Jacek Caban : jscript: Lookup the identifier in the named item's disp before the global context.
Alexandre Julliard
julliard at winehq.org
Fri Mar 27 16:14:39 CDT 2020
Module: wine
Branch: master
Commit: 133918e69c33dfb7e4cfadb3a75296864663f404
URL: https://source.winehq.org/git/wine.git/?a=commit;h=133918e69c33dfb7e4cfadb3a75296864663f404
Author: Jacek Caban <jacek at 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 at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at 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);
More information about the wine-cvs
mailing list