Jacek Caban : jscript: Support passing EXPRVAL_JSVAL through JS stack.

Alexandre Julliard julliard at winehq.org
Mon Apr 12 16:11:26 CDT 2021


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

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Mon Apr 12 15:47:45 2021 +0200

jscript: Support passing EXPRVAL_JSVAL through JS stack.

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

---

 dlls/jscript/engine.c | 25 ++++++++++++++++++++++++-
 1 file changed, 24 insertions(+), 1 deletion(-)

diff --git a/dlls/jscript/engine.c b/dlls/jscript/engine.c
index 018597829ed..106fdabd81c 100644
--- a/dlls/jscript/engine.c
+++ b/dlls/jscript/engine.c
@@ -171,7 +171,10 @@ static HRESULT stack_push_exprval(script_ctx_t *ctx, exprval_t *val)
 
     switch(val->type) {
     case EXPRVAL_JSVAL:
-        assert(0);
+        hres = stack_push(ctx, jsval_null());
+        if(SUCCEEDED(hres))
+            hres = stack_push(ctx, val->u.val);
+        return hres;
     case EXPRVAL_IDREF:
         hres = stack_push(ctx, jsval_disp(val->u.idref.disp));
         if(SUCCEEDED(hres))
@@ -245,6 +248,10 @@ static BOOL stack_topn_exprval(script_ctx_t *ctx, unsigned n, exprval_t *r)
         assert(is_number(stack_topn(ctx, n)));
         r->u.hres = get_number(stack_topn(ctx, n));
         return FALSE;
+    case JSV_NULL:
+        r->type = EXPRVAL_JSVAL;
+        r->u.val = stack_topn(ctx, n);
+        return TRUE;
     default:
         assert(0);
         return FALSE;
@@ -268,6 +275,9 @@ static HRESULT exprval_propput(script_ctx_t *ctx, exprval_t *ref, jsval_t v)
     }
     case EXPRVAL_IDREF:
         return disp_propput(ctx, ref->u.idref.disp, ref->u.idref.id, v);
+    case EXPRVAL_JSVAL:
+        WARN("ignoring an attempt to set value reference\n");
+        return S_OK;
     default:
         assert(0);
         return E_FAIL;
@@ -281,6 +291,8 @@ static HRESULT exprval_propget(script_ctx_t *ctx, exprval_t *ref, jsval_t *r)
         return jsval_copy(ctx->stack[ref->u.off], r);
     case EXPRVAL_IDREF:
         return disp_propget(ctx, ref->u.idref.disp, ref->u.idref.id, r);
+    case EXPRVAL_JSVAL:
+        return jsval_copy(ref->u.val, r);
     default:
         assert(0);
         return E_FAIL;
@@ -302,6 +314,17 @@ static HRESULT exprval_call(script_ctx_t *ctx, exprval_t *ref, WORD flags, unsig
     }
     case EXPRVAL_IDREF:
         return disp_call(ctx, ref->u.idref.disp, ref->u.idref.id, flags, argc, argv, r);
+    case EXPRVAL_JSVAL: {
+        IDispatch *obj;
+        HRESULT hres;
+
+        hres = to_object(ctx, ref->u.val, &obj);
+        if(SUCCEEDED(hres)) {
+            hres = disp_call_value(ctx, obj, NULL, flags, argc, argv, r);
+            IDispatch_Release(obj);
+        }
+        return hres;
+    }
     default:
         assert(0);
         return E_FAIL;




More information about the wine-cvs mailing list