Jacek Caban : jscript: Always use compiler for member, array and identifier expressions.

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


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

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

jscript: Always use compiler for member, array and identifier expressions.

---

 dlls/jscript/engine.c |   40 +++++++++++++++-------------------------
 dlls/jscript/engine.h |    3 ---
 dlls/jscript/parser.y |    6 +++---
 3 files changed, 18 insertions(+), 31 deletions(-)

diff --git a/dlls/jscript/engine.c b/dlls/jscript/engine.c
index cdfc4e3..31781ef 100644
--- a/dlls/jscript/engine.c
+++ b/dlls/jscript/engine.c
@@ -282,12 +282,6 @@ static HRESULT exprval_to_boolean(script_ctx_t *ctx, exprval_t *exprval, jsexcep
     return to_boolean(&exprval->u.var, b);
 }
 
-static void exprval_init(exprval_t *val)
-{
-    val->type = EXPRVAL_VARIANT;
-    V_VT(&val->u.var) = VT_EMPTY;
-}
-
 static void exprval_set_idref(exprval_t *val, IDispatch *disp, DISPID id)
 {
     val->type = EXPRVAL_IDREF;
@@ -1012,6 +1006,10 @@ HRESULT for_statement_eval(script_ctx_t *ctx, statement_t *_stat, return_type_t
     return S_OK;
 }
 
+static HRESULT array_expression_eval(script_ctx_t*,expression_t*,jsexcept_t*,exprval_t*);
+static HRESULT member_expression_eval(script_ctx_t*,expression_t*,jsexcept_t*,exprval_t*);
+static HRESULT identifier_expression_eval(script_ctx_t*,expression_t*,jsexcept_t*,exprval_t*);
+
 /* ECMA-262 3rd Edition    12.6.4 */
 HRESULT forin_statement_eval(script_ctx_t *ctx, statement_t *_stat, return_type_t *rt, VARIANT *ret)
 {
@@ -1076,13 +1074,13 @@ HRESULT forin_statement_eval(script_ctx_t *ctx, statement_t *_stat, return_type_
         }else {
             switch(stat->expr->type) {
             case EXPR_ARRAY:
-                hres = array_expression_eval(ctx, stat->expr, EXPR_NEWREF, &rt->ei, &exprval);
+                hres = array_expression_eval(ctx, stat->expr, &rt->ei, &exprval);
                 break;
             case EXPR_IDENT:
-                hres = identifier_expression_eval(ctx, stat->expr, EXPR_NEWREF, &rt->ei, &exprval);
+                hres = identifier_expression_eval(ctx, stat->expr, &rt->ei, &exprval);
                 break;
             case EXPR_MEMBER:
-                hres = member_expression_eval(ctx, stat->expr, EXPR_NEWREF, &rt->ei, &exprval);
+                hres = member_expression_eval(ctx, stat->expr, &rt->ei, &exprval);
                 break;
             default:
                 hres = expr_eval(ctx, stat->expr, 0, &rt->ei, &exprval);
@@ -1452,7 +1450,7 @@ HRESULT function_expression_eval(script_ctx_t *ctx, expression_t *_expr, DWORD f
 }
 
 /* ECMA-262 3rd Edition    11.2.1 */
-HRESULT array_expression_eval(script_ctx_t *ctx, expression_t *_expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
+static HRESULT array_expression_eval(script_ctx_t *ctx, expression_t *_expr, jsexcept_t *ei, exprval_t *ret)
 {
     binary_expression_t *expr = (binary_expression_t*)_expr;
     exprval_t exprval;
@@ -1489,16 +1487,12 @@ HRESULT array_expression_eval(script_ctx_t *ctx, expression_t *_expr, DWORD flag
         hres = to_string(ctx, &val, ei, &str);
         VariantClear(&val);
         if(SUCCEEDED(hres)) {
-            hres = disp_get_id(ctx, obj, str, flags & EXPR_NEWREF ? fdexNameEnsure : 0, &id);
+            hres = disp_get_id(ctx, obj, str, fdexNameEnsure, &id);
             SysFreeString(str);
         }
 
-        if(SUCCEEDED(hres)) {
+        if(SUCCEEDED(hres))
             exprval_set_idref(ret, obj, id);
-        }else if(!(flags & EXPR_NEWREF) && hres == DISP_E_UNKNOWNNAME) {
-            exprval_init(ret);
-            hres = S_OK;
-        }
 
         IDispatch_Release(obj);
     }
@@ -1548,7 +1542,7 @@ static HRESULT interp_array(exec_ctx_t *ctx)
 }
 
 /* ECMA-262 3rd Edition    11.2.1 */
-HRESULT member_expression_eval(script_ctx_t *ctx, expression_t *_expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
+static HRESULT member_expression_eval(script_ctx_t *ctx, expression_t *_expr, jsexcept_t *ei, exprval_t *ret)
 {
     member_expression_t *expr = (member_expression_t*)_expr;
     IDispatch *obj = NULL;
@@ -1580,14 +1574,10 @@ HRESULT member_expression_eval(script_ctx_t *ctx, expression_t *_expr, DWORD fla
         return E_OUTOFMEMORY;
     }
 
-    hres = disp_get_id(ctx, obj, str, flags & EXPR_NEWREF ? fdexNameEnsure : 0, &id);
+    hres = disp_get_id(ctx, obj, str, fdexNameEnsure, &id);
     SysFreeString(str);
-    if(SUCCEEDED(hres)) {
+    if(SUCCEEDED(hres))
         exprval_set_idref(ret, obj, id);
-    }else if(!(flags & EXPR_NEWREF) && hres == DISP_E_UNKNOWNNAME) {
-        exprval_init(ret);
-        hres = S_OK;
-    }
 
     IDispatch_Release(obj);
     return hres;
@@ -1803,7 +1793,7 @@ static HRESULT interp_this(exec_ctx_t *ctx)
 }
 
 /* ECMA-262 3rd Edition    10.1.4 */
-HRESULT identifier_expression_eval(script_ctx_t *ctx, expression_t *_expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
+static HRESULT identifier_expression_eval(script_ctx_t *ctx, expression_t *_expr, jsexcept_t *ei, exprval_t *ret)
 {
     identifier_expression_t *expr = (identifier_expression_t*)_expr;
     BSTR identifier;
@@ -1815,7 +1805,7 @@ HRESULT identifier_expression_eval(script_ctx_t *ctx, expression_t *_expr, DWORD
     if(!identifier)
         return E_OUTOFMEMORY;
 
-    hres = identifier_eval(ctx, identifier, flags, ei, ret);
+    hres = identifier_eval(ctx, identifier, EXPR_NEWREF, ei, ret);
 
     SysFreeString(identifier);
     return hres;
diff --git a/dlls/jscript/engine.h b/dlls/jscript/engine.h
index b2707cf..2cea63d 100644
--- a/dlls/jscript/engine.h
+++ b/dlls/jscript/engine.h
@@ -566,9 +566,6 @@ typedef struct {
 } property_value_expression_t;
 
 HRESULT function_expression_eval(script_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*) DECLSPEC_HIDDEN;
-HRESULT array_expression_eval(script_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*) DECLSPEC_HIDDEN;
-HRESULT member_expression_eval(script_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*) DECLSPEC_HIDDEN;
-HRESULT identifier_expression_eval(script_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*) DECLSPEC_HIDDEN;
 HRESULT property_value_expression_eval(script_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*) DECLSPEC_HIDDEN;
 
 HRESULT compiled_expression_eval(script_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*) DECLSPEC_HIDDEN;
diff --git a/dlls/jscript/parser.y b/dlls/jscript/parser.y
index 013b7fe..c791e9c 100644
--- a/dlls/jscript/parser.y
+++ b/dlls/jscript/parser.y
@@ -1352,13 +1352,13 @@ static const expression_eval_t expression_eval_table[] = {
    compiled_expression_eval,
    compiled_expression_eval,
    compiled_expression_eval,
-   array_expression_eval,
-   member_expression_eval,
+   compiled_expression_eval,
+   compiled_expression_eval,
    compiled_expression_eval,
    compiled_expression_eval,
    compiled_expression_eval,
    function_expression_eval,
-   identifier_expression_eval,
+   compiled_expression_eval,
    compiled_expression_eval,
    property_value_expression_eval,
    compiled_expression_eval




More information about the wine-cvs mailing list