Module: wine Branch: master Commit: fb57bc21b8471d47764793a4b06cd32592b25f5e URL: http://source.winehq.org/git/wine.git/?a=commit;h=fb57bc21b8471d47764793a4b0...
Author: Jacek Caban jacek@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*);