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