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