Jacek Caban : jscript: Added member expression implementation.

Alexandre Julliard julliard at winehq.org
Tue Sep 9 05:50:49 CDT 2008


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

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Tue Sep  9 01:27:18 2008 +0200

jscript: Added member expression implementation.

---

 dlls/jscript/engine.c  |   54 +++++++++++++++++++++++++++++++++++++++++++++--
 dlls/jscript/jscript.h |    1 +
 dlls/jscript/jsutils.c |   16 ++++++++++++++
 3 files changed, 68 insertions(+), 3 deletions(-)

diff --git a/dlls/jscript/engine.c b/dlls/jscript/engine.c
index 2a98643..183eca4 100644
--- a/dlls/jscript/engine.c
+++ b/dlls/jscript/engine.c
@@ -104,6 +104,12 @@ 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;
@@ -647,10 +653,52 @@ HRESULT array_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags,
     return E_NOTIMPL;
 }
 
-HRESULT member_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
+/* ECMA-262 3rd Edition    11.2.1 */
+HRESULT member_expression_eval(exec_ctx_t *ctx, expression_t *_expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
 {
-    FIXME("\n");
-    return E_NOTIMPL;
+    member_expression_t *expr = (member_expression_t*)_expr;
+    IDispatch *obj = NULL;
+    exprval_t exprval;
+    VARIANT member;
+    DISPID id;
+    BSTR str;
+    HRESULT hres;
+
+    TRACE("\n");
+
+    hres = expr_eval(ctx, expr->expression, 0, ei, &exprval);
+    if(FAILED(hres))
+        return hres;
+
+    hres = exprval_to_value(ctx->parser->script, &exprval, ei, &member);
+    exprval_release(&exprval);
+    if(FAILED(hres))
+        return hres;
+
+    hres = to_object(ctx, &member, &obj);
+    VariantClear(&member);
+    if(FAILED(hres))
+        return hres;
+
+    str = SysAllocString(expr->identifier);
+    if(flags & EXPR_STRREF) {
+        ret->type = EXPRVAL_NAMEREF;
+        ret->u.nameref.disp = obj;
+        ret->u.nameref.name = str;
+        return S_OK;
+    }
+
+    hres = disp_get_id(obj, str, flags & EXPR_NEW ? fdexNameEnsure : 0, &id);
+    SysFreeString(str);
+    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;
 }
 
 static void free_dp(DISPPARAMS *dp)
diff --git a/dlls/jscript/jscript.h b/dlls/jscript/jscript.h
index a8fc379..0144dbf 100644
--- a/dlls/jscript/jscript.h
+++ b/dlls/jscript/jscript.h
@@ -98,6 +98,7 @@ HRESULT jsdisp_set_prototype(DispatchEx*,DispatchEx*);
 HRESULT create_builtin_function(script_ctx_t*,builtin_invoke_t,DWORD,DispatchEx*,DispatchEx**);
 
 HRESULT to_boolean(VARIANT*,VARIANT_BOOL*);
+HRESULT to_object(exec_ctx_t*,VARIANT*,IDispatch**);
 
 typedef struct named_item_t {
     IDispatch *disp;
diff --git a/dlls/jscript/jsutils.c b/dlls/jscript/jsutils.c
index c29f673..de04dfb 100644
--- a/dlls/jscript/jsutils.c
+++ b/dlls/jscript/jsutils.c
@@ -163,3 +163,19 @@ HRESULT to_boolean(VARIANT *v, VARIANT_BOOL *b)
 
     return S_OK;
 }
+
+/* ECMA-262 3rd Edition    9.9 */
+HRESULT to_object(exec_ctx_t *ctx, VARIANT *v, IDispatch **disp)
+{
+    switch(V_VT(v)) {
+    case VT_DISPATCH:
+        IDispatch_AddRef(V_DISPATCH(v));
+        *disp = V_DISPATCH(v);
+        break;
+    default:
+        FIXME("unsupported vt %d\n", V_VT(v));
+        return E_NOTIMPL;
+    }
+
+    return S_OK;
+}




More information about the wine-cvs mailing list