HRESULT Function_invoke(jsdisp_t *func_this, IDispatch *jsthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { const BOOL caller_execs_source = (flags & DISPATCH_JSCRIPT_CALLEREXECSSOURCE) != 0; FunctionInstance *function; TRACE("func %p this %p\n", func_this, jsthis); assert(is_class(func_this, JSCLASS_FUNCTION)); function = (FunctionInstance*)func_this; flags &= ~DISPATCH_JSCRIPT_INTERNAL_MASK; if(function->value_proc) return invoke_value_proc(function->dispex.ctx, function, jsthis, flags, argc, argv, r); if(flags == DISPATCH_CONSTRUCT) { jsdisp_t *this_obj; HRESULT hres; hres = create_object(function->dispex.ctx, &function->dispex, &this_obj); if(FAILED(hres)) return hres; hres = invoke_source(function->dispex.ctx, function, to_disp(this_obj), argc, argv, TRUE, caller_execs_source, r); jsdisp_release(this_obj); return hres; } assert(flags == DISPATCH_METHOD); return invoke_source(function->dispex.ctx, function, jsthis, argc, argv, FALSE, caller_execs_source, r); }
static HRESULT invoke_constructor(script_ctx_t *ctx, FunctionInstance *function, unsigned argc, jsval_t *argv, jsval_t *r) { jsdisp_t *this_obj; jsval_t var; HRESULT hres; hres = create_object(ctx, &function->dispex, &this_obj); if(FAILED(hres)) return hres; hres = invoke_source(ctx, function, to_disp(this_obj), argc, argv, &var); if(FAILED(hres)) { jsdisp_release(this_obj); return hres; } if(is_object_instance(var)) { jsdisp_release(this_obj); *r = var; }else { jsval_release(var); *r = jsval_obj(this_obj); } return S_OK; }
static HRESULT invoke_constructor(script_ctx_t *ctx, FunctionInstance *function, DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller) { DispatchEx *this_obj; VARIANT var; HRESULT hres; hres = create_object(ctx, &function->dispex, &this_obj); if(FAILED(hres)) return hres; hres = invoke_source(ctx, function, (IDispatch*)_IDispatchEx_(this_obj), dp, &var, ei, caller); if(FAILED(hres)) { jsdisp_release(this_obj); return hres; } V_VT(retv) = VT_DISPATCH; if(V_VT(&var) == VT_DISPATCH) { jsdisp_release(this_obj); V_DISPATCH(retv) = V_DISPATCH(&var); }else { VariantClear(&var); V_DISPATCH(retv) = (IDispatch*)_IDispatchEx_(this_obj); } return S_OK; }
static HRESULT invoke_constructor(script_ctx_t *ctx, FunctionInstance *function, DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei) { jsdisp_t *this_obj; VARIANT var; HRESULT hres; hres = create_object(ctx, &function->dispex, &this_obj); if(FAILED(hres)) return hres; hres = invoke_source(ctx, function, to_disp(this_obj), dp, &var, ei); if(FAILED(hres)) { jsdisp_release(this_obj); return hres; } if(V_VT(&var) == VT_DISPATCH) { jsdisp_release(this_obj); V_VT(retv) = VT_DISPATCH; V_DISPATCH(retv) = V_DISPATCH(&var); }else { VariantClear(&var); var_set_jsdisp(retv, this_obj); } return S_OK; }
static HRESULT call_function(script_ctx_t *ctx, FunctionInstance *function, IDispatch *this_obj, unsigned argc, jsval_t *argv, jsval_t *r) { if(function->value_proc) return invoke_value_proc(ctx, function, this_obj, DISPATCH_METHOD, argc, argv, r); return invoke_source(ctx, function, this_obj, argc, argv, r); }
static HRESULT call_function(script_ctx_t *ctx, FunctionInstance *function, IDispatch *this_obj, DISPPARAMS *args, VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller) { if(function->value_proc) return invoke_value_proc(ctx, function, this_obj, DISPATCH_METHOD, args, retv, ei, caller); return invoke_source(ctx, function, this_obj, args, retv, ei, caller); }
static HRESULT invoke_function(FunctionInstance *function, LCID lcid, DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller) { IDispatch *this_obj; if(!(this_obj = get_this(dp))) this_obj = (IDispatch*)_IDispatchEx_(function->dispex.ctx->script_disp); return invoke_source(function, this_obj, lcid, dp, retv, ei, caller); }
HRESULT Function_value(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller) { FunctionInstance *function; TRACE("\n"); if(!is_vclass(jsthis, JSCLASS_FUNCTION)) { ERR("dispex is not a function\n"); return E_FAIL; } function = (FunctionInstance*)jsthis->u.jsdisp; switch(flags) { case DISPATCH_METHOD: if(function->value_proc) return invoke_value_proc(ctx, function, get_this(dp), flags, dp, retv, ei, caller); return invoke_source(ctx, function, get_this(dp), dp, retv, ei, caller); case DISPATCH_PROPERTYGET: { HRESULT hres; BSTR str; hres = function_to_string(function, &str); if(FAILED(hres)) return hres; V_VT(retv) = VT_BSTR; V_BSTR(retv) = str; break; } case DISPATCH_CONSTRUCT: if(function->value_proc) return invoke_value_proc(ctx, function, get_this(dp), flags, dp, retv, ei, caller); return invoke_constructor(ctx, function, dp, retv, ei, caller); default: FIXME("not implemented flags %x\n", flags); return E_NOTIMPL; } return S_OK; }
HRESULT Function_invoke(jsdisp_t *func_this, IDispatch *jsthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { FunctionInstance *function; TRACE("func %p this %p\n", func_this, jsthis); assert(is_class(func_this, JSCLASS_FUNCTION)); function = (FunctionInstance*)func_this; if(function->value_proc) return invoke_value_proc(function->dispex.ctx, function, jsthis, flags, argc, argv, r); if(flags == DISPATCH_CONSTRUCT) return invoke_constructor(function->dispex.ctx, function, argc, argv, r); assert(flags == DISPATCH_METHOD); return invoke_source(function->dispex.ctx, function, jsthis, argc, argv, r); }
static HRESULT invoke_constructor(FunctionInstance *function, LCID lcid, DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller) { DispatchEx *this_obj; HRESULT hres; hres = create_object(function->dispex.ctx, &function->dispex, &this_obj); if(FAILED(hres)) return hres; hres = invoke_source(function, (IDispatch*)_IDispatchEx_(this_obj), lcid, dp, retv, ei, caller); jsdisp_release(this_obj); if(FAILED(hres)) return hres; V_VT(retv) = VT_DISPATCH; V_DISPATCH(retv) = (IDispatch*)_IDispatchEx_(this_obj); return S_OK; }