Module: wine Branch: master Commit: 133918e69c33dfb7e4cfadb3a75296864663f404 URL: https://source.winehq.org/git/wine.git/?a=commit;h=133918e69c33dfb7e4cfadb3a...
Author: Jacek Caban jacek@codeweavers.com Date: Fri Mar 27 18:34:16 2020 +0100
jscript: Lookup the identifier in the named item's disp before the global context.
Based on patch by Gabriel Ivăncescu.
Signed-off-by: Jacek Caban jacek@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/jscript/engine.c | 36 +++++++++++++++++++++++++----------- dlls/jscript/tests/jscript.c | 2 -- 2 files changed, 25 insertions(+), 13 deletions(-)
diff --git a/dlls/jscript/engine.c b/dlls/jscript/engine.c index 896ba6067c..27f03084fa 100644 --- a/dlls/jscript/engine.c +++ b/dlls/jscript/engine.c @@ -670,13 +670,20 @@ static HRESULT identifier_eval(script_ctx_t *ctx, BSTR identifier, exprval_t *re } }
- if(ctx->call_ctx->bytecode->named_item) { - jsdisp_t *script_obj = ctx->call_ctx->bytecode->named_item->script_obj; - hres = jsdisp_get_id(script_obj, identifier, 0, &id); + item = ctx->call_ctx->bytecode->named_item; + if(item) { + hres = jsdisp_get_id(item->script_obj, identifier, 0, &id); if(SUCCEEDED(hres)) { - exprval_set_disp_ref(ret, to_disp(script_obj), id); + exprval_set_disp_ref(ret, to_disp(item->script_obj), id); return S_OK; } + if(!(item->flags & SCRIPTITEM_CODEONLY)) { + hres = disp_get_id(ctx, item->disp, identifier, identifier, 0, &id); + if(SUCCEEDED(hres)) { + exprval_set_disp_ref(ret, item->disp, id); + return S_OK; + } + } } }
@@ -3050,7 +3057,8 @@ HRESULT exec_source(script_ctx_t *ctx, DWORD flags, bytecode_t *bytecode, functi }
if(flags & (EXEC_GLOBAL | EXEC_EVAL)) { - BOOL lookup_globals = (flags & EXEC_GLOBAL) && !bytecode->named_item; + named_item_t *item = bytecode->named_item; + DISPID id;
for(i=0; i < function->var_cnt; i++) { TRACE("[%d] %s %d\n", i, debugstr_w(function->variables[i].name), function->variables[i].func_id); @@ -3063,13 +3071,19 @@ HRESULT exec_source(script_ctx_t *ctx, DWORD flags, bytecode_t *bytecode, functi
hres = jsdisp_propput_name(variable_obj, function->variables[i].name, jsval_obj(func_obj)); jsdisp_release(func_obj); - }else if(!lookup_globals || !lookup_global_members(ctx, function->variables[i].name, NULL)) { - DISPID id = 0; - - hres = jsdisp_get_id(variable_obj, function->variables[i].name, fdexNameEnsure, &id); - if(FAILED(hres)) - goto fail; + continue; } + + if(item && !(item->flags & SCRIPTITEM_CODEONLY) + && SUCCEEDED(disp_get_id(ctx, item->disp, function->variables[i].name, function->variables[i].name, 0, &id))) + continue; + + if(!item && (flags & EXEC_GLOBAL) && lookup_global_members(ctx, function->variables[i].name, NULL)) + continue; + + hres = jsdisp_get_id(variable_obj, function->variables[i].name, fdexNameEnsure, &id); + if(FAILED(hres)) + goto fail; } }
diff --git a/dlls/jscript/tests/jscript.c b/dlls/jscript/tests/jscript.c index dce2f3b95e..a9f128ffc0 100644 --- a/dlls/jscript/tests/jscript.c +++ b/dlls/jscript/tests/jscript.c @@ -1373,7 +1373,6 @@ static void test_named_items(void) hr = IActiveScriptParse_ParseScriptText(parse, L"var abc;\n", L"visibleItem", NULL, NULL, 0, 0, 0, NULL, NULL); ok(hr == S_OK, "ParseScriptText failed: %08x\n", hr); CHECK_CALLED(OnEnterScript); - todo_wine CHECK_CALLED(GetIDsOfNames_visible); CHECK_CALLED(OnLeaveScript);
@@ -1389,7 +1388,6 @@ static void test_named_items(void) hr = IActiveScriptParse_ParseScriptText(parse, L"testVar_global = 5;\n", L"visibleItem", NULL, NULL, 0, 0, 0, NULL, NULL); ok(hr == S_OK, "ParseScriptText failed: %08x\n", hr); CHECK_CALLED(OnEnterScript); - todo_wine CHECK_CALLED(GetIDsOfNames_visible); CHECK_CALLED(OnLeaveScript);