Jacek Caban : jscript: Added 'new' expression implementation.

Alexandre Julliard julliard at winehq.org
Thu Sep 18 07:55:45 CDT 2008


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

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Wed Sep 17 23:29:58 2008 +0200

jscript: Added 'new' expression implementation.

---

 dlls/jscript/engine.c      |   17 ++++++-----------
 dlls/jscript/engine.h      |    4 +---
 dlls/jscript/parser.y      |   11 +++++------
 dlls/jscript/tests/lang.js |    3 +++
 4 files changed, 15 insertions(+), 20 deletions(-)

diff --git a/dlls/jscript/engine.c b/dlls/jscript/engine.c
index 6f5beb4..6833954 100644
--- a/dlls/jscript/engine.c
+++ b/dlls/jscript/engine.c
@@ -41,7 +41,8 @@ static void exprval_release(exprval_t *val)
 {
     switch(val->type) {
     case EXPRVAL_VARIANT:
-        VariantClear(&val->u.var);
+        if(V_VT(&val->u.var) != VT_EMPTY)
+            VariantClear(&val->u.var);
         return;
     case EXPRVAL_IDREF:
         if(val->u.idref.disp)
@@ -1054,7 +1055,7 @@ HRESULT member_expression_eval(exec_ctx_t *ctx, expression_t *_expr, DWORD flags
         return S_OK;
     }
 
-    hres = disp_get_id(obj, str, flags & EXPR_NEW ? fdexNameEnsure : 0, &id);
+    hres = disp_get_id(obj, str, flags & EXPR_NEWREF ? fdexNameEnsure : 0, &id);
     SysFreeString(str);
     if(SUCCEEDED(hres)) {
         exprval_set_idref(ret, obj, id);
@@ -1085,11 +1086,11 @@ static HRESULT args_to_param(exec_ctx_t *ctx, argument_t *args, jsexcept_t *ei,
     HRESULT hres = S_OK;
 
     memset(dp, 0, sizeof(*dp));
+    if(!args)
+        return S_OK;
 
     for(iter = args; iter; iter = iter->next)
         cnt++;
-    if(!cnt)
-        return S_OK;
 
     vargs = heap_alloc_zero(cnt * sizeof(*vargs));
     if(!vargs)
@@ -1117,7 +1118,7 @@ static HRESULT args_to_param(exec_ctx_t *ctx, argument_t *args, jsexcept_t *ei,
 }
 
 /* ECMA-262 3rd Edition    11.2.2 */
-HRESULT member_new_expression_eval(exec_ctx_t *ctx, expression_t *_expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
+HRESULT new_expression_eval(exec_ctx_t *ctx, expression_t *_expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
 {
     call_expression_t *expr = (call_expression_t*)_expr;
     exprval_t exprval;
@@ -1847,12 +1848,6 @@ HRESULT pre_decrement_expression_eval(exec_ctx_t *ctx, expression_t *_expr, DWOR
     return S_OK;
 }
 
-HRESULT new_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
-{
-    FIXME("\n");
-    return E_NOTIMPL;
-}
-
 /* ECMA-262 3rd Edition    11.9.3 */
 static HRESULT equal_values(exec_ctx_t *ctx, VARIANT *lval, VARIANT *rval, jsexcept_t *ei, BOOL *ret)
 {
diff --git a/dlls/jscript/engine.h b/dlls/jscript/engine.h
index c37bc24..5c64853 100644
--- a/dlls/jscript/engine.h
+++ b/dlls/jscript/engine.h
@@ -395,7 +395,6 @@ typedef enum {
      EXPR_POSTDEC,
      EXPR_PREINC,
      EXPR_PREDEC,
-     EXPR_NEW,
      EXPR_EQ,
      EXPR_EQEQ,
      EXPR_NOTEQ,
@@ -427,7 +426,7 @@ HRESULT function_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exp
 HRESULT conditional_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*);
 HRESULT array_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*);
 HRESULT member_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*);
-HRESULT member_new_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*);
+HRESULT new_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*);
 HRESULT call_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*);
 HRESULT this_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*);
 HRESULT identifier_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*);
@@ -457,7 +456,6 @@ HRESULT post_increment_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_
 HRESULT post_decrement_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*);
 HRESULT pre_increment_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*);
 HRESULT pre_decrement_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*);
-HRESULT new_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*);
 HRESULT equal_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*);
 HRESULT equal2_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*);
 HRESULT not_equal_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*);
diff --git a/dlls/jscript/parser.y b/dlls/jscript/parser.y
index f721a8e..998ab81 100644
--- a/dlls/jscript/parser.y
+++ b/dlls/jscript/parser.y
@@ -126,7 +126,7 @@ static expression_t *new_unary_expression(parser_ctx_t*,expression_type_t,expres
 static expression_t *new_conditional_expression(parser_ctx_t*,expression_t*,expression_t*,expression_t*);
 static expression_t *new_array_expression(parser_ctx_t*,expression_t*,expression_t*);
 static expression_t *new_member_expression(parser_ctx_t*,expression_t*,const WCHAR*);
-static expression_t *new_member_new_expression(parser_ctx_t*,expression_t*,argument_list_t*);
+static expression_t *new_new_expression(parser_ctx_t*,expression_t*,argument_list_t*);
 static expression_t *new_call_expression(parser_ctx_t*,expression_t*,argument_list_t*);
 static expression_t *new_this_expression(parser_ctx_t*);
 static expression_t *new_identifier_expression(parser_ctx_t*,const WCHAR*);
@@ -676,7 +676,7 @@ LeftHandSideExpression
 /* ECMA-262 3rd Edition    11.2 */
 NewExpression
         : MemberExpression      { $$ = $1; }
-        | kNEW NewExpression    { $$ = new_unary_expression(ctx, EXPR_NEW, $2); }
+        | kNEW NewExpression    { $$ = new_new_expression(ctx, $2, NULL); }
 
 /* ECMA-262 3rd Edition    11.2 */
 MemberExpression
@@ -687,7 +687,7 @@ MemberExpression
         | MemberExpression '.' tIdentifier
                                 { $$ = new_member_expression(ctx, $1, $3); }
         | kNEW MemberExpression Arguments
-                                { $$ = new_member_new_expression(ctx, $2, $3); }
+                                { $$ = new_new_expression(ctx, $2, $3); }
 
 /* ECMA-262 3rd Edition    11.2 */
 CallExpression
@@ -1281,7 +1281,6 @@ static const expression_eval_t expression_eval_table[] = {
    post_decrement_expression_eval,
    pre_increment_expression_eval,
    pre_decrement_expression_eval,
-   new_expression_eval,
    equal_expression_eval,
    equal2_expression_eval,
    not_equal_expression_eval,
@@ -1366,11 +1365,11 @@ static expression_t *new_member_expression(parser_ctx_t *ctx, expression_t *expr
     return &ret->expr;
 }
 
-static expression_t *new_member_new_expression(parser_ctx_t *ctx, expression_t *expression, argument_list_t *argument_list)
+static expression_t *new_new_expression(parser_ctx_t *ctx, expression_t *expression, argument_list_t *argument_list)
 {
     call_expression_t *ret = parser_alloc(ctx, sizeof(call_expression_t));
 
-    ret->expr.eval = member_new_expression_eval;
+    ret->expr.eval = new_expression_eval;
     ret->expression = expression;
     ret->argument_list = argument_list ? argument_list->head : NULL;
 
diff --git a/dlls/jscript/tests/lang.js b/dlls/jscript/tests/lang.js
index 5f9848e..32bafc6 100644
--- a/dlls/jscript/tests/lang.js
+++ b/dlls/jscript/tests/lang.js
@@ -133,6 +133,9 @@ obj2.pvar = 3;
 testConstr1.prototype.pvar = 1;
 ok(obj2.pvar === 3, "obj2.pvar is not 3");
 
+var obj3 = new Object;
+ok(typeof(obj3) === "object", "typeof(obj3) is not object");
+
 tmp = 0;
 if(true)
     tmp = 1;




More information about the wine-cvs mailing list