Jacek Caban : vbscript: Added IActiveScriptParseProcedure2:: ParseProcedureText implementation.
Alexandre Julliard
julliard at winehq.org
Thu Sep 6 13:37:22 CDT 2012
Module: wine
Branch: master
Commit: cf0faf1d3cac6b1eeb49bd270187de4ce8594164
URL: http://source.winehq.org/git/wine.git/?a=commit;h=cf0faf1d3cac6b1eeb49bd270187de4ce8594164
Author: Jacek Caban <jacek at codeweavers.com>
Date: Thu Sep 6 11:57:33 2012 +0200
vbscript: Added IActiveScriptParseProcedure2::ParseProcedureText implementation.
---
dlls/vbscript/vbdisp.c | 49 +++++++++++++++++++++++++++++++++++++++++++++-
dlls/vbscript/vbscript.c | 15 ++++++++++++-
dlls/vbscript/vbscript.h | 3 ++
3 files changed, 64 insertions(+), 3 deletions(-)
diff --git a/dlls/vbscript/vbdisp.c b/dlls/vbscript/vbdisp.c
index 022ac1d..f6e3f11 100644
--- a/dlls/vbscript/vbdisp.c
+++ b/dlls/vbscript/vbdisp.c
@@ -501,6 +501,8 @@ HRESULT create_vbdisp(const class_desc_t *desc, vbdisp_t **ret)
vbdisp->ref = 1;
vbdisp->desc = desc;
+ list_add_tail(&desc->ctx->objects, &vbdisp->entry);
+
if(desc->class_initialize_id) {
DISPPARAMS dp = {0};
HRESULT hres;
@@ -513,11 +515,56 @@ HRESULT create_vbdisp(const class_desc_t *desc, vbdisp_t **ret)
}
}
- list_add_tail(&desc->ctx->objects, &vbdisp->entry);
*ret = vbdisp;
return S_OK;
}
+static HRESULT Procedure_invoke(vbdisp_t *This, VARIANT *args, unsigned args_cnt, VARIANT *res)
+{
+ script_ctx_t *ctx = This->desc->ctx;
+ HRESULT hres;
+
+ TRACE("\n");
+
+ IActiveScriptSite_OnEnterScript(ctx->site);
+ hres = exec_script(ctx, This->desc->value_func, NULL, NULL, NULL);
+ IActiveScriptSite_OnLeaveScript(ctx->site);
+
+ return hres;
+}
+
+static const builtin_prop_t procedure_props[] = {
+ {DISPID_VALUE, Procedure_invoke, 0}
+};
+
+HRESULT create_procedure_disp(script_ctx_t *ctx, vbscode_t *code, IDispatch **ret)
+{
+ class_desc_t *desc;
+ vbdisp_t *vbdisp;
+ HRESULT hres;
+
+ desc = heap_alloc_zero(sizeof(*desc));
+ if(!desc)
+ return E_OUTOFMEMORY;
+
+ desc->ctx = ctx;
+ desc->builtin_prop_cnt = sizeof(procedure_props)/sizeof(*procedure_props);
+ desc->builtin_props = procedure_props;
+ desc->value_func = &code->main_code;
+
+ hres = create_vbdisp(desc, &vbdisp);
+ if(FAILED(hres)) {
+ heap_free(desc);
+ return hres;
+ }
+
+ desc->next = ctx->procs;
+ ctx->procs = desc;
+
+ *ret = (IDispatch*)&vbdisp->IDispatchEx_iface;
+ return S_OK;
+}
+
void collect_objects(script_ctx_t *ctx)
{
vbdisp_t *iter, *iter2;
diff --git a/dlls/vbscript/vbscript.c b/dlls/vbscript/vbscript.c
index f250df3..f842bba 100644
--- a/dlls/vbscript/vbscript.c
+++ b/dlls/vbscript/vbscript.c
@@ -650,10 +650,21 @@ static HRESULT WINAPI VBScriptParseProcedure_ParseProcedureText(IActiveScriptPar
CTXARG_T dwSourceContextCookie, ULONG ulStartingLineNumber, DWORD dwFlags, IDispatch **ppdisp)
{
VBScript *This = impl_from_IActiveScriptParseProcedure2(iface);
- FIXME("(%p)->(%s %s %s %s %p %s %s %u %x %p)\n", This, debugstr_w(pstrCode), debugstr_w(pstrFormalParams),
+ vbscode_t *code;
+ HRESULT hres;
+
+ TRACE("(%p)->(%s %s %s %s %p %s %s %u %x %p)\n", This, debugstr_w(pstrCode), debugstr_w(pstrFormalParams),
debugstr_w(pstrProcedureName), debugstr_w(pstrItemName), punkContext, debugstr_w(pstrDelimiter),
wine_dbgstr_longlong(dwSourceContextCookie), ulStartingLineNumber, dwFlags, ppdisp);
- return E_NOTIMPL;
+
+ if(This->thread_id != GetCurrentThreadId() || This->state == SCRIPTSTATE_CLOSED)
+ return E_UNEXPECTED;
+
+ hres = compile_script(This->ctx, pstrCode, &code);
+ if(FAILED(hres))
+ return hres;
+
+ return create_procedure_disp(This->ctx, code, ppdisp);
}
static const IActiveScriptParseProcedure2Vtbl VBScriptParseProcedureVtbl = {
diff --git a/dlls/vbscript/vbscript.h b/dlls/vbscript/vbscript.h
index 788d98d..8a316ab 100644
--- a/dlls/vbscript/vbscript.h
+++ b/dlls/vbscript/vbscript.h
@@ -100,6 +100,7 @@ typedef struct _class_desc_t {
unsigned builtin_prop_cnt;
const builtin_prop_t *builtin_props;
ITypeInfo *typeinfo;
+ function_t *value_func;
struct _class_desc_t *next;
} class_desc_t;
@@ -121,6 +122,7 @@ HRESULT vbdisp_get_id(vbdisp_t*,BSTR,vbdisp_invoke_type_t,BOOL,DISPID*) DECLSPEC
HRESULT disp_call(script_ctx_t*,IDispatch*,DISPID,DISPPARAMS*,VARIANT*) DECLSPEC_HIDDEN;
HRESULT disp_propput(script_ctx_t*,IDispatch*,DISPID,DISPPARAMS*) DECLSPEC_HIDDEN;
void collect_objects(script_ctx_t*) DECLSPEC_HIDDEN;
+HRESULT create_procedure_disp(script_ctx_t*,vbscode_t*,IDispatch**) DECLSPEC_HIDDEN;
static inline unsigned arg_cnt(const DISPPARAMS *dp)
{
@@ -160,6 +162,7 @@ struct _script_ctx_t {
dynamic_var_t *global_vars;
function_t *global_funcs;
class_desc_t *classes;
+ class_desc_t *procs;
vbsheap_t heap;
More information about the wine-cvs
mailing list