From 6afd53547e734c2023148006f7404940bf42ecc5 Mon Sep 17 00:00:00 2001 From: Piotr Caban Date: Mon, 10 Aug 2009 12:57:23 +0200 Subject: [PATCH] jscript: Lookup global members after script_disp. --- dlls/jscript/engine.c | 36 +++++++++++++++++++++++------------- dlls/jscript/tests/run.c | 2 ++ 2 files changed, 25 insertions(+), 13 deletions(-) diff --git a/dlls/jscript/engine.c b/dlls/jscript/engine.c index f120cc680b6..dbb186fe582 100644 --- a/dlls/jscript/engine.c +++ b/dlls/jscript/engine.c @@ -356,6 +356,26 @@ static HRESULT literal_to_var(literal_t *literal, VARIANT *v) return S_OK; } +static BOOL lookup_global_members(script_ctx_t *ctx, BSTR identifier, exprval_t *ret) +{ + named_item_t *item; + DISPID id; + HRESULT hres; + + for(item = ctx->named_items; item; item = item->next) { + if(item->flags & SCRIPTITEM_GLOBALMEMBERS) { + hres = disp_get_id(item->disp, identifier, 0, &id); + if(SUCCEEDED(hres)) { + if(ret) + exprval_set_idref(ret, item->disp, id); + return TRUE; + } + } + } + + return FALSE; +} + HRESULT exec_source(exec_ctx_t *ctx, parser_ctx_t *parser, source_elements_t *source, jsexcept_t *ei, VARIANT *retv) { script_ctx_t *script = parser->script; @@ -493,25 +513,15 @@ static HRESULT identifier_eval(exec_ctx_t *ctx, BSTR identifier, DWORD flags, js } } - for(item = ctx->parser->script->named_items; item; item = item->next) { - if(item->flags & SCRIPTITEM_GLOBALMEMBERS) { - hres = disp_get_id(item->disp, identifier, 0, &id); - if(SUCCEEDED(hres)) - break; - } - } - - if(item) { - exprval_set_idref(ret, item->disp, id); - return S_OK; - } - hres = jsdisp_get_id(ctx->parser->script->script_disp, identifier, 0, &id); if(SUCCEEDED(hres)) { exprval_set_idref(ret, (IDispatch*)_IDispatchEx_(ctx->parser->script->script_disp), id); return S_OK; } + if(lookup_global_members(ctx->parser->script, identifier, ret)) + return S_OK; + if(flags & EXPR_NEWREF) { hres = jsdisp_get_id(ctx->var_disp, identifier, fdexNameEnsure, &id); if(FAILED(hres)) diff --git a/dlls/jscript/tests/run.c b/dlls/jscript/tests/run.c index ffbbde347e1..d176533e94c 100644 --- a/dlls/jscript/tests/run.c +++ b/dlls/jscript/tests/run.c @@ -835,6 +835,8 @@ static void run_tests(void) parse_script_a("ok(typeof(test) === 'object', \"typeof(test) != 'object'\");"); + parse_script_a("function reportSuccess() {}; reportSuccess();"); + run_from_res("lang.js"); run_from_res("api.js"); run_from_res("regexp.js");