jscript: Added constructor invokation from Function object support.
authorJacek Caban <jacek@codeweavers.com>
Wed, 10 Sep 2008 19:08:26 +0000 (21:08 +0200)
committerAlexandre Julliard <julliard@winehq.org>
Thu, 11 Sep 2008 10:01:42 +0000 (12:01 +0200)
dlls/jscript/function.c
dlls/jscript/tests/lang.js

index 615e7ce..d4a3b62 100644 (file)
@@ -185,6 +185,28 @@ static HRESULT invoke_function(FunctionInstance *function, LCID lcid, DISPPARAMS
     return invoke_source(function, this_obj, lcid, dp, retv, ei, caller);
 }
 
+static HRESULT invoke_constructor(FunctionInstance *function, LCID lcid, DISPPARAMS *dp,
+        VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller)
+{
+    DispatchEx *this_obj;
+    VARIANT var;
+    HRESULT hres;
+
+    hres = create_object(function->dispex.ctx, &function->dispex, &this_obj);
+    if(FAILED(hres))
+        return hres;
+
+    hres = invoke_source(function, (IDispatch*)_IDispatchEx_(this_obj), lcid, dp, retv, ei, caller);
+    jsdisp_release(this_obj);
+    if(FAILED(hres))
+        return hres;
+
+    VariantClear(&var);
+    V_VT(retv) = VT_DISPATCH;
+    V_DISPATCH(retv) = (IDispatch*)_IDispatchEx_(this_obj);
+    return S_OK;
+}
+
 static HRESULT invoke_value_proc(FunctionInstance *function, LCID lcid, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller)
 {
@@ -301,6 +323,12 @@ static HRESULT Function_value(DispatchEx *dispex, LCID lcid, WORD flags, DISPPAR
 
         return invoke_function(function, lcid, dp, retv, ei, caller);
 
+    case DISPATCH_CONSTRUCT:
+        if(function->value_proc)
+            return invoke_value_proc(function, lcid, flags, dp, retv, ei, caller);
+
+        return invoke_constructor(function, lcid, dp, retv, ei, caller);
+
     default:
         FIXME("not implemented flags %x\n", flags);
         return E_NOTIMPL;
index dca0771..4e76b21 100644 (file)
@@ -79,4 +79,7 @@ ok(typeof(this) === "object", "typeof(this) is not object");
 
 ok(testFunc1(true, "test") === true, "testFunc1 not returned true");
 
+var obj1 = new Object();
+ok(typeof(obj1) === "object", "typeof(obj1) is not object");
+
 reportSuccess();