Module: wine Branch: master Commit: 17ff7829d3f4d4a8ac3cabf2c0afb54dcb2dccbe URL: http://source.winehq.org/git/wine.git/?a=commit;h=17ff7829d3f4d4a8ac3cabf2c0...
Author: Jacek Caban jacek@codeweavers.com Date: Thu Jun 21 10:47:36 2012 +0200
jscript: Make Function object invocation a special case in IDispatchEx implementation.
---
dlls/jscript/dispex.c | 14 ++++++++++---- dlls/jscript/function.c | 21 +++++++++++++++++++++ dlls/jscript/jscript.h | 1 + 3 files changed, 32 insertions(+), 4 deletions(-)
diff --git a/dlls/jscript/dispex.c b/dlls/jscript/dispex.c index dd4b081..7763512 100644 --- a/dlls/jscript/dispex.c +++ b/dlls/jscript/dispex.c @@ -391,7 +391,6 @@ static HRESULT invoke_prop_func(jsdisp_t *This, jsdisp_t *jsthis, dispex_prop_t case PROP_BUILTIN: { DISPPARAMS params; VARIANT buf[6]; - vdisp_t vthis;
if(flags == DISPATCH_CONSTRUCT && (prop->flags & PROPF_METHOD)) { WARN("%s is not a constructor\n", debugstr_w(prop->name)); @@ -402,9 +401,16 @@ static HRESULT invoke_prop_func(jsdisp_t *This, jsdisp_t *jsthis, dispex_prop_t if(FAILED(hres)) return hres;
- set_jsdisp(&vthis, jsthis); - hres = prop->u.p->invoke(This->ctx, &vthis, flags, ¶ms, retv, ei); - vdisp_release(&vthis); + if(prop->name || jsthis->builtin_info->class != JSCLASS_FUNCTION) { + vdisp_t vthis; + + set_jsdisp(&vthis, jsthis); + hres = prop->u.p->invoke(This->ctx, &vthis, flags, ¶ms, retv, ei); + vdisp_release(&vthis); + }else { + /* Function object calls are special case */ + hres = Function_invoke(This, flags, ¶ms, retv, ei); + } if(params.rgvarg != buf && params.rgvarg != dp->rgvarg) heap_free(params.rgvarg); return hres; diff --git a/dlls/jscript/function.c b/dlls/jscript/function.c index cfd57a7..9643195 100644 --- a/dlls/jscript/function.c +++ b/dlls/jscript/function.c @@ -16,6 +16,8 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */
+#include <assert.h> + #include "jscript.h" #include "engine.h"
@@ -305,6 +307,25 @@ static HRESULT function_to_string(FunctionInstance *function, BSTR *ret) return S_OK; }
+HRESULT Function_invoke(jsdisp_t *func_this, WORD flags, DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei) +{ + FunctionInstance *function; + + TRACE("\n"); + + assert(is_class(func_this, JSCLASS_FUNCTION)); + function = (FunctionInstance*)func_this; + + if(function->value_proc) + return invoke_value_proc(function->dispex.ctx, function, get_this(dp), flags, dp, retv, ei); + + if(flags == DISPATCH_CONSTRUCT) + return invoke_constructor(function->dispex.ctx, function, dp, retv, ei); + + assert(flags == DISPATCH_METHOD); + return invoke_source(function->dispex.ctx, function, get_this(dp), dp, retv, ei); +} + static HRESULT Function_length(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei) { diff --git a/dlls/jscript/jscript.h b/dlls/jscript/jscript.h index 571d6e1..f278b6a 100644 --- a/dlls/jscript/jscript.h +++ b/dlls/jscript/jscript.h @@ -225,6 +225,7 @@ VARIANT_BOOL jsdisp_is_own_prop(jsdisp_t *obj, BSTR name) DECLSPEC_HIDDEN; HRESULT create_builtin_function(script_ctx_t*,builtin_invoke_t,const WCHAR*,const builtin_info_t*,DWORD, jsdisp_t*,jsdisp_t**) DECLSPEC_HIDDEN; HRESULT Function_value(script_ctx_t*,vdisp_t*,WORD,DISPPARAMS*,VARIANT*,jsexcept_t*) DECLSPEC_HIDDEN; +HRESULT Function_invoke(jsdisp_t*,WORD,DISPPARAMS*,VARIANT*,jsexcept_t*);
HRESULT throw_eval_error(script_ctx_t*,jsexcept_t*,HRESULT,const WCHAR*) DECLSPEC_HIDDEN; HRESULT throw_generic_error(script_ctx_t*,jsexcept_t*,HRESULT,const WCHAR*) DECLSPEC_HIDDEN;