Module: wine Branch: master Commit: 68d4f489f2d26bddef00eae71608e40fb2c4ab22 URL: http://source.winehq.org/git/wine.git/?a=commit;h=68d4f489f2d26bddef00eae716...
Author: Jacek Caban jacek@codeweavers.com Date: Wed Sep 10 21:06:43 2008 +0200
jscript: Set arguments object on function call.
---
dlls/jscript/dispex.c | 10 ++++++++++ dlls/jscript/function.c | 39 +++++++++++++++++++++++++++++++++++++-- dlls/jscript/jscript.h | 2 +- dlls/jscript/tests/lang.js | 1 + 4 files changed, 49 insertions(+), 3 deletions(-)
diff --git a/dlls/jscript/dispex.c b/dlls/jscript/dispex.c index ad7b988..193a5b5 100644 --- a/dlls/jscript/dispex.c +++ b/dlls/jscript/dispex.c @@ -883,6 +883,16 @@ HRESULT jsdisp_propput_name(DispatchEx *obj, const WCHAR *name, LCID lcid, VARIA return prop_put(obj, prop, lcid, &dp, ei, caller); }
+HRESULT jsdisp_propput_idx(DispatchEx *obj, DWORD idx, LCID lcid, VARIANT *val, jsexcept_t *ei, IServiceProvider *caller) +{ + WCHAR buf[12]; + + static const WCHAR formatW[] = {'%','d',0}; + + sprintfW(buf, formatW, idx); + return jsdisp_propput_name(obj, buf, lcid, val, ei, caller); +} + HRESULT disp_propput(IDispatch *disp, DISPID id, LCID lcid, VARIANT *val, jsexcept_t *ei, IServiceProvider *caller) { DISPID dispid = DISPID_PROPERTYPUT; diff --git a/dlls/jscript/function.c b/dlls/jscript/function.c index c58f002..615e7ce 100644 --- a/dlls/jscript/function.c +++ b/dlls/jscript/function.c @@ -88,17 +88,52 @@ static HRESULT init_parameters(DispatchEx *var_disp, FunctionInstance *function, return S_OK; }
+static HRESULT init_arguments(DispatchEx *arg_disp, FunctionInstance *function, LCID lcid, DISPPARAMS *dp, + jsexcept_t *ei, IServiceProvider *caller) +{ + VARIANT var; + DWORD i; + HRESULT hres; + + for(i=0; i < dp->cArgs-dp->cNamedArgs; i++) { + hres = jsdisp_propput_idx(arg_disp, i, lcid, dp->rgvarg+dp->cArgs-1-i, ei, caller); + if(FAILED(hres)) + return hres; + } + + V_VT(&var) = VT_I4; + V_I4(&var) = dp->cArgs - dp->cNamedArgs; + return jsdisp_propput_name(arg_disp, lengthW, lcid, &var, ei, caller); +} + static HRESULT create_var_disp(FunctionInstance *function, LCID lcid, DISPPARAMS *dp, jsexcept_t *ei, IServiceProvider *caller, DispatchEx **ret) { - DispatchEx *var_disp; + DispatchEx *var_disp, *arg_disp; HRESULT hres;
+ static const WCHAR argumentsW[] = {'a','r','g','u','m','e','n','t','s',0}; + hres = create_dispex(function->dispex.ctx, NULL, NULL, &var_disp); if(FAILED(hres)) return hres;
- hres = init_parameters(var_disp, function, lcid, dp, ei, caller); + hres = create_dispex(function->dispex.ctx, NULL, NULL, &arg_disp); + if(SUCCEEDED(hres)) { + hres = init_arguments(arg_disp, function, lcid, dp, ei, caller); + if(SUCCEEDED(hres)) { + VARIANT var; + + V_VT(&var) = VT_DISPATCH; + V_DISPATCH(&var) = (IDispatch*)_IDispatchEx_(arg_disp); + hres = jsdisp_propput_name(var_disp, argumentsW, lcid, &var, ei, caller); + } + + jsdisp_release(arg_disp); + } + + if(SUCCEEDED(hres)) + hres = init_parameters(var_disp, function, lcid, dp, ei, caller); if(FAILED(hres)) { jsdisp_release(var_disp); return hres; diff --git a/dlls/jscript/jscript.h b/dlls/jscript/jscript.h index 2869fc3..f09cea7 100644 --- a/dlls/jscript/jscript.h +++ b/dlls/jscript/jscript.h @@ -109,7 +109,7 @@ HRESULT jsdisp_call_value(DispatchEx*,LCID,WORD,DISPPARAMS*,VARIANT*,jsexcept_t* HRESULT disp_propget(IDispatch*,DISPID,LCID,VARIANT*,jsexcept_t*,IServiceProvider*); HRESULT disp_propput(IDispatch*,DISPID,LCID,VARIANT*,jsexcept_t*,IServiceProvider*); HRESULT jsdisp_propput_name(DispatchEx*,const WCHAR*,LCID,VARIANT*,jsexcept_t*,IServiceProvider*); -HRESULT jsdisp_set_prototype(DispatchEx*,DispatchEx*); +HRESULT jsdisp_propput_idx(DispatchEx*,DWORD,LCID,VARIANT*,jsexcept_t*,IServiceProvider*);
HRESULT create_builtin_function(script_ctx_t*,builtin_invoke_t,DWORD,DispatchEx*,DispatchEx**);
diff --git a/dlls/jscript/tests/lang.js b/dlls/jscript/tests/lang.js index 19430fe..4be651b 100644 --- a/dlls/jscript/tests/lang.js +++ b/dlls/jscript/tests/lang.js @@ -44,6 +44,7 @@ function testFunc1(x, y) { ok(this !== undefined, "this is undefined"); ok(x === true, "x is not 1"); ok(y === "test", "y is not "test""); + ok(arguments.length === 2, "arguments.length is not 2");
return true; }