From 64a3f5077f719adbad2b2a1668856f113db68fa0 Mon Sep 17 00:00:00 2001 From: Jacek Caban Date: Wed, 25 Apr 2012 10:47:56 +0200 Subject: [PATCH] jscript: Store variable names in function_code_t. --- dlls/jscript/compile.c | 16 +++++++++++++++- dlls/jscript/engine.c | 20 +++++++------------- dlls/jscript/engine.h | 4 +++- dlls/jscript/function.c | 2 +- 4 files changed, 26 insertions(+), 16 deletions(-) diff --git a/dlls/jscript/compile.c b/dlls/jscript/compile.c index f8aaa41dbdc..5d162eae443 100644 --- a/dlls/jscript/compile.c +++ b/dlls/jscript/compile.c @@ -1775,6 +1775,7 @@ static HRESULT compile_function(compiler_ctx_t *ctx, source_elements_t *source, BOOL from_eval, function_code_t *func) { function_declaration_t *iter; + var_list_t *var_iter; unsigned off, i; HRESULT hres; @@ -1809,7 +1810,6 @@ static HRESULT compile_function(compiler_ctx_t *ctx, source_elements_t *source, func->source_len = func_expr->src_len; } - func->source_elements = source; func->expr = func_expr; func->funcs = heap_alloc_zero(func->func_cnt * sizeof(*func->funcs)); @@ -1823,6 +1823,20 @@ static HRESULT compile_function(compiler_ctx_t *ctx, source_elements_t *source, } assert(i == func->func_cnt); + + for(var_iter = source->variables; var_iter; var_iter = var_iter->next) + func->var_cnt++; + + func->variables = compiler_alloc(ctx->code, func->var_cnt * sizeof(*func->variables)); + if(!func->variables) + return E_OUTOFMEMORY; + + for(var_iter = source->variables, i=0; var_iter; var_iter = var_iter->next, i++) { + func->variables[i] = compiler_alloc_bstr(ctx, var_iter->identifier); + if(!func->variables[i]) + return E_OUTOFMEMORY; + } + return S_OK; } diff --git a/dlls/jscript/engine.c b/dlls/jscript/engine.c index ec906a1d72f..189e19ba068 100644 --- a/dlls/jscript/engine.c +++ b/dlls/jscript/engine.c @@ -2614,7 +2614,6 @@ HRESULT exec_source(exec_ctx_t *ctx, bytecode_t *code, function_code_t *func, BO jsexcept_t *ei, VARIANT *retv) { exec_ctx_t *prev_ctx; - var_list_t *var; VARIANT val; unsigned i; HRESULT hres = S_OK; @@ -2640,19 +2639,14 @@ HRESULT exec_source(exec_ctx_t *ctx, bytecode_t *code, function_code_t *func, BO return hres; } - for(var = func->source_elements->variables; var; var = var->next) { - DISPID id = 0; - BSTR name; + for(i=0; i < func->var_cnt; i++) { + if(!ctx->is_global || !lookup_global_members(ctx->script, func->variables[i], NULL)) { + DISPID id = 0; - name = SysAllocString(var->identifier); - if(!name) - return E_OUTOFMEMORY; - - if(!ctx->is_global || !lookup_global_members(ctx->script, name, NULL)) - hres = jsdisp_get_id(ctx->var_disp, var->identifier, fdexNameEnsure, &id); - SysFreeString(name); - if(FAILED(hres)) - return hres; + hres = jsdisp_get_id(ctx->var_disp, func->variables[i], fdexNameEnsure, &id); + if(FAILED(hres)) + return hres; + } } prev_ctx = ctx->script->exec_ctx; diff --git a/dlls/jscript/engine.h b/dlls/jscript/engine.h index a2be6ee62ce..cc58aa88754 100644 --- a/dlls/jscript/engine.h +++ b/dlls/jscript/engine.h @@ -171,13 +171,15 @@ typedef struct _function_code_t { unsigned instr_off; function_expression_t *expr; /* FIXME */ - source_elements_t *source_elements; /* FIXME */ const WCHAR *source; unsigned source_len; unsigned func_cnt; struct _function_code_t *funcs; + + unsigned var_cnt; + BSTR *variables; } function_code_t; typedef struct _bytecode_t { diff --git a/dlls/jscript/function.c b/dlls/jscript/function.c index dc4c5e831a9..0377138e54b 100644 --- a/dlls/jscript/function.c +++ b/dlls/jscript/function.c @@ -774,7 +774,7 @@ static HRESULT construct_function(script_ctx_t *ctx, DISPPARAMS *dp, jsexcept_t if(FAILED(hres)) return hres; - if(code->global_code.func_cnt != 1 || code->parser->source->variables) { + if(code->global_code.func_cnt != 1 || code->global_code.var_cnt) { ERR("Invalid parser result!\n"); release_bytecode(code); return E_UNEXPECTED;