[PATCH v5 3/9] jscript: Lookup the named item and keep a ref to it from the associated bytecode.

Gabriel Ivăncescu gabrielopcode at gmail.com
Fri Mar 6 07:48:40 CST 2020


Signed-off-by: Gabriel Ivăncescu <gabrielopcode at gmail.com>
---
 dlls/jscript/compile.c |  2 ++
 dlls/jscript/engine.h  |  1 +
 dlls/jscript/global.c  |  5 +++++
 dlls/jscript/jscript.c | 29 ++++++++++++++++++++++++++++-
 4 files changed, 36 insertions(+), 1 deletion(-)

diff --git a/dlls/jscript/compile.c b/dlls/jscript/compile.c
index 61db10c..07027c2 100644
--- a/dlls/jscript/compile.c
+++ b/dlls/jscript/compile.c
@@ -2250,6 +2250,8 @@ void release_bytecode(bytecode_t *code)
     for(i=0; i < code->str_cnt; i++)
         jsstr_release(code->str_pool[i]);
 
+    if(code->named_item)
+        release_named_item(code->named_item);
     heap_free(code->source);
     heap_pool_free(&code->heap);
     heap_free(code->bstr_pool);
diff --git a/dlls/jscript/engine.h b/dlls/jscript/engine.h
index 7be98c5..dcd153c 100644
--- a/dlls/jscript/engine.h
+++ b/dlls/jscript/engine.h
@@ -181,6 +181,7 @@ struct _bytecode_t {
     heap_pool_t heap;
 
     function_code_t global_code;
+    named_item_t *named_item;
 
     WCHAR *source;
     UINT64 source_context;
diff --git a/dlls/jscript/global.c b/dlls/jscript/global.c
index e2758bf..8f593a9 100644
--- a/dlls/jscript/global.c
+++ b/dlls/jscript/global.c
@@ -210,6 +210,11 @@ HRESULT JSGlobal_eval(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned a
         return hres;
     }
 
+    if(frame && frame->bytecode->named_item) {
+        code->named_item = frame->bytecode->named_item;
+        code->named_item->ref++;
+    }
+
     if(!frame || (frame->flags & EXEC_GLOBAL))
         exec_flags |= EXEC_GLOBAL;
     if(flags & DISPATCH_JSCRIPT_CALLEREXECSSOURCE)
diff --git a/dlls/jscript/jscript.c b/dlls/jscript/jscript.c
index 36d9f84..8976e6b 100644
--- a/dlls/jscript/jscript.c
+++ b/dlls/jscript/jscript.c
@@ -983,6 +983,7 @@ static HRESULT WINAPI JScriptParse_ParseScriptText(IActiveScriptParse *iface,
         DWORD dwFlags, VARIANT *pvarResult, EXCEPINFO *pexcepinfo)
 {
     JScript *This = impl_from_IActiveScriptParse(iface);
+    named_item_t *item = NULL;
     bytecode_t *code;
     jsexcept_t ei;
     HRESULT hres;
@@ -994,11 +995,23 @@ static HRESULT WINAPI JScriptParse_ParseScriptText(IActiveScriptParse *iface,
     if(This->thread_id != GetCurrentThreadId() || This->ctx->state == SCRIPTSTATE_CLOSED)
         return E_UNEXPECTED;
 
+    if(pstrItemName) {
+        item = lookup_named_item(This->ctx, pstrItemName, 0);
+        if(!item) {
+            WARN("Unknown context %s\n", debugstr_w(pstrItemName));
+            return E_INVALIDARG;
+        }
+    }
+
     enter_script(This->ctx, &ei);
     hres = compile_script(This->ctx, pstrCode, dwSourceContextCookie, ulStartingLine, NULL, pstrDelimiter,
             (dwFlags & SCRIPTTEXT_ISEXPRESSION) != 0, This->is_encode, &code);
     if(FAILED(hres))
         return leave_script(This->ctx, hres);
+    if(item) {
+        code->named_item = item;
+        item->ref++;
+    }
 
     if(dwFlags & SCRIPTTEXT_ISEXPRESSION) {
         jsval_t r;
@@ -1075,6 +1088,7 @@ static HRESULT WINAPI JScriptParseProcedure_ParseProcedureText(IActiveScriptPars
         CTXARG_T dwSourceContextCookie, ULONG ulStartingLineNumber, DWORD dwFlags, IDispatch **ppdisp)
 {
     JScript *This = impl_from_IActiveScriptParseProcedure2(iface);
+    named_item_t *item = NULL;
     bytecode_t *code;
     jsdisp_t *dispex;
     jsexcept_t ei;
@@ -1087,11 +1101,24 @@ static HRESULT WINAPI JScriptParseProcedure_ParseProcedureText(IActiveScriptPars
     if(This->thread_id != GetCurrentThreadId() || This->ctx->state == SCRIPTSTATE_CLOSED)
         return E_UNEXPECTED;
 
+    if(pstrItemName) {
+        item = lookup_named_item(This->ctx, pstrItemName, 0);
+        if(!item) {
+            WARN("Unknown context %s\n", debugstr_w(pstrItemName));
+            return E_INVALIDARG;
+        }
+    }
+
     enter_script(This->ctx, &ei);
     hres = compile_script(This->ctx, pstrCode, dwSourceContextCookie, ulStartingLineNumber, pstrFormalParams,
                           pstrDelimiter, FALSE, This->is_encode, &code);
-    if(SUCCEEDED(hres))
+    if(SUCCEEDED(hres)) {
+        if(item) {
+            code->named_item = item;
+            item->ref++;
+        }
         hres = create_source_function(This->ctx, code, &code->global_code, NULL,  &dispex);
+    }
     release_bytecode(code);
     hres = leave_script(This->ctx, hres);
     if(FAILED(hres))
-- 
2.21.0




More information about the wine-devel mailing list