Jacek Caban : jscript: Use byte code for deleting identifier expressions.

Alexandre Julliard julliard at winehq.org
Thu Dec 15 12:47:21 CST 2011


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

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Thu Dec 15 15:42:27 2011 +0100

jscript: Use byte code for deleting identifier expressions.

---

 dlls/jscript/compile.c |    2 +
 dlls/jscript/engine.c  |   79 ++++++++++++++++++++++-------------------------
 dlls/jscript/engine.h  |    1 +
 3 files changed, 40 insertions(+), 42 deletions(-)

diff --git a/dlls/jscript/compile.c b/dlls/jscript/compile.c
index ff53c90..7188f4c1 100644
--- a/dlls/jscript/compile.c
+++ b/dlls/jscript/compile.c
@@ -487,6 +487,8 @@ static HRESULT compile_delete_expression(compiler_ctx_t *ctx, unary_expression_t
             return E_OUTOFMEMORY;
         break;
     }
+    case EXPR_IDENT:
+        return push_instr_bstr(ctx, OP_delete_ident, ((identifier_expression_t*)expr->expression)->identifier);
     default:
         expr->expr.eval = delete_expression_eval;
         return compile_interp_fallback(ctx, &expr->expr);
diff --git a/dlls/jscript/engine.c b/dlls/jscript/engine.c
index e399aa8..2dcdd44 100644
--- a/dlls/jscript/engine.c
+++ b/dlls/jscript/engine.c
@@ -1399,15 +1399,6 @@ HRESULT try_statement_eval(script_ctx_t *ctx, statement_t *_stat, return_type_t
     return S_OK;
 }
 
-static HRESULT return_bool(exprval_t *ret, DWORD b)
-{
-    ret->type = EXPRVAL_VARIANT;
-    V_VT(&ret->u.var) = VT_BOOL;
-    V_BOOL(&ret->u.var) = b ? VARIANT_TRUE : VARIANT_FALSE;
-
-    return S_OK;
-}
-
 /* ECMA-262 3rd Edition    13 */
 HRESULT function_expression_eval(script_ctx_t *ctx, expression_t *_expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
 {
@@ -2377,39 +2368,8 @@ static HRESULT interp_mod(exec_ctx_t *ctx)
 /* ECMA-262 3rd Edition    11.4.2 */
 HRESULT delete_expression_eval(script_ctx_t *ctx, expression_t *_expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
 {
-    unary_expression_t *expr = (unary_expression_t*)_expr;
-    VARIANT_BOOL b = VARIANT_FALSE;
-    exprval_t exprval;
-    HRESULT hres;
-
-    TRACE("\n");
-
-    hres = expr_eval(ctx, expr->expression, 0, ei, &exprval);
-    if(FAILED(hres))
-        return hres;
-
-    switch(exprval.type) {
-    case EXPRVAL_IDREF: {
-        IDispatchEx *dispex;
-
-        hres = IDispatch_QueryInterface(exprval.u.idref.disp, &IID_IDispatchEx, (void**)&dispex);
-        if(SUCCEEDED(hres)) {
-            hres = IDispatchEx_DeleteMemberByDispID(dispex, exprval.u.idref.id);
-            b = VARIANT_TRUE;
-            IDispatchEx_Release(dispex);
-        }
-        break;
-    }
-    default:
-        FIXME("unsupported type %d\n", exprval.type);
-        hres = E_NOTIMPL;
-    }
-
-    exprval_release(&exprval);
-    if(FAILED(hres))
-        return hres;
-
-    return return_bool(ret, b);
+    FIXME("\n");
+    return E_NOTIMPL;
 }
 
 /* ECMA-262 3rd Edition    11.4.2 */
@@ -2460,6 +2420,41 @@ static HRESULT interp_delete(exec_ctx_t *ctx)
 }
 
 /* ECMA-262 3rd Edition    11.4.2 */
+static HRESULT interp_delete_ident(exec_ctx_t *ctx)
+{
+    const BSTR arg = ctx->parser->code->instrs[ctx->ip].arg1.bstr;
+    IDispatchEx *dispex;
+    exprval_t exprval;
+    BOOL ret = FALSE;
+    HRESULT hres;
+
+    TRACE("%s\n", debugstr_w(arg));
+
+    hres = identifier_eval(ctx->parser->script, arg, 0, &ctx->ei, &exprval);
+    if(FAILED(hres))
+        return hres;
+
+    if(exprval.type != EXPRVAL_IDREF) {
+        FIXME("Unsupported exprval\n");
+        exprval_release(&exprval);
+        return E_NOTIMPL;
+    }
+
+    hres = IDispatch_QueryInterface(exprval.u.idref.disp, &IID_IDispatchEx, (void**)&dispex);
+    IDispatch_Release(exprval.u.idref.disp);
+    if(SUCCEEDED(hres)) {
+        hres = IDispatchEx_DeleteMemberByDispID(dispex, exprval.u.idref.id);
+        IDispatchEx_Release(dispex);
+        if(FAILED(hres))
+            return hres;
+
+        ret = TRUE;
+    }
+
+    return stack_push_bool(ctx, ret);
+}
+
+/* ECMA-262 3rd Edition    11.4.2 */
 static HRESULT interp_void(exec_ctx_t *ctx)
 {
     VARIANT v;
diff --git a/dlls/jscript/engine.h b/dlls/jscript/engine.h
index 0c46383..3147092 100644
--- a/dlls/jscript/engine.h
+++ b/dlls/jscript/engine.h
@@ -52,6 +52,7 @@ typedef struct _func_stack {
     X(call_member,1, ARG_UINT,   ARG_UINT) \
     X(carray,     1, ARG_UINT,   0)        \
     X(delete,     1, 0,0)                  \
+    X(delete_ident,1,ARG_BSTR,   0)        \
     X(div,        1, 0,0)                  \
     X(double,     1, ARG_SBL,    0)        \
     X(eq,         1, 0,0)                  \




More information about the wine-cvs mailing list