Jacek Caban : jscript: Access arguments directly from stack in arguments object if possible.

Alexandre Julliard julliard at winehq.org
Wed Aug 3 18:09:17 CDT 2016


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

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Wed Aug  3 16:27:49 2016 +0200

jscript: Access arguments directly from stack in arguments object if possible.

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

---

 dlls/jscript/engine.c   |  2 +-
 dlls/jscript/engine.h   |  2 --
 dlls/jscript/function.c | 33 ++++++++++++++++++++++-----------
 3 files changed, 23 insertions(+), 14 deletions(-)

diff --git a/dlls/jscript/engine.c b/dlls/jscript/engine.c
index 187a8b7..2c6a9a3 100644
--- a/dlls/jscript/engine.c
+++ b/dlls/jscript/engine.c
@@ -545,7 +545,7 @@ static HRESULT equal2_values(jsval_t lval, jsval_t rval, BOOL *ret)
  * Transfers local variables from stack to variable object.
  * It's slow, so we want to avoid it as much as possible.
  */
-HRESULT detach_variable_object(script_ctx_t *ctx, call_frame_t *frame)
+static HRESULT detach_variable_object(script_ctx_t *ctx, call_frame_t *frame)
 {
     unsigned i;
     HRESULT hres;
diff --git a/dlls/jscript/engine.h b/dlls/jscript/engine.h
index 1aebfd7..89a09fa 100644
--- a/dlls/jscript/engine.h
+++ b/dlls/jscript/engine.h
@@ -226,8 +226,6 @@ typedef struct _call_frame_t {
     struct _call_frame_t *prev_frame;
 } call_frame_t;
 
-HRESULT detach_variable_object(script_ctx_t*,call_frame_t*) DECLSPEC_HIDDEN;
-
 #define EXEC_GLOBAL            0x0001
 #define EXEC_CONSTRUCTOR       0x0002
 #define EXEC_RETURN_TO_INTERP  0x0004
diff --git a/dlls/jscript/function.c b/dlls/jscript/function.c
index 006ec39..191976d 100644
--- a/dlls/jscript/function.c
+++ b/dlls/jscript/function.c
@@ -89,34 +89,45 @@ static unsigned Arguments_idx_length(jsdisp_t *jsdisp)
     return arguments->function->length;
 }
 
-static HRESULT Arguments_idx_get(jsdisp_t *jsdisp, unsigned idx, jsval_t *res)
+static jsval_t *get_argument_ref(ArgumentsInstance *arguments, unsigned idx)
+{
+    call_frame_t *frame = arguments->scope->frame;
+    return frame
+        ? arguments->jsdisp.ctx->stack + frame->arguments_off + idx
+        : NULL;
+}
+
+static HRESULT Arguments_idx_get(jsdisp_t *jsdisp, unsigned idx, jsval_t *r)
 {
     ArgumentsInstance *arguments = (ArgumentsInstance*)jsdisp;
+    jsval_t *ref;
 
     TRACE("%p[%u]\n", arguments, idx);
 
-    if(arguments->scope->frame) {
-        HRESULT hres;
-        hres = detach_variable_object(jsdisp->ctx, arguments->scope->frame);
-        if(FAILED(hres))
-            return hres;
-    }
+    if((ref = get_argument_ref(arguments, idx)))
+        return jsval_copy(*ref, r);
 
     /* FIXME: Accessing by name won't work for duplicated argument names */
-    return jsdisp_propget_name(arguments->scope->jsobj, arguments->function->func_code->params[idx], res);
+    return jsdisp_propget_name(arguments->scope->jsobj, arguments->function->func_code->params[idx], r);
 }
 
 static HRESULT Arguments_idx_put(jsdisp_t *jsdisp, unsigned idx, jsval_t val)
 {
     ArgumentsInstance *arguments = (ArgumentsInstance*)jsdisp;
+    jsval_t *ref;
+    HRESULT hres;
 
     TRACE("%p[%u] = %s\n", arguments, idx, debugstr_jsval(val));
 
-    if(arguments->scope->frame) {
-        HRESULT hres;
-        hres = detach_variable_object(jsdisp->ctx, arguments->scope->frame);
+    if((ref = get_argument_ref(arguments, idx))) {
+        jsval_t copy;
+        hres = jsval_copy(val, &copy);
         if(FAILED(hres))
             return hres;
+
+        jsval_release(*ref);
+        *ref = copy;
+        return S_OK;
     }
 
     /* FIXME: Accessing by name won't work for duplicated argument names */




More information about the wine-cvs mailing list