Piotr Caban : jscript: Added call_expression_eval implementation for EXPRVAL_VARIANT values.

Alexandre Julliard julliard at winehq.org
Tue Jul 14 10:37:23 CDT 2009


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

Author: Piotr Caban <piotr.caban at gmail.com>
Date:   Tue Jul 14 01:36:27 2009 +0200

jscript: Added call_expression_eval implementation for EXPRVAL_VARIANT values.

---

 dlls/jscript/engine.c      |   24 ++++++++++++++++++------
 dlls/jscript/tests/lang.js |    2 ++
 2 files changed, 20 insertions(+), 6 deletions(-)

diff --git a/dlls/jscript/engine.c b/dlls/jscript/engine.c
index 00eb087..b744904 100644
--- a/dlls/jscript/engine.c
+++ b/dlls/jscript/engine.c
@@ -1536,11 +1536,19 @@ HRESULT call_expression_eval(exec_ctx_t *ctx, expression_t *_expr, DWORD flags,
     hres = args_to_param(ctx, expr->argument_list, ei, &dp);
     if(SUCCEEDED(hres)) {
         switch(exprval.type) {
+        case EXPRVAL_VARIANT:
+            if(V_VT(&exprval.u.var) != VT_DISPATCH) {
+                FIXME("throw TypeError\n");
+                hres = E_NOTIMPL;
+                break;
+            }
+
+            hres = disp_call(V_DISPATCH(&exprval.u.var), DISPID_VALUE, ctx->parser->script->lcid,
+                    DISPATCH_METHOD, &dp, flags & EXPR_NOVAL ? NULL : &var, ei, NULL/*FIXME*/);
+            break;
         case EXPRVAL_IDREF:
-            hres = disp_call(exprval.u.idref.disp, exprval.u.idref.id, ctx->parser->script->lcid, DISPATCH_METHOD,
-                    &dp, flags & EXPR_NOVAL ? NULL : &var, ei, NULL/*FIXME*/);
-            if(flags & EXPR_NOVAL)
-                V_VT(&var) = VT_EMPTY;
+            hres = disp_call(exprval.u.idref.disp, exprval.u.idref.id, ctx->parser->script->lcid,
+                    DISPATCH_METHOD, &dp, flags & EXPR_NOVAL ? NULL : &var, ei, NULL/*FIXME*/);
             break;
         default:
             FIXME("unimplemented type %d\n", exprval.type);
@@ -1554,9 +1562,13 @@ HRESULT call_expression_eval(exec_ctx_t *ctx, expression_t *_expr, DWORD flags,
     if(FAILED(hres))
         return hres;
 
-    TRACE("= %s\n", debugstr_variant(&var));
     ret->type = EXPRVAL_VARIANT;
-    ret->u.var = var;
+    if(flags & EXPR_NOVAL) {
+        V_VT(&ret->u.var) = VT_EMPTY;
+    }else {
+        TRACE("= %s\n", debugstr_variant(&var));
+        ret->u.var = var;
+    }
     return S_OK;
 }
 
diff --git a/dlls/jscript/tests/lang.js b/dlls/jscript/tests/lang.js
index b865ad5..a9e0459 100644
--- a/dlls/jscript/tests/lang.js
+++ b/dlls/jscript/tests/lang.js
@@ -894,4 +894,6 @@ ok(""+str === "valueOf", "''+str = " + str);
 str.valueOf = function() { return new Date(); }
 ok(""+str === "test", "''+str = " + str);
 
+ok((function (){return 1;})() === 1, "(function (){return 1;})() = " + (function (){return 1;})());
+
 reportSuccess();




More information about the wine-cvs mailing list