Jacek Caban : vbscript: Added interp_new implementation.

Alexandre Julliard julliard at winehq.org
Thu Sep 15 12:34:54 CDT 2011


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

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Thu Sep 15 14:18:29 2011 +0200

vbscript: Added interp_new implementation.

---

 dlls/vbscript/interp.c       |   25 +++++++++++++++++++++++--
 dlls/vbscript/tests/lang.vbs |    4 ++++
 dlls/vbscript/vbdisp.c       |    2 +-
 dlls/vbscript/vbscript.h     |    1 +
 4 files changed, 29 insertions(+), 3 deletions(-)

diff --git a/dlls/vbscript/interp.c b/dlls/vbscript/interp.c
index dd4f4ff..04ed81d 100644
--- a/dlls/vbscript/interp.c
+++ b/dlls/vbscript/interp.c
@@ -447,8 +447,29 @@ static HRESULT interp_set_member(exec_ctx_t *ctx)
 static HRESULT interp_new(exec_ctx_t *ctx)
 {
     const WCHAR *arg = ctx->instr->arg1.bstr;
-    FIXME("%s\n", debugstr_w(arg));
-    return E_NOTIMPL;
+    class_desc_t *class_desc;
+    vbdisp_t *obj;
+    VARIANT v;
+    HRESULT hres;
+
+    TRACE("%s\n", debugstr_w(arg));
+
+    for(class_desc = ctx->script->classes; class_desc; class_desc = class_desc->next) {
+        if(!strcmpiW(class_desc->name, arg))
+            break;
+    }
+    if(!class_desc) {
+        FIXME("Class %s not found\n", debugstr_w(arg));
+        return E_FAIL;
+    }
+
+    hres = create_vbdisp(&obj);
+    if(FAILED(hres))
+        return hres;
+
+    V_VT(&v) = VT_DISPATCH;
+    V_DISPATCH(&v) = (IDispatch*)&obj->IDispatchEx_iface;
+    return stack_push(ctx, &v);
 }
 
 static HRESULT interp_jmp(exec_ctx_t *ctx)
diff --git a/dlls/vbscript/tests/lang.vbs b/dlls/vbscript/tests/lang.vbs
index 01c7072..c89009b 100644
--- a/dlls/vbscript/tests/lang.vbs
+++ b/dlls/vbscript/tests/lang.vbs
@@ -358,6 +358,10 @@ Call ok(x, "x is not set to true by SetVal?")
 set x = testObj
 Call ok(getVT(x) = "VT_DISPATCH*", "getVT(x=testObj) = " & getVT(x))
 
+Dim obj
+Set obj = New EmptyClass
+Call ok(getVT(obj) = "VT_DISPATCH*", "getVT(obj) = " & getVT(obj))
+
 Class EmptyClass
 End Class
 
diff --git a/dlls/vbscript/vbdisp.c b/dlls/vbscript/vbdisp.c
index 9cfdab2..73006be 100644
--- a/dlls/vbscript/vbdisp.c
+++ b/dlls/vbscript/vbdisp.c
@@ -184,7 +184,7 @@ static IDispatchExVtbl DispatchExVtbl = {
     DispatchEx_GetNameSpaceParent
 };
 
-static HRESULT create_vbdisp(vbdisp_t **ret)
+HRESULT create_vbdisp(vbdisp_t **ret)
 {
     vbdisp_t *vbdisp;
 
diff --git a/dlls/vbscript/vbscript.h b/dlls/vbscript/vbscript.h
index 3e3af5b..9e77714 100644
--- a/dlls/vbscript/vbscript.h
+++ b/dlls/vbscript/vbscript.h
@@ -74,6 +74,7 @@ typedef enum {
     VBDISP_ANY
 } vbdisp_invoke_type_t;
 
+HRESULT create_vbdisp(vbdisp_t**);
 HRESULT disp_get_id(IDispatch*,BSTR,DISPID*);
 HRESULT disp_call(script_ctx_t*,IDispatch*,DISPID,DISPPARAMS*,VARIANT*);
 HRESULT disp_propput(script_ctx_t*,IDispatch*,DISPID,VARIANT*);




More information about the wine-cvs mailing list