Jacek Caban : jscript: Move function call implementation into vtbl.

Alexandre Julliard julliard at winehq.org
Wed Aug 14 20:17:23 CDT 2019


Module: wine
Branch: master
Commit: 5c5397d1efa1ce35e19131fcf3baaecd0c0cd1de
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=5c5397d1efa1ce35e19131fcf3baaecd0c0cd1de

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Wed Aug 14 13:18:09 2019 +0200

jscript: Move function call implementation into vtbl.

Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/jscript/function.c | 148 +++++++++++++++++++++---------------------------
 1 file changed, 63 insertions(+), 85 deletions(-)

diff --git a/dlls/jscript/function.c b/dlls/jscript/function.c
index 3b50a5d..d4b3473 100644
--- a/dlls/jscript/function.c
+++ b/dlls/jscript/function.c
@@ -40,6 +40,7 @@ typedef struct {
 } FunctionInstance;
 
 struct _function_vtbl_t {
+    HRESULT (*call)(script_ctx_t*,FunctionInstance*,IDispatch*,unsigned,unsigned,jsval_t*,jsval_t*);
     HRESULT (*toString)(FunctionInstance*,jsstr_t**);
     void (*destructor)(FunctionInstance*);
 };
@@ -243,69 +244,8 @@ void detach_arguments_object(jsdisp_t *args_disp)
     jsdisp_release(frame->arguments_obj);
 }
 
-static HRESULT invoke_source(script_ctx_t *ctx, FunctionInstance *function, IDispatch *this_obj, unsigned argc, jsval_t *argv,
-        BOOL is_constructor, BOOL caller_execs_source, jsval_t *r)
-{
-    jsdisp_t *var_disp;
-    DWORD exec_flags = 0;
-    HRESULT hres;
-
-    if(ctx->state == SCRIPTSTATE_UNINITIALIZED || ctx->state == SCRIPTSTATE_CLOSED) {
-        WARN("Script engine state does not allow running code.\n");
-        return E_UNEXPECTED;
-    }
-
-    if(!function->func_code) {
-        FIXME("no source\n");
-        return E_FAIL;
-    }
-
-    hres = create_dispex(ctx, NULL, NULL, &var_disp);
-    if(FAILED(hres))
-        return hres;
-
-    if(caller_execs_source)
-        exec_flags |= EXEC_RETURN_TO_INTERP;
-    if(is_constructor)
-        exec_flags |= EXEC_CONSTRUCTOR;
-    hres = exec_source(ctx, exec_flags, function->code, function->func_code, function->scope_chain, this_obj,
-            &function->dispex, var_disp, argc, argv, r);
-
-    jsdisp_release(var_disp);
-    return hres;
-}
-
-static HRESULT invoke_value_proc(script_ctx_t *ctx, FunctionInstance *function, IDispatch *this_disp, WORD flags,
-        unsigned argc, jsval_t *argv, jsval_t *r)
-{
-    vdisp_t vthis;
-    HRESULT hres;
-
-    if(this_disp)
-        set_disp(&vthis, this_disp);
-    else if(ctx->host_global)
-        set_disp(&vthis, ctx->host_global);
-    else
-        set_jsdisp(&vthis, ctx->global);
-
-    hres = function->value_proc(ctx, &vthis, flags, argc, argv, r);
-
-    vdisp_release(&vthis);
-    return hres;
-}
-
-static HRESULT call_function(script_ctx_t *ctx, FunctionInstance *function, IDispatch *this_obj,
-        unsigned argc, jsval_t *argv, BOOL caller_execs_source, jsval_t *r)
-{
-    if(function->value_proc)
-        return invoke_value_proc(ctx, function, this_obj, DISPATCH_METHOD, argc, argv, r);
-
-    return invoke_source(ctx, function, this_obj, argc, argv, FALSE, caller_execs_source, r);
-}
-
 HRESULT Function_invoke(jsdisp_t *func_this, IDispatch *jsthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
 {
-    const BOOL caller_execs_source = (flags & DISPATCH_JSCRIPT_CALLEREXECSSOURCE) != 0;
     FunctionInstance *function;
 
     TRACE("func %p this %p\n", func_this, jsthis);
@@ -313,25 +253,7 @@ HRESULT Function_invoke(jsdisp_t *func_this, IDispatch *jsthis, WORD flags, unsi
     assert(is_class(func_this, JSCLASS_FUNCTION));
     function = function_from_jsdisp(func_this);
 
-    flags &= ~DISPATCH_JSCRIPT_INTERNAL_MASK;
-    if(function->value_proc)
-        return invoke_value_proc(function->dispex.ctx, function, jsthis, flags, argc, argv, r);
-
-    if(flags == DISPATCH_CONSTRUCT) {
-        jsdisp_t *this_obj;
-        HRESULT hres;
-
-        hres = create_object(function->dispex.ctx, &function->dispex, &this_obj);
-        if(FAILED(hres))
-            return hres;
-
-        hres = invoke_source(function->dispex.ctx, function, to_disp(this_obj), argc, argv, TRUE, caller_execs_source, r);
-        jsdisp_release(this_obj);
-        return hres;
-    }
-
-    assert(flags == DISPATCH_METHOD);
-    return invoke_source(function->dispex.ctx, function, jsthis, argc, argv, FALSE, caller_execs_source, r);
+    return function->vtbl->call(function->dispex.ctx, function, jsthis, flags, argc, argv, r);
 }
 
 static HRESULT Function_get_length(script_ctx_t *ctx, jsdisp_t *jsthis, jsval_t *r)
@@ -445,7 +367,7 @@ static HRESULT Function_apply(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, un
 
     if(SUCCEEDED(hres)) {
         if(function) {
-            hres = call_function(ctx, function, this_obj, cnt, args, (flags & DISPATCH_JSCRIPT_CALLEREXECSSOURCE) != 0, r);
+            hres = function->vtbl->call(ctx, function, this_obj, flags, cnt, args, r);
         }else {
             jsval_t res;
             hres = disp_call_value(ctx, jsthis->u.disp, this_obj, DISPATCH_METHOD, cnt, args, &res);
@@ -489,7 +411,7 @@ static HRESULT Function_call(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, uns
         cnt = argc-1;
     }
 
-    hres = call_function(ctx, function, this_obj, cnt, argv+1, (flags & DISPATCH_JSCRIPT_CALLEREXECSSOURCE) != 0, r);
+    hres = function->vtbl->call(ctx, function, this_obj, flags, cnt, argv + 1, r);
 
     if(this_obj)
         IDispatch_Release(this_obj);
@@ -509,9 +431,7 @@ HRESULT Function_value(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned
     }
 
     function = function_from_jsdisp(jsthis->u.jsdisp);
-
-    assert(function->value_proc != NULL);
-    return invoke_value_proc(ctx, function, NULL, flags, argc, argv, r);
+    return function->vtbl->call(ctx, function, NULL, flags, argc, argv, r);
 }
 
 HRESULT Function_get_value(script_ctx_t *ctx, jsdisp_t *jsthis, jsval_t *r)
@@ -621,6 +541,25 @@ static HRESULT create_function(script_ctx_t *ctx, const builtin_info_t *builtin_
     return S_OK;
 }
 
+static HRESULT NativeFunction_call(script_ctx_t *ctx, FunctionInstance *function, IDispatch *this_disp, unsigned flags,
+        unsigned argc, jsval_t *argv, jsval_t *r)
+{
+    vdisp_t vthis;
+    HRESULT hres;
+
+    if(this_disp)
+        set_disp(&vthis, this_disp);
+    else if(ctx->host_global)
+        set_disp(&vthis, ctx->host_global);
+    else
+        set_jsdisp(&vthis, ctx->global);
+
+    hres = function->value_proc(ctx, &vthis, flags & ~DISPATCH_JSCRIPT_INTERNAL_MASK, argc, argv, r);
+
+    vdisp_release(&vthis);
+    return hres;
+}
+
 static HRESULT NativeFunction_toString(FunctionInstance *function, jsstr_t **ret)
 {
     DWORD name_len;
@@ -651,6 +590,7 @@ static void NativeFunction_destructor(FunctionInstance *function)
 }
 
 static const function_vtbl_t NativeFunctionVtbl = {
+    NativeFunction_call,
     NativeFunction_toString,
     NativeFunction_destructor
 };
@@ -710,6 +650,43 @@ HRESULT create_builtin_constructor(script_ctx_t *ctx, builtin_invoke_t value_pro
     return S_OK;
 }
 
+static HRESULT InterpretedFunction_call(script_ctx_t *ctx, FunctionInstance *function, IDispatch *this_obj, unsigned flags,
+         unsigned argc, jsval_t *argv, jsval_t *r)
+{
+    jsdisp_t *var_disp, *new_obj = NULL;
+    DWORD exec_flags = 0;
+    HRESULT hres;
+
+    TRACE("%p\n", function);
+
+    if(ctx->state == SCRIPTSTATE_UNINITIALIZED || ctx->state == SCRIPTSTATE_CLOSED) {
+        WARN("Script engine state does not allow running code.\n");
+        return E_UNEXPECTED;
+    }
+
+    if(flags & DISPATCH_CONSTRUCT) {
+        hres = create_object(ctx, &function->dispex, &new_obj);
+        if(FAILED(hres))
+            return hres;
+        this_obj = to_disp(new_obj);
+    }
+
+    if(flags & DISPATCH_JSCRIPT_CALLEREXECSSOURCE)
+        exec_flags |= EXEC_RETURN_TO_INTERP;
+    if(flags & DISPATCH_CONSTRUCT)
+        exec_flags |= EXEC_CONSTRUCTOR;
+
+    hres = create_dispex(ctx, NULL, NULL, &var_disp);
+    if(SUCCEEDED(hres))
+        hres = exec_source(ctx, exec_flags, function->code, function->func_code, function->scope_chain, this_obj,
+                           &function->dispex, var_disp, argc, argv, r);
+    if(new_obj)
+        jsdisp_release(new_obj);
+
+    jsdisp_release(var_disp);
+    return hres;
+}
+
 static HRESULT InterpretedFunction_toString(FunctionInstance *function, jsstr_t **ret)
 {
     *ret = jsstr_alloc_len(function->func_code->source, function->func_code->source_len);
@@ -724,6 +701,7 @@ static void InterpretedFunction_destructor(FunctionInstance *function)
 }
 
 static const function_vtbl_t InterpretedFunctionVtbl = {
+    InterpretedFunction_call,
     InterpretedFunction_toString,
     InterpretedFunction_destructor
 };




More information about the wine-cvs mailing list