Jacek Caban : jscript: Create arguments object as a seaprated class inheriting from Object.

Alexandre Julliard julliard at winehq.org
Sat Aug 29 11:35:57 CDT 2009


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

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Sat Aug 29 00:01:57 2009 +0200

jscript: Create arguments object as a seaprated class inheriting from Object.

---

 dlls/jscript/function.c    |   66 ++++++++++++++++++++++++++++++++-----------
 dlls/jscript/jscript.h     |    4 ++-
 dlls/jscript/object.c      |    2 +-
 dlls/jscript/tests/api.js  |    2 +
 dlls/jscript/tests/lang.js |    6 ++++
 5 files changed, 61 insertions(+), 19 deletions(-)

diff --git a/dlls/jscript/function.c b/dlls/jscript/function.c
index f54c8c6..59ece20 100644
--- a/dlls/jscript/function.c
+++ b/dlls/jscript/function.c
@@ -85,22 +85,58 @@ static HRESULT init_parameters(DispatchEx *var_disp, FunctionInstance *function,
     return S_OK;
 }
 
-static HRESULT init_arguments(DispatchEx *arg_disp, FunctionInstance *function, LCID lcid, DISPPARAMS *dp,
-        jsexcept_t *ei, IServiceProvider *caller)
+HRESULT Arguments_value(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp,
+        VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller)
+{
+    FIXME("\n");
+    return E_NOTIMPL;
+}
+
+static const builtin_info_t Arguments_info = {
+    JSCLASS_ARGUMENTS,
+    {NULL, Arguments_value, 0},
+    0, NULL,
+    NULL,
+    NULL
+};
+
+static HRESULT create_arguments(script_ctx_t *ctx, LCID lcid, DISPPARAMS *dp,
+        jsexcept_t *ei, IServiceProvider *caller, DispatchEx **ret)
 {
+    DispatchEx *args;
     VARIANT var;
     DWORD i;
     HRESULT hres;
 
-    for(i=0; i < dp->cArgs-dp->cNamedArgs; i++) {
-        hres = jsdisp_propput_idx(arg_disp, i, lcid, dp->rgvarg+dp->cArgs-1-i, ei, caller);
+    args = heap_alloc_zero(sizeof(DispatchEx));
+    if(!args)
+        return E_OUTOFMEMORY;
+
+    hres = init_dispex_from_constr(args, ctx, &Arguments_info, ctx->object_constr);
+    if(FAILED(hres)) {
+        heap_free(args);
+        return hres;
+    }
+
+    for(i=0; i < arg_cnt(dp); i++) {
+        hres = jsdisp_propput_idx(args, i, lcid, get_arg(dp,i), ei, caller);
         if(FAILED(hres))
-            return hres;
+            break;
     }
 
-    V_VT(&var) = VT_I4;
-    V_I4(&var) = dp->cArgs - dp->cNamedArgs;
-    return jsdisp_propput_name(arg_disp, lengthW, lcid, &var, ei, caller);
+    if(SUCCEEDED(hres)) {
+        V_VT(&var) = VT_I4;
+        V_I4(&var) = arg_cnt(dp);
+        hres = jsdisp_propput_name(args, lengthW, lcid, &var, ei, caller);
+    }
+
+    if(FAILED(hres)) {
+        jsdisp_release(args);
+        return hres;
+    }
+
+    *ret = args;
+    return S_OK;
 }
 
 static HRESULT create_var_disp(FunctionInstance *function, LCID lcid, DISPPARAMS *dp, jsexcept_t *ei,
@@ -115,17 +151,13 @@ static HRESULT create_var_disp(FunctionInstance *function, LCID lcid, DISPPARAMS
     if(FAILED(hres))
         return hres;
 
-    hres = create_dispex(function->dispex.ctx, NULL, NULL, &arg_disp);
+    hres = create_arguments(function->dispex.ctx, lcid, dp, ei, caller, &arg_disp);
     if(SUCCEEDED(hres)) {
-        hres = init_arguments(arg_disp, function, lcid, dp, ei, caller);
-        if(SUCCEEDED(hres)) {
-            VARIANT var;
-
-            V_VT(&var) = VT_DISPATCH;
-            V_DISPATCH(&var) = (IDispatch*)_IDispatchEx_(arg_disp);
-            hres = jsdisp_propput_name(var_disp, argumentsW, lcid, &var, ei, caller);
-        }
+        VARIANT var;
 
+        V_VT(&var) = VT_DISPATCH;
+        V_DISPATCH(&var) = (IDispatch*)_IDispatchEx_(arg_disp);
+        hres = jsdisp_propput_name(var_disp, argumentsW, lcid, &var, ei, caller);
         jsdisp_release(arg_disp);
     }
 
diff --git a/dlls/jscript/jscript.h b/dlls/jscript/jscript.h
index 01a6911..628cdfb 100644
--- a/dlls/jscript/jscript.h
+++ b/dlls/jscript/jscript.h
@@ -69,6 +69,7 @@ extern HINSTANCE jscript_hinstance;
 #define PROPF_ENUM    0x0200
 #define PROPF_CONSTR  0x0400
 
+/* NOTE: Keep in sync with names in Object.toString implementation */
 typedef enum {
     JSCLASS_NONE,
     JSCLASS_ARRAY,
@@ -81,7 +82,8 @@ typedef enum {
     JSCLASS_NUMBER,
     JSCLASS_OBJECT,
     JSCLASS_REGEXP,
-    JSCLASS_STRING
+    JSCLASS_STRING,
+    JSCLASS_ARGUMENTS
 } jsclass_t;
 
 typedef HRESULT (*builtin_invoke_t)(DispatchEx*,LCID,WORD,DISPPARAMS*,VARIANT*,jsexcept_t*,IServiceProvider*);
diff --git a/dlls/jscript/object.c b/dlls/jscript/object.c
index e8624bd..a87fa1f 100644
--- a/dlls/jscript/object.c
+++ b/dlls/jscript/object.c
@@ -49,7 +49,7 @@ static HRESULT Object_toString(DispatchEx *dispex, LCID lcid, WORD flags, DISPPA
     static const WCHAR stringW[] = {'S','t','r','i','n','g',0};
     /* Keep in sync with jsclass_t enum */
     static const WCHAR *names[] = {NULL, arrayW, booleanW, dateW, errorW,
-        functionW, NULL, mathW, numberW, objectW, regexpW, stringW};
+        functionW, NULL, mathW, numberW, objectW, regexpW, stringW, objectW};
 
     TRACE("\n");
 
diff --git a/dlls/jscript/tests/api.js b/dlls/jscript/tests/api.js
index a77f31a..db7bf68 100644
--- a/dlls/jscript/tests/api.js
+++ b/dlls/jscript/tests/api.js
@@ -1422,6 +1422,8 @@ testObjectInherit(new Error(), Error, false, true, true);
 testObjectInherit(testObjectInherit, Function, false, true, true);
 testObjectInherit(Math, Object, true, true, true);
 
+(function() { testObjectInherit(arguments, Object, true, true, true); })();
+
 function testFunctions(obj, arr) {
     var l;
 
diff --git a/dlls/jscript/tests/lang.js b/dlls/jscript/tests/lang.js
index e3abe27..5cd97d2 100644
--- a/dlls/jscript/tests/lang.js
+++ b/dlls/jscript/tests/lang.js
@@ -811,6 +811,12 @@ ok((1 instanceof Object) === false, "1 is instance of Object");
 ok((false instanceof Boolean) === false, "false is instance of Boolean");
 ok(("" instanceof Object) === false, "'' is instance of Object");
 
+(function () {
+    ok((arguments instanceof Object) === true, "argument is not instance of Object");
+    ok((arguments instanceof Array) === false, "argument is not instance of Array");
+    ok(arguments.toString() === "[object Object]", "arguments.toString() = " + arguments.toString());
+})(1,2);
+
 ok(isNaN(NaN) === true, "isNaN(NaN) !== true");
 ok(isNaN(0.5) === false, "isNaN(0.5) !== false");
 ok(isNaN(Infinity) === false, "isNaN(Infinity) !== false");




More information about the wine-cvs mailing list