From d125c45fffde05806f8cf08007d65da26bbb5aa8 Mon Sep 17 00:00:00 2001 From: Christoph von Wittich Date: Sat, 22 Aug 2009 15:25:26 +0000 Subject: [PATCH] sync jscript with wine 1.1.28 svn path=/trunk/; revision=42849 --- reactos/dll/win32/jscript/array.c | 54 +++------ reactos/dll/win32/jscript/bool.c | 51 ++------- reactos/dll/win32/jscript/date.c | 76 +++++-------- reactos/dll/win32/jscript/dispex.c | 17 +++ reactos/dll/win32/jscript/engine.c | 45 +++++--- reactos/dll/win32/jscript/error.c | 50 ++------- reactos/dll/win32/jscript/function.c | 36 ------ reactos/dll/win32/jscript/global.c | 14 +-- reactos/dll/win32/jscript/jscript.h | 15 +-- reactos/dll/win32/jscript/jscript_Nl.rc | 1 + reactos/dll/win32/jscript/math.c | 50 ++++++--- reactos/dll/win32/jscript/number.c | 51 +++------ reactos/dll/win32/jscript/object.c | 11 +- reactos/dll/win32/jscript/regexp.c | 75 +++++-------- reactos/dll/win32/jscript/string.c | 141 ++++++++++++++---------- 15 files changed, 283 insertions(+), 404 deletions(-) diff --git a/reactos/dll/win32/jscript/array.c b/reactos/dll/win32/jscript/array.c index b2bd5b2de48..704624e7974 100644 --- a/reactos/dll/win32/jscript/array.c +++ b/reactos/dll/win32/jscript/array.c @@ -43,10 +43,6 @@ static const WCHAR spliceW[] = {'s','p','l','i','c','e',0}; static const WCHAR toStringW[] = {'t','o','S','t','r','i','n','g',0}; static const WCHAR toLocaleStringW[] = {'t','o','L','o','c','a','l','e','S','t','r','i','n','g',0}; static const WCHAR unshiftW[] = {'u','n','s','h','i','f','t',0}; -static const WCHAR hasOwnPropertyW[] = {'h','a','s','O','w','n','P','r','o','p','e','r','t','y',0}; -static const WCHAR propertyIsEnumerableW[] = - {'p','r','o','p','e','r','t','y','I','s','E','n','u','m','e','r','a','b','l','e',0}; -static const WCHAR isPrototypeOfW[] = {'i','s','P','r','o','t','o','t','y','p','e','O','f',0}; static const WCHAR default_separatorW[] = {',',0}; @@ -743,27 +739,6 @@ static HRESULT Array_unshift(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARA return E_NOTIMPL; } -static HRESULT Array_hasOwnProperty(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, - VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp) -{ - FIXME("\n"); - return E_NOTIMPL; -} - -static HRESULT Array_propertyIsEnumerable(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, - VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp) -{ - FIXME("\n"); - return E_NOTIMPL; -} - -static HRESULT Array_isPrototypeOf(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, - VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp) -{ - FIXME("\n"); - return E_NOTIMPL; -} - static HRESULT Array_value(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp) { @@ -809,22 +784,19 @@ static void Array_on_put(DispatchEx *dispex, const WCHAR *name) } static const builtin_prop_t Array_props[] = { - {concatW, Array_concat, PROPF_METHOD}, - {hasOwnPropertyW, Array_hasOwnProperty, PROPF_METHOD}, - {isPrototypeOfW, Array_isPrototypeOf, PROPF_METHOD}, - {joinW, Array_join, PROPF_METHOD}, + {concatW, Array_concat, PROPF_METHOD|1}, + {joinW, Array_join, PROPF_METHOD|1}, {lengthW, Array_length, 0}, {popW, Array_pop, PROPF_METHOD}, - {propertyIsEnumerableW, Array_propertyIsEnumerable, PROPF_METHOD}, - {pushW, Array_push, PROPF_METHOD}, + {pushW, Array_push, PROPF_METHOD|1}, {reverseW, Array_reverse, PROPF_METHOD}, {shiftW, Array_shift, PROPF_METHOD}, - {sliceW, Array_slice, PROPF_METHOD}, - {sortW, Array_sort, PROPF_METHOD}, - {spliceW, Array_splice, PROPF_METHOD}, + {sliceW, Array_slice, PROPF_METHOD|2}, + {sortW, Array_sort, PROPF_METHOD|1}, + {spliceW, Array_splice, PROPF_METHOD|2}, {toLocaleStringW, Array_toLocaleString, PROPF_METHOD}, {toStringW, Array_toString, PROPF_METHOD}, - {unshiftW, Array_unshift, PROPF_METHOD}, + {unshiftW, Array_unshift, PROPF_METHOD|1}, }; static const builtin_info_t Array_info = { @@ -888,7 +860,7 @@ static HRESULT ArrayConstr_value(DispatchEx *dispex, LCID lcid, WORD flags, DISP return S_OK; } -static HRESULT alloc_array(script_ctx_t *ctx, BOOL use_constr, ArrayInstance **ret) +static HRESULT alloc_array(script_ctx_t *ctx, DispatchEx *object_prototype, ArrayInstance **ret) { ArrayInstance *array; HRESULT hres; @@ -897,8 +869,8 @@ static HRESULT alloc_array(script_ctx_t *ctx, BOOL use_constr, ArrayInstance **r if(!array) return E_OUTOFMEMORY; - if(use_constr) - hres = init_dispex_from_constr(&array->dispex, ctx, &Array_info, ctx->array_constr); + if(object_prototype) + hres = init_dispex(&array->dispex, ctx, &Array_info, object_prototype); else hres = init_dispex_from_constr(&array->dispex, ctx, &Array_info, ctx->object_constr); @@ -911,12 +883,12 @@ static HRESULT alloc_array(script_ctx_t *ctx, BOOL use_constr, ArrayInstance **r return S_OK; } -HRESULT create_array_constr(script_ctx_t *ctx, DispatchEx **ret) +HRESULT create_array_constr(script_ctx_t *ctx, DispatchEx *object_prototype, DispatchEx **ret) { ArrayInstance *array; HRESULT hres; - hres = alloc_array(ctx, FALSE, &array); + hres = alloc_array(ctx, object_prototype, &array); if(FAILED(hres)) return hres; @@ -931,7 +903,7 @@ HRESULT create_array(script_ctx_t *ctx, DWORD length, DispatchEx **ret) ArrayInstance *array; HRESULT hres; - hres = alloc_array(ctx, TRUE, &array); + hres = alloc_array(ctx, NULL, &array); if(FAILED(hres)) return hres; diff --git a/reactos/dll/win32/jscript/bool.c b/reactos/dll/win32/jscript/bool.c index bfacebf3ec6..336f7e9cec9 100644 --- a/reactos/dll/win32/jscript/bool.c +++ b/reactos/dll/win32/jscript/bool.c @@ -30,12 +30,7 @@ typedef struct { } BoolInstance; static const WCHAR toStringW[] = {'t','o','S','t','r','i','n','g',0}; -static const WCHAR toLocaleStringW[] = {'t','o','L','o','c','a','l','e','S','t','r','i','n','g',0}; static const WCHAR valueOfW[] = {'v','a','l','u','e','O','f',0}; -static const WCHAR hasOwnPropertyW[] = {'h','a','s','O','w','n','P','r','o','p','e','r','t','y',0}; -static const WCHAR propertyIsEnumerableW[] = - {'p','r','o','p','e','r','t','y','I','s','E','n','u','m','e','r','a','b','l','e',0}; -static const WCHAR isPrototypeOfW[] = {'i','s','P','r','o','t','o','t','y','p','e','O','f',0}; /* ECMA-262 3rd Edition 15.6.4.2 */ static HRESULT Bool_toString(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, @@ -66,13 +61,6 @@ static HRESULT Bool_toString(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARA return S_OK; } -static HRESULT Bool_toLocaleString(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, - VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp) -{ - TRACE("\n"); - return Bool_toString(dispex, lcid, flags, dp, retv, ei, sp); -} - /* ECMA-262 3rd Edition 15.6.4.3 */ static HRESULT Bool_valueOf(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp) @@ -92,27 +80,6 @@ static HRESULT Bool_valueOf(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAM return S_OK; } -static HRESULT Bool_hasOwnProperty(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, - VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp) -{ - FIXME("\n"); - return E_NOTIMPL; -} - -static HRESULT Bool_propertyIsEnumerable(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, - VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp) -{ - FIXME("\n"); - return E_NOTIMPL; -} - -static HRESULT Bool_isPrototypeOf(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, - VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp) -{ - FIXME("\n"); - return E_NOTIMPL; -} - static HRESULT Bool_value(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp) { @@ -131,10 +98,6 @@ static HRESULT Bool_value(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS } static const builtin_prop_t Bool_props[] = { - {hasOwnPropertyW, Bool_hasOwnProperty, PROPF_METHOD}, - {isPrototypeOfW, Bool_isPrototypeOf, PROPF_METHOD}, - {propertyIsEnumerableW, Bool_propertyIsEnumerable, PROPF_METHOD}, - {toLocaleStringW, Bool_toLocaleString, PROPF_METHOD}, {toStringW, Bool_toString, PROPF_METHOD}, {valueOfW, Bool_valueOf, PROPF_METHOD} }; @@ -188,7 +151,7 @@ static HRESULT BoolConstr_value(DispatchEx *dispex, LCID lcid, WORD flags, DISPP return S_OK; } -static HRESULT alloc_bool(script_ctx_t *ctx, BOOL use_constr, BoolInstance **ret) +static HRESULT alloc_bool(script_ctx_t *ctx, DispatchEx *object_prototype, BoolInstance **ret) { BoolInstance *bool; HRESULT hres; @@ -197,10 +160,10 @@ static HRESULT alloc_bool(script_ctx_t *ctx, BOOL use_constr, BoolInstance **ret if(!bool) return E_OUTOFMEMORY; - if(use_constr) - hres = init_dispex_from_constr(&bool->dispex, ctx, &Bool_info, ctx->bool_constr); + if(object_prototype) + hres = init_dispex(&bool->dispex, ctx, &Bool_info, object_prototype); else - hres = init_dispex(&bool->dispex, ctx, &Bool_info, NULL); + hres = init_dispex_from_constr(&bool->dispex, ctx, &Bool_info, ctx->bool_constr); if(FAILED(hres)) { heap_free(bool); @@ -211,12 +174,12 @@ static HRESULT alloc_bool(script_ctx_t *ctx, BOOL use_constr, BoolInstance **ret return S_OK; } -HRESULT create_bool_constr(script_ctx_t *ctx, DispatchEx **ret) +HRESULT create_bool_constr(script_ctx_t *ctx, DispatchEx *object_prototype, DispatchEx **ret) { BoolInstance *bool; HRESULT hres; - hres = alloc_bool(ctx, FALSE, &bool); + hres = alloc_bool(ctx, object_prototype, &bool); if(FAILED(hres)) return hres; @@ -231,7 +194,7 @@ HRESULT create_bool(script_ctx_t *ctx, VARIANT_BOOL b, DispatchEx **ret) BoolInstance *bool; HRESULT hres; - hres = alloc_bool(ctx, TRUE, &bool); + hres = alloc_bool(ctx, NULL, &bool); if(FAILED(hres)) return hres; diff --git a/reactos/dll/win32/jscript/date.c b/reactos/dll/win32/jscript/date.c index 5085f212ebe..7c240cd1031 100644 --- a/reactos/dll/win32/jscript/date.c +++ b/reactos/dll/win32/jscript/date.c @@ -17,6 +17,9 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +#include "config.h" +#include "wine/port.h" + #include #include @@ -44,7 +47,6 @@ typedef struct { static const WCHAR toStringW[] = {'t','o','S','t','r','i','n','g',0}; static const WCHAR toLocaleStringW[] = {'t','o','L','o','c','a','l','e','S','t','r','i','n','g',0}; -static const WCHAR hasOwnPropertyW[] = {'h','a','s','O','w','n','P','r','o','p','e','r','t','y',0}; static const WCHAR propertyIsEnumerableW[] = {'p','r','o','p','e','r','t','y','I','s','E','n','u','m','e','r','a','b','l','e',0}; static const WCHAR isPrototypeOfW[] = {'i','s','P','r','o','t','o','t','y','p','e','O','f',0}; @@ -649,27 +651,6 @@ static HRESULT Date_toLocaleString(DispatchEx *dispex, LCID lcid, WORD flags, DI return S_OK; } -static HRESULT Date_hasOwnProperty(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, - VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller) -{ - FIXME("\n"); - return E_NOTIMPL; -} - -static HRESULT Date_propertyIsEnumerable(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, - VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller) -{ - FIXME("\n"); - return E_NOTIMPL; -} - -static HRESULT Date_isPrototypeOf(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, - VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller) -{ - FIXME("\n"); - return E_NOTIMPL; -} - static HRESULT Date_valueOf(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller) { @@ -2073,24 +2054,21 @@ static const builtin_prop_t Date_props[] = { {getUTCMonthW, Date_getUTCMonth, PROPF_METHOD}, {getUTCSecondsW, Date_getUTCSeconds, PROPF_METHOD}, {getYearW, Date_getYear, PROPF_METHOD}, - {hasOwnPropertyW, Date_hasOwnProperty, PROPF_METHOD}, - {isPrototypeOfW, Date_isPrototypeOf, PROPF_METHOD}, - {propertyIsEnumerableW, Date_propertyIsEnumerable, PROPF_METHOD}, - {setDateW, Date_setDate, PROPF_METHOD}, - {setFullYearW, Date_setFullYear, PROPF_METHOD}, - {setHoursW, Date_setHours, PROPF_METHOD}, - {setMillisecondsW, Date_setMilliseconds, PROPF_METHOD}, - {setMinutesW, Date_setMinutes, PROPF_METHOD}, - {setMonthW, Date_setMonth, PROPF_METHOD}, - {setSecondsW, Date_setSeconds, PROPF_METHOD}, - {setTimeW, Date_setTime, PROPF_METHOD}, - {setUTCDateW, Date_setUTCDate, PROPF_METHOD}, - {setUTCFullYearW, Date_setUTCFullYear, PROPF_METHOD}, - {setUTCHoursW, Date_setUTCHours, PROPF_METHOD}, - {setUTCMillisecondsW, Date_setUTCMilliseconds, PROPF_METHOD}, - {setUTCMinutesW, Date_setUTCMinutes, PROPF_METHOD}, - {setUTCMonthW, Date_setUTCMonth, PROPF_METHOD}, - {setUTCSecondsW, Date_setUTCSeconds, PROPF_METHOD}, + {setDateW, Date_setDate, PROPF_METHOD|1}, + {setFullYearW, Date_setFullYear, PROPF_METHOD|3}, + {setHoursW, Date_setHours, PROPF_METHOD|4}, + {setMillisecondsW, Date_setMilliseconds, PROPF_METHOD|1}, + {setMinutesW, Date_setMinutes, PROPF_METHOD|3}, + {setMonthW, Date_setMonth, PROPF_METHOD|2}, + {setSecondsW, Date_setSeconds, PROPF_METHOD|2}, + {setTimeW, Date_setTime, PROPF_METHOD|1}, + {setUTCDateW, Date_setUTCDate, PROPF_METHOD|1}, + {setUTCFullYearW, Date_setUTCFullYear, PROPF_METHOD|3}, + {setUTCHoursW, Date_setUTCHours, PROPF_METHOD|4}, + {setUTCMillisecondsW, Date_setUTCMilliseconds, PROPF_METHOD|1}, + {setUTCMinutesW, Date_setUTCMinutes, PROPF_METHOD|3}, + {setUTCMonthW, Date_setUTCMonth, PROPF_METHOD|2}, + {setUTCSecondsW, Date_setUTCSeconds, PROPF_METHOD|2}, {toDateStringW, Date_toDateString, PROPF_METHOD}, {toLocaleDateStringW, Date_toLocaleDateString, PROPF_METHOD}, {toLocaleStringW, Date_toLocaleString, PROPF_METHOD}, @@ -2110,7 +2088,7 @@ static const builtin_info_t Date_info = { NULL }; -static HRESULT create_date(script_ctx_t *ctx, BOOL use_constr, DOUBLE time, DispatchEx **ret) +static HRESULT create_date(script_ctx_t *ctx, DispatchEx *object_prototype, DOUBLE time, DispatchEx **ret) { DateInstance *date; HRESULT hres; @@ -2122,10 +2100,10 @@ static HRESULT create_date(script_ctx_t *ctx, BOOL use_constr, DOUBLE time, Disp if(!date) return E_OUTOFMEMORY; - if(use_constr) - hres = init_dispex_from_constr(&date->dispex, ctx, &Date_info, ctx->date_constr); + if(object_prototype) + hres = init_dispex(&date->dispex, ctx, &Date_info, object_prototype); else - hres = init_dispex(&date->dispex, ctx, &Date_info, NULL); + hres = init_dispex_from_constr(&date->dispex, ctx, &Date_info, ctx->date_constr); if(FAILED(hres)) { heap_free(date); return hres; @@ -2537,7 +2515,7 @@ static HRESULT DateConstr_value(DispatchEx *dispex, LCID lcid, WORD flags, DISPP lltime = ((LONGLONG)time.dwHighDateTime<<32) + time.dwLowDateTime; - hres = create_date(dispex->ctx, TRUE, lltime/10000-TIME_EPOCH, &date); + hres = create_date(dispex->ctx, NULL, lltime/10000-TIME_EPOCH, &date); if(FAILED(hres)) return hres; break; @@ -2560,7 +2538,7 @@ static HRESULT DateConstr_value(DispatchEx *dispex, LCID lcid, WORD flags, DISPP if(FAILED(hres)) return hres; - hres = create_date(dispex->ctx, TRUE, time_clip(num_val(&num)), &date); + hres = create_date(dispex->ctx, NULL, time_clip(num_val(&num)), &date); if(FAILED(hres)) return hres; break; @@ -2573,7 +2551,7 @@ static HRESULT DateConstr_value(DispatchEx *dispex, LCID lcid, WORD flags, DISPP DateConstr_UTC(dispex, lcid, flags, dp, &ret_date, ei, sp); - hres = create_date(dispex->ctx, TRUE, num_val(&ret_date), &date); + hres = create_date(dispex->ctx, NULL, num_val(&ret_date), &date); if(FAILED(hres)) return hres; @@ -2620,12 +2598,12 @@ static const builtin_info_t DateConstr_info = { NULL }; -HRESULT create_date_constr(script_ctx_t *ctx, DispatchEx **ret) +HRESULT create_date_constr(script_ctx_t *ctx, DispatchEx *object_prototype, DispatchEx **ret) { DispatchEx *date; HRESULT hres; - hres = create_date(ctx, FALSE, 0.0, &date); + hres = create_date(ctx, object_prototype, 0.0, &date); if(FAILED(hres)) return hres; diff --git a/reactos/dll/win32/jscript/dispex.c b/reactos/dll/win32/jscript/dispex.c index 509fb50944d..12fcb3a161a 100644 --- a/reactos/dll/win32/jscript/dispex.c +++ b/reactos/dll/win32/jscript/dispex.c @@ -844,6 +844,23 @@ HRESULT jsdisp_call(DispatchEx *disp, DISPID id, LCID lcid, WORD flags, DISPPARA return invoke_prop_func(disp, disp, prop, lcid, flags, dp, retv, ei, caller); } +HRESULT jsdisp_call_name(DispatchEx *disp, const WCHAR *name, LCID lcid, WORD flags, DISPPARAMS *dp, VARIANT *retv, + jsexcept_t *ei, IServiceProvider *caller) +{ + dispex_prop_t *prop; + HRESULT hres; + + hres = find_prop_name_prot(disp, name, TRUE, &prop); + if(FAILED(hres)) + return hres; + + memset(ei, 0, sizeof(*ei)); + if(retv) + V_VT(retv) = VT_EMPTY; + + return invoke_prop_func(disp, disp, prop, lcid, flags, dp, retv, ei, caller); +} + HRESULT disp_call(IDispatch *disp, DISPID id, LCID lcid, WORD flags, DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller) { diff --git a/reactos/dll/win32/jscript/engine.c b/reactos/dll/win32/jscript/engine.c index f120cc680b6..2f884b2cdb9 100644 --- a/reactos/dll/win32/jscript/engine.c +++ b/reactos/dll/win32/jscript/engine.c @@ -356,6 +356,26 @@ static HRESULT literal_to_var(literal_t *literal, VARIANT *v) return S_OK; } +static BOOL lookup_global_members(script_ctx_t *ctx, BSTR identifier, exprval_t *ret) +{ + named_item_t *item; + DISPID id; + HRESULT hres; + + for(item = ctx->named_items; item; item = item->next) { + if(item->flags & SCRIPTITEM_GLOBALMEMBERS) { + hres = disp_get_id(item->disp, identifier, 0, &id); + if(SUCCEEDED(hres)) { + if(ret) + exprval_set_idref(ret, item->disp, id); + return TRUE; + } + } + } + + return FALSE; +} + HRESULT exec_source(exec_ctx_t *ctx, parser_ctx_t *parser, source_elements_t *source, jsexcept_t *ei, VARIANT *retv) { script_ctx_t *script = parser->script; @@ -387,8 +407,15 @@ HRESULT exec_source(exec_ctx_t *ctx, parser_ctx_t *parser, source_elements_t *so for(var = source->variables; var; var = var->next) { DISPID id = 0; + BSTR name; - hres = jsdisp_get_id(ctx->var_disp, var->identifier, fdexNameEnsure, &id); + name = SysAllocString(var->identifier); + if(!name) + return E_OUTOFMEMORY; + + if(!lookup_global_members(parser->script, name, NULL)) + hres = jsdisp_get_id(ctx->var_disp, var->identifier, fdexNameEnsure, &id); + SysFreeString(name); if(FAILED(hres)) return hres; } @@ -493,25 +520,15 @@ static HRESULT identifier_eval(exec_ctx_t *ctx, BSTR identifier, DWORD flags, js } } - for(item = ctx->parser->script->named_items; item; item = item->next) { - if(item->flags & SCRIPTITEM_GLOBALMEMBERS) { - hres = disp_get_id(item->disp, identifier, 0, &id); - if(SUCCEEDED(hres)) - break; - } - } - - if(item) { - exprval_set_idref(ret, item->disp, id); - return S_OK; - } - hres = jsdisp_get_id(ctx->parser->script->script_disp, identifier, 0, &id); if(SUCCEEDED(hres)) { exprval_set_idref(ret, (IDispatch*)_IDispatchEx_(ctx->parser->script->script_disp), id); return S_OK; } + if(lookup_global_members(ctx->parser->script, identifier, ret)) + return S_OK; + if(flags & EXPR_NEWREF) { hres = jsdisp_get_id(ctx->var_disp, identifier, fdexNameEnsure, &id); if(FAILED(hres)) diff --git a/reactos/dll/win32/jscript/error.c b/reactos/dll/win32/jscript/error.c index 25a3836cc8f..70fd008781b 100644 --- a/reactos/dll/win32/jscript/error.c +++ b/reactos/dll/win32/jscript/error.c @@ -38,10 +38,6 @@ static const WCHAR descriptionW[] = {'d','e','s','c','r','i','p','t','i','o','n' static const WCHAR messageW[] = {'m','e','s','s','a','g','e',0}; static const WCHAR numberW[] = {'n','u','m','b','e','r',0}; static const WCHAR toStringW[] = {'t','o','S','t','r','i','n','g',0}; -static const WCHAR hasOwnPropertyW[] = {'h','a','s','O','w','n','P','r','o','p','e','r','t','y',0}; -static const WCHAR propertyIsEnumerableW[] = - {'p','r','o','p','e','r','t','y','I','s','E','n','u','m','e','r','a','b','l','e',0}; -static const WCHAR isPrototypeOfW[] = {'i','s','P','r','o','t','o','t','y','p','e','O','f',0}; static HRESULT Error_number(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp) @@ -116,28 +112,6 @@ static HRESULT Error_toString(DispatchEx *dispex, LCID lcid, WORD flags, return S_OK; } -static HRESULT Error_hasOwnProperty(DispatchEx *dispex, LCID lcid, WORD flags, - DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp) -{ - FIXME("\n"); - return E_NOTIMPL; -} - -static HRESULT Error_propertyIsEnumerable(DispatchEx *dispex, LCID lcid, WORD flags, - DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp) -{ - FIXME("\n"); - return E_NOTIMPL; -} - - -static HRESULT Error_isPrototypeOf(DispatchEx *dispex, LCID lcid, WORD flags, - DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp) -{ - FIXME("\n"); - return E_NOTIMPL; -} - static HRESULT Error_value(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp) { @@ -166,11 +140,8 @@ static void Error_destructor(DispatchEx *dispex) static const builtin_prop_t Error_props[] = { {descriptionW, Error_description, 0}, - {hasOwnPropertyW, Error_hasOwnProperty, PROPF_METHOD}, - {isPrototypeOfW, Error_isPrototypeOf, PROPF_METHOD}, {messageW, Error_message, 0}, {numberW, Error_number, 0}, - {propertyIsEnumerableW, Error_propertyIsEnumerable, PROPF_METHOD}, {toStringW, Error_toString, PROPF_METHOD} }; @@ -185,11 +156,8 @@ static const builtin_info_t Error_info = { static const builtin_prop_t ErrorInst_props[] = { {descriptionW, Error_description, 0}, - {hasOwnPropertyW, Error_hasOwnProperty, PROPF_METHOD}, - {isPrototypeOfW, Error_isPrototypeOf, PROPF_METHOD}, {messageW, Error_message, 0}, {numberW, Error_number, 0}, - {propertyIsEnumerableW, Error_propertyIsEnumerable, PROPF_METHOD} }; static const builtin_info_t ErrorInst_info = { @@ -201,21 +169,21 @@ static const builtin_info_t ErrorInst_info = { NULL }; -static HRESULT alloc_error(script_ctx_t *ctx, BOOL error_prototype, +static HRESULT alloc_error(script_ctx_t *ctx, DispatchEx *prototype, DispatchEx *constr, ErrorInstance **ret) { ErrorInstance *err; - DispatchEx *inherit; HRESULT hres; err = heap_alloc_zero(sizeof(ErrorInstance)); if(!err) return E_OUTOFMEMORY; - inherit = error_prototype ? ctx->object_constr : ctx->error_constr; - hres = init_dispex_from_constr(&err->dispex, ctx, - error_prototype ? &Error_info : &ErrorInst_info, - constr ? constr : inherit); + if(prototype) + hres = init_dispex(&err->dispex, ctx, &Error_info, prototype); + else + hres = init_dispex_from_constr(&err->dispex, ctx, &ErrorInst_info, + constr ? constr : ctx->error_constr); if(FAILED(hres)) { heap_free(err); return hres; @@ -231,7 +199,7 @@ static HRESULT create_error(script_ctx_t *ctx, DispatchEx *constr, ErrorInstance *err; HRESULT hres; - hres = alloc_error(ctx, FALSE, constr, &err); + hres = alloc_error(ctx, NULL, constr, &err); if(FAILED(hres)) return hres; @@ -366,7 +334,7 @@ static HRESULT URIErrorConstr_value(DispatchEx *dispex, LCID lcid, WORD flags, dispex->ctx->uri_error_constr); } -HRESULT init_error_constr(script_ctx_t *ctx) +HRESULT init_error_constr(script_ctx_t *ctx, DispatchEx *object_prototype) { static const WCHAR nameW[] = {'n','a','m','e',0}; static const WCHAR ErrorW[] = {'E','r','r','o','r',0}; @@ -392,7 +360,7 @@ HRESULT init_error_constr(script_ctx_t *ctx) HRESULT hres; for(i=0; i<7; i++) { - hres = alloc_error(ctx, i==0, NULL, &err); + hres = alloc_error(ctx, i==0 ? object_prototype : NULL, NULL, &err); if(FAILED(hres)) return hres; diff --git a/reactos/dll/win32/jscript/function.c b/reactos/dll/win32/jscript/function.c index 6ac668cf80a..661b93c2576 100644 --- a/reactos/dll/win32/jscript/function.c +++ b/reactos/dll/win32/jscript/function.c @@ -40,12 +40,8 @@ static const WCHAR prototypeW[] = {'p','r','o','t','o','t', 'y', 'p','e',0}; static const WCHAR lengthW[] = {'l','e','n','g','t','h',0}; static const WCHAR toStringW[] = {'t','o','S','t','r','i','n','g',0}; -static const WCHAR toLocaleStringW[] = {'t','o','L','o','c','a','l','e','S','t','r','i','n','g',0}; static const WCHAR applyW[] = {'a','p','p','l','y',0}; static const WCHAR callW[] = {'c','a','l','l',0}; -static const WCHAR hasOwnPropertyW[] = {'h','a','s','O','w','n','P','r','o','p','e','r','t','y',0}; -static const WCHAR propertyIsEnumerableW[] = {'p','r','o','p','e','r','t','y','I','s','E','n','u','m','e','r','a','b','l','e',0}; -static const WCHAR isPrototypeOfW[] = {'i','s','P','r','o','t','o','t','y','p','e','O','f',0}; static IDispatch *get_this(DISPPARAMS *dp) { @@ -290,13 +286,6 @@ static HRESULT Function_toString(DispatchEx *dispex, LCID lcid, WORD flags, DISP return S_OK; } -static HRESULT Function_toLocaleString(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, - VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp) -{ - FIXME("\n"); - return E_NOTIMPL; -} - static HRESULT Function_apply(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp) { @@ -311,27 +300,6 @@ static HRESULT Function_call(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARA return E_NOTIMPL; } -static HRESULT Function_hasOwnProperty(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, - VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp) -{ - FIXME("\n"); - return E_NOTIMPL; -} - -static HRESULT Function_propertyIsEnumerable(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, - VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp) -{ - FIXME("\n"); - return E_NOTIMPL; -} - -static HRESULT Function_isPrototypeOf(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, - VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp) -{ - FIXME("\n"); - return E_NOTIMPL; -} - HRESULT Function_value(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller) { @@ -394,11 +362,7 @@ static void Function_destructor(DispatchEx *dispex) static const builtin_prop_t Function_props[] = { {applyW, Function_apply, PROPF_METHOD}, {callW, Function_call, PROPF_METHOD}, - {hasOwnPropertyW, Function_hasOwnProperty, PROPF_METHOD}, - {isPrototypeOfW, Function_isPrototypeOf, PROPF_METHOD}, {lengthW, Function_length, 0}, - {propertyIsEnumerableW, Function_propertyIsEnumerable, PROPF_METHOD}, - {toLocaleStringW, Function_toLocaleString, PROPF_METHOD}, {toStringW, Function_toString, PROPF_METHOD} }; diff --git a/reactos/dll/win32/jscript/global.c b/reactos/dll/win32/jscript/global.c index ff3510fd83b..e843fac02f7 100644 --- a/reactos/dll/win32/jscript/global.c +++ b/reactos/dll/win32/jscript/global.c @@ -754,31 +754,31 @@ static HRESULT init_constructors(script_ctx_t *ctx, DispatchEx *object_prototype if(FAILED(hres)) return hres; - hres = create_array_constr(ctx, &ctx->array_constr); + hres = create_array_constr(ctx, object_prototype, &ctx->array_constr); if(FAILED(hres)) return hres; - hres = create_bool_constr(ctx, &ctx->bool_constr); + hres = create_bool_constr(ctx, object_prototype, &ctx->bool_constr); if(FAILED(hres)) return hres; - hres = create_date_constr(ctx, &ctx->date_constr); + hres = create_date_constr(ctx, object_prototype, &ctx->date_constr); if(FAILED(hres)) return hres; - hres = init_error_constr(ctx); + hres = init_error_constr(ctx, object_prototype); if(FAILED(hres)) return hres; - hres = create_number_constr(ctx, &ctx->number_constr); + hres = create_number_constr(ctx, object_prototype, &ctx->number_constr); if(FAILED(hres)) return hres; - hres = create_regexp_constr(ctx, &ctx->regexp_constr); + hres = create_regexp_constr(ctx, object_prototype, &ctx->regexp_constr); if(FAILED(hres)) return hres; - hres = create_string_constr(ctx, &ctx->string_constr); + hres = create_string_constr(ctx, object_prototype, &ctx->string_constr); if(FAILED(hres)) return hres; diff --git a/reactos/dll/win32/jscript/jscript.h b/reactos/dll/win32/jscript/jscript.h index 70c9fea603a..807225a0ac7 100644 --- a/reactos/dll/win32/jscript/jscript.h +++ b/reactos/dll/win32/jscript/jscript.h @@ -131,6 +131,7 @@ DispatchEx *iface_to_jsdisp(IUnknown*); HRESULT disp_call(IDispatch*,DISPID,LCID,WORD,DISPPARAMS*,VARIANT*,jsexcept_t*,IServiceProvider*); HRESULT jsdisp_call_value(DispatchEx*,LCID,WORD,DISPPARAMS*,VARIANT*,jsexcept_t*,IServiceProvider*); HRESULT jsdisp_call(DispatchEx*,DISPID,LCID,WORD,DISPPARAMS*,VARIANT*,jsexcept_t*,IServiceProvider*); +HRESULT jsdisp_call_name(DispatchEx*,const WCHAR*,LCID,WORD,DISPPARAMS*,VARIANT*,jsexcept_t*,IServiceProvider*); HRESULT disp_propget(IDispatch*,DISPID,LCID,VARIANT*,jsexcept_t*,IServiceProvider*); HRESULT disp_propput(IDispatch*,DISPID,LCID,VARIANT*,jsexcept_t*,IServiceProvider*); HRESULT jsdisp_propget(DispatchEx*,DISPID,LCID,VARIANT*,jsexcept_t*,IServiceProvider*); @@ -225,14 +226,14 @@ HRESULT init_global(script_ctx_t*); HRESULT init_function_constr(script_ctx_t*,DispatchEx*); HRESULT create_object_prototype(script_ctx_t*,DispatchEx**); -HRESULT create_array_constr(script_ctx_t*,DispatchEx**); -HRESULT create_bool_constr(script_ctx_t*,DispatchEx**); -HRESULT create_date_constr(script_ctx_t*,DispatchEx**); -HRESULT init_error_constr(script_ctx_t*); -HRESULT create_number_constr(script_ctx_t*,DispatchEx**); +HRESULT create_array_constr(script_ctx_t*,DispatchEx*,DispatchEx**); +HRESULT create_bool_constr(script_ctx_t*,DispatchEx*,DispatchEx**); +HRESULT create_date_constr(script_ctx_t*,DispatchEx*,DispatchEx**); +HRESULT init_error_constr(script_ctx_t*,DispatchEx*); +HRESULT create_number_constr(script_ctx_t*,DispatchEx*,DispatchEx**); HRESULT create_object_constr(script_ctx_t*,DispatchEx*,DispatchEx**); -HRESULT create_regexp_constr(script_ctx_t*,DispatchEx**); -HRESULT create_string_constr(script_ctx_t*,DispatchEx**); +HRESULT create_regexp_constr(script_ctx_t*,DispatchEx*,DispatchEx**); +HRESULT create_string_constr(script_ctx_t*,DispatchEx*,DispatchEx**); typedef struct { const WCHAR *str; diff --git a/reactos/dll/win32/jscript/jscript_Nl.rc b/reactos/dll/win32/jscript/jscript_Nl.rc index 71ba6b5517d..e3bd39f884c 100644 --- a/reactos/dll/win32/jscript/jscript_Nl.rc +++ b/reactos/dll/win32/jscript/jscript_Nl.rc @@ -30,6 +30,7 @@ STRINGTABLE DISCARDABLE IDS_SEMICOLON "';' verwacht" IDS_LBRACKET "'(' verwacht" IDS_RBRACKET "')' verwacht" + IDS_UNTERMINATED_STR "Onafgesloten tekenreeksconstante" IDS_NOT_FUNC "Functie verwacht" IDS_NOT_DATE "'[object]' is geen datum object" IDS_NOT_NUM "Getal verwacht" diff --git a/reactos/dll/win32/jscript/math.c b/reactos/dll/win32/jscript/math.c index b172ffdf72d..628707ed17e 100644 --- a/reactos/dll/win32/jscript/math.c +++ b/reactos/dll/win32/jscript/math.c @@ -571,24 +571,24 @@ static const builtin_prop_t Math_props[] = { {PIW, Math_PI, 0}, {SQRT1_2W, Math_SQRT1_2, 0}, {SQRT2W, Math_SQRT2, 0}, - {absW, Math_abs, PROPF_METHOD}, - {acosW, Math_acos, PROPF_METHOD}, - {asinW, Math_asin, PROPF_METHOD}, - {atanW, Math_atan, PROPF_METHOD}, - {atan2W, Math_atan2, PROPF_METHOD}, - {ceilW, Math_ceil, PROPF_METHOD}, - {cosW, Math_cos, PROPF_METHOD}, - {expW, Math_exp, PROPF_METHOD}, - {floorW, Math_floor, PROPF_METHOD}, - {logW, Math_log, PROPF_METHOD}, - {maxW, Math_max, PROPF_METHOD}, - {minW, Math_min, PROPF_METHOD}, - {powW, Math_pow, PROPF_METHOD}, + {absW, Math_abs, PROPF_METHOD|1}, + {acosW, Math_acos, PROPF_METHOD|1}, + {asinW, Math_asin, PROPF_METHOD|1}, + {atanW, Math_atan, PROPF_METHOD|1}, + {atan2W, Math_atan2, PROPF_METHOD|2}, + {ceilW, Math_ceil, PROPF_METHOD|1}, + {cosW, Math_cos, PROPF_METHOD|1}, + {expW, Math_exp, PROPF_METHOD|1}, + {floorW, Math_floor, PROPF_METHOD|1}, + {logW, Math_log, PROPF_METHOD|1}, + {maxW, Math_max, PROPF_METHOD|2}, + {minW, Math_min, PROPF_METHOD|2}, + {powW, Math_pow, PROPF_METHOD|2}, {randomW, Math_random, PROPF_METHOD}, - {roundW, Math_round, PROPF_METHOD}, - {sinW, Math_sin, PROPF_METHOD}, - {sqrtW, Math_sqrt, PROPF_METHOD}, - {tanW, Math_tan, PROPF_METHOD} + {roundW, Math_round, PROPF_METHOD|1}, + {sinW, Math_sin, PROPF_METHOD|1}, + {sqrtW, Math_sqrt, PROPF_METHOD|1}, + {tanW, Math_tan, PROPF_METHOD|1} }; static const builtin_info_t Math_info = { @@ -602,5 +602,19 @@ static const builtin_info_t Math_info = { HRESULT create_math(script_ctx_t *ctx, DispatchEx **ret) { - return create_dispex(ctx, &Math_info, NULL, ret); + DispatchEx *math; + HRESULT hres; + + math = heap_alloc_zero(sizeof(DispatchEx)); + if(!math) + return E_OUTOFMEMORY; + + hres = init_dispex_from_constr(math, ctx, &Math_info, ctx->object_constr); + if(FAILED(hres)) { + heap_free(math); + return hres; + } + + *ret = math; + return S_OK; } diff --git a/reactos/dll/win32/jscript/number.c b/reactos/dll/win32/jscript/number.c index 0aeeab6386a..30b7a56d6a9 100644 --- a/reactos/dll/win32/jscript/number.c +++ b/reactos/dll/win32/jscript/number.c @@ -16,6 +16,9 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +#include "config.h" +#include "wine/port.h" + #include #include "jscript.h" @@ -36,10 +39,6 @@ static const WCHAR toFixedW[] = {'t','o','F','i','x','e','d',0}; static const WCHAR toExponentialW[] = {'t','o','E','x','p','o','n','e','n','t','i','a','l',0}; static const WCHAR toPrecisionW[] = {'t','o','P','r','e','c','i','s','i','o','n',0}; static const WCHAR valueOfW[] = {'v','a','l','u','e','O','f',0}; -static const WCHAR hasOwnPropertyW[] = {'h','a','s','O','w','n','P','r','o','p','e','r','t','y',0}; -static const WCHAR propertyIsEnumerableW[] = - {'p','r','o','p','e','r','t','y','I','s','E','n','u','m','e','r','a','b','l','e',0}; -static const WCHAR isPrototypeOfW[] = {'i','s','P','r','o','t','o','t','y','p','e','O','f',0}; #define NUMBER_TOSTRING_BUF_SIZE 64 /* ECMA-262 3rd Edition 15.7.4.2 */ @@ -214,27 +213,6 @@ static HRESULT Number_valueOf(DispatchEx *dispex, LCID lcid, WORD flags, DISPPAR return S_OK; } -static HRESULT Number_hasOwnProperty(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, - VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp) -{ - FIXME("\n"); - return E_NOTIMPL; -} - -static HRESULT Number_propertyIsEnumerable(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, - VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp) -{ - FIXME("\n"); - return E_NOTIMPL; -} - -static HRESULT Number_isPrototypeOf(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, - VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp) -{ - FIXME("\n"); - return E_NOTIMPL; -} - static HRESULT Number_value(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp) { @@ -256,14 +234,11 @@ static HRESULT Number_value(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAM } static const builtin_prop_t Number_props[] = { - {hasOwnPropertyW, Number_hasOwnProperty, PROPF_METHOD}, - {isPrototypeOfW, Number_isPrototypeOf, PROPF_METHOD}, - {propertyIsEnumerableW, Number_propertyIsEnumerable, PROPF_METHOD}, - {toExponentialW, Number_toExponential, PROPF_METHOD}, + {toExponentialW, Number_toExponential, PROPF_METHOD|1}, {toFixedW, Number_toFixed, PROPF_METHOD}, {toLocaleStringW, Number_toLocaleString, PROPF_METHOD}, - {toPrecisionW, Number_toPrecision, PROPF_METHOD}, - {toStringW, Number_toString, PROPF_METHOD}, + {toPrecisionW, Number_toPrecision, PROPF_METHOD|1}, + {toStringW, Number_toString, PROPF_METHOD|1}, {valueOfW, Number_valueOf, PROPF_METHOD} }; @@ -330,7 +305,7 @@ static HRESULT NumberConstr_value(DispatchEx *dispex, LCID lcid, WORD flags, DIS return S_OK; } -static HRESULT alloc_number(script_ctx_t *ctx, BOOL use_constr, NumberInstance **ret) +static HRESULT alloc_number(script_ctx_t *ctx, DispatchEx *object_prototype, NumberInstance **ret) { NumberInstance *number; HRESULT hres; @@ -339,10 +314,10 @@ static HRESULT alloc_number(script_ctx_t *ctx, BOOL use_constr, NumberInstance * if(!number) return E_OUTOFMEMORY; - if(use_constr) - hres = init_dispex_from_constr(&number->dispex, ctx, &Number_info, ctx->number_constr); + if(object_prototype) + hres = init_dispex(&number->dispex, ctx, &Number_info, object_prototype); else - hres = init_dispex(&number->dispex, ctx, &Number_info, NULL); + hres = init_dispex_from_constr(&number->dispex, ctx, &Number_info, ctx->number_constr); if(FAILED(hres)) return hres; @@ -350,12 +325,12 @@ static HRESULT alloc_number(script_ctx_t *ctx, BOOL use_constr, NumberInstance * return S_OK; } -HRESULT create_number_constr(script_ctx_t *ctx, DispatchEx **ret) +HRESULT create_number_constr(script_ctx_t *ctx, DispatchEx *object_prototype, DispatchEx **ret) { NumberInstance *number; HRESULT hres; - hres = alloc_number(ctx, FALSE, &number); + hres = alloc_number(ctx, object_prototype, &number); if(FAILED(hres)) return hres; @@ -371,7 +346,7 @@ HRESULT create_number(script_ctx_t *ctx, VARIANT *num, DispatchEx **ret) NumberInstance *number; HRESULT hres; - hres = alloc_number(ctx, TRUE, &number); + hres = alloc_number(ctx, NULL, &number); if(FAILED(hres)) return hres; diff --git a/reactos/dll/win32/jscript/object.c b/reactos/dll/win32/jscript/object.c index 737230ada85..e8624bd79aa 100644 --- a/reactos/dll/win32/jscript/object.c +++ b/reactos/dll/win32/jscript/object.c @@ -74,8 +74,11 @@ static HRESULT Object_toString(DispatchEx *dispex, LCID lcid, WORD flags, DISPPA static HRESULT Object_toLocaleString(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp) { + DISPPARAMS params = {NULL, NULL, 0, 0}; + TRACE("\n"); - return Object_toString(dispex, lcid, flags, dp, retv, ei, sp); + + return jsdisp_call_name(dispex, toStringW, lcid, DISPATCH_METHOD, ¶ms, retv, ei, sp); } static HRESULT Object_valueOf(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, @@ -142,9 +145,9 @@ static void Object_destructor(DispatchEx *dispex) } static const builtin_prop_t Object_props[] = { - {hasOwnPropertyW, Object_hasOwnProperty, PROPF_METHOD}, - {isPrototypeOfW, Object_isPrototypeOf, PROPF_METHOD}, - {propertyIsEnumerableW, Object_propertyIsEnumerable, PROPF_METHOD}, + {hasOwnPropertyW, Object_hasOwnProperty, PROPF_METHOD|1}, + {isPrototypeOfW, Object_isPrototypeOf, PROPF_METHOD|1}, + {propertyIsEnumerableW, Object_propertyIsEnumerable, PROPF_METHOD|1}, {toLocaleStringW, Object_toLocaleString, PROPF_METHOD}, {toStringW, Object_toString, PROPF_METHOD}, {valueOfW, Object_valueOf, PROPF_METHOD} diff --git a/reactos/dll/win32/jscript/regexp.c b/reactos/dll/win32/jscript/regexp.c index a4d640ef860..1f874e27de9 100644 --- a/reactos/dll/win32/jscript/regexp.c +++ b/reactos/dll/win32/jscript/regexp.c @@ -90,11 +90,6 @@ static const WCHAR ignoreCaseW[] = {'i','g','n','o','r','e','C','a','s','e',0}; static const WCHAR multilineW[] = {'m','u','l','t','i','l','i','n','e',0}; static const WCHAR lastIndexW[] = {'l','a','s','t','I','n','d','e','x',0}; static const WCHAR toStringW[] = {'t','o','S','t','r','i','n','g',0}; -static const WCHAR toLocaleStringW[] = {'t','o','L','o','c','a','l','e','S','t','r','i','n','g',0}; -static const WCHAR hasOwnPropertyW[] = {'h','a','s','O','w','n','P','r','o','p','e','r','t','y',0}; -static const WCHAR propertyIsEnumerableW[] = - {'p','r','o','p','e','r','t','y','I','s','E','n','u','m','e','r','a','b','l','e',0}; -static const WCHAR isPrototypeOfW[] = {'i','s','P','r','o','t','o','t','y','p','e','O','f',0}; static const WCHAR execW[] = {'e','x','e','c',0}; static const WCHAR testW[] = {'t','e','s','t',0}; @@ -3432,8 +3427,24 @@ HRESULT regexp_match(DispatchEx *dispex, const WCHAR *str, DWORD len, BOOL gflag static HRESULT RegExp_source(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp) { - FIXME("\n"); - return E_NOTIMPL; + TRACE("\n"); + + switch(flags) { + case DISPATCH_PROPERTYGET: { + RegExpInstance *This = (RegExpInstance*)dispex; + + V_VT(retv) = VT_BSTR; + V_BSTR(retv) = SysAllocString(This->str); + if(!V_BSTR(retv)) + return E_OUTOFMEMORY; + break; + } + default: + FIXME("Unimplemnted flags %x\n", flags); + return E_NOTIMPL; + } + + return S_OK; } static HRESULT RegExp_global(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, @@ -3471,34 +3482,6 @@ static HRESULT RegExp_toString(DispatchEx *dispex, LCID lcid, WORD flags, DISPPA return E_NOTIMPL; } -static HRESULT RegExp_toLocaleString(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, - VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp) -{ - FIXME("\n"); - return E_NOTIMPL; -} - -static HRESULT RegExp_hasOwnProperty(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, - VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp) -{ - FIXME("\n"); - return E_NOTIMPL; -} - -static HRESULT RegExp_propertyIsEnumerable(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, - VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp) -{ - FIXME("\n"); - return E_NOTIMPL; -} - -static HRESULT RegExp_isPrototypeOf(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, - VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp) -{ - FIXME("\n"); - return E_NOTIMPL; -} - static HRESULT RegExp_exec(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp) { @@ -3540,17 +3523,13 @@ static void RegExp_destructor(DispatchEx *dispex) } static const builtin_prop_t RegExp_props[] = { - {execW, RegExp_exec, PROPF_METHOD}, + {execW, RegExp_exec, PROPF_METHOD|1}, {globalW, RegExp_global, 0}, - {hasOwnPropertyW, RegExp_hasOwnProperty, PROPF_METHOD}, {ignoreCaseW, RegExp_ignoreCase, 0}, - {isPrototypeOfW, RegExp_isPrototypeOf, PROPF_METHOD}, {lastIndexW, RegExp_lastIndex, 0}, {multilineW, RegExp_multiline, 0}, - {propertyIsEnumerableW, RegExp_propertyIsEnumerable, PROPF_METHOD}, {sourceW, RegExp_source, 0}, - {testW, RegExp_test, PROPF_METHOD}, - {toLocaleStringW, RegExp_toLocaleString, PROPF_METHOD}, + {testW, RegExp_test, PROPF_METHOD|1}, {toStringW, RegExp_toString, PROPF_METHOD} }; @@ -3563,7 +3542,7 @@ static const builtin_info_t RegExp_info = { NULL }; -static HRESULT alloc_regexp(script_ctx_t *ctx, BOOL use_constr, RegExpInstance **ret) +static HRESULT alloc_regexp(script_ctx_t *ctx, DispatchEx *object_prototype, RegExpInstance **ret) { RegExpInstance *regexp; HRESULT hres; @@ -3572,10 +3551,10 @@ static HRESULT alloc_regexp(script_ctx_t *ctx, BOOL use_constr, RegExpInstance * if(!regexp) return E_OUTOFMEMORY; - if(use_constr) - hres = init_dispex_from_constr(®exp->dispex, ctx, &RegExp_info, ctx->regexp_constr); + if(object_prototype) + hres = init_dispex(®exp->dispex, ctx, &RegExp_info, object_prototype); else - hres = init_dispex(®exp->dispex, ctx, &RegExp_info, NULL); + hres = init_dispex_from_constr(®exp->dispex, ctx, &RegExp_info, ctx->regexp_constr); if(FAILED(hres)) { heap_free(regexp); @@ -3593,7 +3572,7 @@ static HRESULT create_regexp(script_ctx_t *ctx, const WCHAR *exp, int len, DWORD TRACE("%s %x\n", debugstr_w(exp), flags); - hres = alloc_regexp(ctx, TRUE, ®exp); + hres = alloc_regexp(ctx, NULL, ®exp); if(FAILED(hres)) return hres; @@ -3694,12 +3673,12 @@ static HRESULT RegExpConstr_value(DispatchEx *dispex, LCID lcid, WORD flags, DIS return S_OK; } -HRESULT create_regexp_constr(script_ctx_t *ctx, DispatchEx **ret) +HRESULT create_regexp_constr(script_ctx_t *ctx, DispatchEx *object_prototype, DispatchEx **ret) { RegExpInstance *regexp; HRESULT hres; - hres = alloc_regexp(ctx, FALSE, ®exp); + hres = alloc_regexp(ctx, object_prototype, ®exp); if(FAILED(hres)) return hres; diff --git a/reactos/dll/win32/jscript/string.c b/reactos/dll/win32/jscript/string.c index 6695bf893cb..ea499aabd66 100644 --- a/reactos/dll/win32/jscript/string.c +++ b/reactos/dll/win32/jscript/string.c @@ -62,10 +62,6 @@ static const WCHAR toUpperCaseW[] = {'t','o','U','p','p','e','r','C','a','s','e' static const WCHAR toLocaleLowerCaseW[] = {'t','o','L','o','c','a','l','e','L','o','w','e','r','C','a','s','e',0}; static const WCHAR toLocaleUpperCaseW[] = {'t','o','L','o','c','a','l','e','U','p','p','e','r','C','a','s','e',0}; static const WCHAR localeCompareW[] = {'l','o','c','a','l','e','C','o','m','p','a','r','e',0}; -static const WCHAR hasOwnPropertyW[] = {'h','a','s','O','w','n','P','r','o','p','e','r','t','y',0}; -static const WCHAR propertyIsEnumerableW[] = - {'p','r','o','p','e','r','t','y','I','s','E','n','u','m','e','r','a','b','l','e',0}; -static const WCHAR isPrototypeOfW[] = {'i','s','P','r','o','t','o','t','y','p','e','O','f',0}; static const WCHAR fromCharCodeW[] = {'f','r','o','m','C','h','a','r','C','o','d','e',0}; static HRESULT String_length(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, @@ -802,7 +798,7 @@ static HRESULT String_replace(DispatchEx *dispex, LCID lcid, WORD flags, DISPPAR DWORD parens_cnt = 0, parens_size=0, rep_len=0, length; BSTR rep_str = NULL, match_str = NULL, ret_str, val_str = NULL; DispatchEx *rep_func = NULL, *regexp = NULL; - match_result_t *parens = NULL, match; + match_result_t *parens = NULL, match, **parens_ptr = &parens; strbuf_t ret = {NULL,0,0}; BOOL gcheck = FALSE; VARIANT *arg_var; @@ -884,12 +880,9 @@ static HRESULT String_replace(DispatchEx *dispex, LCID lcid, WORD flags, DISPPAR if(FAILED(hres)) break; - if(strchrW(rep_str, '$')) { - FIXME("unsupported $ in replace string\n"); - hres = E_NOTIMPL; - } - rep_len = SysStringLen(rep_str); + if(!strchrW(rep_str, '$')) + parens_ptr = NULL; } } @@ -900,7 +893,7 @@ static HRESULT String_replace(DispatchEx *dispex, LCID lcid, WORD flags, DISPPAR while(1) { if(regexp) { - hres = regexp_match_next(regexp, gcheck, str, length, &cp, rep_func ? &parens : NULL, + hres = regexp_match_next(regexp, gcheck, str, length, &cp, parens_ptr, &parens_size, &parens_cnt, &match); gcheck = TRUE; @@ -934,6 +927,64 @@ static HRESULT String_replace(DispatchEx *dispex, LCID lcid, WORD flags, DISPPAR SysFreeString(cstr); if(FAILED(hres)) break; + }else if(rep_str && regexp) { + const WCHAR *ptr = rep_str, *ptr2; + + while((ptr2 = strchrW(ptr, '$'))) { + hres = strbuf_append(&ret, ptr, ptr2-ptr); + if(FAILED(hres)) + break; + + switch(ptr2[1]) { + case '$': + hres = strbuf_append(&ret, ptr2, 1); + ptr = ptr2+2; + break; + case '&': + hres = strbuf_append(&ret, match.str, match.len); + ptr = ptr2+2; + break; + case '`': + hres = strbuf_append(&ret, str, match.str-str); + ptr = ptr2+2; + break; + case '\'': + hres = strbuf_append(&ret, ecp, (str+length)-ecp); + ptr = ptr2+2; + break; + default: { + DWORD idx; + + if(!isdigitW(ptr2[1])) { + hres = strbuf_append(&ret, ptr2, 1); + ptr = ptr2+1; + break; + } + + idx = ptr2[1] - '0'; + if(isdigitW(ptr[3]) && idx*10 + (ptr[2]-'0') <= parens_cnt) { + idx = idx*10 + (ptr[2]-'0'); + ptr = ptr2+3; + }else if(idx && idx <= parens_cnt) { + ptr = ptr2+2; + }else { + hres = strbuf_append(&ret, ptr2, 1); + ptr = ptr2+1; + break; + } + + hres = strbuf_append(&ret, parens[idx-1].str, parens[idx-1].len); + } + } + + if(FAILED(hres)) + break; + } + + if(SUCCEEDED(hres)) + hres = strbuf_append(&ret, ptr, (rep_str+rep_len)-ptr); + if(FAILED(hres)) + break; }else if(rep_str) { hres = strbuf_append(&ret, rep_str, rep_len); if(FAILED(hres)) @@ -1456,27 +1507,6 @@ static HRESULT String_localeCompare(DispatchEx *dispex, LCID lcid, WORD flags, D return E_NOTIMPL; } -static HRESULT String_hasOwnProperty(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, - VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp) -{ - FIXME("\n"); - return E_NOTIMPL; -} - -static HRESULT String_propertyIsEnumerable(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, - VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp) -{ - FIXME("\n"); - return E_NOTIMPL; -} - -static HRESULT String_isPrototypeOf(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, - VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp) -{ - FIXME("\n"); - return E_NOTIMPL; -} - static HRESULT String_value(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp) { @@ -1513,35 +1543,32 @@ static void String_destructor(DispatchEx *dispex) } static const builtin_prop_t String_props[] = { - {anchorW, String_anchor, PROPF_METHOD}, + {anchorW, String_anchor, PROPF_METHOD|1}, {bigW, String_big, PROPF_METHOD}, {blinkW, String_blink, PROPF_METHOD}, {boldW, String_bold, PROPF_METHOD}, - {charAtW, String_charAt, PROPF_METHOD}, - {charCodeAtW, String_charCodeAt, PROPF_METHOD}, - {concatW, String_concat, PROPF_METHOD}, + {charAtW, String_charAt, PROPF_METHOD|1}, + {charCodeAtW, String_charCodeAt, PROPF_METHOD|1}, + {concatW, String_concat, PROPF_METHOD|1}, {fixedW, String_fixed, PROPF_METHOD}, - {fontcolorW, String_fontcolor, PROPF_METHOD}, - {fontsizeW, String_fontsize, PROPF_METHOD}, - {hasOwnPropertyW, String_hasOwnProperty, PROPF_METHOD}, - {indexOfW, String_indexOf, PROPF_METHOD}, - {isPrototypeOfW, String_isPrototypeOf, PROPF_METHOD}, + {fontcolorW, String_fontcolor, PROPF_METHOD|1}, + {fontsizeW, String_fontsize, PROPF_METHOD|1}, + {indexOfW, String_indexOf, PROPF_METHOD|2}, {italicsW, String_italics, PROPF_METHOD}, - {lastIndexOfW, String_lastIndexOf, PROPF_METHOD}, + {lastIndexOfW, String_lastIndexOf, PROPF_METHOD|2}, {lengthW, String_length, 0}, - {linkW, String_link, PROPF_METHOD}, - {localeCompareW, String_localeCompare, PROPF_METHOD}, - {matchW, String_match, PROPF_METHOD}, - {propertyIsEnumerableW, String_propertyIsEnumerable, PROPF_METHOD}, - {replaceW, String_replace, PROPF_METHOD}, + {linkW, String_link, PROPF_METHOD|1}, + {localeCompareW, String_localeCompare, PROPF_METHOD|1}, + {matchW, String_match, PROPF_METHOD|1}, + {replaceW, String_replace, PROPF_METHOD|1}, {searchW, String_search, PROPF_METHOD}, {sliceW, String_slice, PROPF_METHOD}, {smallW, String_small, PROPF_METHOD}, - {splitW, String_split, PROPF_METHOD}, + {splitW, String_split, PROPF_METHOD|2}, {strikeW, String_strike, PROPF_METHOD}, {subW, String_sub, PROPF_METHOD}, - {substrW, String_substr, PROPF_METHOD}, - {substringW, String_substring, PROPF_METHOD}, + {substrW, String_substr, PROPF_METHOD|2}, + {substringW, String_substring, PROPF_METHOD|2}, {supW, String_sup, PROPF_METHOD}, {toLocaleLowerCaseW, String_toLocaleLowerCase, PROPF_METHOD}, {toLocaleUpperCaseW, String_toLocaleUpperCase, PROPF_METHOD}, @@ -1648,7 +1675,7 @@ static HRESULT StringConstr_value(DispatchEx *dispex, LCID lcid, WORD flags, DIS return S_OK; } -static HRESULT string_alloc(script_ctx_t *ctx, BOOL use_constr, StringInstance **ret) +static HRESULT string_alloc(script_ctx_t *ctx, DispatchEx *object_prototype, StringInstance **ret) { StringInstance *string; HRESULT hres; @@ -1657,10 +1684,10 @@ static HRESULT string_alloc(script_ctx_t *ctx, BOOL use_constr, StringInstance * if(!string) return E_OUTOFMEMORY; - if(use_constr) - hres = init_dispex_from_constr(&string->dispex, ctx, &String_info, ctx->string_constr); + if(object_prototype) + hres = init_dispex(&string->dispex, ctx, &String_info, object_prototype); else - hres = init_dispex(&string->dispex, ctx, &String_info, NULL); + hres = init_dispex_from_constr(&string->dispex, ctx, &String_info, ctx->string_constr); if(FAILED(hres)) { heap_free(string); return hres; @@ -1683,12 +1710,12 @@ static const builtin_info_t StringConstr_info = { NULL }; -HRESULT create_string_constr(script_ctx_t *ctx, DispatchEx **ret) +HRESULT create_string_constr(script_ctx_t *ctx, DispatchEx *object_prototype, DispatchEx **ret) { StringInstance *string; HRESULT hres; - hres = string_alloc(ctx, FALSE, &string); + hres = string_alloc(ctx, object_prototype, &string); if(FAILED(hres)) return hres; @@ -1703,7 +1730,7 @@ HRESULT create_string(script_ctx_t *ctx, const WCHAR *str, DWORD len, DispatchEx StringInstance *string; HRESULT hres; - hres = string_alloc(ctx, TRUE, &string); + hres = string_alloc(ctx, NULL, &string); if(FAILED(hres)) return hres;