instr_t *instr;
script_ctx_t *script;
function_t *func;
+ IDispatch *this_obj;
VARIANT *args;
VARIANT *vars;
}
}
+ hres = disp_get_id(ctx->this_obj, name, TRUE, &id);
+ if(SUCCEEDED(hres)) {
+ ref->type = REF_DISP;
+ ref->u.d.disp = ctx->this_obj;
+ ref->u.d.id = id;
+ return S_OK;
+ }
+
if(lookup_dynamic_vars(ctx->script->global_vars, name, ref))
return S_OK;
}
LIST_FOR_EACH_ENTRY(item, &ctx->script->named_items, named_item_t, entry) {
- if(item->flags & SCRIPTITEM_GLOBALMEMBERS) {
- hres = disp_get_id(item->disp, name, &id);
+ if((item->flags & SCRIPTITEM_GLOBALMEMBERS) && item->disp != ctx->this_obj) {
+ hres = disp_get_id(item->disp, name, FALSE, &id);
if(SUCCEEDED(hres)) {
ref->type = REF_DISP;
ref->u.d.disp = item->disp;
return hres;
break;
case REF_FUNC:
- hres = exec_script(ctx->script, ref.u.f, &dp, res);
+ hres = exec_script(ctx->script, ref.u.f, NULL, &dp, res);
if(FAILED(hres))
return hres;
break;
vbstack_to_dp(ctx, arg_cnt, &dp);
- hres = disp_get_id(obj, identifier, &id);
+ hres = disp_get_id(obj, identifier, FALSE, &id);
if(SUCCEEDED(hres))
hres = disp_call(ctx->script, obj, id, &dp, res);
IDispatch_Release(obj);
return hres;
}
- hres = disp_get_id(obj, identifier, &id);
+ hres = disp_get_id(obj, identifier, FALSE, &id);
if(SUCCEEDED(hres))
hres = disp_propput(ctx->script, obj, id, val.v);
VariantClear(&ctx->ret_val);
+ if(ctx->this_obj)
+ IDispatch_Release(ctx->this_obj);
+
if(ctx->args) {
for(i=0; i < ctx->func->arg_cnt; i++)
VariantClear(ctx->args+i);
heap_free(ctx->stack);
}
-HRESULT exec_script(script_ctx_t *ctx, function_t *func, DISPPARAMS *dp, VARIANT *res)
+HRESULT exec_script(script_ctx_t *ctx, function_t *func, IDispatch *this_obj, DISPPARAMS *dp, VARIANT *res)
{
exec_ctx_t exec = {func->code_ctx};
vbsop_t op;
return E_OUTOFMEMORY;
}
+ if(this_obj)
+ exec.this_obj = this_obj;
+ else if (ctx->host_global)
+ exec.this_obj = ctx->host_global;
+ else
+ exec.this_obj = (IDispatch*)&ctx->script_obj->IDispatchEx_iface;
+ IDispatch_AddRef(exec.this_obj);
+
exec.instr = exec.code->instrs + func->code_off;
exec.script = ctx;
exec.func = func;
Class TestClass
Public Function publicFunction()
+ privateSub()
publicFunction = 4
End Function
return FALSE;
}
+static HRESULT vbdisp_get_id(vbdisp_t *This, BSTR name, BOOL search_private, DISPID *id)
+{
+ if(get_func_id(This, name, search_private, id))
+ return S_OK;
+
+ *id = -1;
+ return DISP_E_UNKNOWNNAME;
+}
+
static inline vbdisp_t *impl_from_IDispatchEx(IDispatchEx *iface)
{
return CONTAINING_RECORD(iface, vbdisp_t, IDispatchEx_iface);
return E_NOTIMPL;
}
- if(get_func_id(This, bstrName, FALSE, pid))
- return S_OK;
-
- *pid = -1;
- return DISP_E_UNKNOWNNAME;
+ return vbdisp_get_id(This, bstrName, FALSE, pid);
}
static HRESULT WINAPI DispatchEx_InvokeEx(IDispatchEx *iface, DISPID id, LCID lcid, WORD wFlags, DISPPARAMS *pdp,
return DISP_E_MEMBERNOTFOUND;
}
- return exec_script(This->desc->ctx, func, pdp, pvarRes);
+ return exec_script(This->desc->ctx, func, (IDispatch*)&This->IDispatchEx_iface, pdp, pvarRes);
default:
FIXME("flags %x\n", wFlags);
return DISP_E_MEMBERNOTFOUND;
DispatchEx_GetNameSpaceParent
};
+static inline vbdisp_t *unsafe_impl_from_IDispatch(IDispatch *iface)
+{
+ return iface->lpVtbl == (IDispatchVtbl*)&DispatchExVtbl
+ ? CONTAINING_RECORD(iface, vbdisp_t, IDispatchEx_iface)
+ : NULL;
+}
+
HRESULT create_vbdisp(const class_desc_t *desc, vbdisp_t **ret)
{
vbdisp_t *vbdisp;
return create_vbdisp(&ctx->script_desc, &ctx->script_obj);
}
-HRESULT disp_get_id(IDispatch *disp, BSTR name, DISPID *id)
+HRESULT disp_get_id(IDispatch *disp, BSTR name, BOOL search_private, DISPID *id)
{
IDispatchEx *dispex;
+ vbdisp_t *vbdisp;
HRESULT hres;
- if(disp->lpVtbl == (IDispatchVtbl*)&DispatchExVtbl)
- FIXME("properly handle builtin objects\n");
+ vbdisp = unsafe_impl_from_IDispatch(disp);
+ if(vbdisp)
+ return vbdisp_get_id(vbdisp, name, search_private, id);
hres = IDispatch_QueryInterface(disp, &IID_IDispatchEx, (void**)&dispex);
if(FAILED(hres)) {
code->global_executed = TRUE;
IActiveScriptSite_OnEnterScript(ctx->site);
- hres = exec_script(ctx, &code->global_code, NULL, NULL);
+ hres = exec_script(ctx, &code->global_code, NULL, NULL, NULL);
IActiveScriptSite_OnLeaveScript(ctx->site);
return hres;
} vbdisp_t;
HRESULT create_vbdisp(const class_desc_t*,vbdisp_t**);
-HRESULT disp_get_id(IDispatch*,BSTR,DISPID*);
+HRESULT disp_get_id(IDispatch*,BSTR,BOOL,DISPID*);
HRESULT disp_call(script_ctx_t*,IDispatch*,DISPID,DISPPARAMS*,VARIANT*);
HRESULT disp_propput(script_ctx_t*,IDispatch*,DISPID,VARIANT*);
void release_vbscode(vbscode_t*) DECLSPEC_HIDDEN;
HRESULT compile_script(script_ctx_t*,const WCHAR*,vbscode_t**) DECLSPEC_HIDDEN;
-HRESULT exec_script(script_ctx_t*,function_t*,DISPPARAMS*,VARIANT*) DECLSPEC_HIDDEN;
+HRESULT exec_script(script_ctx_t*,function_t*,IDispatch*,DISPPARAMS*,VARIANT*) DECLSPEC_HIDDEN;
HRESULT WINAPI VBScriptFactory_CreateInstance(IClassFactory*,IUnknown*,REFIID,void**);