jscript: Added Array constructor implementation.
This commit is contained in:
parent
199952bf55
commit
9c25917e5d
|
@ -24,6 +24,8 @@ WINE_DEFAULT_DEBUG_CHANNEL(jscript);
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
DispatchEx dispex;
|
DispatchEx dispex;
|
||||||
|
|
||||||
|
DWORD length;
|
||||||
} ArrayInstance;
|
} ArrayInstance;
|
||||||
|
|
||||||
static const WCHAR lengthW[] = {'l','e','n','g','t','h',0};
|
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,
|
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");
|
DispatchEx *obj;
|
||||||
return E_NOTIMPL;
|
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)
|
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));
|
IDispatchEx_Release(_IDispatchEx_(&array->dispex));
|
||||||
return hres;
|
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;
|
||||||
|
}
|
||||||
|
|
|
@ -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_object(script_ctx_t*,DispatchEx*,DispatchEx**);
|
||||||
HRESULT create_math(script_ctx_t*,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_primitive(script_ctx_t*,VARIANT*,jsexcept_t*,VARIANT*);
|
||||||
HRESULT to_boolean(VARIANT*,VARIANT_BOOL*);
|
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_regexp_constr(script_ctx_t*,DispatchEx**);
|
||||||
HRESULT create_string_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*);
|
const char *debugstr_variant(const VARIANT*);
|
||||||
|
|
||||||
HRESULT WINAPI JScriptFactory_CreateInstance(IClassFactory*,IUnknown*,REFIID,void**);
|
HRESULT WINAPI JScriptFactory_CreateInstance(IClassFactory*,IUnknown*,REFIID,void**);
|
||||||
|
|
|
@ -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();
|
|
@ -16,5 +16,8 @@
|
||||||
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
|
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/* @makedep: api.js */
|
||||||
|
api.js 40 "api.js"
|
||||||
|
|
||||||
/* @makedep: lang.js */
|
/* @makedep: lang.js */
|
||||||
lang.js 40 "lang.js"
|
lang.js 40 "lang.js"
|
||||||
|
|
|
@ -582,6 +582,7 @@ static void run_tests(void)
|
||||||
CHECK_CALLED(global_success_i);
|
CHECK_CALLED(global_success_i);
|
||||||
|
|
||||||
run_from_res("lang.js");
|
run_from_res("lang.js");
|
||||||
|
run_from_res("api.js");
|
||||||
}
|
}
|
||||||
|
|
||||||
START_TEST(run)
|
START_TEST(run)
|
||||||
|
|
Loading…
Reference in New Issue