diff --git a/dlls/jscript/engine.c b/dlls/jscript/engine.c index ec503f6eaa0..ecf62aea784 100644 --- a/dlls/jscript/engine.c +++ b/dlls/jscript/engine.c @@ -457,6 +457,16 @@ static HRESULT identifier_eval(exec_ctx_t *ctx, BSTR identifier, DWORD flags, ex return S_OK; } + 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)) diff --git a/dlls/jscript/jscript.c b/dlls/jscript/jscript.c index c4bd8907eaf..fb13d0814a4 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 b416f6ed1c8..6930ec65c4c 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 3904a362783..20d710d9e52 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");