Jacek Caban : jscript: Added SCRIPTITEM_ISVISIBLE flag implementation.

Alexandre Julliard julliard at winehq.org
Wed Nov 5 09:37:51 CST 2008


Module: wine
Branch: master
Commit: 1b51a43a7c7403ff903fbcc8436f99628e78265a
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=1b51a43a7c7403ff903fbcc8436f99628e78265a

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Wed Nov  5 01:03:38 2008 +0100

jscript: Added SCRIPTITEM_ISVISIBLE flag implementation.

---

 dlls/jscript/engine.c    |   10 ++++++++++
 dlls/jscript/jscript.c   |    8 ++++++++
 dlls/jscript/jscript.h   |    1 +
 dlls/jscript/tests/run.c |    2 ++
 4 files changed, 21 insertions(+), 0 deletions(-)

diff --git a/dlls/jscript/engine.c b/dlls/jscript/engine.c
index ec503f6..ecf62ae 100644
--- a/dlls/jscript/engine.c
+++ b/dlls/jscript/engine.c
@@ -458,6 +458,16 @@ static HRESULT identifier_eval(exec_ctx_t *ctx, BSTR identifier, DWORD flags, ex
     }
 
     for(item = ctx->parser->script->named_items; item; item = item->next) {
+        if((item->flags & SCRIPTITEM_ISVISIBLE) && !strcmpW(item->name, identifier)) {
+            ret->type = EXPRVAL_VARIANT;
+            V_VT(&ret->u.var) = VT_DISPATCH;
+            V_DISPATCH(&ret->u.var) = item->disp;
+            IDispatch_AddRef(item->disp);
+            return S_OK;
+        }
+    }
+
+    for(item = ctx->parser->script->named_items; item; item = item->next) {
         hres = disp_get_id(item->disp, identifier, 0, &id);
         if(SUCCEEDED(hres))
             break;
diff --git a/dlls/jscript/jscript.c b/dlls/jscript/jscript.c
index c4bd890..fb13d08 100644
--- a/dlls/jscript/jscript.c
+++ b/dlls/jscript/jscript.c
@@ -326,6 +326,7 @@ static HRESULT WINAPI JScript_Close(IActiveScript *iface)
                 iter2 = iter->next;
 
                 IDispatch_Release(iter->disp);
+                heap_free(iter->name);
                 heap_free(iter);
                 iter = iter2;
             }
@@ -390,6 +391,13 @@ static HRESULT WINAPI JScript_AddNamedItem(IActiveScript *iface,
 
     item->disp = disp;
     item->flags = dwFlags;
+    item->name = heap_strdupW(pstrName);
+    if(!item->name) {
+        IDispatch_Release(disp);
+        heap_free(item);
+        return E_OUTOFMEMORY;
+    }
+
     item->next = This->ctx->named_items;
     This->ctx->named_items = item;
 
diff --git a/dlls/jscript/jscript.h b/dlls/jscript/jscript.h
index b416f6e..6930ec6 100644
--- a/dlls/jscript/jscript.h
+++ b/dlls/jscript/jscript.h
@@ -154,6 +154,7 @@ HRESULT to_object(exec_ctx_t*,VARIANT*,IDispatch**);
 typedef struct named_item_t {
     IDispatch *disp;
     DWORD flags;
+    LPWSTR name;
 
     struct named_item_t *next;
 } named_item_t;
diff --git a/dlls/jscript/tests/run.c b/dlls/jscript/tests/run.c
index 3904a36..20d710d 100644
--- a/dlls/jscript/tests/run.c
+++ b/dlls/jscript/tests/run.c
@@ -702,6 +702,8 @@ static void run_tests(void)
     parse_script_a("delete testObj.deleteTest;");
     CHECK_CALLED(testobj_delete);
 
+    parse_script_a("ok(typeof(test) === 'object', \"typeof(test) != 'object'\");");
+
     run_from_res("lang.js");
     run_from_res("api.js");
     run_from_res("regexp.js");




More information about the wine-cvs mailing list