{
named_item_t *item;
function_t *func;
+ IDispatch *disp;
unsigned i;
DISPID id;
HRESULT hres;
}
}
+ if(ctx->func->code_ctx->context) {
+ hres = disp_get_id(ctx->func->code_ctx->context, name, invoke_type, TRUE, &id);
+ if(SUCCEEDED(hres)) {
+ ref->type = REF_DISP;
+ ref->u.d.disp = ctx->func->code_ctx->context;
+ ref->u.d.id = id;
+ return S_OK;
+ }
+ }
+
if(ctx->func->type != FUNC_GLOBAL && lookup_dynamic_vars(ctx->script->global_vars, name, ref))
return S_OK;
return S_OK;
}
- LIST_FOR_EACH_ENTRY(item, &ctx->script->named_items, named_item_t, entry) {
- if((item->flags & SCRIPTITEM_ISVISIBLE) && !strcmpiW(item->name, name)) {
- if(!item->disp) {
- IUnknown *unk;
-
- hres = IActiveScriptSite_GetItemInfo(ctx->script->site, item->name, SCRIPTINFO_IUNKNOWN, &unk, NULL);
- if(FAILED(hres)) {
- WARN("GetItemInfo failed: %08x\n", hres);
- continue;
- }
-
- hres = IUnknown_QueryInterface(unk, &IID_IDispatch, (void**)&item->disp);
- IUnknown_Release(unk);
- if(FAILED(hres)) {
- WARN("object does not implement IDispatch\n");
- continue;
- }
- }
-
- ref->type = REF_OBJ;
- ref->u.obj = item->disp;
- return S_OK;
- }
+ disp = lookup_named_item(ctx->script, name, SCRIPTITEM_ISVISIBLE);
+ if(disp) {
+ ref->type = REF_OBJ;
+ ref->u.obj = disp;
+ return S_OK;
}
LIST_FOR_EACH_ENTRY(item, &ctx->script->named_items, named_item_t, entry) {
#ifdef _WIN64
#define CTXARG_T DWORDLONG
+#define IActiveScriptDebugVtbl IActiveScriptDebug64Vtbl
#define IActiveScriptParseVtbl IActiveScriptParse64Vtbl
#define IActiveScriptParseProcedure2Vtbl IActiveScriptParseProcedure2_64Vtbl
#else
#define CTXARG_T DWORD
+#define IActiveScriptDebugVtbl IActiveScriptDebug32Vtbl
#define IActiveScriptParseVtbl IActiveScriptParse32Vtbl
#define IActiveScriptParseProcedure2Vtbl IActiveScriptParseProcedure2_32Vtbl
struct VBScript {
IActiveScript IActiveScript_iface;
+ IActiveScriptDebug IActiveScriptDebug_iface;
IActiveScriptParse IActiveScriptParse_iface;
IActiveScriptParseProcedure2 IActiveScriptParseProcedure2_iface;
IObjectSafety IObjectSafety_iface;
}
}
+IDispatch *lookup_named_item(script_ctx_t *ctx, const WCHAR *name, unsigned flags)
+{
+ named_item_t *item;
+ HRESULT hres;
+
+ LIST_FOR_EACH_ENTRY(item, &ctx->named_items, named_item_t, entry) {
+ if((item->flags & flags) == flags && !strcmpiW(item->name, name)) {
+ if(!item->disp) {
+ IUnknown *unk;
+
+ hres = IActiveScriptSite_GetItemInfo(ctx->site, item->name,
+ SCRIPTINFO_IUNKNOWN, &unk, NULL);
+ if(FAILED(hres)) {
+ WARN("GetItemInfo failed: %08x\n", hres);
+ continue;
+ }
+
+ hres = IUnknown_QueryInterface(unk, &IID_IDispatch, (void**)&item->disp);
+ IUnknown_Release(unk);
+ if(FAILED(hres)) {
+ WARN("object does not implement IDispatch\n");
+ continue;
+ }
+ }
+
+ return item->disp;
+ }
+ }
+
+ return NULL;
+}
+
static HRESULT set_ctx_site(VBScript *This)
{
HRESULT hres;
}else if(IsEqualGUID(riid, &IID_IActiveScript)) {
TRACE("(%p)->(IID_IActiveScript %p)\n", This, ppv);
*ppv = &This->IActiveScript_iface;
+ }else if(IsEqualGUID(riid, &IID_IActiveScriptDebug)) {
+ TRACE("(%p)->(IID_IActiveScriptDebug %p)\n", This, ppv);
+ *ppv = &This->IActiveScriptDebug_iface;
}else if(IsEqualGUID(riid, &IID_IActiveScriptParse)) {
TRACE("(%p)->(IID_IActiveScriptParse %p)\n", This, ppv);
*ppv = &This->IActiveScriptParse_iface;
VBScript_Clone
};
+static inline VBScript *impl_from_IActiveScriptDebug(IActiveScriptDebug *iface)
+{
+ return CONTAINING_RECORD(iface, VBScript, IActiveScriptDebug_iface);
+}
+
+static HRESULT WINAPI VBScriptDebug_QueryInterface(IActiveScriptDebug *iface, REFIID riid, void **ppv)
+{
+ VBScript *This = impl_from_IActiveScriptDebug(iface);
+ return IActiveScript_QueryInterface(&This->IActiveScript_iface, riid, ppv);
+}
+
+static ULONG WINAPI VBScriptDebug_AddRef(IActiveScriptDebug *iface)
+{
+ VBScript *This = impl_from_IActiveScriptDebug(iface);
+ return IActiveScript_AddRef(&This->IActiveScript_iface);
+}
+
+static ULONG WINAPI VBScriptDebug_Release(IActiveScriptDebug *iface)
+{
+ VBScript *This = impl_from_IActiveScriptDebug(iface);
+ return IActiveScript_Release(&This->IActiveScript_iface);
+}
+
+static HRESULT WINAPI VBScriptDebug_GetScriptTextAttributes(IActiveScriptDebug *iface,
+ LPCOLESTR code, ULONG len, LPCOLESTR delimiter, DWORD flags, SOURCE_TEXT_ATTR *attr)
+{
+ VBScript *This = impl_from_IActiveScriptDebug(iface);
+ FIXME("(%p)->(%s %u %s %#x %p)\n", This, debugstr_w(code), len,
+ debugstr_w(delimiter), flags, attr);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI VBScriptDebug_GetScriptletTextAttributes(IActiveScriptDebug *iface,
+ LPCOLESTR code, ULONG len, LPCOLESTR delimiter, DWORD flags, SOURCE_TEXT_ATTR *attr)
+{
+ VBScript *This = impl_from_IActiveScriptDebug(iface);
+ FIXME("(%p)->(%s %u %s %#x %p)\n", This, debugstr_w(code), len,
+ debugstr_w(delimiter), flags, attr);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI VBScriptDebug_EnumCodeContextsOfPosition(IActiveScriptDebug *iface,
+ CTXARG_T source, ULONG offset, ULONG len, IEnumDebugCodeContexts **ret)
+{
+ VBScript *This = impl_from_IActiveScriptDebug(iface);
+ FIXME("(%p)->(%s %u %u %p)\n", This, wine_dbgstr_longlong(source), offset, len, ret);
+ return E_NOTIMPL;
+}
+
+static const IActiveScriptDebugVtbl VBScriptDebugVtbl = {
+ VBScriptDebug_QueryInterface,
+ VBScriptDebug_AddRef,
+ VBScriptDebug_Release,
+ VBScriptDebug_GetScriptTextAttributes,
+ VBScriptDebug_GetScriptletTextAttributes,
+ VBScriptDebug_EnumCodeContextsOfPosition,
+};
+
static inline VBScript *impl_from_IActiveScriptParse(IActiveScriptParse *iface)
{
return CONTAINING_RECORD(iface, VBScript, IActiveScriptParse_iface);
DWORD dwFlags, VARIANT *pvarResult, EXCEPINFO *pexcepinfo)
{
VBScript *This = impl_from_IActiveScriptParse(iface);
+ IDispatch *context = NULL;
vbscode_t *code;
HRESULT hres;
if(This->thread_id != GetCurrentThreadId() || This->state == SCRIPTSTATE_CLOSED)
return E_UNEXPECTED;
+ if(pstrItemName) {
+ context = lookup_named_item(This->ctx, pstrItemName, 0);
+ if(!context) {
+ WARN("Inknown context %s\n", debugstr_w(pstrItemName));
+ return E_INVALIDARG;
+ }
+ }
+
hres = compile_script(This->ctx, pstrCode, pstrDelimiter, &code);
if(FAILED(hres))
return hres;
+ if(context)
+ IDispatch_AddRef(code->context = context);
+
if(!is_started(This)) {
code->pending_exec = TRUE;
return S_OK;
return E_OUTOFMEMORY;
ret->IActiveScript_iface.lpVtbl = &VBScriptVtbl;
+ ret->IActiveScriptDebug_iface.lpVtbl = &VBScriptDebugVtbl;
ret->IActiveScriptParse_iface.lpVtbl = &VBScriptParseVtbl;
ret->IActiveScriptParseProcedure2_iface.lpVtbl = &VBScriptParseProcedureVtbl;
ret->IObjectSafety_iface.lpVtbl = &VBScriptSafetyVtbl;