Jacek Caban : jscript: Added support for pstrFormalParams argument in ParseProcedureText.

Alexandre Julliard julliard at winehq.org
Thu Oct 4 13:38:38 CDT 2012


Module: wine
Branch: master
Commit: bf650032713ad0bc736376ccb700c4e864f6901f
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=bf650032713ad0bc736376ccb700c4e864f6901f

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Thu Oct  4 14:58:05 2012 +0200

jscript: Added support for pstrFormalParams argument in ParseProcedureText.

---

 dlls/jscript/compile.c      |  106 +++++++++++++++++++++++++++++++++++++++++--
 dlls/jscript/engine.h       |    2 +-
 dlls/jscript/function.c     |    2 +-
 dlls/jscript/global.c       |    2 +-
 dlls/jscript/jscript.c      |    4 +-
 dlls/jscript/tests/run.c    |   11 +++++
 dlls/mshtml/tests/activex.c |    2 -
 7 files changed, 117 insertions(+), 12 deletions(-)

diff --git a/dlls/jscript/compile.c b/dlls/jscript/compile.c
index 034a55d..7099a6a 100644
--- a/dlls/jscript/compile.c
+++ b/dlls/jscript/compile.c
@@ -131,24 +131,32 @@ static WCHAR *compiler_alloc_string(bytecode_t *code, const WCHAR *str)
     return ret;
 }
 
-static BSTR compiler_alloc_bstr(compiler_ctx_t *ctx, const WCHAR *str)
+static BOOL ensure_bstr_slot(compiler_ctx_t *ctx)
 {
     if(!ctx->code->bstr_pool_size) {
         ctx->code->bstr_pool = heap_alloc(8 * sizeof(BSTR));
         if(!ctx->code->bstr_pool)
-            return NULL;
+            return FALSE;
         ctx->code->bstr_pool_size = 8;
     }else if(ctx->code->bstr_pool_size == ctx->code->bstr_cnt) {
         BSTR *new_pool;
 
         new_pool = heap_realloc(ctx->code->bstr_pool, ctx->code->bstr_pool_size*2*sizeof(BSTR));
         if(!new_pool)
-            return NULL;
+            return FALSE;
 
         ctx->code->bstr_pool = new_pool;
         ctx->code->bstr_pool_size *= 2;
     }
 
+    return TRUE;
+}
+
+static BSTR compiler_alloc_bstr(compiler_ctx_t *ctx, const WCHAR *str)
+{
+    if(!ensure_bstr_slot(ctx))
+        return NULL;
+
     ctx->code->bstr_pool[ctx->code->bstr_cnt] = SysAllocString(str);
     if(!ctx->code->bstr_pool[ctx->code->bstr_cnt])
         return NULL;
@@ -156,6 +164,18 @@ static BSTR compiler_alloc_bstr(compiler_ctx_t *ctx, const WCHAR *str)
     return ctx->code->bstr_pool[ctx->code->bstr_cnt++];
 }
 
+static BSTR compiler_alloc_bstr_len(compiler_ctx_t *ctx, const WCHAR *str, size_t len)
+{
+    if(!ensure_bstr_slot(ctx))
+        return NULL;
+
+    ctx->code->bstr_pool[ctx->code->bstr_cnt] = SysAllocStringLen(str, len);
+    if(!ctx->code->bstr_pool[ctx->code->bstr_cnt])
+        return NULL;
+
+    return ctx->code->bstr_pool[ctx->code->bstr_cnt++];
+}
+
 static unsigned push_instr(compiler_ctx_t *ctx, jsop_t op)
 {
     assert(ctx->code_size >= ctx->code_off);
@@ -1885,8 +1905,78 @@ static HRESULT compile_function(compiler_ctx_t *ctx, source_elements_t *source,
     return S_OK;
 }
 
-HRESULT compile_script(script_ctx_t *ctx, const WCHAR *code, const WCHAR *delimiter, BOOL from_eval, BOOL use_decode,
-        bytecode_t **ret)
+static HRESULT parse_arguments(compiler_ctx_t *ctx, const WCHAR *args, BSTR *arg_array, unsigned *args_size)
+{
+    const WCHAR *ptr = args, *ptr2;
+    unsigned arg_cnt = 0;
+
+    while(isspaceW(*ptr))
+        ptr++;
+    if(!*ptr) {
+        if(args_size)
+            *args_size = 0;
+        return S_OK;
+    }
+
+    while(1) {
+        if(!isalphaW(*ptr) && *ptr != '_') {
+            FIXME("expected alpha or '_': %s\n", debugstr_w(ptr));
+            return E_FAIL;
+        }
+
+        ptr2 = ptr;
+        while(isalnumW(*ptr) || *ptr == '_')
+            ptr++;
+
+        if(*ptr && *ptr != ',' && !isspaceW(*ptr)) {
+            FIXME("unexpected har %s\n", debugstr_w(ptr));
+            return E_FAIL;
+        }
+
+        if(arg_array) {
+            arg_array[arg_cnt] = compiler_alloc_bstr_len(ctx, ptr2, ptr-ptr2);
+            if(!arg_array[arg_cnt])
+                return E_OUTOFMEMORY;
+        }
+        arg_cnt++;
+
+        while(isspaceW(*ptr))
+            ptr++;
+        if(!*ptr)
+            break;
+        if(*ptr != ',') {
+            FIXME("expected ',': %s\n", debugstr_w(ptr));
+            return E_FAIL;
+        }
+
+        ptr++;
+        while(isspaceW(*ptr))
+            ptr++;
+    }
+
+    if(args_size)
+        *args_size = arg_cnt;
+    return S_OK;
+}
+
+static HRESULT compile_arguments(compiler_ctx_t *ctx, const WCHAR *args)
+{
+    HRESULT hres;
+
+    hres = parse_arguments(ctx, args, NULL, &ctx->code->global_code.param_cnt);
+    if(FAILED(hres))
+        return hres;
+
+    ctx->code->global_code.params = compiler_alloc(ctx->code,
+            ctx->code->global_code.param_cnt * sizeof(*ctx->code->global_code.params));
+    if(!ctx->code->global_code.params)
+        return E_OUTOFMEMORY;
+
+    return parse_arguments(ctx, args, ctx->code->global_code.params, NULL);
+}
+
+HRESULT compile_script(script_ctx_t *ctx, const WCHAR *code, const WCHAR *args, const WCHAR *delimiter,
+        BOOL from_eval, BOOL use_decode, bytecode_t **ret)
 {
     compiler_ctx_t compiler = {0};
     HRESULT hres;
@@ -1895,6 +1985,12 @@ HRESULT compile_script(script_ctx_t *ctx, const WCHAR *code, const WCHAR *delimi
     if(FAILED(hres))
         return hres;
 
+    if(args) {
+        hres = compile_arguments(&compiler, args);
+        if(FAILED(hres))
+            return hres;
+    }
+
     if(use_decode) {
         hres = decode_source(compiler.code->source);
         if(FAILED(hres)) {
diff --git a/dlls/jscript/engine.h b/dlls/jscript/engine.h
index f7e03f7..49232ee 100644
--- a/dlls/jscript/engine.h
+++ b/dlls/jscript/engine.h
@@ -178,7 +178,7 @@ typedef struct _bytecode_t {
     struct _bytecode_t *next;
 } bytecode_t;
 
-HRESULT compile_script(script_ctx_t*,const WCHAR*,const WCHAR*,BOOL,BOOL,bytecode_t**) DECLSPEC_HIDDEN;
+HRESULT compile_script(script_ctx_t*,const WCHAR*,const WCHAR*,const WCHAR*,BOOL,BOOL,bytecode_t**) DECLSPEC_HIDDEN;
 void release_bytecode(bytecode_t*) DECLSPEC_HIDDEN;
 
 static inline void bytecode_addref(bytecode_t *code)
diff --git a/dlls/jscript/function.c b/dlls/jscript/function.c
index f1ed559..7a32de7 100644
--- a/dlls/jscript/function.c
+++ b/dlls/jscript/function.c
@@ -750,7 +750,7 @@ static HRESULT construct_function(script_ctx_t *ctx, unsigned argc, jsval_t *arg
     if(FAILED(hres))
         return hres;
 
-    hres = compile_script(ctx, str, NULL, FALSE, FALSE, &code);
+    hres = compile_script(ctx, str, NULL, NULL, FALSE, FALSE, &code);
     heap_free(str);
     if(FAILED(hres))
         return hres;
diff --git a/dlls/jscript/global.c b/dlls/jscript/global.c
index 60aae51..1c0f72c 100644
--- a/dlls/jscript/global.c
+++ b/dlls/jscript/global.c
@@ -370,7 +370,7 @@ static HRESULT JSGlobal_eval(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, uns
     }
 
     TRACE("parsing %s\n", debugstr_jsval(argv[0]));
-    hres = compile_script(ctx, get_string(argv[0]), NULL, TRUE, FALSE, &code);
+    hres = compile_script(ctx, get_string(argv[0]), NULL, NULL, TRUE, FALSE, &code);
     if(FAILED(hres)) {
         WARN("parse (%s) failed: %08x\n", debugstr_jsval(argv[0]), hres);
         return throw_syntax_error(ctx, hres, NULL);
diff --git a/dlls/jscript/jscript.c b/dlls/jscript/jscript.c
index e38987c..8dfa0c8 100644
--- a/dlls/jscript/jscript.c
+++ b/dlls/jscript/jscript.c
@@ -763,7 +763,7 @@ static HRESULT WINAPI JScriptParse_ParseScriptText(IActiveScriptParse *iface,
     if(This->thread_id != GetCurrentThreadId() || This->ctx->state == SCRIPTSTATE_CLOSED)
         return E_UNEXPECTED;
 
-    hres = compile_script(This->ctx, pstrCode, pstrDelimiter, FALSE, This->is_encode, &code);
+    hres = compile_script(This->ctx, pstrCode, NULL, pstrDelimiter, FALSE, This->is_encode, &code);
     if(FAILED(hres))
         return hres;
 
@@ -830,7 +830,7 @@ static HRESULT WINAPI JScriptParseProcedure_ParseProcedureText(IActiveScriptPars
     if(This->thread_id != GetCurrentThreadId() || This->ctx->state == SCRIPTSTATE_CLOSED)
         return E_UNEXPECTED;
 
-    hres = compile_script(This->ctx, pstrCode, pstrDelimiter, FALSE, This->is_encode, &code);
+    hres = compile_script(This->ctx, pstrCode, pstrFormalParams, pstrDelimiter, FALSE, This->is_encode, &code);
     if(FAILED(hres)) {
         WARN("Parse failed %08x\n", hres);
         return hres;
diff --git a/dlls/jscript/tests/run.c b/dlls/jscript/tests/run.c
index e360515..f0aff60 100644
--- a/dlls/jscript/tests/run.c
+++ b/dlls/jscript/tests/run.c
@@ -1927,6 +1927,17 @@ static void test_parse_proc(void)
     dp.cArgs = 1;
     V_VT(args) = VT_EMPTY;
     invoke_procedure(NULL, "return arguments.length == 1;", &dp);
+
+    V_VT(args) = VT_BOOL;
+    V_BOOL(args) = VARIANT_TRUE;
+    invoke_procedure(" x ", "return x;", &dp);
+
+    dp.cArgs = 2;
+    V_VT(args) = VT_I4;
+    V_I4(args) = 2;
+    V_VT(args+1) = VT_I4;
+    V_I4(args+1) = 1;
+    invoke_procedure(" _x1 , y_2", "return _x1 === 1 && y_2 === 2;", &dp);
 }
 
 static void run_encoded_tests(void)
diff --git a/dlls/mshtml/tests/activex.c b/dlls/mshtml/tests/activex.c
index 8e4ee58..e861d37 100644
--- a/dlls/mshtml/tests/activex.c
+++ b/dlls/mshtml/tests/activex.c
@@ -2355,10 +2355,8 @@ static void test_event_call(void)
     dp.cArgs = 2;
     V_VT(&res) = VT_EMPTY;
     hres = IDispatch_Invoke(sink_disp, 2, &IID_NULL, 0, DISPATCH_METHOD, &dp, &res, &ei, NULL);
-    todo_wine { /* Needs jscript fixes */
     ok(hres == S_OK, "Invoke failed: %08x\n", hres);
     ok(V_VT(&res) == VT_I4 && V_I4(&res) == 7, "unexpected result: %d\n", V_I4(&res));
-    }
 
     V_VT(&res) = VT_ERROR;
     hres = IDispatch_Invoke(sink_disp, 10, &IID_NULL, 0, DISPATCH_METHOD, &dp, &res, &ei, NULL);




More information about the wine-cvs mailing list