jscript: Added Array constructor implementation.

This commit is contained in:
Jacek Caban 2008-09-15 20:37:10 +02:00 committed by Alexandre Julliard
parent 199952bf55
commit 9c25917e5d
5 changed files with 114 additions and 3 deletions

View File

@ -24,6 +24,8 @@ WINE_DEFAULT_DEBUG_CHANNEL(jscript);
typedef struct {
DispatchEx dispex;
DWORD length;
} ArrayInstance;
static const WCHAR lengthW[] = {'l','e','n','g','t','h',0};
@ -212,10 +214,56 @@ static const builtin_info_t Array_info = {
};
static HRESULT ArrayConstr_value(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp,
VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller)
{
FIXME("\n");
return E_NOTIMPL;
DispatchEx *obj;
VARIANT *arg_var;
DWORD i;
HRESULT hres;
TRACE("\n");
switch(flags) {
case DISPATCH_CONSTRUCT: {
if(arg_cnt(dp) == 1 && V_VT((arg_var = get_arg(dp, 0))) == VT_I4) {
if(V_I4(arg_var) < 0) {
FIXME("throw RangeError\n");
return E_FAIL;
}
hres = create_array(dispex->ctx, V_I4(arg_var), &obj);
if(FAILED(hres))
return hres;
V_VT(retv) = VT_DISPATCH;
V_DISPATCH(retv) = (IDispatch*)_IDispatchEx_(obj);
return S_OK;
}
hres = create_array(dispex->ctx, arg_cnt(dp), &obj);
if(FAILED(hres))
return hres;
for(i=0; i < arg_cnt(dp); i++) {
hres = jsdisp_propput_idx(obj, i, lcid, get_arg(dp, i), ei, caller);
if(FAILED(hres))
break;
}
if(FAILED(hres)) {
jsdisp_release(obj);
return hres;
}
V_VT(retv) = VT_DISPATCH;
V_DISPATCH(retv) = (IDispatch*)_IDispatchEx_(obj);
break;
}
default:
FIXME("unimplemented flags: %x\n", flags);
return E_NOTIMPL;
}
return S_OK;
}
static HRESULT alloc_array(script_ctx_t *ctx, BOOL use_constr, ArrayInstance **ret)
@ -251,3 +299,18 @@ HRESULT create_array_constr(script_ctx_t *ctx, DispatchEx **ret)
IDispatchEx_Release(_IDispatchEx_(&array->dispex));
return hres;
}
HRESULT create_array(script_ctx_t *ctx, DWORD length, DispatchEx **ret)
{
ArrayInstance *array;
HRESULT hres;
hres = alloc_array(ctx, TRUE, &array);
if(FAILED(hres))
return hres;
array->length = length;
*ret = &array->dispex;
return S_OK;
}

View File

@ -115,6 +115,7 @@ HRESULT create_builtin_function(script_ctx_t*,builtin_invoke_t,DWORD,DispatchEx*
HRESULT create_object(script_ctx_t*,DispatchEx*,DispatchEx**);
HRESULT create_math(script_ctx_t*,DispatchEx**);
HRESULT create_array(script_ctx_t*,DWORD,DispatchEx**);
HRESULT to_primitive(script_ctx_t*,VARIANT*,jsexcept_t*,VARIANT*);
HRESULT to_boolean(VARIANT*,VARIANT_BOOL*);
@ -163,6 +164,16 @@ HRESULT create_object_constr(script_ctx_t*,DispatchEx**);
HRESULT create_regexp_constr(script_ctx_t*,DispatchEx**);
HRESULT create_string_constr(script_ctx_t*,DispatchEx**);
static inline VARIANT *get_arg(DISPPARAMS *dp, DWORD i)
{
return dp->rgvarg + dp->cArgs-i-1;
}
static inline DWORD arg_cnt(const DISPPARAMS *dp)
{
return dp->cArgs - dp->cNamedArgs;
}
const char *debugstr_variant(const VARIANT*);
HRESULT WINAPI JScriptFactory_CreateInstance(IClassFactory*,IUnknown*,REFIID,void**);

33
dlls/jscript/tests/api.js Normal file
View File

@ -0,0 +1,33 @@
/*
* Copyright 2008 Jacek Caban for CodeWeavers
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
var arr = new Array();
ok(typeof(arr) === "object", "arr () is not object");
ok(arr["0"] === undefined, "arr[0] is not undefined");
var arr = new Array(1, 2, "test");
ok(typeof(arr) === "object", "arr (1,2,test) is not object");
ok(arr["0"] === 1, "arr[0] is not 1");
ok(arr["1"] === 2, "arr[1] is not 2");
ok(arr["2"] === "test", "arr[2] is not \"test\"");
var arr = new Array(6);
ok(typeof(arr) === "object", "arr (6) is not object");
ok(arr["0"] === undefined, "arr[0] is not undefined");
reportSuccess();

View File

@ -16,5 +16,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
/* @makedep: api.js */
api.js 40 "api.js"
/* @makedep: lang.js */
lang.js 40 "lang.js"

View File

@ -582,6 +582,7 @@ static void run_tests(void)
CHECK_CALLED(global_success_i);
run_from_res("lang.js");
run_from_res("api.js");
}
START_TEST(run)