From 23d4ad046dd8593bd005f59610b4b24adcd1ab68 Mon Sep 17 00:00:00 2001 From: Christoph von Wittich Date: Sat, 8 Aug 2009 07:34:09 +0000 Subject: [PATCH] sync jscript with wine 1.1.27 svn path=/trunk/; revision=42496 --- reactos/dll/win32/jscript/array.c | 123 +- reactos/dll/win32/jscript/bool.c | 98 +- reactos/dll/win32/jscript/date.c | 761 ++++++---- reactos/dll/win32/jscript/dispex.c | 18 +- reactos/dll/win32/jscript/engine.c | 57 +- reactos/dll/win32/jscript/engine.h | 1 + reactos/dll/win32/jscript/error.c | 481 +++++++ reactos/dll/win32/jscript/function.c | 77 +- reactos/dll/win32/jscript/global.c | 195 ++- reactos/dll/win32/jscript/jscript.h | 37 +- reactos/dll/win32/jscript/jscript.rbuild | 2 + reactos/dll/win32/jscript/jscript_De.rc | 43 + reactos/dll/win32/jscript/jscript_En.rc | 41 + reactos/dll/win32/jscript/jscript_Fr.rc | 46 + reactos/dll/win32/jscript/jscript_Lt.rc | 44 + reactos/dll/win32/jscript/jscript_Nl.rc | 40 + reactos/dll/win32/jscript/jscript_Pt.rc | 42 + reactos/dll/win32/jscript/jscript_main.c | 2 +- reactos/dll/win32/jscript/jsutils.c | 91 +- reactos/dll/win32/jscript/lex.c | 9 +- reactos/dll/win32/jscript/math.c | 1 + reactos/dll/win32/jscript/number.c | 125 +- reactos/dll/win32/jscript/object.c | 72 +- reactos/dll/win32/jscript/parser.tab.c | 1634 ++++++++++++---------- reactos/dll/win32/jscript/parser.tab.h | 2 +- reactos/dll/win32/jscript/parser.y | 79 +- reactos/dll/win32/jscript/regexp.c | 20 +- reactos/dll/win32/jscript/resource.h | 36 + reactos/dll/win32/jscript/rsrc.rc | 7 + reactos/dll/win32/jscript/string.c | 592 ++++++-- 30 files changed, 3440 insertions(+), 1336 deletions(-) create mode 100644 reactos/dll/win32/jscript/error.c create mode 100644 reactos/dll/win32/jscript/jscript_De.rc create mode 100644 reactos/dll/win32/jscript/jscript_En.rc create mode 100644 reactos/dll/win32/jscript/jscript_Fr.rc create mode 100644 reactos/dll/win32/jscript/jscript_Lt.rc create mode 100644 reactos/dll/win32/jscript/jscript_Nl.rc create mode 100644 reactos/dll/win32/jscript/jscript_Pt.rc create mode 100644 reactos/dll/win32/jscript/resource.h diff --git a/reactos/dll/win32/jscript/array.c b/reactos/dll/win32/jscript/array.c index cd40e432517..b2bd5b2de48 100644 --- a/reactos/dll/win32/jscript/array.c +++ b/reactos/dll/win32/jscript/array.c @@ -16,6 +16,8 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +#include + #include "jscript.h" #include "wine/debug.h" @@ -40,7 +42,6 @@ static const WCHAR sortW[] = {'s','o','r','t',0}; 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 valueOfW[] = {'v','a','l','u','e','O','f',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[] = @@ -61,6 +62,30 @@ static HRESULT Array_length(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAM V_VT(retv) = VT_I4; V_I4(retv) = This->length; break; + case DISPATCH_PROPERTYPUT: { + VARIANT num; + DOUBLE len = -1; + DWORD i; + HRESULT hres; + + hres = to_number(dispex->ctx, get_arg(dp, 0), ei, &num); + if(V_VT(&num) == VT_I4) + len = V_I4(&num); + else + len = floor(V_R8(&num)); + + if(len!=(DWORD)len) + return throw_range_error(dispex->ctx, ei, IDS_INVALID_LENGTH, NULL); + + for(i=len; ilength; i++) { + hres = jsdisp_delete_idx(dispex, i); + if(FAILED(hres)) + return hres; + } + + This->length = len; + break; + } default: FIXME("unimplemented flags %x\n", flags); return E_NOTIMPL; @@ -394,8 +419,81 @@ static HRESULT Array_shift(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS static HRESULT Array_slice(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp) { - FIXME("\n"); - return E_NOTIMPL; + DispatchEx *arr; + VARIANT v; + DOUBLE range; + DWORD length, start, end, idx; + HRESULT hres; + + TRACE("\n"); + + if(is_class(dispex, JSCLASS_ARRAY)) { + length = ((ArrayInstance*)dispex)->length; + }else { + FIXME("not Array this\n"); + return E_NOTIMPL; + } + + if(arg_cnt(dp)) { + hres = to_number(dispex->ctx, get_arg(dp, 0), ei, &v); + if(FAILED(hres)) + return hres; + + if(V_VT(&v) == VT_I4) + range = V_I4(&v); + else + range = floor(V_R8(&v)); + + if(-range>length || isnan(range)) start = 0; + else if(range < 0) start = range+length; + else if(range <= length) start = range; + else start = length; + } + else start = 0; + + if(arg_cnt(dp)>1) { + hres = to_number(dispex->ctx, get_arg(dp, 1), ei, &v); + if(FAILED(hres)) + return hres; + + if(V_VT(&v) == VT_I4) + range = V_I4(&v); + else + range = floor(V_R8(&v)); + + if(-range>length) end = 0; + else if(range < 0) end = range+length; + else if(range <= length) end = range; + else end = length; + } + else end = length; + + hres = create_array(dispex->ctx, (end>start)?end-start:0, &arr); + if(FAILED(hres)) + return hres; + + for(idx=start; idxctx, ei, IDS_NOT_FUNC, NULL); case INVOKE_PROPERTYGET: return array_join(dispex, lcid, ((ArrayInstance*)dispex)->length, default_separatorW, retv, ei, sp); default: @@ -732,7 +825,6 @@ static const builtin_prop_t Array_props[] = { {toLocaleStringW, Array_toLocaleString, PROPF_METHOD}, {toStringW, Array_toString, PROPF_METHOD}, {unshiftW, Array_unshift, PROPF_METHOD}, - {valueOfW, Array_valueOf, PROPF_METHOD} }; static const builtin_info_t Array_info = { @@ -755,12 +847,11 @@ static HRESULT ArrayConstr_value(DispatchEx *dispex, LCID lcid, WORD flags, DISP TRACE("\n"); switch(flags) { + case DISPATCH_METHOD: 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; - } + if(V_I4(arg_var) < 0) + return throw_range_error(dispex->ctx, ei, IDS_INVALID_LENGTH, NULL); hres = create_array(dispex->ctx, V_I4(arg_var), &obj); if(FAILED(hres)) @@ -809,7 +900,7 @@ static HRESULT alloc_array(script_ctx_t *ctx, BOOL use_constr, ArrayInstance **r if(use_constr) hres = init_dispex_from_constr(&array->dispex, ctx, &Array_info, ctx->array_constr); else - hres = init_dispex(&array->dispex, ctx, &Array_info, NULL); + hres = init_dispex_from_constr(&array->dispex, ctx, &Array_info, ctx->object_constr); if(FAILED(hres)) { heap_free(array); diff --git a/reactos/dll/win32/jscript/bool.c b/reactos/dll/win32/jscript/bool.c index 7e3bf7ac738..bfacebf3ec6 100644 --- a/reactos/dll/win32/jscript/bool.c +++ b/reactos/dll/win32/jscript/bool.c @@ -1,5 +1,6 @@ /* * Copyright 2008 Jacek Caban for CodeWeavers + * Copyright 2009 Piotr Caban * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -36,25 +37,59 @@ 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, VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp) { - FIXME("\n"); - return E_NOTIMPL; + static const WCHAR trueW[] = {'t','r','u','e',0}; + static const WCHAR falseW[] = {'f','a','l','s','e',0}; + + TRACE("\n"); + + if(!is_class(dispex, JSCLASS_BOOLEAN)) + return throw_type_error(dispex->ctx, ei, IDS_NOT_BOOL, NULL); + + if(retv) { + BoolInstance *bool = (BoolInstance*)dispex; + BSTR val; + + if(bool->val) val = SysAllocString(trueW); + else val = SysAllocString(falseW); + + if(!val) + return E_OUTOFMEMORY; + + V_VT(retv) = VT_BSTR; + V_BSTR(retv) = val; + } + + return S_OK; } static HRESULT Bool_toLocaleString(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp) { - FIXME("\n"); - return E_NOTIMPL; + 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) { - FIXME("\n"); - return E_NOTIMPL; + TRACE("\n"); + + if(!is_class(dispex, JSCLASS_BOOLEAN)) + return throw_type_error(dispex->ctx, ei, IDS_NOT_BOOL, NULL); + + if(retv) { + BoolInstance *bool = (BoolInstance*)dispex; + + V_VT(retv) = VT_BOOL; + V_BOOL(retv) = bool->val; + } + + return S_OK; } static HRESULT Bool_hasOwnProperty(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, @@ -81,8 +116,18 @@ static HRESULT Bool_isPrototypeOf(DispatchEx *dispex, LCID lcid, WORD flags, DIS static HRESULT Bool_value(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 INVOKE_FUNC: + return throw_type_error(dispex->ctx, ei, IDS_NOT_FUNC, NULL); + default: + FIXME("unimplemented flags %x\n", flags); + return E_NOTIMPL; + } + + return S_OK; + } static const builtin_prop_t Bool_props[] = { @@ -106,8 +151,41 @@ static const builtin_info_t Bool_info = { static HRESULT BoolConstr_value(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp) { - FIXME("\n"); - return E_NOTIMPL; + HRESULT hres; + VARIANT_BOOL value = VARIANT_FALSE; + + if(arg_cnt(dp)) { + hres = to_boolean(get_arg(dp,0), &value); + if(FAILED(hres)) + return hres; + } + + switch(flags) { + case DISPATCH_CONSTRUCT: { + DispatchEx *bool; + + hres = create_bool(dispex->ctx, value, &bool); + if(FAILED(hres)) + return hres; + + V_VT(retv) = VT_DISPATCH; + V_DISPATCH(retv) = (IDispatch*)_IDispatchEx_(bool); + return S_OK; + } + + case INVOKE_FUNC: + if(retv) { + V_VT(retv) = VT_BOOL; + V_BOOL(retv) = value; + } + return S_OK; + + default: + FIXME("unimplemented flags %x\n", flags); + return E_NOTIMPL; + } + + return S_OK; } static HRESULT alloc_bool(script_ctx_t *ctx, BOOL use_constr, BoolInstance **ret) diff --git a/reactos/dll/win32/jscript/date.c b/reactos/dll/win32/jscript/date.c index 9dcc8a7391b..5085f212ebe 100644 --- a/reactos/dll/win32/jscript/date.c +++ b/reactos/dll/win32/jscript/date.c @@ -1,5 +1,6 @@ /* * Copyright 2008 Jacek Caban for CodeWeavers + * Copyright 2009 Piotr Caban * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -86,6 +87,7 @@ static const WCHAR setMonthW[] = {'s','e','t','M','o','n','t','h',0}; static const WCHAR setUTCMonthW[] = {'s','e','t','U','T','C','M','o','n','t','h',0}; static const WCHAR setFullYearW[] = {'s','e','t','F','u','l','l','Y','e','a','r',0}; static const WCHAR setUTCFullYearW[] = {'s','e','t','U','T','C','F','u','l','l','Y','e','a','r',0}; +static const WCHAR getYearW[] = {'g','e','t','Y','e','a','r',0}; static const WCHAR UTCW[] = {'U','T','C',0}; static const WCHAR parseW[] = {'p','a','r','s','e',0}; @@ -454,9 +456,7 @@ static SYSTEMTIME create_systemtime(DOUBLE time) return st; } -/* ECMA-262 3rd Edition 15.9.1.2 */ -static HRESULT Date_toString(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, - VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller) +static inline HRESULT date_to_string(DOUBLE time, BOOL show_offset, int offset, VARIANT *retv) { static const WCHAR NaNW[] = { 'N','a','N',0 }; static const WCHAR formatW[] = { '%','s',' ','%','s',' ','%','d',' ', @@ -465,6 +465,9 @@ static HRESULT Date_toString(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARA static const WCHAR formatUTCW[] = { '%','s',' ','%','s',' ','%','d',' ', '%','0','2','d',':','%','0','2','d',':','%','0','2','d',' ', 'U','T','C',' ','%','d','%','s',0 }; + static const WCHAR formatNoOffsetW[] = { '%','s',' ','%','s',' ', + '%','d',' ','%','0','2','d',':','%','0','2','d',':', + '%','0','2','d',' ','%','d','%','s',0 }; static const WCHAR ADW[] = { 0 }; static const WCHAR BCW[] = { ' ','B','.','C','.',0 }; @@ -480,23 +483,12 @@ static HRESULT Date_toString(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARA BOOL formatAD = TRUE; BSTR week, month; - DateInstance *date; BSTR date_str; - DOUBLE time; - int len, size, year, day, offset; + int len, size, year, day; DWORD lcid_en, week_id, month_id; WCHAR sign = '-'; - TRACE("\n"); - - if(!is_class(dispex, JSCLASS_DATE)) { - FIXME("throw TypeError\n"); - return E_FAIL; - } - - date = (DateInstance*)dispex; - - if(isnan(date->time)) { + if(isnan(time)) { if(retv) { V_VT(retv) = VT_BSTR; V_BSTR(retv) = SysAllocString(NaNW); @@ -506,8 +498,6 @@ static HRESULT Date_toString(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARA return S_OK; } - time = local_time(date->time, date); - if(retv) { len = 21; @@ -553,10 +543,8 @@ static HRESULT Date_toString(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARA } while(day); day = date_from_time(time); - offset = date->bias + - daylight_saving_ta(time, date); - - if(offset == 0) len -= 5; + if(!show_offset) len -= 9; + else if(offset == 0) len -= 5; else if(offset < 0) { sign = '+'; offset = -offset; @@ -569,15 +557,19 @@ static HRESULT Date_toString(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARA return E_OUTOFMEMORY; } - if(offset) + if(!show_offset) + sprintfW(date_str, formatNoOffsetW, week, month, day, + (int)hour_from_time(time), (int)min_from_time(time), + (int)sec_from_time(time), year, formatAD?ADW:BCW); + else if(offset) sprintfW(date_str, formatW, week, month, day, (int)hour_from_time(time), (int)min_from_time(time), (int)sec_from_time(time), sign, offset/60, offset%60, year, formatAD?ADW:BCW); else sprintfW(date_str, formatUTCW, week, month, day, - (int)hour_from_time(time), (int)min_from_time(time), - (int)sec_from_time(time), year, formatAD?ADW:BCW); + (int)hour_from_time(time), (int)min_from_time(time), + (int)sec_from_time(time), year, formatAD?ADW:BCW); SysFreeString(week); SysFreeString(month); @@ -588,6 +580,27 @@ static HRESULT Date_toString(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARA return S_OK; } +/* ECMA-262 3rd Edition 15.9.1.2 */ +static HRESULT Date_toString(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, + VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller) +{ + DateInstance *date; + DOUBLE time; + int offset; + + TRACE("\n"); + + if(!is_class(dispex, JSCLASS_DATE)) + return throw_type_error(dispex->ctx, ei, IDS_NOT_DATE, NULL); + + date = (DateInstance*)dispex; + time = local_time(date->time, date); + offset = date->bias + + daylight_saving_ta(time, date); + + return date_to_string(time, TRUE, offset, retv); +} + /* ECMA-262 3rd Edition 15.9.1.5 */ static HRESULT Date_toLocaleString(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller) @@ -600,10 +613,8 @@ static HRESULT Date_toLocaleString(DispatchEx *dispex, LCID lcid, WORD flags, DI TRACE("\n"); - if(!is_class(dispex, JSCLASS_DATE)) { - FIXME("throw TypeError\n"); - return E_FAIL; - } + if(!is_class(dispex, JSCLASS_DATE)) + return throw_type_error(dispex->ctx, ei, IDS_NOT_DATE, NULL); date = (DateInstance*)dispex; @@ -662,8 +673,16 @@ static HRESULT Date_isPrototypeOf(DispatchEx *dispex, LCID lcid, WORD flags, DIS static HRESULT Date_valueOf(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller) { - FIXME("\n"); - return E_NOTIMPL; + TRACE("\n"); + + if(!is_class(dispex, JSCLASS_DATE)) + return throw_type_error(dispex->ctx, ei, IDS_NOT_DATE, NULL); + + if(retv) { + DateInstance *date = (DateInstance*)dispex; + num_set_val(retv, date->time); + } + return S_OK; } /* ECMA-262 3rd Edition 15.9.5.42 */ @@ -695,10 +714,8 @@ static HRESULT Date_toUTCString(DispatchEx *dispex, LCID lcid, WORD flags, DISPP TRACE("\n"); - if(!is_class(dispex, JSCLASS_DATE)) { - FIXME("throw TypeError\n"); - return E_FAIL; - } + if(!is_class(dispex, JSCLASS_DATE)) + return throw_type_error(dispex->ctx, ei, IDS_NOT_DATE, NULL); date = (DateInstance*)dispex; @@ -804,10 +821,8 @@ static HRESULT Date_toDateString(DispatchEx *dispex, LCID lcid, WORD flags, DISP TRACE("\n"); - if(!is_class(dispex, JSCLASS_DATE)) { - FIXME("throw TypeError\n"); - return E_FAIL; - } + if(!is_class(dispex, JSCLASS_DATE)) + return throw_type_error(dispex->ctx, ei, IDS_NOT_DATE, NULL); date = (DateInstance*)dispex; @@ -902,10 +917,8 @@ static HRESULT Date_toTimeString(DispatchEx *dispex, LCID lcid, WORD flags, DISP TRACE("\n"); - if(!is_class(dispex, JSCLASS_DATE)) { - FIXME("throw TypeError\n"); - return E_FAIL; - } + if(!is_class(dispex, JSCLASS_DATE)) + return throw_type_error(dispex->ctx, ei, IDS_NOT_DATE, NULL); date = (DateInstance*)dispex; @@ -961,10 +974,8 @@ static HRESULT Date_toLocaleDateString(DispatchEx *dispex, LCID lcid, WORD flags TRACE("\n"); - if(!is_class(dispex, JSCLASS_DATE)) { - FIXME("throw TypeError\n"); - return E_FAIL; - } + if(!is_class(dispex, JSCLASS_DATE)) + return throw_type_error(dispex->ctx, ei, IDS_NOT_DATE, NULL); date = (DateInstance*)dispex; @@ -1008,10 +1019,8 @@ static HRESULT Date_toLocaleTimeString(DispatchEx *dispex, LCID lcid, WORD flags TRACE("\n"); - if(!is_class(dispex, JSCLASS_DATE)) { - FIXME("throw TypeError\n"); - return E_FAIL; - } + if(!is_class(dispex, JSCLASS_DATE)) + return throw_type_error(dispex->ctx, ei, IDS_NOT_DATE, NULL); date = (DateInstance*)dispex; @@ -1049,10 +1058,8 @@ static HRESULT Date_getTime(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAM { TRACE("\n"); - if(!is_class(dispex, JSCLASS_DATE)) { - FIXME("throw TypeError\n"); - return E_FAIL; - } + if(!is_class(dispex, JSCLASS_DATE)) + return throw_type_error(dispex->ctx, ei, IDS_NOT_DATE, NULL); if(retv) { DateInstance *date = (DateInstance*)dispex; @@ -1067,10 +1074,8 @@ static HRESULT Date_getFullYear(DispatchEx *dispex, LCID lcid, WORD flags, DISPP { TRACE("\n"); - if(!is_class(dispex, JSCLASS_DATE)) { - FIXME("throw TypeError\n"); - return E_FAIL; - } + if(!is_class(dispex, JSCLASS_DATE)) + return throw_type_error(dispex->ctx, ei, IDS_NOT_DATE, NULL); if(retv) { DateInstance *date = (DateInstance*)dispex; @@ -1087,10 +1092,8 @@ static HRESULT Date_getUTCFullYear(DispatchEx *dispex, LCID lcid, WORD flags, DI { TRACE("\n"); - if(!is_class(dispex, JSCLASS_DATE)) { - FIXME("throw TypeError\n"); - return E_FAIL; - } + if(!is_class(dispex, JSCLASS_DATE)) + return throw_type_error(dispex->ctx, ei, IDS_NOT_DATE, NULL); if(retv) { DateInstance *date = (DateInstance*)dispex; @@ -1105,10 +1108,8 @@ static HRESULT Date_getMonth(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARA { TRACE("\n"); - if(!is_class(dispex, JSCLASS_DATE)) { - FIXME("throw TypeError\n"); - return E_FAIL; - } + if(!is_class(dispex, JSCLASS_DATE)) + return throw_type_error(dispex->ctx, ei, IDS_NOT_DATE, NULL); if(retv) { DateInstance *date = (DateInstance*)dispex; @@ -1125,10 +1126,8 @@ static HRESULT Date_getUTCMonth(DispatchEx *dispex, LCID lcid, WORD flags, DISPP { TRACE("\n"); - if(!is_class(dispex, JSCLASS_DATE)) { - FIXME("throw TypeError\n"); - return E_FAIL; - } + if(!is_class(dispex, JSCLASS_DATE)) + return throw_type_error(dispex->ctx, ei, IDS_NOT_DATE, NULL); if(retv) { DateInstance *date = (DateInstance*)dispex; @@ -1143,10 +1142,8 @@ static HRESULT Date_getDate(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAM { TRACE("\n"); - if(!is_class(dispex, JSCLASS_DATE)) { - FIXME("throw TypeError\n"); - return E_FAIL; - } + if(!is_class(dispex, JSCLASS_DATE)) + return throw_type_error(dispex->ctx, ei, IDS_NOT_DATE, NULL); if(retv) { DateInstance *date = (DateInstance*)dispex; @@ -1163,10 +1160,8 @@ static HRESULT Date_getUTCDate(DispatchEx *dispex, LCID lcid, WORD flags, DISPPA { TRACE("\n"); - if(!is_class(dispex, JSCLASS_DATE)) { - FIXME("throw TypeError\n"); - return E_FAIL; - } + if(!is_class(dispex, JSCLASS_DATE)) + return throw_type_error(dispex->ctx, ei, IDS_NOT_DATE, NULL); if(retv) { DateInstance *date = (DateInstance*)dispex; @@ -1181,10 +1176,8 @@ static HRESULT Date_getDay(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS { TRACE("\n"); - if(!is_class(dispex, JSCLASS_DATE)) { - FIXME("throw TypeError\n"); - return E_FAIL; - } + if(!is_class(dispex, JSCLASS_DATE)) + return throw_type_error(dispex->ctx, ei, IDS_NOT_DATE, NULL); if(retv) { DateInstance *date = (DateInstance*)dispex; @@ -1201,10 +1194,8 @@ static HRESULT Date_getUTCDay(DispatchEx *dispex, LCID lcid, WORD flags, DISPPAR { TRACE("\n"); - if(!is_class(dispex, JSCLASS_DATE)) { - FIXME("throw TypeError\n"); - return E_FAIL; - } + if(!is_class(dispex, JSCLASS_DATE)) + return throw_type_error(dispex->ctx, ei, IDS_NOT_DATE, NULL); if(retv) { DateInstance *date = (DateInstance*)dispex; @@ -1219,10 +1210,8 @@ static HRESULT Date_getHours(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARA { TRACE("\n"); - if(!is_class(dispex, JSCLASS_DATE)) { - FIXME("throw TypeError\n"); - return E_FAIL; - } + if(!is_class(dispex, JSCLASS_DATE)) + return throw_type_error(dispex->ctx, ei, IDS_NOT_DATE, NULL); if(retv) { DateInstance *date = (DateInstance*)dispex; @@ -1239,10 +1228,8 @@ static HRESULT Date_getUTCHours(DispatchEx *dispex, LCID lcid, WORD flags, DISPP { TRACE("\n"); - if(!is_class(dispex, JSCLASS_DATE)) { - FIXME("throw TypeError\n"); - return E_FAIL; - } + if(!is_class(dispex, JSCLASS_DATE)) + return throw_type_error(dispex->ctx, ei, IDS_NOT_DATE, NULL); if(retv) { DateInstance *date = (DateInstance*)dispex; @@ -1257,10 +1244,8 @@ static HRESULT Date_getMinutes(DispatchEx *dispex, LCID lcid, WORD flags, DISPPA { TRACE("\n"); - if(!is_class(dispex, JSCLASS_DATE)) { - FIXME("throw TypeError\n"); - return E_FAIL; - } + if(!is_class(dispex, JSCLASS_DATE)) + return throw_type_error(dispex->ctx, ei, IDS_NOT_DATE, NULL); if(retv) { DateInstance *date = (DateInstance*)dispex; @@ -1277,10 +1262,8 @@ static HRESULT Date_getUTCMinutes(DispatchEx *dispex, LCID lcid, WORD flags, DIS { TRACE("\n"); - if(!is_class(dispex, JSCLASS_DATE)) { - FIXME("throw TypeError\n"); - return E_FAIL; - } + if(!is_class(dispex, JSCLASS_DATE)) + return throw_type_error(dispex->ctx, ei, IDS_NOT_DATE, NULL); if(retv) { DateInstance *date = (DateInstance*)dispex; @@ -1295,10 +1278,8 @@ static HRESULT Date_getSeconds(DispatchEx *dispex, LCID lcid, WORD flags, DISPPA { TRACE("\n"); - if(!is_class(dispex, JSCLASS_DATE)) { - FIXME("throw TypeError\n"); - return E_FAIL; - } + if(!is_class(dispex, JSCLASS_DATE)) + return throw_type_error(dispex->ctx, ei, IDS_NOT_DATE, NULL); if(retv) { DateInstance *date = (DateInstance*)dispex; @@ -1315,10 +1296,8 @@ static HRESULT Date_getUTCSeconds(DispatchEx *dispex, LCID lcid, WORD flags, DIS { TRACE("\n"); - if(!is_class(dispex, JSCLASS_DATE)) { - FIXME("throw TypeError\n"); - return E_FAIL; - } + if(!is_class(dispex, JSCLASS_DATE)) + return throw_type_error(dispex->ctx, ei, IDS_NOT_DATE, NULL); if(retv) { DateInstance *date = (DateInstance*)dispex; @@ -1333,10 +1312,8 @@ static HRESULT Date_getMilliseconds(DispatchEx *dispex, LCID lcid, WORD flags, D { TRACE("\n"); - if(!is_class(dispex, JSCLASS_DATE)) { - FIXME("throw TypeError\n"); - return E_FAIL; - } + if(!is_class(dispex, JSCLASS_DATE)) + return throw_type_error(dispex->ctx, ei, IDS_NOT_DATE, NULL); if(retv) { DateInstance *date = (DateInstance*)dispex; @@ -1353,10 +1330,8 @@ static HRESULT Date_getUTCMilliseconds(DispatchEx *dispex, LCID lcid, WORD flags { TRACE("\n"); - if(!is_class(dispex, JSCLASS_DATE)) { - FIXME("throw TypeError\n"); - return E_FAIL; - } + if(!is_class(dispex, JSCLASS_DATE)) + return throw_type_error(dispex->ctx, ei, IDS_NOT_DATE, NULL); if(retv) { DateInstance *date = (DateInstance*)dispex; @@ -1371,10 +1346,8 @@ static HRESULT Date_getTimezoneOffset(DispatchEx *dispex, LCID lcid, WORD flags, { TRACE("\n"); - if(!is_class(dispex, JSCLASS_DATE)) { - FIXME("throw TypeError\n"); - return E_FAIL; - } + if(!is_class(dispex, JSCLASS_DATE)) + return throw_type_error(dispex->ctx, ei, IDS_NOT_DATE, NULL); if(retv) { DateInstance *date = (DateInstance*)dispex; @@ -1394,16 +1367,11 @@ static HRESULT Date_setTime(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAM TRACE("\n"); - if(!is_class(dispex, JSCLASS_DATE)) { - FIXME("throw TypeError\n"); - return E_FAIL; - } + if(!is_class(dispex, JSCLASS_DATE)) + return throw_type_error(dispex->ctx, ei, IDS_NOT_DATE, NULL); - if(!arg_cnt(dp)) { - FIXME("throw ArgumentNotOptional\n"); - if(retv) num_set_nan(retv); - return S_OK; - } + if(!arg_cnt(dp)) + return throw_type_error(dispex->ctx, ei, IDS_ARG_NOT_OPT, NULL); hres = to_number(dispex->ctx, get_arg(dp, 0), ei, &v); if(FAILED(hres)) @@ -1429,16 +1397,11 @@ static HRESULT Date_setMilliseconds(DispatchEx *dispex, LCID lcid, WORD flags, D TRACE("\n"); - if(!is_class(dispex, JSCLASS_DATE)) { - FIXME("throw TypeError\n"); - return E_FAIL; - } + if(!is_class(dispex, JSCLASS_DATE)) + return throw_type_error(dispex->ctx, ei, IDS_NOT_DATE, NULL); - if(!arg_cnt(dp)) { - FIXME("throw ArgumentNotOptional\n"); - if(retv) num_set_nan(retv); - return S_OK; - } + if(!arg_cnt(dp)) + return throw_type_error(dispex->ctx, ei, IDS_ARG_NOT_OPT, NULL); hres = to_number(dispex->ctx, get_arg(dp, 0), ei, &v); if(FAILED(hres)) @@ -1467,16 +1430,11 @@ static HRESULT Date_setUTCMilliseconds(DispatchEx *dispex, LCID lcid, WORD flags TRACE("\n"); - if(!is_class(dispex, JSCLASS_DATE)) { - FIXME("throw TypeError\n"); - return E_FAIL; - } + if(!is_class(dispex, JSCLASS_DATE)) + return throw_type_error(dispex->ctx, ei, IDS_NOT_DATE, NULL); - if(!arg_cnt(dp)) { - FIXME("throw ArgumentNotOptional\n"); - if(retv) num_set_nan(retv); - return S_OK; - } + if(!arg_cnt(dp)) + return throw_type_error(dispex->ctx, ei, IDS_ARG_NOT_OPT, NULL); hres = to_number(dispex->ctx, get_arg(dp, 0), ei, &v); if(FAILED(hres)) @@ -1505,16 +1463,11 @@ static HRESULT Date_setSeconds(DispatchEx *dispex, LCID lcid, WORD flags, DISPPA TRACE("\n"); - if(!is_class(dispex, JSCLASS_DATE)) { - FIXME("throw TypeError\n"); - return E_FAIL; - } + if(!is_class(dispex, JSCLASS_DATE)) + return throw_type_error(dispex->ctx, ei, IDS_NOT_DATE, NULL); - if(!arg_cnt(dp)) { - FIXME("throw ArgumentNotOptional\n"); - if(retv) num_set_nan(retv); - return S_OK; - } + if(!arg_cnt(dp)) + return throw_type_error(dispex->ctx, ei, IDS_ARG_NOT_OPT, NULL); date = (DateInstance*)dispex; t = local_time(date->time, date); @@ -1553,16 +1506,11 @@ static HRESULT Date_setUTCSeconds(DispatchEx *dispex, LCID lcid, WORD flags, DIS TRACE("\n"); - if(!is_class(dispex, JSCLASS_DATE)) { - FIXME("throw TypeError\n"); - return E_FAIL; - } + if(!is_class(dispex, JSCLASS_DATE)) + return throw_type_error(dispex->ctx, ei, IDS_NOT_DATE, NULL); - if(!arg_cnt(dp)) { - FIXME("throw ArgumentNotOptional\n"); - if(retv) num_set_nan(retv); - return S_OK; - } + if(!arg_cnt(dp)) + return throw_type_error(dispex->ctx, ei, IDS_ARG_NOT_OPT, NULL); date = (DateInstance*)dispex; t = date->time; @@ -1601,16 +1549,11 @@ static HRESULT Date_setMinutes(DispatchEx *dispex, LCID lcid, WORD flags, DISPPA TRACE("\n"); - if(!is_class(dispex, JSCLASS_DATE)) { - FIXME("throw TypeError\n"); - return E_FAIL; - } + if(!is_class(dispex, JSCLASS_DATE)) + return throw_type_error(dispex->ctx, ei, IDS_NOT_DATE, NULL); - if(!arg_cnt(dp)) { - FIXME("throw ArgumentNotOptional\n"); - if(retv) num_set_nan(retv); - return S_OK; - } + if(!arg_cnt(dp)) + return throw_type_error(dispex->ctx, ei, IDS_ARG_NOT_OPT, NULL); date = (DateInstance*)dispex; t = local_time(date->time, date); @@ -1657,16 +1600,11 @@ static HRESULT Date_setUTCMinutes(DispatchEx *dispex, LCID lcid, WORD flags, DIS TRACE("\n"); - if(!is_class(dispex, JSCLASS_DATE)) { - FIXME("throw TypeError\n"); - return E_FAIL; - } + if(!is_class(dispex, JSCLASS_DATE)) + return throw_type_error(dispex->ctx, ei, IDS_NOT_DATE, NULL); - if(!arg_cnt(dp)) { - FIXME("throw ArgumentNotOptional\n"); - if(retv) num_set_nan(retv); - return S_OK; - } + if(!arg_cnt(dp)) + return throw_type_error(dispex->ctx, ei, IDS_ARG_NOT_OPT, NULL); date = (DateInstance*)dispex; t = date->time; @@ -1713,16 +1651,11 @@ static HRESULT Date_setHours(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARA TRACE("\n"); - if(!is_class(dispex, JSCLASS_DATE)) { - FIXME("throw TypeError\n"); - return E_FAIL; - } + if(!is_class(dispex, JSCLASS_DATE)) + return throw_type_error(dispex->ctx, ei, IDS_NOT_DATE, NULL); - if(!arg_cnt(dp)) { - FIXME("throw ArgumentNotOptional\n"); - if(retv) num_set_nan(retv); - return S_OK; - } + if(!arg_cnt(dp)) + return throw_type_error(dispex->ctx, ei, IDS_ARG_NOT_OPT, NULL); date = (DateInstance*)dispex; t = local_time(date->time, date); @@ -1776,16 +1709,11 @@ static HRESULT Date_setUTCHours(DispatchEx *dispex, LCID lcid, WORD flags, DISPP TRACE("\n"); - if(!is_class(dispex, JSCLASS_DATE)) { - FIXME("throw TypeError\n"); - return E_FAIL; - } + if(!is_class(dispex, JSCLASS_DATE)) + return throw_type_error(dispex->ctx, ei, IDS_NOT_DATE, NULL); - if(!arg_cnt(dp)) { - FIXME("throw ArgumentNotOptional\n"); - if(retv) num_set_nan(retv); - return S_OK; - } + if(!arg_cnt(dp)) + return throw_type_error(dispex->ctx, ei, IDS_ARG_NOT_OPT, NULL); date = (DateInstance*)dispex; t = date->time; @@ -1839,16 +1767,11 @@ static HRESULT Date_setDate(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAM TRACE("\n"); - if(!is_class(dispex, JSCLASS_DATE)) { - FIXME("throw TypeError\n"); - return E_FAIL; - } + if(!is_class(dispex, JSCLASS_DATE)) + return throw_type_error(dispex->ctx, ei, IDS_NOT_DATE, NULL); - if(!arg_cnt(dp)) { - FIXME("throw ArgumentNotOptional\n"); - if(retv) num_set_nan(retv); - return S_OK; - } + if(!arg_cnt(dp)) + return throw_type_error(dispex->ctx, ei, IDS_ARG_NOT_OPT, NULL); hres = to_number(dispex->ctx, get_arg(dp, 0), ei, &v); if(FAILED(hres)) @@ -1877,16 +1800,11 @@ static HRESULT Date_setUTCDate(DispatchEx *dispex, LCID lcid, WORD flags, DISPPA TRACE("\n"); - if(!is_class(dispex, JSCLASS_DATE)) { - FIXME("throw TypeError\n"); - return E_FAIL; - } + if(!is_class(dispex, JSCLASS_DATE)) + return throw_type_error(dispex->ctx, ei, IDS_NOT_DATE, NULL); - if(!arg_cnt(dp)) { - FIXME("throw ArgumentNotOptional\n"); - if(retv) num_set_nan(retv); - return S_OK; - } + if(!arg_cnt(dp)) + return throw_type_error(dispex->ctx, ei, IDS_ARG_NOT_OPT, NULL); hres = to_number(dispex->ctx, get_arg(dp, 0), ei, &v); if(FAILED(hres)) @@ -1915,16 +1833,11 @@ static HRESULT Date_setMonth(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARA TRACE("\n"); - if(!is_class(dispex, JSCLASS_DATE)) { - FIXME("throw TypeError\n"); - return E_FAIL; - } + if(!is_class(dispex, JSCLASS_DATE)) + return throw_type_error(dispex->ctx, ei, IDS_NOT_DATE, NULL); - if(!arg_cnt(dp)) { - FIXME("throw ArgumentNotOptional\n"); - if(retv) num_set_nan(retv); - return S_OK; - } + if(!arg_cnt(dp)) + return throw_type_error(dispex->ctx, ei, IDS_ARG_NOT_OPT, NULL); date = (DateInstance*)dispex; t = local_time(date->time, date); @@ -1963,16 +1876,11 @@ static HRESULT Date_setUTCMonth(DispatchEx *dispex, LCID lcid, WORD flags, DISPP TRACE("\n"); - if(!is_class(dispex, JSCLASS_DATE)) { - FIXME("throw TypeError\n"); - return E_FAIL; - } + if(!is_class(dispex, JSCLASS_DATE)) + return throw_type_error(dispex->ctx, ei, IDS_NOT_DATE, NULL); - if(!arg_cnt(dp)) { - FIXME("throw ArgumentNotOptional\n"); - if(retv) num_set_nan(retv); - return S_OK; - } + if(!arg_cnt(dp)) + return throw_type_error(dispex->ctx, ei, IDS_ARG_NOT_OPT, NULL); date = (DateInstance*)dispex; t = date->time; @@ -2011,16 +1919,11 @@ static HRESULT Date_setFullYear(DispatchEx *dispex, LCID lcid, WORD flags, DISPP TRACE("\n"); - if(!is_class(dispex, JSCLASS_DATE)) { - FIXME("throw TypeError\n"); - return E_FAIL; - } + if(!is_class(dispex, JSCLASS_DATE)) + return throw_type_error(dispex->ctx, ei, IDS_NOT_DATE, NULL); - if(!arg_cnt(dp)) { - FIXME("throw ArgumentNotOptional\n"); - if(retv) num_set_nan(retv); - return S_OK; - } + if(!arg_cnt(dp)) + return throw_type_error(dispex->ctx, ei, IDS_ARG_NOT_OPT, NULL); date = (DateInstance*)dispex; t = local_time(date->time, date); @@ -2066,16 +1969,11 @@ static HRESULT Date_setUTCFullYear(DispatchEx *dispex, LCID lcid, WORD flags, DI TRACE("\n"); - if(!is_class(dispex, JSCLASS_DATE)) { - FIXME("throw TypeError\n"); - return E_FAIL; - } + if(!is_class(dispex, JSCLASS_DATE)) + return throw_type_error(dispex->ctx, ei, IDS_NOT_DATE, NULL); - if(!arg_cnt(dp)) { - FIXME("throw ArgumentNotOptional\n"); - if(retv) num_set_nan(retv); - return S_OK; - } + if(!arg_cnt(dp)) + return throw_type_error(dispex->ctx, ei, IDS_ARG_NOT_OPT, NULL); date = (DateInstance*)dispex; t = date->time; @@ -2110,11 +2008,49 @@ static HRESULT Date_setUTCFullYear(DispatchEx *dispex, LCID lcid, WORD flags, DI return S_OK; } +/* ECMA-262 3rd Edition B2.4 */ +static HRESULT Date_getYear(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, + VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller) +{ + DateInstance *date; + DOUBLE t, year; + + TRACE("\n"); + + if(!is_class(dispex, JSCLASS_DATE)) + return throw_type_error(dispex->ctx, ei, IDS_NOT_DATE, NULL); + + date = (DateInstance*)dispex; + t = local_time(date->time, date); + + + if(isnan(t)) { + if(retv) + num_set_nan(retv); + return S_OK; + } + + year = year_from_time(t); + if(retv) + num_set_val(retv, (1900<=year && year<2000)?year-1900:year); + + return S_OK; +} + static HRESULT Date_value(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller) { - FIXME("\n"); - return E_NOTIMPL; + TRACE("\n"); + + switch(flags) { + case INVOKE_FUNC: + return throw_type_error(dispex->ctx, ei, IDS_NOT_FUNC, NULL); + default: + FIXME("unimplemented flags %x\n", flags); + return E_NOTIMPL; + } + + return S_OK; } static const builtin_prop_t Date_props[] = { @@ -2136,6 +2072,7 @@ static const builtin_prop_t Date_props[] = { {getUTCMinutesW, Date_getUTCMinutes, PROPF_METHOD}, {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}, @@ -2205,11 +2142,288 @@ static HRESULT create_date(script_ctx_t *ctx, BOOL use_constr, DOUBLE time, Disp return S_OK; } +static inline HRESULT date_parse(BSTR input, VARIANT *retv) { + static const DWORD string_ids[] = { LOCALE_SMONTHNAME12, LOCALE_SMONTHNAME11, + LOCALE_SMONTHNAME10, LOCALE_SMONTHNAME9, LOCALE_SMONTHNAME8, + LOCALE_SMONTHNAME7, LOCALE_SMONTHNAME6, LOCALE_SMONTHNAME5, + LOCALE_SMONTHNAME4, LOCALE_SMONTHNAME3, LOCALE_SMONTHNAME2, + LOCALE_SMONTHNAME1, LOCALE_SDAYNAME7, LOCALE_SDAYNAME1, + LOCALE_SDAYNAME2, LOCALE_SDAYNAME3, LOCALE_SDAYNAME4, + LOCALE_SDAYNAME5, LOCALE_SDAYNAME6 }; + BSTR strings[sizeof(string_ids)/sizeof(DWORD)]; + + BSTR parse; + int input_len, parse_len = 0, nest_level = 0, i, size; + int year = 0, month = 0, day = 0, hour = 0, min = 0, sec = 0; + int ms = 0, offset = 0, hour_adjust = 0; + BOOL set_year = FALSE, set_month = FALSE, set_day = FALSE, set_hour = FALSE; + BOOL set_offset = FALSE, set_era = FALSE, ad = TRUE, set_am = FALSE, am = TRUE; + BOOL set_hour_adjust = TRUE; + TIME_ZONE_INFORMATION tzi; + DateInstance di; + DWORD lcid_en; + + if(retv) num_set_nan(retv); + + input_len = SysStringLen(input); + for(i=0; i= 0) + SysFreeString(strings[i]); + SysFreeString(parse); + return E_OUTOFMEMORY; + } + GetLocaleInfoW(lcid_en, string_ids[i], strings[i], size); + } + + for(i=0; i='0' && parse[i]<='9') { + int tmp = atoiW(&parse[i]); + while(parse[i]>='0' && parse[i]<='9') i++; + while(isspaceW(parse[i])) i++; + + if(parse[i] == ':') { + /* Time */ + if(set_hour) break; + set_hour = TRUE; + + hour = tmp; + + while(parse[i] == ':') i++; + while(isspaceW(parse[i])) i++; + if(parse[i]>='0' && parse[i]<='9') { + min = atoiW(&parse[i]); + while(parse[i]>='0' && parse[i]<='9') i++; + } + + while(isspaceW(parse[i])) i++; + while(parse[i] == ':') i++; + while(isspaceW(parse[i])) i++; + if(parse[i]>='0' && parse[i]<='9') { + sec = atoiW(&parse[i]); + while(parse[i]>='0' && parse[i]<='9') i++; + } + } + else if(parse[i]=='-' || parse[i]=='/') { + /* Short date */ + if(set_day || set_month || set_year) break; + set_day = TRUE; + set_month = TRUE; + set_year = TRUE; + + month = tmp-1; + + while(isspaceW(parse[i])) i++; + while(parse[i]=='-' || parse[i]=='/') i++; + while(isspaceW(parse[i])) i++; + if(parse[i]<'0' || parse[i]>'9') break; + day = atoiW(&parse[i]); + while(parse[i]>='0' && parse[i]<='9') i++; + + while(parse[i]=='-' || parse[i]=='/') i++; + while(isspaceW(parse[i])) i++; + if(parse[i]<'0' || parse[i]>'9') break; + year = atoiW(&parse[i]); + while(parse[i]>='0' && parse[i]<='9') i++; + } + else if(tmp<0) break; + else if(tmp<70) { + /* Day */ + if(set_day) break; + set_day = TRUE; + day = tmp; + } + else { + /* Year */ + if(set_year) break; + set_year = TRUE; + year = tmp; + } + } + else { + if(parse[i]<'A' || parse[i]>'Z') break; + else if(parse[i]=='B' && (parse[i+1]=='C' || + (parse[i+1]=='.' && parse[i+2]=='C'))) { + /* AD/BC */ + if(set_era) break; + set_era = TRUE; + ad = FALSE; + + i++; + if(parse[i] == '.') i++; + i++; + if(parse[i] == '.') i++; + } + else if(parse[i]=='A' && (parse[i+1]=='D' || + (parse[i+1]=='.' && parse[i+2]=='D'))) { + /* AD/BC */ + if(set_era) break; + set_era = TRUE; + + i++; + if(parse[i] == '.') i++; + i++; + if(parse[i] == '.') i++; + } + else if(parse[i+1]<'A' || parse[i+1]>'Z') { + /* Timezone */ + if(set_offset) break; + set_offset = TRUE; + + if(parse[i] <= 'I') hour_adjust = parse[i]-'A'+2; + else if(parse[i] == 'J') break; + else if(parse[i] <= 'M') hour_adjust = parse[i]-'K'+11; + else if(parse[i] <= 'Y') hour_adjust = parse[i]-'N'; + else hour_adjust = 1; + + i++; + if(parse[i] == '.') i++; + } + else if(parse[i]=='A' && parse[i+1]=='M') { + /* AM/PM */ + if(set_am) break; + set_am = TRUE; + am = TRUE; + i += 2; + } + else if(parse[i]=='P' && parse[i+1]=='M') { + /* AM/PM */ + if(set_am) break; + set_am = TRUE; + am = FALSE; + i += 2; + } + else if((parse[i]=='U' && parse[i+1]=='T' && parse[i+2]=='C') + || (parse[i]=='G' && parse[i+1]=='M' && parse[i+2]=='T')) { + /* Timezone */ + BOOL positive = TRUE; + + if(set_offset) break; + set_offset = TRUE; + set_hour_adjust = FALSE; + + i += 3; + while(isspaceW(parse[i])) i++; + if(parse[i] == '-') positive = FALSE; + else if(parse[i] != '+') continue; + + i++; + while(isspaceW(parse[i])) i++; + if(parse[i]<'0' || parse[i]>'9') break; + offset = atoiW(&parse[i]); + while(parse[i]>='0' && parse[i]<='9') i++; + + if(offset<24) offset *= 60; + else offset = (offset/100)*60 + offset%100; + + if(positive) offset = -offset; + } + else { + /* Month or garbage */ + int j; + + for(size=i; parse[size]>='A' && parse[size]<='Z'; size++); + size -= i; + + for(j=0; jctx, get_arg(dp,0), ei, &parse_str); + if(FAILED(hres)) + return hres; + + hres = date_parse(parse_str, retv); + + SysFreeString(parse_str); + return hres; } static HRESULT DateConstr_UTC(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, @@ -2333,16 +2547,15 @@ static HRESULT DateConstr_value(DispatchEx *dispex, LCID lcid, WORD flags, DISPP case 1: { VARIANT prim, num; - hres = to_primitive(dispex->ctx, get_arg(dp,0), ei, &prim); + hres = to_primitive(dispex->ctx, get_arg(dp,0), ei, &prim, NO_HINT); if(FAILED(hres)) return hres; - if(V_VT(&prim) == VT_BSTR) { - FIXME("VT_BSTR not supported\n"); - return E_NOTIMPL; - } + if(V_VT(&prim) == VT_BSTR) + hres = date_parse(V_BSTR(&prim), &num); + else + hres = to_number(dispex->ctx, &prim, ei, &num); - hres = to_number(dispex->ctx, &prim, ei, &num); VariantClear(&prim); if(FAILED(hres)) return hres; @@ -2373,6 +2586,18 @@ static HRESULT DateConstr_value(DispatchEx *dispex, LCID lcid, WORD flags, DISPP V_DISPATCH(retv) = (IDispatch*)_IDispatchEx_(date); return S_OK; + case INVOKE_FUNC: { + FILETIME system_time, local_time; + LONGLONG lltime; + + GetSystemTimeAsFileTime(&system_time); + FileTimeToLocalFileTime(&system_time, &local_time); + lltime = ((LONGLONG)local_time.dwHighDateTime<<32) + + local_time.dwLowDateTime; + + return date_to_string(lltime/10000-TIME_EPOCH, FALSE, 0, retv); + } + default: FIXME("unimplemented flags %x\n", flags); return E_NOTIMPL; diff --git a/reactos/dll/win32/jscript/dispex.c b/reactos/dll/win32/jscript/dispex.c index a387ecdbff6..509fb50944d 100644 --- a/reactos/dll/win32/jscript/dispex.c +++ b/reactos/dll/win32/jscript/dispex.c @@ -828,7 +828,7 @@ HRESULT jsdisp_call_value(DispatchEx *disp, LCID lcid, WORD flags, DISPPARAMS *d return disp->builtin_info->value_prop.invoke(disp, lcid, flags, dp, retv, ei, caller); } -static HRESULT jsdisp_call(DispatchEx *disp, DISPID id, LCID lcid, WORD flags, DISPPARAMS *dp, VARIANT *retv, +HRESULT jsdisp_call(DispatchEx *disp, DISPID id, LCID lcid, WORD flags, DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller) { dispex_prop_t *prop; @@ -1010,3 +1010,19 @@ HRESULT disp_propget(IDispatch *disp, DISPID id, LCID lcid, VARIANT *val, jsexce return hres; } + +HRESULT jsdisp_delete_idx(DispatchEx *obj, DWORD idx) +{ + static const WCHAR formatW[] = {'%','d',0}; + WCHAR buf[12]; + dispex_prop_t *prop; + HRESULT hres; + + sprintfW(buf, formatW, idx); + + hres = find_prop_name(obj, buf, &prop); + if(FAILED(hres) || !prop) + return hres; + + return delete_prop(prop); +} diff --git a/reactos/dll/win32/jscript/engine.c b/reactos/dll/win32/jscript/engine.c index 05c6225daae..f120cc680b6 100644 --- a/reactos/dll/win32/jscript/engine.c +++ b/reactos/dll/win32/jscript/engine.c @@ -179,6 +179,8 @@ HRESULT create_exec_ctx(IDispatch *this_obj, DispatchEx *var_disp, scope_chain_t if(!ctx) return E_OUTOFMEMORY; + ctx->ref = 1; + IDispatch_AddRef(this_obj); ctx->this_obj = this_obj; @@ -230,10 +232,8 @@ static HRESULT disp_get_id(IDispatch *disp, BSTR name, DWORD flags, DISPID *id) /* ECMA-262 3rd Edition 8.7.2 */ static HRESULT put_value(script_ctx_t *ctx, exprval_t *ref, VARIANT *v, jsexcept_t *ei) { - if(ref->type != EXPRVAL_IDREF) { - FIXME("throw ReferemceError\n"); - return E_FAIL; - } + if(ref->type != EXPRVAL_IDREF) + return throw_reference_error(ctx, ei, IDS_ILLEGAL_ASSIGN, NULL); return disp_propput(ref->u.idref.disp, ref->u.idref.id, ctx->lcid, v, ei, NULL/*FIXME*/); } @@ -304,7 +304,12 @@ static HRESULT equal2_values(VARIANT *lval, VARIANT *rval, BOOL *ret) *ret = V_R8(lval) == V_R8(rval); break; case VT_BSTR: - *ret = !strcmpW(V_BSTR(lval), V_BSTR(rval)); + if(!V_BSTR(lval)) + *ret = SysStringLen(V_BSTR(rval))?FALSE:TRUE; + else if(!V_BSTR(rval)) + *ret = SysStringLen(V_BSTR(lval))?FALSE:TRUE; + else + *ret = !strcmpW(V_BSTR(lval), V_BSTR(rval)); break; case VT_DISPATCH: return disp_cmp(V_DISPATCH(lval), V_DISPATCH(rval), ret); @@ -431,7 +436,7 @@ HRESULT exec_source(exec_ctx_t *ctx, parser_ctx_t *parser, source_elements_t *so } /* ECMA-262 3rd Edition 10.1.4 */ -static HRESULT identifier_eval(exec_ctx_t *ctx, BSTR identifier, DWORD flags, exprval_t *ret) +static HRESULT identifier_eval(exec_ctx_t *ctx, BSTR identifier, DWORD flags, jsexcept_t *ei, exprval_t *ret) { scope_chain_t *scope; named_item_t *item; @@ -516,8 +521,7 @@ static HRESULT identifier_eval(exec_ctx_t *ctx, BSTR identifier, DWORD flags, ex return S_OK; } - WARN("Could not find identifier %s\n", debugstr_w(identifier)); - return E_FAIL; + return throw_type_error(ctx->var_disp->ctx, ei, IDS_UNDEFINED, identifier); } /* ECMA-262 3rd Edition 12.1 */ @@ -853,7 +857,7 @@ HRESULT forin_statement_eval(exec_ctx_t *ctx, statement_t *_stat, return_type_t TRACE("iter %s\n", debugstr_w(str)); if(stat->variable) - hres = identifier_eval(ctx, identifier, 0, &exprval); + hres = identifier_eval(ctx, identifier, 0, NULL, &exprval); else hres = expr_eval(ctx, stat->expr, EXPR_NEWREF, &rt->ei, &exprval); if(SUCCEEDED(hres)) { @@ -1536,11 +1540,16 @@ HRESULT call_expression_eval(exec_ctx_t *ctx, expression_t *_expr, DWORD flags, hres = args_to_param(ctx, expr->argument_list, ei, &dp); if(SUCCEEDED(hres)) { switch(exprval.type) { + case EXPRVAL_VARIANT: + if(V_VT(&exprval.u.var) != VT_DISPATCH) + return throw_type_error(ctx->var_disp->ctx, ei, IDS_NO_PROPERTY, NULL); + + hres = disp_call(V_DISPATCH(&exprval.u.var), DISPID_VALUE, ctx->parser->script->lcid, + DISPATCH_METHOD, &dp, flags & EXPR_NOVAL ? NULL : &var, ei, NULL/*FIXME*/); + break; case EXPRVAL_IDREF: - hres = disp_call(exprval.u.idref.disp, exprval.u.idref.id, ctx->parser->script->lcid, DISPATCH_METHOD, - &dp, flags & EXPR_NOVAL ? NULL : &var, ei, NULL/*FIXME*/); - if(flags & EXPR_NOVAL) - V_VT(&var) = VT_EMPTY; + hres = disp_call(exprval.u.idref.disp, exprval.u.idref.id, ctx->parser->script->lcid, + DISPATCH_METHOD, &dp, flags & EXPR_NOVAL ? NULL : &var, ei, NULL/*FIXME*/); break; default: FIXME("unimplemented type %d\n", exprval.type); @@ -1554,9 +1563,13 @@ HRESULT call_expression_eval(exec_ctx_t *ctx, expression_t *_expr, DWORD flags, if(FAILED(hres)) return hres; - TRACE("= %s\n", debugstr_variant(&var)); ret->type = EXPRVAL_VARIANT; - ret->u.var = var; + if(flags & EXPR_NOVAL) { + V_VT(&ret->u.var) = VT_EMPTY; + }else { + TRACE("= %s\n", debugstr_variant(&var)); + ret->u.var = var; + } return S_OK; } @@ -1585,7 +1598,7 @@ HRESULT identifier_expression_eval(exec_ctx_t *ctx, expression_t *_expr, DWORD f if(!identifier) return E_OUTOFMEMORY; - hres = identifier_eval(ctx, identifier, flags, ret); + hres = identifier_eval(ctx, identifier, flags, ei, ret); SysFreeString(identifier); return hres; @@ -1931,11 +1944,11 @@ static HRESULT add_eval(exec_ctx_t *ctx, VARIANT *lval, VARIANT *rval, jsexcept_ VARIANT r, l; HRESULT hres; - hres = to_primitive(ctx->parser->script, lval, ei, &l); + hres = to_primitive(ctx->parser->script, lval, ei, &l, NO_HINT); if(FAILED(hres)) return hres; - hres = to_primitive(ctx->parser->script, rval, ei, &r); + hres = to_primitive(ctx->parser->script, rval, ei, &r, NO_HINT); if(FAILED(hres)) { VariantClear(&l); return hres; @@ -2518,7 +2531,7 @@ static HRESULT equal_values(exec_ctx_t *ctx, VARIANT *lval, VARIANT *rval, jsexc VARIANT v; HRESULT hres; - hres = to_primitive(ctx->parser->script, rval, ei, &v); + hres = to_primitive(ctx->parser->script, rval, ei, &v, NO_HINT); if(FAILED(hres)) return hres; @@ -2533,7 +2546,7 @@ static HRESULT equal_values(exec_ctx_t *ctx, VARIANT *lval, VARIANT *rval, jsexc VARIANT v; HRESULT hres; - hres = to_primitive(ctx->parser->script, lval, ei, &v); + hres = to_primitive(ctx->parser->script, lval, ei, &v, NO_HINT); if(FAILED(hres)) return hres; @@ -2638,11 +2651,11 @@ static HRESULT less_eval(exec_ctx_t *ctx, VARIANT *lval, VARIANT *rval, BOOL gre VARIANT l, r, ln, rn; HRESULT hres; - hres = to_primitive(ctx->parser->script, lval, ei, &l); + hres = to_primitive(ctx->parser->script, lval, ei, &l, NO_HINT); if(FAILED(hres)) return hres; - hres = to_primitive(ctx->parser->script, rval, ei, &r); + hres = to_primitive(ctx->parser->script, rval, ei, &r, NO_HINT); if(FAILED(hres)) { VariantClear(&l); return hres; diff --git a/reactos/dll/win32/jscript/engine.h b/reactos/dll/win32/jscript/engine.h index f1a78ecf15d..8d53f003459 100644 --- a/reactos/dll/win32/jscript/engine.h +++ b/reactos/dll/win32/jscript/engine.h @@ -56,6 +56,7 @@ typedef struct _parser_ctx_t { source_elements_t *source; BOOL nl; BOOL is_html; + BOOL lexer_error; HRESULT hres; jsheap_t heap; diff --git a/reactos/dll/win32/jscript/error.c b/reactos/dll/win32/jscript/error.c new file mode 100644 index 00000000000..25a3836cc8f --- /dev/null +++ b/reactos/dll/win32/jscript/error.c @@ -0,0 +1,481 @@ +/* + * Copyright 2009 Piotr Caban + * + * 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 + */ +#include "config.h" +#include "wine/port.h" + +#include + +#include "jscript.h" + +#include "wine/debug.h" + +WINE_DEFAULT_DEBUG_CHANNEL(jscript); + +typedef struct { + DispatchEx dispex; + + VARIANT number; + VARIANT description; + VARIANT message; +} ErrorInstance; + +static const WCHAR descriptionW[] = {'d','e','s','c','r','i','p','t','i','o','n',0}; +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) +{ + ErrorInstance *This = (ErrorInstance*)dispex; + + TRACE("\n"); + + switch(flags) { + case DISPATCH_PROPERTYGET: + return VariantCopy(retv, &This->number); + case DISPATCH_PROPERTYPUT: + return VariantCopy(&This->number, get_arg(dp, 0)); + default: + FIXME("unimplemented flags %x\n", flags); + return E_NOTIMPL; + } +} + +static HRESULT Error_description(DispatchEx *dispex, LCID lcid, WORD flags, + DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp) +{ + ErrorInstance *This = (ErrorInstance*)dispex; + + TRACE("\n"); + + switch(flags) { + case DISPATCH_PROPERTYGET: + return VariantCopy(retv, &This->description); + case DISPATCH_PROPERTYPUT: + return VariantCopy(&This->description, get_arg(dp, 0)); + default: + FIXME("unimplemented flags %x\n", flags); + return E_NOTIMPL; + } +} + +/* ECMA-262 3rd Edition 15.11.4.3 */ +static HRESULT Error_message(DispatchEx *dispex, LCID lcid, WORD flags, + DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp) +{ + ErrorInstance *This = (ErrorInstance*)dispex; + + TRACE("\n"); + + switch(flags) { + case DISPATCH_PROPERTYGET: + return VariantCopy(retv, &This->message); + case DISPATCH_PROPERTYPUT: + return VariantCopy(&This->message, get_arg(dp, 0)); + default: + FIXME("unimplemented flags %x\n", flags); + return E_NOTIMPL; + } +} + +/* ECMA-262 3rd Edition 15.11.4.4 */ +static HRESULT Error_toString(DispatchEx *dispex, LCID lcid, WORD flags, + DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp) +{ + static const WCHAR str[] = {'[','o','b','j','e','c','t',' ','E','r','r','o','r',']',0}; + + TRACE("\n"); + + if(retv) { + V_VT(retv) = VT_BSTR; + V_BSTR(retv) = SysAllocString(str); + if(!V_BSTR(retv)) + return E_OUTOFMEMORY; + } + + 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) +{ + TRACE("\n"); + + switch(flags) { + case INVOKE_FUNC: + return throw_type_error(dispex->ctx, ei, IDS_NOT_FUNC, NULL); + default: + FIXME("unimplemented flags %x\n", flags); + return E_NOTIMPL; + } + + return S_OK; +} + +static void Error_destructor(DispatchEx *dispex) +{ + ErrorInstance *This = (ErrorInstance*)dispex; + + VariantClear(&This->number); + VariantClear(&This->description); + VariantClear(&This->message); + heap_free(This); +} + +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} +}; + +static const builtin_info_t Error_info = { + JSCLASS_ERROR, + {NULL, Error_value, 0}, + sizeof(Error_props)/sizeof(*Error_props), + Error_props, + Error_destructor, + NULL +}; + +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 = { + JSCLASS_ERROR, + {NULL, Error_value, 0}, + sizeof(ErrorInst_props)/sizeof(*ErrorInst_props), + ErrorInst_props, + Error_destructor, + NULL +}; + +static HRESULT alloc_error(script_ctx_t *ctx, BOOL error_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(FAILED(hres)) { + heap_free(err); + return hres; + } + + *ret = err; + return S_OK; +} + +static HRESULT create_error(script_ctx_t *ctx, DispatchEx *constr, + const UINT *number, const WCHAR *msg, DispatchEx **ret) +{ + ErrorInstance *err; + HRESULT hres; + + hres = alloc_error(ctx, FALSE, constr, &err); + if(FAILED(hres)) + return hres; + + if(number) { + V_VT(&err->number) = VT_I4; + V_I4(&err->number) = *number; + } + + V_VT(&err->message) = VT_BSTR; + if(msg) V_BSTR(&err->message) = SysAllocString(msg); + else V_BSTR(&err->message) = SysAllocStringLen(NULL, 0); + + VariantCopy(&err->description, &err->message); + + if(!V_BSTR(&err->message)) { + heap_free(err); + return E_OUTOFMEMORY; + } + + *ret = &err->dispex; + return S_OK; +} + +static HRESULT error_constr(DispatchEx *dispex, WORD flags, DISPPARAMS *dp, + VARIANT *retv, jsexcept_t *ei, DispatchEx *constr) { + DispatchEx *err; + VARIANT numv; + UINT num; + BSTR msg = NULL; + HRESULT hres; + + V_VT(&numv) = VT_NULL; + + if(arg_cnt(dp)) { + hres = to_number(dispex->ctx, get_arg(dp, 0), ei, &numv); + if(FAILED(hres) || (V_VT(&numv)==VT_R8 && isnan(V_R8(&numv)))) + hres = to_string(dispex->ctx, get_arg(dp, 0), ei, &msg); + else if(V_VT(&numv) == VT_I4) + num = V_I4(&numv); + else + num = V_R8(&numv); + + if(FAILED(hres)) + return hres; + } + + if(arg_cnt(dp)>1 && !msg) { + hres = to_string(dispex->ctx, get_arg(dp, 1), ei, &msg); + if(FAILED(hres)) + return hres; + } + + switch(flags) { + case INVOKE_FUNC: + case DISPATCH_CONSTRUCT: + if(V_VT(&numv) == VT_NULL) + hres = create_error(dispex->ctx, constr, NULL, msg, &err); + else + hres = create_error(dispex->ctx, constr, &num, msg, &err); + + if(FAILED(hres)) + return hres; + + if(retv) { + V_VT(retv) = VT_DISPATCH; + V_DISPATCH(retv) = (IDispatch*)_IDispatchEx_(err); + } + else + IDispatchEx_Release(_IDispatchEx_(err)); + + return S_OK; + + default: + FIXME("unimplemented flags %x\n", flags); + return E_NOTIMPL; + } +} + +static HRESULT ErrorConstr_value(DispatchEx *dispex, LCID lcid, WORD flags, + DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp) +{ + TRACE("\n"); + return error_constr(dispex, flags, dp, retv, ei, + dispex->ctx->error_constr); +} + +static HRESULT EvalErrorConstr_value(DispatchEx *dispex, LCID lcid, WORD flags, + DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp) +{ + TRACE("\n"); + return error_constr(dispex, flags, dp, retv, ei, + dispex->ctx->eval_error_constr); +} + +static HRESULT RangeErrorConstr_value(DispatchEx *dispex, LCID lcid, WORD flags, + DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp) +{ + TRACE("\n"); + return error_constr(dispex, flags, dp, retv, ei, + dispex->ctx->range_error_constr); +} + +static HRESULT ReferenceErrorConstr_value(DispatchEx *dispex, LCID lcid, WORD flags, + DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp) +{ + TRACE("\n"); + return error_constr(dispex, flags, dp, retv, ei, + dispex->ctx->reference_error_constr); +} + +static HRESULT SyntaxErrorConstr_value(DispatchEx *dispex, LCID lcid, WORD flags, + DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp) +{ + TRACE("\n"); + return error_constr(dispex, flags, dp, retv, ei, + dispex->ctx->syntax_error_constr); +} + +static HRESULT TypeErrorConstr_value(DispatchEx *dispex, LCID lcid, WORD flags, + DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp) +{ + TRACE("\n"); + return error_constr(dispex, flags, dp, retv, ei, + dispex->ctx->type_error_constr); +} + +static HRESULT URIErrorConstr_value(DispatchEx *dispex, LCID lcid, WORD flags, + DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp) +{ + TRACE("\n"); + return error_constr(dispex, flags, dp, retv, ei, + dispex->ctx->uri_error_constr); +} + +HRESULT init_error_constr(script_ctx_t *ctx) +{ + static const WCHAR nameW[] = {'n','a','m','e',0}; + static const WCHAR ErrorW[] = {'E','r','r','o','r',0}; + static const WCHAR EvalErrorW[] = {'E','v','a','l','E','r','r','o','r',0}; + static const WCHAR RangeErrorW[] = {'R','a','n','g','e','E','r','r','o','r',0}; + static const WCHAR ReferenceErrorW[] = {'R','e','f','e','r','e','n','c','e','E','r','r','o','r',0}; + static const WCHAR SyntaxErrorW[] = {'S','y','n','t','a','x','E','r','r','o','r',0}; + static const WCHAR TypeErrorW[] = {'T','y','p','e','E','r','r','o','r',0}; + static const WCHAR URIErrorW[] = {'U','R','I','E','r','r','o','r',0}; + static const WCHAR *names[] = {ErrorW, EvalErrorW, RangeErrorW, + ReferenceErrorW, SyntaxErrorW, TypeErrorW, URIErrorW}; + DispatchEx **constr_addr[] = {&ctx->error_constr, &ctx->eval_error_constr, + &ctx->range_error_constr, &ctx->reference_error_constr, + &ctx->syntax_error_constr, &ctx->type_error_constr, + &ctx->uri_error_constr}; + static builtin_invoke_t constr_val[] = {ErrorConstr_value, EvalErrorConstr_value, + RangeErrorConstr_value, ReferenceErrorConstr_value, SyntaxErrorConstr_value, + TypeErrorConstr_value, URIErrorConstr_value}; + + ErrorInstance *err; + INT i; + VARIANT v; + HRESULT hres; + + for(i=0; i<7; i++) { + hres = alloc_error(ctx, i==0, NULL, &err); + if(FAILED(hres)) + return hres; + + V_VT(&v) = VT_BSTR; + V_BSTR(&v) = SysAllocString(names[i]); + if(!V_BSTR(&v)) { + IDispatchEx_Release(_IDispatchEx_(&err->dispex)); + return E_OUTOFMEMORY; + } + + hres = jsdisp_propput_name(&err->dispex, nameW, ctx->lcid, &v, NULL/*FIXME*/, NULL/*FIXME*/); + + if(SUCCEEDED(hres)) + hres = create_builtin_function(ctx, constr_val[i], NULL, + PROPF_CONSTR, &err->dispex, constr_addr[i]); + + IDispatchEx_Release(_IDispatchEx_(&err->dispex)); + VariantClear(&v); + if(FAILED(hres)) + return hres; + } + + return S_OK; +} + +static HRESULT throw_error(script_ctx_t *ctx, jsexcept_t *ei, UINT id, const WCHAR *str, DispatchEx *constr) +{ + WCHAR buf[1024], *pos = NULL; + DispatchEx *err; + HRESULT hres; + + buf[0] = '\0'; + LoadStringW(jscript_hinstance, id&0xFFFF, buf, sizeof(buf)/sizeof(WCHAR)); + + if(str) pos = strchrW(buf, '|'); + if(pos) { + int len = strlenW(str); + memmove(pos+len, pos+1, (strlenW(pos+1)+1)*sizeof(WCHAR)); + memcpy(pos, str, len*sizeof(WCHAR)); + } + + WARN("%s\n", debugstr_w(buf)); + + id |= JSCRIPT_ERROR; + hres = create_error(ctx, constr, &id, buf, &err); + if(FAILED(hres)) + return hres; + + if(!ei) + return id; + + V_VT(&ei->var) = VT_DISPATCH; + V_DISPATCH(&ei->var) = (IDispatch*)_IDispatchEx_(err); + + return id; +} + +HRESULT throw_eval_error(script_ctx_t *ctx, jsexcept_t *ei, UINT id, const WCHAR *str) +{ + return throw_error(ctx, ei, id, str, ctx->eval_error_constr); +} + +HRESULT throw_range_error(script_ctx_t *ctx, jsexcept_t *ei, UINT id, const WCHAR *str) +{ + return throw_error(ctx, ei, id, str, ctx->range_error_constr); +} + +HRESULT throw_reference_error(script_ctx_t *ctx, jsexcept_t *ei, UINT id, const WCHAR *str) +{ + return throw_error(ctx, ei, id, str, ctx->reference_error_constr); +} + +HRESULT throw_syntax_error(script_ctx_t *ctx, jsexcept_t *ei, UINT id, const WCHAR *str) +{ + return throw_error(ctx, ei, id, str, ctx->syntax_error_constr); +} + +HRESULT throw_type_error(script_ctx_t *ctx, jsexcept_t *ei, UINT id, const WCHAR *str) +{ + return throw_error(ctx, ei, id, str, ctx->type_error_constr); +} + +HRESULT throw_uri_error(script_ctx_t *ctx, jsexcept_t *ei, UINT id, const WCHAR *str) +{ + return throw_error(ctx, ei, id, str, ctx->uri_error_constr); +} diff --git a/reactos/dll/win32/jscript/function.c b/reactos/dll/win32/jscript/function.c index d780aeebde1..6ac668cf80a 100644 --- a/reactos/dll/win32/jscript/function.c +++ b/reactos/dll/win32/jscript/function.c @@ -41,7 +41,6 @@ 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 valueOfW[] = {'v','a','l','u','e','O','f',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}; @@ -198,9 +197,10 @@ static HRESULT invoke_constructor(FunctionInstance *function, LCID lcid, DISPPAR return hres; hres = invoke_source(function, (IDispatch*)_IDispatchEx_(this_obj), lcid, dp, retv, ei, caller); - jsdisp_release(this_obj); - if(FAILED(hres)) + if(FAILED(hres)) { + jsdisp_release(this_obj); return hres; + } V_VT(retv) = VT_DISPATCH; V_DISPATCH(retv) = (IDispatch*)_IDispatchEx_(this_obj); @@ -272,10 +272,8 @@ static HRESULT Function_toString(DispatchEx *dispex, LCID lcid, WORD flags, DISP TRACE("\n"); - if(!is_class(dispex, JSCLASS_FUNCTION)) { - FIXME("throw TypeError\n"); - return E_FAIL; - } + if(!is_class(dispex, JSCLASS_FUNCTION)) + return throw_type_error(dispex->ctx, ei, IDS_NOT_FUNC, NULL); function = (FunctionInstance*)dispex; @@ -299,13 +297,6 @@ static HRESULT Function_toLocaleString(DispatchEx *dispex, LCID lcid, WORD flags return E_NOTIMPL; } -static HRESULT Function_valueOf(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) { @@ -408,8 +399,7 @@ static const builtin_prop_t Function_props[] = { {lengthW, Function_length, 0}, {propertyIsEnumerableW, Function_propertyIsEnumerable, PROPF_METHOD}, {toLocaleStringW, Function_toLocaleString, PROPF_METHOD}, - {toStringW, Function_toString, PROPF_METHOD}, - {valueOfW, Function_valueOf, PROPF_METHOD} + {toStringW, Function_toString, PROPF_METHOD} }; static const builtin_info_t Function_info = { @@ -457,35 +447,38 @@ static HRESULT create_function(script_ctx_t *ctx, const builtin_info_t *builtin_ function->flags = flags; function->length = flags & PROPF_ARGMASK; - if(prototype) { - jsexcept_t jsexcept; - VARIANT var; - - V_VT(&var) = VT_DISPATCH; - V_DISPATCH(&var) = (IDispatch*)_IDispatchEx_(prototype); - memset(&jsexcept, 0, sizeof(jsexcept)); - - hres = jsdisp_propput_name(&function->dispex, prototypeW, ctx->lcid, &var, &jsexcept, NULL/*FIXME*/); - if(FAILED(hres)) { - IDispatchEx_Release(_IDispatchEx_(&function->dispex)); - return hres; - } - } - *ret = function; return S_OK; } +static HRESULT set_prototype(script_ctx_t *ctx, DispatchEx *dispex, DispatchEx *prototype) +{ + jsexcept_t jsexcept; + VARIANT var; + + V_VT(&var) = VT_DISPATCH; + V_DISPATCH(&var) = (IDispatch*)_IDispatchEx_(prototype); + memset(&jsexcept, 0, sizeof(jsexcept)); + + return jsdisp_propput_name(dispex, prototypeW, ctx->lcid, &var, &jsexcept, NULL/*FIXME*/); +} + HRESULT create_builtin_function(script_ctx_t *ctx, builtin_invoke_t value_proc, const builtin_info_t *builtin_info, DWORD flags, DispatchEx *prototype, DispatchEx **ret) { FunctionInstance *function; HRESULT hres; - hres = create_function(ctx, builtin_info, flags, FALSE, prototype, &function); + hres = create_function(ctx, builtin_info, flags, FALSE, NULL, &function); if(FAILED(hres)) return hres; + hres = set_prototype(ctx, &function->dispex, prototype); + if(FAILED(hres)) { + jsdisp_release(&function->dispex); + return hres; + } + function->value_proc = value_proc; *ret = &function->dispex; @@ -505,7 +498,12 @@ HRESULT create_source_function(parser_ctx_t *ctx, parameter_t *parameters, sourc if(FAILED(hres)) return hres; - hres = create_function(ctx->script, NULL, PROPF_CONSTR, FALSE, prototype, &function); + hres = create_function(ctx->script, NULL, PROPF_CONSTR, FALSE, NULL, &function); + if(SUCCEEDED(hres)) { + hres = set_prototype(ctx->script, &function->dispex, prototype); + if(FAILED(hres)) + jsdisp_release(&function->dispex); + } jsdisp_release(prototype); if(FAILED(hres)) return hres; @@ -532,23 +530,28 @@ HRESULT create_source_function(parser_ctx_t *ctx, parameter_t *parameters, sourc return S_OK; } -HRESULT init_function_constr(script_ctx_t *ctx) +HRESULT init_function_constr(script_ctx_t *ctx, DispatchEx *object_prototype) { FunctionInstance *prot, *constr; HRESULT hres; - hres = create_function(ctx, NULL, PROPF_CONSTR, TRUE, NULL, &prot); + hres = create_function(ctx, NULL, PROPF_CONSTR, TRUE, object_prototype, &prot); if(FAILED(hres)) return hres; prot->value_proc = FunctionProt_value; hres = create_function(ctx, NULL, PROPF_CONSTR, TRUE, &prot->dispex, &constr); + if(SUCCEEDED(hres)) { + constr->value_proc = FunctionConstr_value; + hres = set_prototype(ctx, &constr->dispex, &prot->dispex); + if(FAILED(hres)) + jsdisp_release(&constr->dispex); + } jsdisp_release(&prot->dispex); if(FAILED(hres)) return hres; - constr->value_proc = FunctionConstr_value; ctx->function_constr = &constr->dispex; - return hres; + return S_OK; } diff --git a/reactos/dll/win32/jscript/global.c b/reactos/dll/win32/jscript/global.c index a714f8ef4e4..ff3510fd83b 100644 --- a/reactos/dll/win32/jscript/global.c +++ b/reactos/dll/win32/jscript/global.c @@ -20,6 +20,7 @@ #include "wine/port.h" #include +#include #include "jscript.h" #include "engine.h" @@ -28,11 +29,20 @@ WINE_DEFAULT_DEBUG_CHANNEL(jscript); +#define LONGLONG_MAX (((LONGLONG)0x7fffffff<<32)|0xffffffff) + static const WCHAR NaNW[] = {'N','a','N',0}; static const WCHAR InfinityW[] = {'I','n','f','i','n','i','t','y',0}; static const WCHAR ArrayW[] = {'A','r','r','a','y',0}; static const WCHAR BooleanW[] = {'B','o','o','l','e','a','n',0}; static const WCHAR DateW[] = {'D','a','t','e',0}; +static const WCHAR ErrorW[] = {'E','r','r','o','r',0}; +static const WCHAR EvalErrorW[] = {'E','v','a','l','E','r','r','o','r',0}; +static const WCHAR RangeErrorW[] = {'R','a','n','g','e','E','r','r','o','r',0}; +static const WCHAR ReferenceErrorW[] = {'R','e','f','e','r','e','n','c','e','E','r','r','o','r',0}; +static const WCHAR SyntaxErrorW[] = {'S','y','n','t','a','x','E','r','r','o','r',0}; +static const WCHAR TypeErrorW[] = {'T','y','p','e','E','r','r','o','r',0}; +static const WCHAR URIErrorW[] = {'U','R','I','E','r','r','o','r',0}; static const WCHAR FunctionW[] = {'F','u','n','c','t','i','o','n',0}; static const WCHAR NumberW[] = {'N','u','m','b','e','r',0}; static const WCHAR ObjectW[] = {'O','b','j','e','c','t',0}; @@ -165,6 +175,62 @@ static HRESULT JSGlobal_Date(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARA return constructor_call(dispex->ctx->date_constr, lcid, flags, dp, retv, ei, sp); } +static HRESULT JSGlobal_Error(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, + VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp) +{ + TRACE("\n"); + + return constructor_call(dispex->ctx->error_constr, lcid, flags, dp, retv, ei, sp); +} + +static HRESULT JSGlobal_EvalError(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, + VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp) +{ + TRACE("\n"); + + return constructor_call(dispex->ctx->eval_error_constr, lcid, flags, dp, retv, ei, sp); +} + +static HRESULT JSGlobal_RangeError(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, + VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp) +{ + TRACE("\n"); + + return constructor_call(dispex->ctx->range_error_constr, lcid, flags, dp, retv, ei, sp); +} + +static HRESULT JSGlobal_ReferenceError(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, + VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp) +{ + TRACE("\n"); + + return constructor_call(dispex->ctx->reference_error_constr, lcid, flags, dp, retv, ei, sp); +} + +static HRESULT JSGlobal_SyntaxError(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, + VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp) +{ + TRACE("\n"); + + return constructor_call(dispex->ctx->syntax_error_constr, lcid, flags, dp, retv, ei, sp); +} + +static HRESULT JSGlobal_TypeError(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, + VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp) +{ + TRACE("\n"); + + return constructor_call(dispex->ctx->type_error_constr, lcid, flags, dp, retv, ei, sp); +} + +static HRESULT JSGlobal_URIError(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, + VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp) +{ + TRACE("\n"); + + return constructor_call(dispex->ctx->uri_error_constr, lcid, flags, dp, retv, ei, sp); +} + static HRESULT JSGlobal_Function(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp) { @@ -267,7 +333,7 @@ static HRESULT JSGlobal_eval(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARA hres = script_parse(dispex->ctx, V_BSTR(arg), NULL, &parser_ctx); if(FAILED(hres)) { WARN("parse (%s) failed: %08x\n", debugstr_w(V_BSTR(arg)), hres); - return hres; + return throw_syntax_error(dispex->ctx, ei, hres, NULL); } hres = exec_source(dispex->ctx->exec_ctx, parser_ctx, parser_ctx->source, ei, retv); @@ -411,8 +477,103 @@ static HRESULT JSGlobal_parseInt(DispatchEx *dispex, LCID lcid, WORD flags, DISP static HRESULT JSGlobal_parseFloat(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp) { - FIXME("\n"); - return E_NOTIMPL; + LONGLONG d = 0, hlp; + int exp = 0, length; + VARIANT *arg; + WCHAR *str; + BSTR val_str = NULL; + BOOL ret_nan = TRUE, positive = TRUE; + HRESULT hres; + + if(!arg_cnt(dp)) { + if(retv) + num_set_nan(retv); + return S_OK; + } + + arg = get_arg(dp, 0); + hres = to_string(dispex->ctx, arg, ei, &val_str); + if(FAILED(hres)) + return hres; + + str = val_str; + length = SysStringLen(val_str); + + while(isspaceW(*str)) str++; + + if(*str == '+') + str++; + else if(*str == '-') { + positive = FALSE; + str++; + } + + if(isdigitW(*str)) + ret_nan = FALSE; + + while(isdigitW(*str)) { + hlp = d*10 + *(str++) - '0'; + if(d>LONGLONG_MAX/10 || hlp<0) { + exp++; + break; + } + else + d = hlp; + } + while(isdigitW(*str)) { + exp++; + str++; + } + + if(*str == '.') str++; + + if(isdigitW(*str)) + ret_nan = FALSE; + + while(isdigitW(*str)) { + hlp = d*10 + *(str++) - '0'; + if(d>LONGLONG_MAX/10 || hlp<0) + break; + + d = hlp; + exp--; + } + while(isdigitW(*str)) + str++; + + if(*str && !ret_nan && (*str=='e' || *str=='E')) { + int sign = 1, e = 0; + + str++; + if(*str == '+') + str++; + else if(*str == '-') { + sign = -1; + str++; + } + + while(isdigitW(*str)) { + if(e>INT_MAX/10 || (e = e*10 + *str++ - '0')<0) + e = INT_MAX; + } + e *= sign; + + if(exp<0 && e<0 && exp+e>0) exp = INT_MIN; + else if(exp>0 && e>0 && exp+e<0) exp = INT_MAX; + else exp += e; + } + + SysFreeString(val_str); + + if(ret_nan) { + if(retv) + num_set_nan(retv); + return S_OK; + } + + V_VT(retv) = VT_R8; + V_R8(retv) = (double)(positive?d:-d)*pow(10, exp); + return S_OK; } static HRESULT JSGlobal_unescape(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, @@ -541,6 +702,8 @@ static const builtin_prop_t JSGlobal_props[] = { {CollectGarbageW, JSGlobal_CollectGarbage, PROPF_METHOD}, {DateW, JSGlobal_Date, PROPF_CONSTR}, {EnumeratorW, JSGlobal_Enumerator, PROPF_METHOD}, + {ErrorW, JSGlobal_Error, PROPF_CONSTR}, + {EvalErrorW, JSGlobal_EvalError, PROPF_CONSTR}, {FunctionW, JSGlobal_Function, PROPF_CONSTR}, {_GetObjectW, JSGlobal_GetObject, PROPF_METHOD}, {InfinityW, JSGlobal_Infinity, 0}, @@ -548,12 +711,17 @@ static const builtin_prop_t JSGlobal_props[] = { {NaNW, JSGlobal_NaN, 0}, {NumberW, JSGlobal_Number, PROPF_CONSTR}, {ObjectW, JSGlobal_Object, PROPF_CONSTR}, + {RangeErrorW, JSGlobal_RangeError, PROPF_CONSTR}, + {ReferenceErrorW, JSGlobal_ReferenceError, PROPF_CONSTR}, {RegExpW, JSGlobal_RegExp, PROPF_CONSTR}, {ScriptEngineW, JSGlobal_ScriptEngine, PROPF_METHOD}, {ScriptEngineBuildVersionW, JSGlobal_ScriptEngineBuildVersion, PROPF_METHOD}, {ScriptEngineMajorVersionW, JSGlobal_ScriptEngineMajorVersion, PROPF_METHOD}, {ScriptEngineMinorVersionW, JSGlobal_ScriptEngineMinorVersion, PROPF_METHOD}, {StringW, JSGlobal_String, PROPF_CONSTR}, + {SyntaxErrorW, JSGlobal_SyntaxError, PROPF_CONSTR}, + {TypeErrorW, JSGlobal_TypeError, PROPF_CONSTR}, + {URIErrorW, JSGlobal_URIError, PROPF_CONSTR}, {VBArrayW, JSGlobal_VBArray, PROPF_METHOD}, {encodeURIW, JSGlobal_encodeURI, PROPF_METHOD}, {escapeW, JSGlobal_escape, PROPF_METHOD}, @@ -574,11 +742,15 @@ static const builtin_info_t JSGlobal_info = { NULL }; -static HRESULT init_constructors(script_ctx_t *ctx) +static HRESULT init_constructors(script_ctx_t *ctx, DispatchEx *object_prototype) { HRESULT hres; - hres = init_function_constr(ctx); + hres = init_function_constr(ctx, object_prototype); + if(FAILED(hres)) + return hres; + + hres = create_object_constr(ctx, object_prototype, &ctx->object_constr); if(FAILED(hres)) return hres; @@ -594,11 +766,11 @@ static HRESULT init_constructors(script_ctx_t *ctx) if(FAILED(hres)) return hres; - hres = create_number_constr(ctx, &ctx->number_constr); + hres = init_error_constr(ctx); if(FAILED(hres)) return hres; - hres = create_object_constr(ctx, &ctx->object_constr); + hres = create_number_constr(ctx, &ctx->number_constr); if(FAILED(hres)) return hres; @@ -615,14 +787,19 @@ static HRESULT init_constructors(script_ctx_t *ctx) HRESULT init_global(script_ctx_t *ctx) { - DispatchEx *math; + DispatchEx *math, *object_prototype; VARIANT var; HRESULT hres; if(ctx->global) return S_OK; - hres = init_constructors(ctx); + hres = create_object_prototype(ctx, &object_prototype); + if(FAILED(hres)) + return hres; + + hres = init_constructors(ctx, object_prototype); + jsdisp_release(object_prototype); if(FAILED(hres)) return hres; diff --git a/reactos/dll/win32/jscript/jscript.h b/reactos/dll/win32/jscript/jscript.h index 7a4158c631f..70c9fea603a 100644 --- a/reactos/dll/win32/jscript/jscript.h +++ b/reactos/dll/win32/jscript/jscript.h @@ -28,9 +28,13 @@ #include "dispex.h" #include "activscp.h" +#include "resource.h" + #include "wine/unicode.h" #include "wine/list.h" +#define JSCRIPT_ERROR 0x800A0000 + typedef struct _script_ctx_t script_ctx_t; typedef struct _exec_ctx_t exec_ctx_t; typedef struct _dispex_prop_t dispex_prop_t; @@ -58,6 +62,8 @@ jsheap_t *jsheap_mark(jsheap_t*); typedef struct DispatchEx DispatchEx; +extern HINSTANCE jscript_hinstance; + #define PROPF_ARGMASK 0x00ff #define PROPF_METHOD 0x0100 #define PROPF_ENUM 0x0200 @@ -68,6 +74,7 @@ typedef enum { JSCLASS_ARRAY, JSCLASS_BOOLEAN, JSCLASS_DATE, + JSCLASS_ERROR, JSCLASS_FUNCTION, JSCLASS_GLOBAL, JSCLASS_MATH, @@ -123,6 +130,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 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*); @@ -131,11 +139,19 @@ HRESULT jsdisp_propput_idx(DispatchEx*,DWORD,LCID,VARIANT*,jsexcept_t*,IServiceP HRESULT jsdisp_propget_name(DispatchEx*,LPCWSTR,LCID,VARIANT*,jsexcept_t*,IServiceProvider*); HRESULT jsdisp_propget_idx(DispatchEx*,DWORD,LCID,VARIANT*,jsexcept_t*,IServiceProvider*); HRESULT jsdisp_get_id(DispatchEx*,const WCHAR*,DWORD,DISPID*); +HRESULT jsdisp_delete_idx(DispatchEx*,DWORD); HRESULT create_builtin_function(script_ctx_t*,builtin_invoke_t,const builtin_info_t*,DWORD, DispatchEx*,DispatchEx**); HRESULT Function_value(DispatchEx*,LCID,WORD,DISPPARAMS*,VARIANT*,jsexcept_t*,IServiceProvider*); +HRESULT throw_eval_error(script_ctx_t*,jsexcept_t*,UINT,const WCHAR*); +HRESULT throw_range_error(script_ctx_t*,jsexcept_t*,UINT,const WCHAR*); +HRESULT throw_reference_error(script_ctx_t*,jsexcept_t*,UINT,const WCHAR*); +HRESULT throw_syntax_error(script_ctx_t*,jsexcept_t*,UINT,const WCHAR*); +HRESULT throw_type_error(script_ctx_t*,jsexcept_t*,UINT,const WCHAR*); +HRESULT throw_uri_error(script_ctx_t*,jsexcept_t*,UINT,const WCHAR*); + HRESULT create_object(script_ctx_t*,DispatchEx*,DispatchEx**); HRESULT create_math(script_ctx_t*,DispatchEx**); @@ -145,7 +161,13 @@ HRESULT create_string(script_ctx_t*,const WCHAR*,DWORD,DispatchEx**); HRESULT create_bool(script_ctx_t*,VARIANT_BOOL,DispatchEx**); HRESULT create_number(script_ctx_t*,VARIANT*,DispatchEx**); -HRESULT to_primitive(script_ctx_t*,VARIANT*,jsexcept_t*,VARIANT*); +typedef enum { + NO_HINT, + HINT_STRING, + HINT_NUMBER +} hint_t; + +HRESULT to_primitive(script_ctx_t*,VARIANT*,jsexcept_t*,VARIANT*, hint_t); HRESULT to_boolean(VARIANT*,VARIANT_BOOL*); HRESULT to_number(script_ctx_t*,VARIANT*,jsexcept_t*,VARIANT*); HRESULT to_integer(script_ctx_t*,VARIANT*,jsexcept_t*,VARIANT*); @@ -179,6 +201,13 @@ struct _script_ctx_t { DispatchEx *array_constr; DispatchEx *bool_constr; DispatchEx *date_constr; + DispatchEx *error_constr; + DispatchEx *eval_error_constr; + DispatchEx *range_error_constr; + DispatchEx *reference_error_constr; + DispatchEx *syntax_error_constr; + DispatchEx *type_error_constr; + DispatchEx *uri_error_constr; DispatchEx *number_constr; DispatchEx *object_constr; DispatchEx *regexp_constr; @@ -193,13 +222,15 @@ static inline void script_addref(script_ctx_t *ctx) } HRESULT init_global(script_ctx_t*); -HRESULT init_function_constr(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_object_constr(script_ctx_t*,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**); diff --git a/reactos/dll/win32/jscript/jscript.rbuild b/reactos/dll/win32/jscript/jscript.rbuild index 80c3d6cbc43..1694b54a850 100644 --- a/reactos/dll/win32/jscript/jscript.rbuild +++ b/reactos/dll/win32/jscript/jscript.rbuild @@ -10,11 +10,13 @@ jsglobal wine kernel32 + user32 oleaut32 advapi32 date.c dispex.c engine.c + error.c jscript.c jscript_main.c jsutils.c diff --git a/reactos/dll/win32/jscript/jscript_De.rc b/reactos/dll/win32/jscript/jscript_De.rc new file mode 100644 index 00000000000..123cf571b02 --- /dev/null +++ b/reactos/dll/win32/jscript/jscript_De.rc @@ -0,0 +1,43 @@ +/* + * Copyright 2009 André Hentschel + * + * 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 + */ + +#include "resource.h" + +#pragma code_page(65001) + +LANGUAGE LANG_GERMAN, SUBLANG_NEUTRAL + +STRINGTABLE DISCARDABLE +{ + IDS_TO_PRIMITIVE "Fehler beim umwandeln des Objektes in einen Grundtyp" + IDS_INVALID_CALL_ARG "Ungültiger Funktionsaufruf oder Argument" + IDS_NO_PROPERTY "Das Objekt unterstützt diese Eigenschaft oder Methode nicht" + IDS_ARG_NOT_OPT "Argument nicht optional" + IDS_SYNTAX_ERROR "Syntax Fehler" + IDS_SEMICOLON "';' erwartet" + IDS_LBRACKET "'(' erwartet" + IDS_RBRACKET "')' erwartet" + IDS_UNTERMINATED_STR "konstante Zeichenkette nicht terminiert" + IDS_NOT_FUNC "Funktion erwartet" + IDS_NOT_DATE "'[Objekt]' ist kein Datums-Objekt" + IDS_NOT_NUM "Nummer erwartet" + IDS_ILLEGAL_ASSIGN "Unzulässige Zuweisung" + IDS_UNDEFINED "'|' nicht definiert" + IDS_NOT_BOOL "Boolisches Objekt erwartet" + IDS_INVALID_LENGTH "Array-Größe muss eine endliche, positive Ganzzahl sein" +} diff --git a/reactos/dll/win32/jscript/jscript_En.rc b/reactos/dll/win32/jscript/jscript_En.rc new file mode 100644 index 00000000000..697c1ab0709 --- /dev/null +++ b/reactos/dll/win32/jscript/jscript_En.rc @@ -0,0 +1,41 @@ +/* + * Copyright 2009 Piotr Caban + * + * 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 + */ + +#include "resource.h" + +LANGUAGE LANG_ENGLISH, SUBLANG_DEFAULT + +STRINGTABLE DISCARDABLE +{ + IDS_TO_PRIMITIVE "Error converting object to primitive type" + IDS_INVALID_CALL_ARG "Invalid procedure call or argument" + IDS_NO_PROPERTY "Object doesn't support this property or method" + IDS_ARG_NOT_OPT "Argument not optional" + IDS_SYNTAX_ERROR "Syntax error" + IDS_SEMICOLON "Expected ';'" + IDS_LBRACKET "Expected '('" + IDS_RBRACKET "Expected ')'" + IDS_UNTERMINATED_STR "Unterminated string constant" + IDS_NOT_FUNC "Function expected" + IDS_NOT_DATE "'[object]' is not a date object" + IDS_NOT_NUM "Number expected" + IDS_ILLEGAL_ASSIGN "Illegal assignment" + IDS_UNDEFINED "'|' is undefined" + IDS_NOT_BOOL "Boolean object expected" + IDS_INVALID_LENGTH "Array length must be a finite positive integer" +} diff --git a/reactos/dll/win32/jscript/jscript_Fr.rc b/reactos/dll/win32/jscript/jscript_Fr.rc new file mode 100644 index 00000000000..4554fb06ff3 --- /dev/null +++ b/reactos/dll/win32/jscript/jscript_Fr.rc @@ -0,0 +1,46 @@ +/* + * French resources for jscript + * + * Copyright 2009 Frédéric Delanoy + * + * 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 + */ + +#include "resource.h" + +/* UTF-8 */ +#pragma code_page(65001) + +LANGUAGE LANG_FRENCH, SUBLANG_NEUTRAL + +STRINGTABLE DISCARDABLE +{ + IDS_TO_PRIMITIVE "Erreur lors de la conversion de l'objet vers un type primitif" + IDS_INVALID_CALL_ARG "Appel de procédure ou argument invalide" + IDS_NO_PROPERTY "Cet objet ne supporte pas cette propriété ou méthode" + IDS_ARG_NOT_OPT "Argument non optionnel" + IDS_SYNTAX_ERROR "Erreur de syntaxe" + IDS_SEMICOLON "« ; » attendu" + IDS_LBRACKET "« ( » attendu" + IDS_RBRACKET "« ) » attendu" + IDS_UNTERMINATED_STR "Constante chaîne de caractères non clôturée" + IDS_NOT_FUNC "Fonction attendue" + IDS_NOT_DATE "« [objet] » n'est pas un objet de type date" + IDS_NOT_NUM "Nombre attendu" + IDS_ILLEGAL_ASSIGN "Affectation illégale" + IDS_UNDEFINED "« | » n'est pas défini" + IDS_NOT_BOOL "Booléen attendu" + IDS_INVALID_LENGTH "La longueur d'un tableau doit être un entier positif" +} diff --git a/reactos/dll/win32/jscript/jscript_Lt.rc b/reactos/dll/win32/jscript/jscript_Lt.rc new file mode 100644 index 00000000000..de0037ee604 --- /dev/null +++ b/reactos/dll/win32/jscript/jscript_Lt.rc @@ -0,0 +1,44 @@ +/* + * Copyright 2009 Aurimas Fišeras + * + * 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 + */ + +#include "resource.h" + +/* UTF-8 */ +#pragma code_page(65001) + +LANGUAGE LANG_LITHUANIAN, SUBLANG_NEUTRAL + +STRINGTABLE DISCARDABLE +{ + IDS_TO_PRIMITIVE "Klaida keičiant objektą į primityvų tipą" + IDS_INVALID_CALL_ARG "Netinkamas kreipinys į procedūrą ar argumentas" + IDS_NO_PROPERTY "Objektas nepalaiko šios savybės ar metodo" + IDS_ARG_NOT_OPT "Argumentas nėra neprivalomas" + IDS_SYNTAX_ERROR "Sintaksės klaida" + IDS_SEMICOLON "Tikėtasi „;“" + IDS_LBRACKET "Tikėtasi „(“" + IDS_RBRACKET "Tikėtasi „)“" + IDS_UNTERMINATED_STR "Nebaigta eilutės konstanta" + IDS_NOT_FUNC "Tikėtasi funkcijos" + IDS_NOT_DATE "„[objektas]“ nėra datos objektas" + IDS_NOT_NUM "Tikėtasi skaičiaus" + IDS_ILLEGAL_ASSIGN "Neleistinas priskyrimas" + IDS_UNDEFINED "„|“ yra neapibrėžtas" + IDS_NOT_BOOL "Tikėtasi loginio objekto" + IDS_INVALID_LENGTH "Masyvo dydis turi būti teigiamas sveikasis skaičius" +} diff --git a/reactos/dll/win32/jscript/jscript_Nl.rc b/reactos/dll/win32/jscript/jscript_Nl.rc new file mode 100644 index 00000000000..71ba6b5517d --- /dev/null +++ b/reactos/dll/win32/jscript/jscript_Nl.rc @@ -0,0 +1,40 @@ +/* + * Copyright 2009 Paul Vriens + * + * 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 + */ + +#include "resource.h" + +LANGUAGE LANG_DUTCH, SUBLANG_NEUTRAL + +STRINGTABLE DISCARDABLE +{ + IDS_TO_PRIMITIVE "Fout bij het omzetten van het object naar een primitief type" + IDS_INVALID_CALL_ARG "Ongeldige procedure-aanroep of argument" + IDS_NO_PROPERTY "Dit object ondersteunt deze eigenschap of methode niet" + IDS_ARG_NOT_OPT "Argument is niet optioneel" + IDS_SYNTAX_ERROR "Syntax fout" + IDS_SEMICOLON "';' verwacht" + IDS_LBRACKET "'(' verwacht" + IDS_RBRACKET "')' verwacht" + IDS_NOT_FUNC "Functie verwacht" + IDS_NOT_DATE "'[object]' is geen datum object" + IDS_NOT_NUM "Getal verwacht" + IDS_ILLEGAL_ASSIGN "Ongeldige toekenning" + IDS_UNDEFINED "'|' is ongedefinieerd" + IDS_NOT_BOOL "Boolean object verwacht" + IDS_INVALID_LENGTH "Array lengte moet een eindig, positief geheel getal zijn" +} diff --git a/reactos/dll/win32/jscript/jscript_Pt.rc b/reactos/dll/win32/jscript/jscript_Pt.rc new file mode 100644 index 00000000000..87a791454a8 --- /dev/null +++ b/reactos/dll/win32/jscript/jscript_Pt.rc @@ -0,0 +1,42 @@ +/* + * Copyright 2009 Ricardo Filipe + * + * 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 + */ + +#include "resource.h" + +#pragma code_page(65001) + +LANGUAGE LANG_PORTUGUESE, SUBLANG_PORTUGUESE + +STRINGTABLE DISCARDABLE +{ + IDS_TO_PRIMITIVE "Erro ao converter objecto em tipo primitivo" + IDS_INVALID_CALL_ARG "Argumento ou chamada de procedimento inválida" + IDS_NO_PROPERTY "O objecto não suporta esta propriedade ou método" + IDS_ARG_NOT_OPT "Argumento não opcional" + IDS_SYNTAX_ERROR "Erro de sintaxe" + IDS_SEMICOLON "';' esperado" + IDS_LBRACKET "'(' esperado" + IDS_RBRACKET "')' esperado" + IDS_NOT_FUNC "Função esperada" + IDS_NOT_DATE "'[object]' não é um objecto de data" + IDS_NOT_NUM "Número esperado" + IDS_ILLEGAL_ASSIGN "Atribuição ilegal" + IDS_UNDEFINED "'|' é indefinido" + IDS_NOT_BOOL "Objecto boleano esperado" + IDS_INVALID_LENGTH "Tamanho do vector tem de ser um inteiro finito positivo" +} diff --git a/reactos/dll/win32/jscript/jscript_main.c b/reactos/dll/win32/jscript/jscript_main.c index 37266e5773c..4f59ecbc11a 100644 --- a/reactos/dll/win32/jscript/jscript_main.c +++ b/reactos/dll/win32/jscript/jscript_main.c @@ -40,7 +40,7 @@ static const CLSID CLSID_JScriptEncode = DEFINE_GUID(GUID_NULL,0,0,0,0,0,0,0,0,0,0,0); -static HINSTANCE jscript_hinstance; +HINSTANCE jscript_hinstance; static HRESULT WINAPI ClassFactory_QueryInterface(IClassFactory *iface, REFIID riid, void **ppv) { diff --git a/reactos/dll/win32/jscript/jsutils.c b/reactos/dll/win32/jscript/jsutils.c index 73bac94d7e8..10d4f51b074 100644 --- a/reactos/dll/win32/jscript/jsutils.c +++ b/reactos/dll/win32/jscript/jsutils.c @@ -175,7 +175,7 @@ jsheap_t *jsheap_mark(jsheap_t *heap) } /* ECMA-262 3rd Edition 9.1 */ -HRESULT to_primitive(script_ctx_t *ctx, VARIANT *v, jsexcept_t *ei, VARIANT *ret) +HRESULT to_primitive(script_ctx_t *ctx, VARIANT *v, jsexcept_t *ei, VARIANT *ret, hint_t hint) { switch(V_VT(v)) { case VT_EMPTY: @@ -189,8 +189,61 @@ HRESULT to_primitive(script_ctx_t *ctx, VARIANT *v, jsexcept_t *ei, VARIANT *ret V_VT(ret) = VT_BSTR; V_BSTR(ret) = SysAllocString(V_BSTR(v)); break; - case VT_DISPATCH: - return disp_propget(V_DISPATCH(v), DISPID_VALUE, ctx->lcid, ret, ei, NULL /*FIXME*/); + case VT_DISPATCH: { + DispatchEx *jsdisp; + DISPID id; + DISPPARAMS dp = {NULL, NULL, 0, 0}; + HRESULT hres; + + static const WCHAR toStringW[] = {'t','o','S','t','r','i','n','g',0}; + static const WCHAR valueOfW[] = {'v','a','l','u','e','O','f',0}; + + jsdisp = iface_to_jsdisp((IUnknown*)V_DISPATCH(v)); + if(!jsdisp) + return disp_propget(V_DISPATCH(v), DISPID_VALUE, ctx->lcid, ret, ei, NULL /*FIXME*/); + + if(hint == NO_HINT) + hint = is_class(jsdisp, JSCLASS_DATE) ? HINT_STRING : HINT_NUMBER; + + /* Native implementation doesn't throw TypeErrors, returns strange values */ + + hres = jsdisp_get_id(jsdisp, hint == HINT_STRING ? toStringW : valueOfW, 0, &id); + if(SUCCEEDED(hres)) { + hres = jsdisp_call(jsdisp, id, ctx->lcid, DISPATCH_METHOD, &dp, ret, ei, NULL /*FIXME*/); + if(FAILED(hres)) { + WARN("call error - forwarding exception\n"); + jsdisp_release(jsdisp); + return hres; + } + else if(V_VT(ret) != VT_DISPATCH) { + jsdisp_release(jsdisp); + return S_OK; + } + else + IDispatch_Release(V_DISPATCH(ret)); + } + + hres = jsdisp_get_id(jsdisp, hint == HINT_STRING ? valueOfW : toStringW, 0, &id); + if(SUCCEEDED(hres)) { + hres = jsdisp_call(jsdisp, id, ctx->lcid, DISPATCH_METHOD, &dp, ret, ei, NULL /*FIXME*/); + if(FAILED(hres)) { + WARN("call error - forwarding exception\n"); + jsdisp_release(jsdisp); + return hres; + } + else if(V_VT(ret) != VT_DISPATCH) { + jsdisp_release(jsdisp); + return S_OK; + } + else + IDispatch_Release(V_DISPATCH(ret)); + } + + jsdisp_release(jsdisp); + + WARN("failed\n"); + return throw_type_error(ctx, ei, IDS_TO_PRIMITIVE, NULL); + } default: FIXME("Unimplemented for vt %d\n", V_VT(v)); return E_NOTIMPL; @@ -211,7 +264,8 @@ HRESULT to_boolean(VARIANT *v, VARIANT_BOOL *b) *b = V_I4(v) ? VARIANT_TRUE : VARIANT_FALSE; break; case VT_R8: - *b = V_R8(v) ? VARIANT_TRUE : VARIANT_FALSE; + if(isnan(V_R8(v))) *b = VARIANT_FALSE; + else *b = V_R8(v) ? VARIANT_TRUE : VARIANT_FALSE; break; case VT_BSTR: *b = V_BSTR(v) && *V_BSTR(v) ? VARIANT_TRUE : VARIANT_FALSE; @@ -355,7 +409,7 @@ HRESULT to_number(script_ctx_t *ctx, VARIANT *v, jsexcept_t *ei, VARIANT *ret) VARIANT prim; HRESULT hres; - hres = to_primitive(ctx, v, ei, &prim); + hres = to_primitive(ctx, v, ei, &prim, HINT_NUMBER); if(FAILED(hres)) return hres; @@ -458,6 +512,8 @@ HRESULT to_string(script_ctx_t *ctx, VARIANT *v, jsexcept_t *ei, BSTR *str) const WCHAR nullW[] = {'n','u','l','l',0}; const WCHAR trueW[] = {'t','r','u','e',0}; const WCHAR falseW[] = {'f','a','l','s','e',0}; + const WCHAR NaNW[] = {'N','a','N',0}; + const WCHAR InfinityW[] = {'-','I','n','f','i','n','i','t','y',0}; switch(V_VT(v)) { case VT_EMPTY: @@ -470,16 +526,23 @@ HRESULT to_string(script_ctx_t *ctx, VARIANT *v, jsexcept_t *ei, BSTR *str) *str = int_to_bstr(V_I4(v)); break; case VT_R8: { - VARIANT strv; - HRESULT hres; + if(isnan(V_R8(v))) + *str = SysAllocString(NaNW); + else if(isinf(V_R8(v))) + *str = SysAllocString(V_R8(v)<0 ? InfinityW : InfinityW+1); + else { + VARIANT strv; + HRESULT hres; - V_VT(&strv) = VT_EMPTY; - hres = VariantChangeTypeEx(&strv, v, MAKELCID(MAKELANGID(LANG_ENGLISH,SUBLANG_ENGLISH_US),SORT_DEFAULT), 0, VT_BSTR); - if(FAILED(hres)) - return hres; + V_VT(&strv) = VT_EMPTY; + hres = VariantChangeTypeEx(&strv, v, MAKELCID(MAKELANGID(LANG_ENGLISH,SUBLANG_ENGLISH_US),SORT_DEFAULT), 0, VT_BSTR); + if(FAILED(hres)) + return hres; - *str = V_BSTR(&strv); - return S_OK; + *str = V_BSTR(&strv); + return S_OK; + } + break; } case VT_BSTR: *str = SysAllocString(V_BSTR(v)); @@ -488,7 +551,7 @@ HRESULT to_string(script_ctx_t *ctx, VARIANT *v, jsexcept_t *ei, BSTR *str) VARIANT prim; HRESULT hres; - hres = to_primitive(ctx, v, ei, &prim); + hres = to_primitive(ctx, v, ei, &prim, HINT_STRING); if(FAILED(hres)) return hres; diff --git a/reactos/dll/win32/jscript/lex.c b/reactos/dll/win32/jscript/lex.c index 5b7e7a4249b..eb9b83536be 100644 --- a/reactos/dll/win32/jscript/lex.c +++ b/reactos/dll/win32/jscript/lex.c @@ -100,7 +100,8 @@ static const struct { static int lex_error(parser_ctx_t *ctx, HRESULT hres) { - ctx->hres = hres; + ctx->hres = JSCRIPT_ERROR|hres; + ctx->lexer_error = TRUE; return -1; } @@ -342,10 +343,8 @@ static int parse_string_literal(parser_ctx_t *ctx, const WCHAR **ret, WCHAR endc ctx->ptr++; } - if(ctx->ptr == ctx->end) { - WARN("unexpected end of file\n"); - return lex_error(ctx, E_FAIL); - } + if(ctx->ptr == ctx->end) + return lex_error(ctx, IDS_UNTERMINATED_STR); len = ctx->ptr-ptr; diff --git a/reactos/dll/win32/jscript/math.c b/reactos/dll/win32/jscript/math.c index 9d609e5d8c0..b172ffdf72d 100644 --- a/reactos/dll/win32/jscript/math.c +++ b/reactos/dll/win32/jscript/math.c @@ -1,5 +1,6 @@ /* * Copyright 2008 Jacek Caban for CodeWeavers + * Copyright 2009 Piotr Caban * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public diff --git a/reactos/dll/win32/jscript/number.c b/reactos/dll/win32/jscript/number.c index d6591d06317..0aeeab6386a 100644 --- a/reactos/dll/win32/jscript/number.c +++ b/reactos/dll/win32/jscript/number.c @@ -16,6 +16,8 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +#include + #include "jscript.h" #include "wine/debug.h" @@ -39,31 +41,126 @@ 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 */ static HRESULT Number_toString(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp) { NumberInstance *number; + INT radix = 10; + DOUBLE val; BSTR str; HRESULT hres; TRACE("\n"); - if(!is_class(dispex, JSCLASS_NUMBER)) { - FIXME("throw TypeError\n"); - return E_FAIL; - } + if(!is_class(dispex, JSCLASS_NUMBER)) + return throw_type_error(dispex->ctx, ei, IDS_NOT_NUM, NULL); number = (NumberInstance*)dispex; - if(arg_cnt(dp) != 0) { - FIXME("unsupported args\n"); - return E_NOTIMPL; + if(arg_cnt(dp)) { + hres = to_int32(dispex->ctx, get_arg(dp, 0), ei, &radix); + if(FAILED(hres)) + return hres; + + if(radix<2 || radix>36) + return throw_type_error(dispex->ctx, ei, IDS_INVALID_CALL_ARG, NULL); } - hres = to_string(dispex->ctx, &number->num, ei, &str); - if(FAILED(hres)) - return hres; + if(V_VT(&number->num) == VT_I4) + val = V_I4(&number->num); + else + val = V_R8(&number->num); + + if(radix==10 || isnan(val) || isinf(val)) { + hres = to_string(dispex->ctx, &number->num, ei, &str); + if(FAILED(hres)) + return hres; + } + else { + INT idx = 0; + DOUBLE integ, frac, log_radix = 0; + WCHAR buf[NUMBER_TOSTRING_BUF_SIZE+16]; + BOOL exp = FALSE; + + if(val<0) { + val = -val; + buf[idx++] = '-'; + } + + while(1) { + integ = floor(val); + frac = val-integ; + + if(integ == 0) + buf[idx++] = '0'; + while(integ>=1 && idx beg) { + wch = buf[beg]; + buf[beg++] = buf[end]; + buf[end--] = wch; + } + } + + if(idx != NUMBER_TOSTRING_BUF_SIZE) buf[idx++] = '.'; + + while(frac>0 && idxctx, ei, IDS_NOT_NUM, NULL); if(retv) { NumberInstance *number = (NumberInstance*)dispex; @@ -146,6 +241,8 @@ static HRESULT Number_value(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAM NumberInstance *number = (NumberInstance*)dispex; switch(flags) { + case INVOKE_FUNC: + return throw_type_error(dispex->ctx, ei, IDS_NOT_FUNC, NULL); case DISPATCH_PROPERTYGET: *retv = number->num; break; diff --git a/reactos/dll/win32/jscript/object.c b/reactos/dll/win32/jscript/object.c index 9474bc4f8bc..737230ada85 100644 --- a/reactos/dll/win32/jscript/object.c +++ b/reactos/dll/win32/jscript/object.c @@ -35,22 +35,62 @@ static const WCHAR default_valueW[] = {'[','o','b','j','e','c','t',' ','O','b',' static HRESULT Object_toString(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp) { - FIXME("\n"); - return E_NOTIMPL; + static const WCHAR formatW[] = {'[','o','b','j','e','c','t',' ','%','s',']',0}; + + static const WCHAR arrayW[] = {'A','r','r','a','y',0}; + static const WCHAR booleanW[] = {'B','o','o','l','e','a','n',0}; + static const WCHAR dateW[] = {'D','a','t','e',0}; + static const WCHAR errorW[] = {'E','r','r','o','r',0}; + static const WCHAR functionW[] = {'F','u','n','c','t','i','o','n',0}; + static const WCHAR mathW[] = {'M','a','t','h',0}; + static const WCHAR numberW[] = {'N','u','m','b','e','r',0}; + static const WCHAR objectW[] = {'O','b','j','e','c','t',0}; + static const WCHAR regexpW[] = {'R','e','g','E','x','p',0}; + static const WCHAR stringW[] = {'S','t','r','i','n','g',0}; + /* Keep in sync with jsclass_t enum */ + static const WCHAR *names[] = {NULL, arrayW, booleanW, dateW, errorW, + functionW, NULL, mathW, numberW, objectW, regexpW, stringW}; + + TRACE("\n"); + + if(names[dispex->builtin_info->class] == NULL) { + ERR("dispex->builtin_info->class = %d\n", + dispex->builtin_info->class); + return E_FAIL; + } + + if(retv) { + V_VT(retv) = VT_BSTR; + V_BSTR(retv) = SysAllocStringLen(NULL, 9+strlenW(names[dispex->builtin_info->class])); + if(!V_BSTR(retv)) + return E_OUTOFMEMORY; + + sprintfW(V_BSTR(retv), formatW, names[dispex->builtin_info->class]); + } + + return S_OK; } static HRESULT Object_toLocaleString(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp) { - FIXME("\n"); - return E_NOTIMPL; + TRACE("\n"); + return Object_toString(dispex, lcid, flags, dp, retv, ei, sp); } static HRESULT Object_valueOf(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp) { - FIXME("\n"); - return E_NOTIMPL; + TRACE("\n"); + + if(retv) { + IDispatchEx_AddRef(_IDispatchEx_(dispex)); + + V_VT(retv) = VT_DISPATCH; + V_DISPATCH(retv) = (IDispatch*)_IDispatchEx_(dispex); + } + + return S_OK; } static HRESULT Object_hasOwnProperty(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, @@ -80,6 +120,8 @@ static HRESULT Object_value(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAM TRACE("\n"); switch(flags) { + case INVOKE_FUNC: + return throw_type_error(dispex->ctx, ei, IDS_NOT_FUNC, NULL); case DISPATCH_PROPERTYGET: V_VT(retv) = VT_BSTR; V_BSTR(retv) = SysAllocString(default_valueW); @@ -145,19 +187,15 @@ static HRESULT ObjectConstr_value(DispatchEx *dispex, LCID lcid, WORD flags, DIS return S_OK; } -HRESULT create_object_constr(script_ctx_t *ctx, DispatchEx **ret) +HRESULT create_object_constr(script_ctx_t *ctx, DispatchEx *object_prototype, DispatchEx **ret) { - DispatchEx *object; - HRESULT hres; + return create_builtin_function(ctx, ObjectConstr_value, NULL, PROPF_CONSTR, + object_prototype, ret); +} - hres = create_dispex(ctx, &Object_info, NULL, &object); - if(FAILED(hres)) - return hres; - - hres = create_builtin_function(ctx, ObjectConstr_value, NULL, PROPF_CONSTR, object, ret); - - jsdisp_release(object); - return hres; +HRESULT create_object_prototype(script_ctx_t *ctx, DispatchEx **ret) +{ + return create_dispex(ctx, &Object_info, NULL, ret); } HRESULT create_object(script_ctx_t *ctx, DispatchEx *constr, DispatchEx **ret) diff --git a/reactos/dll/win32/jscript/parser.tab.c b/reactos/dll/win32/jscript/parser.tab.c index 0f1cf085a48..8334a0c3d29 100644 --- a/reactos/dll/win32/jscript/parser.tab.c +++ b/reactos/dll/win32/jscript/parser.tab.c @@ -86,6 +86,8 @@ #define YYPARSE_PARAM ctx static int parser_error(const char*); +static void set_error(parser_ctx_t*,UINT); +static BOOL explicit_error(parser_ctx_t*,void*,WCHAR); static BOOL allow_auto_semicolon(parser_ctx_t*); static void program_parsed(parser_ctx_t*,source_elements_t*); static source_elements_t *function_body_parsed(parser_ctx_t*,source_elements_t*); @@ -205,7 +207,7 @@ static source_elements_t *source_elements_add_statement(source_elements_t*,state /* Line 189 of yacc.c */ -#line 209 "parser.tab.c" +#line 211 "parser.tab.c" /* Enabling traces. */ #ifndef YYDEBUG @@ -284,7 +286,7 @@ typedef union YYSTYPE { /* Line 214 of yacc.c */ -#line 149 "parser.y" +#line 151 "parser.y" int ival; const WCHAR *srcptr; @@ -308,7 +310,7 @@ typedef union YYSTYPE /* Line 214 of yacc.c */ -#line 312 "parser.tab.c" +#line 314 "parser.tab.c" } YYSTYPE; # define YYSTYPE_IS_TRIVIAL 1 # define yystype YYSTYPE /* obsolescent; will be withdrawn */ @@ -320,7 +322,7 @@ typedef union YYSTYPE /* Line 264 of yacc.c */ -#line 324 "parser.tab.c" +#line 326 "parser.tab.c" #ifdef short # undef short @@ -535,16 +537,16 @@ union yyalloc /* YYFINAL -- State number of the termination state. */ #define YYFINAL 3 /* YYLAST -- Last index in YYTABLE. */ -#define YYLAST 891 +#define YYLAST 942 /* YYNTOKENS -- Number of terminals. */ #define YYNTOKENS 67 /* YYNNTS -- Number of nonterminals. */ -#define YYNNTS 86 +#define YYNNTS 94 /* YYNRULES -- Number of rules. */ -#define YYNRULES 199 +#define YYNRULES 211 /* YYNRULES -- Number of states. */ -#define YYNSTATES 358 +#define YYNSTATES 370 /* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */ #define YYUNDEFTOK 2 @@ -559,16 +561,16 @@ static const yytype_uint8 yytranslate[] = 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 63, 2, 2, 2, 61, 56, 2, - 46, 47, 59, 57, 49, 58, 66, 60, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 52, 51, - 2, 50, 2, 53, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 61, 2, 2, 2, 59, 54, 2, + 65, 66, 57, 55, 47, 56, 64, 58, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 50, 49, + 2, 48, 2, 51, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 64, 2, 65, 55, 2, 2, 2, 2, 2, + 2, 62, 2, 63, 53, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 48, 54, 37, 62, 2, 2, 2, + 2, 2, 2, 46, 52, 37, 60, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, @@ -598,114 +600,121 @@ static const yytype_uint16 yyprhs[] = 47, 49, 51, 53, 55, 57, 59, 61, 63, 65, 68, 69, 71, 75, 78, 82, 84, 88, 90, 94, 97, 100, 101, 103, 106, 107, 109, 112, 114, 117, - 125, 131, 139, 145, 155, 166, 174, 183, 187, 191, - 195, 201, 205, 211, 215, 221, 222, 224, 226, 229, - 234, 238, 242, 246, 250, 255, 261, 264, 265, 267, - 269, 273, 274, 276, 278, 282, 284, 288, 292, 294, - 298, 302, 304, 310, 312, 318, 320, 324, 326, 330, - 332, 336, 338, 342, 344, 348, 350, 354, 356, 360, - 362, 366, 368, 372, 374, 378, 380, 384, 386, 390, - 392, 396, 400, 404, 406, 410, 414, 416, 420, 422, - 426, 430, 432, 436, 440, 444, 446, 449, 452, 455, - 458, 461, 464, 467, 470, 473, 475, 478, 481, 483, - 485, 487, 490, 492, 494, 499, 503, 507, 510, 513, - 518, 522, 525, 529, 531, 535, 537, 539, 541, 543, - 545, 549, 552, 556, 560, 566, 569, 574, 576, 579, - 580, 582, 585, 589, 593, 599, 601, 603, 605, 606, - 608, 610, 612, 614, 616, 618, 620, 622, 624, 626 + 125, 131, 139, 145, 146, 147, 159, 160, 161, 174, + 182, 191, 195, 199, 203, 209, 213, 219, 223, 229, + 230, 232, 234, 237, 242, 246, 250, 254, 258, 263, + 269, 272, 273, 275, 277, 279, 281, 285, 286, 288, + 290, 294, 296, 300, 304, 306, 310, 314, 316, 322, + 324, 330, 332, 336, 338, 342, 344, 348, 350, 354, + 356, 360, 362, 366, 368, 372, 374, 378, 380, 384, + 386, 390, 392, 396, 398, 402, 404, 408, 412, 416, + 418, 422, 426, 428, 432, 434, 438, 442, 444, 448, + 452, 456, 458, 461, 464, 467, 470, 473, 476, 479, + 482, 485, 487, 490, 493, 495, 497, 499, 502, 504, + 506, 511, 515, 519, 522, 525, 530, 534, 537, 541, + 543, 547, 549, 551, 553, 555, 557, 561, 564, 568, + 572, 578, 581, 586, 588, 591, 592, 594, 597, 601, + 605, 611, 613, 615, 617, 618, 620, 622, 624, 626, + 628, 630, 632, 634, 636, 638, 640, 642, 644, 646, + 648, 650 }; /* YYRHS -- A `-1'-separated list of the rules' RHS. */ static const yytype_int16 yyrhs[] = { 68, 0, -1, 70, 69, -1, 35, -1, -1, -1, - 70, 76, -1, 72, 149, 46, 75, 47, 48, 73, - 37, -1, 36, -1, 70, -1, 38, -1, 74, 49, + 70, 76, -1, 72, 154, 158, 75, 159, 46, 73, + 37, -1, 36, -1, 70, -1, 38, -1, 74, 47, 38, -1, -1, 74, -1, 79, -1, 80, -1, 89, - -1, 90, -1, 91, -1, 92, -1, 93, -1, 94, - -1, 95, -1, 96, -1, 97, -1, 98, -1, 104, - -1, 105, -1, 76, -1, 77, 76, -1, -1, 77, - -1, 48, 77, 37, -1, 48, 37, -1, 27, 81, - 152, -1, 83, -1, 81, 49, 83, -1, 84, -1, - 82, 49, 84, -1, 38, 85, -1, 38, 87, -1, - -1, 86, -1, 50, 112, -1, -1, 88, -1, 50, - 113, -1, 51, -1, 109, 152, -1, 11, 46, 109, - 47, 76, 10, 76, -1, 11, 46, 109, 47, 76, - -1, 9, 76, 29, 46, 109, 47, 51, -1, 29, - 46, 109, 47, 76, -1, 13, 46, 110, 51, 108, - 51, 108, 47, 76, -1, 13, 46, 27, 82, 51, - 108, 51, 108, 47, 76, -1, 13, 46, 135, 14, - 109, 47, 76, -1, 13, 46, 27, 84, 14, 109, - 47, 76, -1, 6, 149, 152, -1, 3, 149, 152, - -1, 19, 108, 152, -1, 30, 46, 109, 47, 76, - -1, 38, 52, 76, -1, 20, 46, 109, 47, 99, - -1, 48, 100, 37, -1, 48, 100, 103, 100, 37, - -1, -1, 101, -1, 102, -1, 101, 102, -1, 4, - 109, 52, 78, -1, 7, 52, 78, -1, 22, 109, - 152, -1, 25, 79, 106, -1, 25, 79, 107, -1, - 25, 79, 106, 107, -1, 5, 46, 38, 47, 79, - -1, 12, 79, -1, -1, 109, -1, 112, -1, 109, - 49, 112, -1, -1, 111, -1, 113, -1, 111, 49, - 113, -1, 114, -1, 135, 50, 112, -1, 135, 39, - 112, -1, 115, -1, 135, 50, 113, -1, 135, 39, - 113, -1, 116, -1, 116, 53, 112, 52, 112, -1, - 117, -1, 117, 53, 113, 52, 113, -1, 118, -1, - 116, 32, 118, -1, 119, -1, 117, 32, 119, -1, - 120, -1, 118, 31, 120, -1, 121, -1, 119, 31, - 121, -1, 122, -1, 120, 54, 122, -1, 123, -1, - 121, 54, 123, -1, 124, -1, 122, 55, 124, -1, - 125, -1, 123, 55, 125, -1, 126, -1, 124, 56, - 126, -1, 127, -1, 125, 56, 127, -1, 128, -1, - 126, 40, 128, -1, 129, -1, 127, 40, 129, -1, - 130, -1, 128, 42, 130, -1, 128, 15, 130, -1, - 128, 14, 130, -1, 130, -1, 129, 42, 130, -1, - 129, 15, 130, -1, 131, -1, 130, 41, 131, -1, - 132, -1, 131, 57, 132, -1, 131, 58, 132, -1, - 133, -1, 132, 59, 133, -1, 132, 60, 133, -1, - 132, 61, 133, -1, 134, -1, 8, 133, -1, 28, - 133, -1, 26, 133, -1, 33, 133, -1, 34, 133, - -1, 57, 133, -1, 58, 133, -1, 62, 133, -1, - 63, 133, -1, 135, -1, 135, 33, -1, 135, 34, - -1, 136, -1, 138, -1, 137, -1, 16, 136, -1, - 141, -1, 71, -1, 137, 64, 109, 65, -1, 137, - 66, 38, -1, 16, 137, 139, -1, 137, 139, -1, - 138, 139, -1, 138, 64, 109, 65, -1, 138, 66, - 38, -1, 46, 47, -1, 46, 140, 47, -1, 112, - -1, 140, 49, 112, -1, 21, -1, 38, -1, 150, - -1, 142, -1, 146, -1, 46, 109, 47, -1, 64, - 65, -1, 64, 144, 65, -1, 64, 143, 65, -1, - 64, 143, 49, 145, 65, -1, 145, 112, -1, 143, - 49, 145, 112, -1, 49, -1, 144, 49, -1, -1, - 144, -1, 48, 37, -1, 48, 147, 37, -1, 148, - 52, 112, -1, 147, 49, 148, 52, 112, -1, 38, - -1, 44, -1, 43, -1, -1, 38, -1, 17, -1, - 18, -1, 151, -1, 43, -1, 44, -1, 60, -1, - 23, -1, 24, -1, 51, -1, 1, -1 + -1, 90, -1, 91, -1, 92, -1, 97, -1, 98, + -1, 99, -1, 100, -1, 101, -1, 102, -1, 108, + -1, 109, -1, 76, -1, 77, 76, -1, -1, 77, + -1, 46, 77, 37, -1, 46, 37, -1, 27, 81, + 157, -1, 83, -1, 81, 47, 83, -1, 84, -1, + 82, 47, 84, -1, 38, 85, -1, 38, 87, -1, + -1, 86, -1, 48, 117, -1, -1, 88, -1, 48, + 118, -1, 49, -1, 114, 157, -1, 11, 158, 113, + 159, 76, 10, 76, -1, 11, 158, 113, 159, 76, + -1, 9, 76, 29, 158, 113, 159, 157, -1, 29, + 158, 113, 159, 76, -1, -1, -1, 13, 158, 115, + 93, 160, 112, 94, 160, 112, 159, 76, -1, -1, + -1, 13, 158, 27, 82, 95, 160, 112, 96, 160, + 112, 159, 76, -1, 13, 158, 140, 14, 113, 159, + 76, -1, 13, 158, 27, 84, 14, 113, 159, 76, + -1, 6, 154, 157, -1, 3, 154, 157, -1, 19, + 112, 157, -1, 30, 158, 114, 159, 76, -1, 38, + 50, 76, -1, 20, 158, 114, 159, 103, -1, 46, + 104, 37, -1, 46, 104, 107, 104, 37, -1, -1, + 105, -1, 106, -1, 105, 106, -1, 4, 114, 50, + 78, -1, 7, 50, 78, -1, 22, 114, 157, -1, + 25, 79, 110, -1, 25, 79, 111, -1, 25, 79, + 110, 111, -1, 5, 158, 38, 159, 79, -1, 12, + 79, -1, -1, 114, -1, 114, -1, 1, -1, 117, + -1, 114, 47, 117, -1, -1, 116, -1, 118, -1, + 116, 47, 118, -1, 119, -1, 140, 48, 117, -1, + 140, 39, 117, -1, 120, -1, 140, 48, 118, -1, + 140, 39, 118, -1, 121, -1, 121, 51, 117, 50, + 117, -1, 122, -1, 122, 51, 118, 50, 118, -1, + 123, -1, 121, 32, 123, -1, 124, -1, 122, 32, + 124, -1, 125, -1, 123, 31, 125, -1, 126, -1, + 124, 31, 126, -1, 127, -1, 125, 52, 127, -1, + 128, -1, 126, 52, 128, -1, 129, -1, 127, 53, + 129, -1, 130, -1, 128, 53, 130, -1, 131, -1, + 129, 54, 131, -1, 132, -1, 130, 54, 132, -1, + 133, -1, 131, 40, 133, -1, 134, -1, 132, 40, + 134, -1, 135, -1, 133, 42, 135, -1, 133, 15, + 135, -1, 133, 14, 135, -1, 135, -1, 134, 42, + 135, -1, 134, 15, 135, -1, 136, -1, 135, 41, + 136, -1, 137, -1, 136, 55, 137, -1, 136, 56, + 137, -1, 138, -1, 137, 57, 138, -1, 137, 58, + 138, -1, 137, 59, 138, -1, 139, -1, 8, 138, + -1, 28, 138, -1, 26, 138, -1, 33, 138, -1, + 34, 138, -1, 55, 138, -1, 56, 138, -1, 60, + 138, -1, 61, 138, -1, 140, -1, 140, 33, -1, + 140, 34, -1, 141, -1, 143, -1, 142, -1, 16, + 141, -1, 146, -1, 71, -1, 142, 62, 114, 63, + -1, 142, 64, 38, -1, 16, 142, 144, -1, 142, + 144, -1, 143, 144, -1, 143, 62, 114, 63, -1, + 143, 64, 38, -1, 65, 66, -1, 65, 145, 66, + -1, 117, -1, 145, 47, 117, -1, 21, -1, 38, + -1, 155, -1, 147, -1, 151, -1, 65, 114, 66, + -1, 62, 63, -1, 62, 149, 63, -1, 62, 148, + 63, -1, 62, 148, 47, 150, 63, -1, 150, 117, + -1, 148, 47, 150, 117, -1, 47, -1, 149, 47, + -1, -1, 149, -1, 46, 37, -1, 46, 152, 37, + -1, 153, 50, 117, -1, 152, 47, 153, 50, 117, + -1, 38, -1, 44, -1, 43, -1, -1, 38, -1, + 17, -1, 18, -1, 156, -1, 43, -1, 44, -1, + 58, -1, 23, -1, 24, -1, 49, -1, 1, -1, + 65, -1, 1, -1, 66, -1, 1, -1, 49, -1, + 1, -1 }; /* YYRLINE[YYN] -- source line where rule number YYN was defined. */ static const yytype_uint16 yyrline[] = { - 0, 254, 254, 258, 259, 263, 264, 269, 273, 277, - 281, 282, 287, 288, 292, 293, 294, 295, 296, 297, - 298, 299, 300, 301, 302, 303, 304, 305, 309, 310, - 315, 316, 320, 321, 325, 330, 331, 336, 338, 343, - 348, 353, 354, 358, 363, 364, 368, 373, 377, 382, - 384, 389, 391, 393, 395, 397, 399, 404, 409, 414, - 419, 424, 429, 434, 436, 441, 442, 446, 447, 452, - 457, 462, 467, 468, 469, 474, 479, 483, 484, 488, - 489, 494, 495, 499, 501, 506, 507, 509, 514, 516, - 518, 523, 524, 529, 531, 536, 537, 542, 544, 549, - 550, 555, 557, 562, 563, 568, 570, 575, 576, 581, - 583, 588, 589, 594, 596, 601, 602, 607, 608, 613, - 614, 616, 618, 623, 624, 626, 631, 632, 637, 639, - 641, 646, 647, 649, 651, 656, 657, 659, 660, 662, - 663, 664, 665, 666, 667, 671, 673, 675, 681, 682, - 686, 687, 691, 692, 693, 695, 697, 702, 704, 706, - 708, 713, 714, 718, 719, 724, 725, 726, 727, 728, - 729, 733, 734, 735, 736, 741, 743, 748, 749, 753, - 754, 758, 759, 764, 766, 771, 772, 773, 777, 778, - 782, 783, 784, 785, 786, 787, 792, 793, 796, 797 + 0, 256, 256, 260, 261, 265, 266, 271, 275, 279, + 283, 284, 289, 290, 294, 295, 296, 297, 298, 299, + 300, 301, 302, 303, 304, 305, 306, 307, 311, 312, + 317, 318, 322, 323, 327, 332, 333, 338, 340, 345, + 350, 355, 356, 360, 365, 366, 370, 375, 379, 384, + 386, 391, 393, 396, 398, 395, 402, 404, 401, 407, + 409, 414, 419, 424, 429, 434, 439, 444, 446, 451, + 452, 456, 457, 462, 467, 472, 477, 478, 479, 484, + 489, 493, 494, 497, 498, 502, 503, 508, 509, 513, + 515, 520, 521, 523, 528, 530, 532, 537, 538, 543, + 545, 550, 551, 556, 558, 563, 564, 569, 571, 576, + 577, 582, 584, 589, 590, 595, 597, 602, 603, 608, + 610, 615, 616, 621, 622, 627, 628, 630, 632, 637, + 638, 640, 645, 646, 651, 653, 655, 660, 661, 663, + 665, 670, 671, 673, 674, 676, 677, 678, 679, 680, + 681, 685, 687, 689, 695, 696, 700, 701, 705, 706, + 707, 709, 711, 716, 718, 720, 722, 727, 728, 732, + 733, 738, 739, 740, 741, 742, 743, 747, 748, 749, + 750, 755, 757, 762, 763, 767, 768, 772, 773, 778, + 780, 785, 786, 787, 791, 792, 796, 797, 798, 799, + 800, 801, 806, 807, 810, 811, 814, 815, 818, 819, + 822, 823 }; #endif @@ -721,9 +730,9 @@ static const char *const yytname[] = "kWHILE", "kWITH", "tANDAND", "tOROR", "tINC", "tDEC", "tHTMLCOMMENT", "kFUNCTION", "'}'", "tIdentifier", "tAssignOper", "tEqOper", "tShiftOper", "tRelOper", "tNumericLiteral", "tStringLiteral", - "LOWER_THAN_ELSE", "'('", "')'", "'{'", "','", "'='", "';'", "':'", - "'?'", "'|'", "'^'", "'&'", "'+'", "'-'", "'*'", "'/'", "'%'", "'~'", - "'!'", "'['", "']'", "'.'", "$accept", "Program", "HtmlComment", + "LOWER_THAN_ELSE", "'{'", "','", "'='", "';'", "':'", "'?'", "'|'", + "'^'", "'&'", "'+'", "'-'", "'*'", "'/'", "'%'", "'~'", "'!'", "'['", + "']'", "'.'", "'('", "')'", "$accept", "Program", "HtmlComment", "SourceElements", "FunctionExpression", "KFunction", "FunctionBody", "FormalParameterList", "FormalParameterList_opt", "Statement", "StatementList", "StatementList_opt", "Block", "VariableStatement", @@ -731,12 +740,13 @@ static const char *const yytname[] = "VariableDeclaration", "VariableDeclarationNoIn", "Initialiser_opt", "Initialiser", "InitialiserNoIn_opt", "InitialiserNoIn", "EmptyStatement", "ExpressionStatement", "IfStatement", - "IterationStatement", "ContinueStatement", "BreakStatement", - "ReturnStatement", "WithStatement", "LabelledStatement", - "SwitchStatement", "CaseBlock", "CaseClausules_opt", "CaseClausules", - "CaseClausule", "DefaultClausule", "ThrowStatement", "TryStatement", - "Catch", "Finally", "Expression_opt", "Expression", "ExpressionNoIn_opt", - "ExpressionNoIn", "AssignmentExpression", "AssignmentExpressionNoIn", + "IterationStatement", "$@1", "$@2", "$@3", "$@4", "ContinueStatement", + "BreakStatement", "ReturnStatement", "WithStatement", + "LabelledStatement", "SwitchStatement", "CaseBlock", "CaseClausules_opt", + "CaseClausules", "CaseClausule", "DefaultClausule", "ThrowStatement", + "TryStatement", "Catch", "Finally", "Expression_opt", "Expression_err", + "Expression", "ExpressionNoIn_opt", "ExpressionNoIn", + "AssignmentExpression", "AssignmentExpressionNoIn", "ConditionalExpression", "ConditionalExpressionNoIn", "LogicalORExpression", "LogicalORExpressionNoIn", "LogicalANDExpression", "LogicalANDExpressionNoIn", "BitwiseORExpression", @@ -750,7 +760,8 @@ static const char *const yytname[] = "CallExpression", "Arguments", "ArgumentList", "PrimaryExpression", "ArrayLiteral", "ElementList", "Elision", "Elision_opt", "ObjectLiteral", "PropertyNameAndValueList", "PropertyName", "Identifier_opt", "Literal", - "BooleanLiteral", "semicolon_opt", 0 + "BooleanLiteral", "semicolon_opt", "left_bracket", "right_bracket", + "semicolon", 0 }; #endif @@ -763,9 +774,9 @@ static const yytype_uint16 yytoknum[] = 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 125, 292, 293, - 294, 295, 296, 297, 298, 299, 40, 41, 123, 44, - 61, 59, 58, 63, 124, 94, 38, 43, 45, 42, - 47, 37, 126, 33, 91, 93, 46 + 294, 295, 296, 297, 298, 299, 123, 44, 61, 59, + 58, 63, 124, 94, 38, 43, 45, 42, 47, 37, + 126, 33, 91, 93, 46, 40, 41 }; # endif @@ -777,21 +788,23 @@ static const yytype_uint8 yyr1[] = 76, 76, 76, 76, 76, 76, 76, 76, 77, 77, 78, 78, 79, 79, 80, 81, 81, 82, 82, 83, 84, 85, 85, 86, 87, 87, 88, 89, 90, 91, - 91, 92, 92, 92, 92, 92, 92, 93, 94, 95, - 96, 97, 98, 99, 99, 100, 100, 101, 101, 102, - 103, 104, 105, 105, 105, 106, 107, 108, 108, 109, - 109, 110, 110, 111, 111, 112, 112, 112, 113, 113, - 113, 114, 114, 115, 115, 116, 116, 117, 117, 118, - 118, 119, 119, 120, 120, 121, 121, 122, 122, 123, - 123, 124, 124, 125, 125, 126, 126, 127, 127, 128, - 128, 128, 128, 129, 129, 129, 130, 130, 131, 131, - 131, 132, 132, 132, 132, 133, 133, 133, 133, 133, - 133, 133, 133, 133, 133, 134, 134, 134, 135, 135, - 136, 136, 137, 137, 137, 137, 137, 138, 138, 138, - 138, 139, 139, 140, 140, 141, 141, 141, 141, 141, - 141, 142, 142, 142, 142, 143, 143, 144, 144, 145, - 145, 146, 146, 147, 147, 148, 148, 148, 149, 149, - 150, 150, 150, 150, 150, 150, 151, 151, 152, 152 + 91, 92, 92, 93, 94, 92, 95, 96, 92, 92, + 92, 97, 98, 99, 100, 101, 102, 103, 103, 104, + 104, 105, 105, 106, 107, 108, 109, 109, 109, 110, + 111, 112, 112, 113, 113, 114, 114, 115, 115, 116, + 116, 117, 117, 117, 118, 118, 118, 119, 119, 120, + 120, 121, 121, 122, 122, 123, 123, 124, 124, 125, + 125, 126, 126, 127, 127, 128, 128, 129, 129, 130, + 130, 131, 131, 132, 132, 133, 133, 133, 133, 134, + 134, 134, 135, 135, 136, 136, 136, 137, 137, 137, + 137, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 139, 139, 139, 140, 140, 141, 141, 142, 142, + 142, 142, 142, 143, 143, 143, 143, 144, 144, 145, + 145, 146, 146, 146, 146, 146, 146, 147, 147, 147, + 147, 148, 148, 149, 149, 150, 150, 151, 151, 152, + 152, 153, 153, 153, 154, 154, 155, 155, 155, 155, + 155, 155, 156, 156, 157, 157, 158, 158, 159, 159, + 160, 160 }; /* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */ @@ -802,21 +815,23 @@ static const yytype_uint8 yyr2[] = 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 0, 1, 3, 2, 3, 1, 3, 1, 3, 2, 2, 0, 1, 2, 0, 1, 2, 1, 2, 7, - 5, 7, 5, 9, 10, 7, 8, 3, 3, 3, - 5, 3, 5, 3, 5, 0, 1, 1, 2, 4, - 3, 3, 3, 3, 4, 5, 2, 0, 1, 1, - 3, 0, 1, 1, 3, 1, 3, 3, 1, 3, - 3, 1, 5, 1, 5, 1, 3, 1, 3, 1, + 5, 7, 5, 0, 0, 11, 0, 0, 12, 7, + 8, 3, 3, 3, 5, 3, 5, 3, 5, 0, + 1, 1, 2, 4, 3, 3, 3, 3, 4, 5, + 2, 0, 1, 1, 1, 1, 3, 0, 1, 1, + 3, 1, 3, 3, 1, 3, 3, 1, 5, 1, + 5, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, - 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, - 3, 3, 3, 1, 3, 3, 1, 3, 1, 3, - 3, 1, 3, 3, 3, 1, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 1, 2, 2, 1, 1, - 1, 2, 1, 1, 4, 3, 3, 2, 2, 4, - 3, 2, 3, 1, 3, 1, 1, 1, 1, 1, - 3, 2, 3, 3, 5, 2, 4, 1, 2, 0, - 1, 2, 3, 3, 5, 1, 1, 1, 0, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 + 3, 1, 3, 1, 3, 1, 3, 3, 3, 1, + 3, 3, 1, 3, 1, 3, 3, 1, 3, 3, + 3, 1, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 1, 2, 2, 1, 1, 1, 2, 1, 1, + 4, 3, 3, 2, 2, 4, 3, 2, 3, 1, + 3, 1, 1, 1, 1, 1, 3, 2, 3, 3, + 5, 2, 4, 1, 2, 0, 1, 2, 3, 3, + 5, 1, 1, 1, 0, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1 }; /* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state @@ -824,306 +839,320 @@ static const yytype_uint8 yyr2[] = means the default is an error. */ static const yytype_uint8 yydefact[] = { - 5, 0, 4, 1, 188, 188, 0, 0, 0, 0, - 0, 190, 191, 77, 0, 165, 0, 196, 197, 0, - 0, 0, 0, 0, 0, 0, 0, 3, 8, 166, - 193, 194, 0, 0, 47, 0, 0, 195, 0, 0, - 179, 2, 153, 188, 6, 14, 15, 16, 17, 18, + 5, 0, 4, 1, 194, 194, 0, 0, 0, 0, + 0, 196, 197, 81, 0, 171, 0, 202, 203, 0, + 0, 0, 0, 0, 0, 0, 0, 3, 8, 172, + 199, 200, 0, 47, 0, 0, 201, 0, 0, 185, + 0, 2, 159, 194, 6, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 0, - 79, 85, 91, 95, 99, 103, 107, 111, 115, 119, - 126, 128, 131, 135, 145, 148, 150, 149, 152, 168, - 169, 167, 192, 189, 0, 0, 166, 0, 136, 145, - 0, 0, 81, 151, 150, 0, 78, 0, 0, 0, - 0, 138, 41, 0, 35, 137, 0, 0, 139, 140, - 0, 0, 33, 166, 193, 194, 28, 0, 0, 0, - 141, 142, 143, 144, 177, 171, 0, 180, 0, 0, - 199, 0, 198, 48, 0, 0, 0, 0, 0, 0, + 85, 91, 97, 101, 105, 109, 113, 117, 121, 125, + 132, 134, 137, 141, 151, 154, 156, 155, 158, 174, + 175, 173, 198, 195, 0, 0, 172, 0, 142, 151, + 0, 207, 206, 0, 87, 157, 156, 0, 82, 0, + 0, 0, 0, 144, 41, 0, 35, 143, 0, 0, + 145, 146, 0, 33, 172, 199, 200, 28, 0, 0, + 0, 147, 148, 149, 150, 183, 177, 0, 186, 0, + 0, 0, 205, 0, 204, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 146, 147, 0, 0, 0, 0, 0, 157, 0, 0, - 158, 58, 57, 181, 185, 187, 186, 0, 0, 0, - 0, 82, 83, 88, 93, 97, 101, 105, 109, 113, - 117, 123, 145, 156, 59, 0, 71, 33, 0, 0, - 72, 73, 0, 39, 42, 0, 34, 0, 0, 61, - 170, 32, 29, 182, 0, 0, 179, 173, 178, 172, - 175, 12, 80, 96, 0, 100, 104, 108, 112, 116, - 122, 121, 120, 127, 129, 130, 132, 133, 134, 87, - 86, 161, 163, 0, 0, 155, 0, 160, 0, 0, - 44, 0, 37, 77, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, - 74, 43, 36, 0, 0, 0, 183, 180, 0, 10, - 13, 0, 0, 162, 0, 154, 159, 0, 50, 0, - 40, 45, 0, 77, 0, 0, 84, 145, 98, 0, - 102, 106, 110, 114, 118, 125, 124, 0, 90, 89, - 65, 62, 0, 52, 60, 0, 174, 176, 0, 0, - 92, 164, 0, 0, 46, 38, 0, 0, 77, 0, - 0, 0, 0, 66, 67, 0, 184, 11, 5, 51, - 49, 77, 0, 0, 94, 55, 0, 0, 63, 65, - 68, 75, 9, 0, 0, 56, 0, 30, 30, 0, - 7, 0, 53, 31, 69, 70, 64, 54 + 0, 0, 152, 153, 0, 0, 0, 0, 0, 163, + 0, 0, 164, 62, 61, 187, 191, 193, 192, 0, + 84, 0, 83, 0, 53, 88, 89, 94, 99, 103, + 107, 111, 115, 119, 123, 129, 151, 162, 63, 0, + 75, 33, 0, 0, 76, 77, 0, 39, 42, 0, + 34, 0, 0, 65, 32, 29, 188, 0, 0, 185, + 179, 184, 178, 181, 176, 12, 86, 102, 0, 106, + 110, 114, 118, 122, 128, 127, 126, 133, 135, 136, + 138, 139, 140, 93, 92, 0, 161, 167, 169, 0, + 0, 166, 0, 209, 208, 0, 44, 56, 37, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 80, 78, 43, 36, 0, + 0, 0, 189, 186, 0, 10, 13, 0, 0, 160, + 0, 168, 165, 0, 50, 0, 40, 45, 0, 0, + 0, 211, 210, 81, 90, 151, 104, 0, 108, 112, + 116, 120, 124, 131, 130, 0, 96, 95, 69, 66, + 0, 52, 64, 0, 180, 182, 0, 0, 98, 170, + 0, 0, 46, 38, 81, 0, 54, 0, 0, 0, + 0, 70, 71, 0, 190, 11, 5, 51, 49, 57, + 0, 0, 100, 59, 0, 0, 67, 69, 72, 79, + 9, 0, 0, 60, 81, 30, 30, 0, 7, 81, + 0, 31, 73, 74, 68, 0, 0, 0, 55, 58 }; /* YYDEFGOTO[NTERM-NUM]. */ static const yytype_int16 yydefgoto[] = { - -1, 1, 41, 2, 42, 43, 343, 270, 271, 116, - 117, 354, 45, 46, 103, 241, 104, 242, 193, 194, - 280, 281, 47, 48, 49, 50, 51, 52, 53, 54, - 55, 56, 301, 322, 323, 324, 339, 57, 58, 190, - 191, 95, 59, 170, 171, 60, 172, 61, 173, 62, - 174, 63, 175, 64, 176, 65, 177, 66, 178, 67, - 179, 68, 180, 69, 70, 71, 72, 73, 74, 75, - 76, 77, 157, 233, 78, 79, 126, 127, 128, 80, - 118, 119, 84, 81, 82, 133 + -1, 1, 41, 2, 42, 43, 351, 276, 277, 117, + 118, 362, 45, 46, 105, 247, 106, 248, 197, 198, + 286, 287, 47, 48, 49, 50, 249, 341, 289, 352, + 51, 52, 53, 54, 55, 56, 309, 330, 331, 332, + 347, 57, 58, 194, 195, 97, 171, 59, 174, 175, + 60, 176, 61, 177, 62, 178, 63, 179, 64, 180, + 65, 181, 66, 182, 67, 183, 68, 184, 69, 70, + 71, 72, 73, 74, 75, 76, 77, 159, 239, 78, + 79, 127, 128, 129, 80, 119, 120, 84, 81, 82, + 135, 93, 245, 293 }; /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing STATE-NUM. */ -#define YYPACT_NINF -242 +#define YYPACT_NINF -278 static const yytype_int16 yypact[] = { - -242, 16, 375, -242, 0, 0, 827, 623, 11, 55, - 93, -242, -242, 827, 76, -242, 827, -242, -242, -4, - 827, 33, 827, 86, 92, 827, 827, -242, -242, 23, - -242, -242, 827, 437, -242, 827, 827, -242, 827, 827, - -43, -242, -242, 0, -242, -242, -242, -242, -242, -242, - -242, -242, -242, -242, -242, -242, -242, -242, -242, 7, - -242, -242, -8, 52, 88, 90, 95, 119, 18, 140, - 158, 44, -242, -242, 73, -242, 27, 32, -242, -242, - -242, -242, -242, -242, 2, 2, -242, 117, -242, 186, - 164, 827, 725, -242, 27, 2, 156, 827, 7, 499, - 64, -242, 167, 10, -242, -242, 827, 827, -242, -242, - 623, 25, 321, 23, 159, 173, -242, 561, 13, 175, - -242, -242, -242, -242, -242, -242, -31, 35, 827, 182, - -242, 827, -242, -242, 827, 827, 827, 827, 827, 827, - 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, - -242, -242, 827, 827, 776, 827, 191, -242, 827, 192, - -242, -242, -242, -242, -242, -242, -242, 187, 81, 194, - 183, 189, -242, -242, -7, 204, 185, 181, 188, 201, - -1, 140, 85, -242, -242, 109, -242, -242, 197, -4, - 233, -242, 827, -242, -242, 33, -242, 115, 133, -242, - -242, -242, -242, -242, 82, 827, 198, -242, -242, -242, - -242, 208, -242, 52, 196, 88, 90, 95, 119, 18, - 140, 140, 140, 158, 44, 44, -242, -242, -242, -242, - -242, -242, -242, 151, 37, -242, 48, -242, 827, 623, - 199, 150, 236, 827, 827, 827, 827, 827, 827, 827, - 827, 827, 827, 827, 827, 827, 827, 203, 214, -242, - -242, -242, -242, 623, 623, 202, -242, 206, 674, -242, - 207, 210, 827, -242, 827, -242, -242, 157, 243, 827, - -242, -242, 194, 827, 827, 209, -242, 163, 204, 211, - 185, 181, 188, 201, -1, 140, 140, 161, -242, -242, - 255, -242, 217, -242, -242, 827, -242, -242, 227, 218, - -242, -242, 216, 623, -242, -242, 219, 165, 827, 827, - 623, 827, 6, 255, -242, -4, -242, -242, -242, -242, - -242, 827, 623, 221, -242, -242, -37, 231, -242, 255, - -242, -242, 623, 232, 239, -242, 623, 623, 623, 250, - -242, 623, -242, 623, -242, -242, -242, -242 + -278, 20, 433, -278, -3, -3, 877, 673, 12, 12, + 196, -278, -278, 877, 12, -278, 877, -278, -278, 15, + 877, 28, 877, 12, 12, 877, 877, -278, -278, 1, + -278, -278, 493, -278, 877, 877, -278, 877, 877, 59, + 877, -278, -278, -3, -278, -278, -278, -278, -278, -278, + -278, -278, -278, -278, -278, -278, -278, -278, -278, 16, + -278, -278, -13, 83, 72, 32, 85, 102, 88, 114, + 153, 104, -278, -278, 98, -278, -40, -28, -278, -278, + -278, -278, -278, -278, 8, 8, -278, 113, -278, 182, + 135, -278, -278, 345, 775, -278, -40, 8, 119, 877, + 16, 553, 131, -278, 120, 51, -278, -278, 345, 877, + -278, -278, 673, 381, 1, 136, 149, -278, 613, 62, + 156, -278, -278, -278, -278, -278, -278, 60, 70, 877, + -26, 12, -278, 877, -278, -278, 877, 877, 877, 877, + 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, + 877, 877, -278, -278, 877, 877, 877, 173, 724, -278, + 877, 180, -278, -278, -278, -278, -278, -278, -278, 12, + -278, 6, 119, 185, -278, 186, -278, -278, -6, 210, + 192, 193, 191, 207, 14, 114, 87, -278, -278, 7, + -278, -278, 12, 15, 237, -278, 877, -278, -278, 28, + -278, 6, 7, -278, -278, -278, -278, 116, 877, 203, + -278, -278, -278, -278, -278, 213, -278, 83, 202, 72, + 32, 85, 102, 88, 114, 114, 114, 153, 104, 104, + -278, -278, -278, -278, -278, 71, -278, -278, -278, -17, + 82, -278, 345, -278, -278, 673, 205, 208, 242, 13, + 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, + 345, 877, 877, 211, 221, -278, -278, -278, -278, 673, + 673, 212, -278, 216, 826, -278, 217, 6, 877, -278, + 877, -278, -278, 6, 250, 877, -278, -278, 185, 13, + 345, -278, -278, 877, -278, 188, 210, 215, 192, 193, + 191, 207, 14, 114, 114, 6, -278, -278, 265, -278, + 6, -278, -278, 877, -278, -278, 233, 226, -278, -278, + 8, 673, -278, -278, 877, 6, -278, 877, 673, 877, + 9, 265, -278, 15, -278, -278, -278, -278, -278, -278, + 673, 13, -278, -278, 91, 223, -278, 265, -278, -278, + 673, 238, 13, -278, 877, 673, 673, 239, -278, 877, + 6, 673, -278, -278, -278, 6, 673, 673, -278, -278 }; /* YYPGOTO[NTERM-NUM]. */ static const yytype_int16 yypgoto[] = { - -242, -242, -242, -40, -242, -242, -242, -242, -242, -2, - -126, -59, -10, -242, -242, -242, 96, 8, -242, -242, - -242, -242, -242, -242, -242, -242, -242, -242, -242, -242, - -242, -242, -242, -46, -242, -29, -242, -242, -242, -242, - 102, -241, -12, -242, -242, -65, -227, -242, -242, -242, - -242, 162, 50, 166, 51, 160, 53, 169, 54, 171, - 62, 174, 65, -61, 155, 78, 1, -242, 29, 290, - 294, -242, -47, -242, -242, -242, -242, 99, 107, -242, - -242, 113, 5, -242, -242, 49 + -278, -278, -278, -62, -278, -278, -278, -278, -278, -2, + -130, -79, -8, -278, -278, -278, 80, 10, -278, -278, + -278, -278, -278, -278, -278, -278, -278, -278, -278, -278, + -278, -278, -278, -278, -278, -278, -278, -67, -278, -49, + -278, -278, -278, -278, 99, -246, -102, -12, -278, -278, + -43, -157, -278, -278, -278, -278, 160, 46, 161, 47, + 162, 48, 163, 49, 164, 50, 165, 52, -61, 167, + 81, 54, -278, 33, 298, 300, -278, -27, -278, -278, + -278, -278, 105, 106, -278, -278, 109, 5, -278, -278, + -82, 18, -158, -277 }; /* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If positive, shift that token. If negative, reduce the rule which number is the opposite. If zero, do what YYDEFACT says. If YYTABLE_NINF, syntax error. */ -#define YYTABLE_NINF -188 +#define YYTABLE_NINF -194 static const yytype_int16 yytable[] = { - 44, 96, 285, 130, 98, 90, 124, 88, 130, 100, - 85, 130, 131, 337, 252, 347, 3, 286, 206, 289, - 111, 101, 125, 105, 134, 245, 108, 109, 298, 299, - 160, 181, 141, 142, 207, 89, 120, 121, 83, 122, - 123, 253, 316, 338, 99, 135, 246, 183, 129, 89, - 203, 89, 314, 132, 89, 89, 131, 91, 132, 195, - 143, 132, 204, 210, 89, 89, 212, 89, 89, 188, - 214, 102, 200, 154, 131, 110, 189, 333, 154, 168, - 220, 221, 222, 136, 208, 185, 131, 229, 230, 232, - 344, 155, 334, 156, 197, 198, 158, 131, 159, 254, - 209, 92, 275, 147, 148, 149, 150, 151, 199, 10, - 11, 12, 152, 276, 15, 202, 17, 18, 150, 151, - 164, 182, 97, 153, 255, 165, 166, 261, 239, 28, - 131, 86, 106, 161, 162, 256, 30, 31, 107, 32, - 266, 87, 137, 234, 184, 138, 236, 186, 226, 227, - 228, 139, 196, 37, 163, 164, 257, 40, 131, 140, - 165, 166, 263, 89, 131, 89, 89, 89, 89, 89, - 89, 89, 89, 89, 89, 89, 89, 89, 89, 259, - 264, 144, 131, 181, 181, 181, 181, 181, 181, 181, - 181, 295, 296, 167, 181, 181, 150, 151, 273, 282, - 274, 283, 255, 307, 312, 131, 131, 310, 320, 311, - 131, -187, 332, 256, 131, 145, 146, 192, 181, 150, - 151, 353, 353, 224, 225, -186, 277, 205, 211, 235, - 237, 96, 240, 238, 243, 247, 249, 278, 244, 248, - 326, 251, 297, 258, 250, 189, 269, 124, 272, 279, - 284, 300, 302, 313, 305, 208, 308, 309, 181, 321, - 318, 303, 304, 319, 325, 327, 328, 329, 346, 350, - 331, 96, 317, 287, 89, 287, 89, 89, 89, 89, - 89, 89, 89, 348, 287, 287, 351, 356, 342, 355, - 315, 262, 260, 349, 340, 288, 213, 216, 290, 223, - 93, 291, 215, 292, 94, 267, 96, 217, 287, 336, - 218, 330, 293, 268, 219, 341, 294, 265, 335, 96, - 0, 0, -181, 0, 0, 0, 0, 0, 0, 0, - 345, 0, 0, 0, 0, -181, -181, 0, 0, 0, - 44, 0, 0, 0, 352, 0, 0, 0, 287, 357, - 0, 202, -181, -181, 0, 0, 0, 0, 0, 0, - -181, -181, -181, -181, 0, 0, 0, 0, 0, 0, - -181, -181, 0, 0, -181, -181, -181, -181, 4, 0, - -181, 5, -181, 6, 7, 0, 8, -181, 9, 0, - 0, 10, 11, 12, 13, 14, 15, 16, 17, 18, - 19, 20, 21, 22, 23, 24, 0, 0, 25, 26, - 27, 28, 0, 29, 0, 0, 0, 0, 30, 31, - 0, 32, 0, 33, 0, 0, 34, 0, 0, 0, - 0, 0, 35, 36, 0, 37, 0, 38, 39, 40, - 4, 0, 0, 5, 0, 6, 7, 0, 8, 0, - 9, 0, 0, 10, 11, 12, 13, 14, 15, 16, - 17, 18, 19, 20, 21, 22, 23, 24, 0, 0, - 25, 26, 0, 28, 112, 113, 0, 0, 0, 0, - 114, 115, 0, 32, 0, 33, 0, 0, 34, 0, - 0, 0, 0, 0, 35, 36, 0, 37, 0, 38, - 39, 40, 4, 0, 0, 5, 0, 6, 7, 0, - 8, 0, 9, 0, 0, 10, 11, 12, 13, 14, - 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, - 0, 0, 25, 26, 0, 28, 187, 29, 0, 0, - 0, 0, 30, 31, 0, 32, 0, 33, 0, 0, - 34, 0, 0, 0, 0, 0, 35, 36, 0, 37, - 0, 38, 39, 40, 4, 0, 0, 5, 0, 6, - 7, 0, 8, 0, 9, 0, 0, 10, 11, 12, - 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, - 23, 24, 0, 0, 25, 26, 0, 28, 201, 29, - 0, 0, 0, 0, 30, 31, 0, 32, 0, 33, - 0, 0, 34, 0, 0, 0, 0, 0, 35, 36, - 0, 37, 0, 38, 39, 40, 4, 0, 0, 5, + 44, 98, 163, 164, 100, 90, 201, 243, 243, 132, + 85, 102, 324, 91, 291, 188, 345, 132, 190, 136, + 3, 133, 156, 200, 157, 158, 251, 94, 130, 258, + 280, 263, 99, 185, 160, 83, 161, 158, 137, 89, + 214, 108, 109, 269, 270, 252, 346, 326, 131, 281, + 162, 112, 132, 89, 133, 89, 259, 134, 89, 89, + 88, 101, 292, 133, 354, 134, 104, 89, 89, 187, + 89, 89, 244, 244, 103, 359, 107, 92, 339, 110, + 111, 172, 224, 225, 226, 140, 213, 189, 121, 122, + 216, 123, 124, 294, 218, 297, 172, 202, 199, 206, + 134, 260, 143, 144, 306, 307, 125, 209, 360, 207, + 203, 233, 234, 365, 138, 238, 205, 211, 133, 317, + 152, 153, 126, 210, 139, 320, 261, 186, 322, 133, + 145, 152, 153, 212, 279, 262, 192, 154, 133, 141, + 283, 355, 142, 193, 235, 282, 155, 328, 240, 215, + 165, 166, 333, 267, 166, 146, 167, 168, 305, 167, + 168, 149, 150, 151, 169, 272, 133, 340, 196, 89, + 342, 89, 89, 89, 89, 89, 89, 89, 89, 89, + 89, 89, 89, 89, 89, 265, -193, 242, 325, 185, + 185, 185, 185, 185, 185, 185, 185, 303, 304, -192, + 185, 185, 366, 230, 231, 232, 208, 367, 147, 148, + 264, 236, 10, 11, 12, 152, 153, 15, 241, 17, + 18, 152, 153, 246, 185, 361, 361, 261, 228, 229, + 172, 315, 28, 250, 86, 318, 262, 319, 337, 30, + 31, 253, 87, 284, 254, 256, 255, 257, 172, 193, + 125, 275, 278, 285, 36, 288, 290, 308, 39, 310, + 321, 40, 313, 211, 316, 327, 185, 311, 312, 329, + 334, 335, 336, 356, 350, 358, 364, 363, 172, 268, + 357, 98, 348, 295, 89, 295, 89, 89, 89, 89, + 89, 89, 89, 266, 295, 295, 217, 296, 323, 219, + 298, 220, 299, 221, 300, 222, 301, 223, 95, 302, + 96, 0, 98, 227, 273, 274, 271, 344, 295, 338, + 0, 0, 0, 0, 0, 349, 343, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 353, 0, + 0, 0, 98, 0, 0, 0, 170, 98, 44, 0, + 0, 0, 0, 6, 0, 0, 0, 0, 0, 205, + 295, 10, 11, 12, 368, 369, 15, 0, 17, 18, + 0, 20, 0, 22, 0, 0, 0, 0, 25, 26, + 0, 28, -187, 86, 0, 0, 0, 0, 30, 31, + 0, 87, 0, 0, 0, -187, -187, 0, 0, 0, + 34, 35, 0, 36, 0, 37, 38, 39, 0, 0, + 40, 0, -187, -187, 0, 0, 0, 0, 0, 0, + -187, -187, -187, -187, 0, 0, 0, 0, -187, -187, + 0, 0, -187, -187, -187, -187, 4, 0, -187, 5, + -187, 6, 7, 0, 8, -187, 9, 0, 0, 10, + 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, + 21, 22, 23, 24, 0, 0, 25, 26, 27, 28, + 0, 29, 0, 0, 0, 0, 30, 31, 0, 32, + 0, 0, 33, 0, 0, 0, 0, 0, 34, 35, + 0, 36, 0, 37, 38, 39, 4, 0, 40, 5, + 0, 6, 7, 0, 8, 0, 9, 0, 0, 10, + 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, + 21, 22, 23, 24, 0, 0, 25, 26, 0, 28, + 113, 114, 0, 0, 0, 0, 115, 116, 0, 32, + 0, 0, 33, 0, 0, 0, 0, 0, 34, 35, + 0, 36, 0, 37, 38, 39, 4, 0, 40, 5, + 0, 6, 7, 0, 8, 0, 9, 0, 0, 10, + 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, + 21, 22, 23, 24, 0, 0, 25, 26, 0, 28, + 191, 29, 0, 0, 0, 0, 30, 31, 0, 32, + 0, 0, 33, 0, 0, 0, 0, 0, 34, 35, + 0, 36, 0, 37, 38, 39, 4, 0, 40, 5, + 0, 6, 7, 0, 8, 0, 9, 0, 0, 10, + 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, + 21, 22, 23, 24, 0, 0, 25, 26, 0, 28, + 204, 29, 0, 0, 0, 0, 30, 31, 0, 32, + 0, 0, 33, 0, 0, 0, 0, 0, 34, 35, + 0, 36, 0, 37, 38, 39, 4, 0, 40, 5, 0, 6, 7, 0, 8, 0, 9, 0, 0, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 0, 0, 25, 26, 0, 28, 0, 29, 0, 0, 0, 0, 30, 31, 0, 32, - 0, 33, 0, 0, 34, 0, 0, 0, 0, 0, - 35, 36, 6, 37, 0, 38, 39, 40, 0, 0, + 0, 0, 33, 0, 0, 0, 0, 0, 34, 35, + 0, 36, 6, 37, 38, 39, 0, 0, 40, 0, 10, 11, 12, 0, 0, 15, 0, 17, 18, 0, 20, 0, 22, 0, 0, 0, 0, 25, 26, 0, 28, 0, 86, 0, 0, 0, 0, 30, 31, 0, - 32, 0, 87, 0, 0, 0, 0, 0, 0, 0, - 0, 35, 36, 6, 37, 0, 38, 39, 40, 306, - 0, 10, 11, 12, 0, 0, 15, 0, 17, 18, - 0, 20, 169, 22, 0, 0, 0, 0, 25, 26, + 87, 0, 0, 0, 0, 0, 0, 0, 0, 34, + 35, 0, 36, 6, 37, 38, 39, 0, 0, 40, + 237, 10, 11, 12, 0, 0, 15, 0, 17, 18, + 0, 20, 173, 22, 0, 0, 0, 0, 25, 26, 0, 28, 0, 86, 0, 0, 0, 0, 30, 31, - 0, 32, 0, 87, 0, 0, 0, 0, 0, 0, - 0, 0, 35, 36, 6, 37, 0, 38, 39, 40, - 0, 0, 10, 11, 12, 0, 0, 15, 0, 17, + 0, 87, 0, 0, 0, 0, 0, 0, 0, 0, + 34, 35, 0, 36, 6, 37, 38, 39, 0, 0, + 40, 0, 10, 11, 12, 0, 0, 15, 0, 17, 18, 0, 20, 0, 22, 0, 0, 0, 0, 25, 26, 0, 28, 0, 86, 0, 0, 0, 0, 30, - 31, 0, 32, 231, 87, 0, 0, 0, 0, 0, - 0, 0, 0, 35, 36, 6, 37, 0, 38, 39, - 40, 0, 0, 10, 11, 12, 0, 0, 15, 0, + 31, 0, 87, 0, 0, 0, 0, 0, 0, 0, + 0, 34, 35, 0, 36, 6, 37, 38, 39, 314, + 0, 40, 0, 10, 11, 12, 0, 0, 15, 0, 17, 18, 0, 20, 0, 22, 0, 0, 0, 0, 25, 26, 0, 28, 0, 86, 0, 0, 0, 0, - 30, 31, 0, 32, 0, 87, 0, 0, 0, 0, - 0, 0, 0, 0, 35, 36, 0, 37, 0, 38, - 39, 40 + 30, 31, 0, 87, 0, 0, 0, 0, 0, 0, + 0, 0, 34, 35, 0, 36, 0, 37, 38, 39, + 0, 0, 40 }; static const yytype_int16 yycheck[] = { - 2, 13, 243, 1, 16, 7, 49, 6, 1, 19, - 5, 1, 49, 7, 15, 52, 0, 244, 49, 246, - 32, 20, 65, 22, 32, 32, 25, 26, 255, 256, - 77, 92, 14, 15, 65, 6, 35, 36, 38, 38, - 39, 42, 283, 37, 48, 53, 53, 94, 43, 20, - 37, 22, 279, 51, 25, 26, 49, 46, 51, 49, - 42, 51, 49, 128, 35, 36, 131, 38, 39, 5, - 135, 38, 47, 46, 49, 52, 12, 318, 46, 91, - 141, 142, 143, 31, 49, 97, 49, 152, 153, 154, - 331, 64, 319, 66, 106, 107, 64, 49, 66, 14, - 65, 46, 65, 59, 60, 61, 33, 34, 110, 16, - 17, 18, 39, 65, 21, 117, 23, 24, 33, 34, - 38, 92, 46, 50, 39, 43, 44, 192, 47, 36, - 49, 38, 46, 84, 85, 50, 43, 44, 46, 46, - 205, 48, 54, 155, 95, 55, 158, 98, 147, 148, - 149, 56, 103, 60, 37, 38, 47, 64, 49, 40, - 43, 44, 47, 134, 49, 136, 137, 138, 139, 140, - 141, 142, 143, 144, 145, 146, 147, 148, 149, 189, - 47, 41, 49, 244, 245, 246, 247, 248, 249, 250, - 251, 252, 253, 29, 255, 256, 33, 34, 47, 49, - 49, 51, 39, 268, 47, 49, 49, 272, 47, 274, - 49, 52, 47, 50, 49, 57, 58, 50, 279, 33, - 34, 347, 348, 145, 146, 52, 238, 52, 46, 38, - 38, 243, 38, 46, 51, 31, 55, 239, 49, 54, - 305, 40, 254, 46, 56, 12, 38, 49, 52, 50, - 14, 48, 38, 10, 52, 49, 49, 47, 319, 4, - 51, 263, 264, 52, 47, 38, 48, 51, 47, 37, - 51, 283, 284, 244, 245, 246, 247, 248, 249, 250, - 251, 252, 253, 52, 255, 256, 47, 37, 328, 348, - 282, 195, 190, 339, 323, 245, 134, 137, 247, 144, - 10, 248, 136, 249, 10, 206, 318, 138, 279, 321, - 139, 313, 250, 206, 140, 325, 251, 204, 320, 331, - -1, -1, 1, -1, -1, -1, -1, -1, -1, -1, - 332, -1, -1, -1, -1, 14, 15, -1, -1, -1, - 342, -1, -1, -1, 346, -1, -1, -1, 319, 351, - -1, 353, 31, 32, -1, -1, -1, -1, -1, -1, - 39, 40, 41, 42, -1, -1, -1, -1, -1, -1, - 49, 50, -1, -1, 53, 54, 55, 56, 3, -1, - 59, 6, 61, 8, 9, -1, 11, 66, 13, -1, - -1, 16, 17, 18, 19, 20, 21, 22, 23, 24, - 25, 26, 27, 28, 29, 30, -1, -1, 33, 34, - 35, 36, -1, 38, -1, -1, -1, -1, 43, 44, - -1, 46, -1, 48, -1, -1, 51, -1, -1, -1, - -1, -1, 57, 58, -1, 60, -1, 62, 63, 64, - 3, -1, -1, 6, -1, 8, 9, -1, 11, -1, - 13, -1, -1, 16, 17, 18, 19, 20, 21, 22, - 23, 24, 25, 26, 27, 28, 29, 30, -1, -1, - 33, 34, -1, 36, 37, 38, -1, -1, -1, -1, - 43, 44, -1, 46, -1, 48, -1, -1, 51, -1, - -1, -1, -1, -1, 57, 58, -1, 60, -1, 62, - 63, 64, 3, -1, -1, 6, -1, 8, 9, -1, - 11, -1, 13, -1, -1, 16, 17, 18, 19, 20, - 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, - -1, -1, 33, 34, -1, 36, 37, 38, -1, -1, - -1, -1, 43, 44, -1, 46, -1, 48, -1, -1, - 51, -1, -1, -1, -1, -1, 57, 58, -1, 60, - -1, 62, 63, 64, 3, -1, -1, 6, -1, 8, - 9, -1, 11, -1, 13, -1, -1, 16, 17, 18, - 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, - 29, 30, -1, -1, 33, 34, -1, 36, 37, 38, - -1, -1, -1, -1, 43, 44, -1, 46, -1, 48, - -1, -1, 51, -1, -1, -1, -1, -1, 57, 58, - -1, 60, -1, 62, 63, 64, 3, -1, -1, 6, + 2, 13, 84, 85, 16, 7, 108, 1, 1, 1, + 5, 19, 289, 1, 1, 97, 7, 1, 100, 32, + 0, 47, 62, 105, 64, 65, 32, 9, 40, 15, + 47, 189, 14, 94, 62, 38, 64, 65, 51, 6, + 66, 23, 24, 201, 202, 51, 37, 293, 43, 66, + 77, 50, 1, 20, 47, 22, 42, 49, 25, 26, + 6, 46, 49, 47, 341, 49, 38, 34, 35, 96, + 37, 38, 66, 66, 20, 352, 22, 65, 324, 25, + 26, 93, 143, 144, 145, 53, 129, 99, 34, 35, + 133, 37, 38, 250, 137, 252, 108, 109, 47, 37, + 49, 14, 14, 15, 261, 262, 47, 47, 354, 47, + 112, 154, 155, 359, 31, 158, 118, 47, 47, 277, + 33, 34, 63, 63, 52, 283, 39, 94, 285, 47, + 42, 33, 34, 63, 63, 48, 5, 39, 47, 54, + 242, 50, 40, 12, 156, 63, 48, 305, 160, 131, + 37, 38, 310, 196, 38, 41, 43, 44, 260, 43, + 44, 57, 58, 59, 29, 208, 47, 325, 48, 136, + 327, 138, 139, 140, 141, 142, 143, 144, 145, 146, + 147, 148, 149, 150, 151, 193, 50, 169, 290, 250, + 251, 252, 253, 254, 255, 256, 257, 258, 259, 50, + 261, 262, 360, 149, 150, 151, 50, 365, 55, 56, + 192, 38, 16, 17, 18, 33, 34, 21, 38, 23, + 24, 33, 34, 38, 285, 355, 356, 39, 147, 148, + 242, 274, 36, 47, 38, 278, 48, 280, 320, 43, + 44, 31, 46, 245, 52, 54, 53, 40, 260, 12, + 47, 38, 50, 48, 58, 47, 14, 46, 62, 38, + 10, 65, 50, 47, 47, 50, 327, 269, 270, 4, + 313, 38, 46, 50, 336, 37, 37, 356, 290, 199, + 347, 293, 331, 250, 251, 252, 253, 254, 255, 256, + 257, 258, 259, 194, 261, 262, 136, 251, 288, 138, + 253, 139, 254, 140, 255, 141, 256, 142, 10, 257, + 10, -1, 324, 146, 209, 209, 207, 329, 285, 321, + -1, -1, -1, -1, -1, 333, 328, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 340, -1, + -1, -1, 354, -1, -1, -1, 1, 359, 350, -1, + -1, -1, -1, 8, -1, -1, -1, -1, -1, 361, + 327, 16, 17, 18, 366, 367, 21, -1, 23, 24, + -1, 26, -1, 28, -1, -1, -1, -1, 33, 34, + -1, 36, 1, 38, -1, -1, -1, -1, 43, 44, + -1, 46, -1, -1, -1, 14, 15, -1, -1, -1, + 55, 56, -1, 58, -1, 60, 61, 62, -1, -1, + 65, -1, 31, 32, -1, -1, -1, -1, -1, -1, + 39, 40, 41, 42, -1, -1, -1, -1, 47, 48, + -1, -1, 51, 52, 53, 54, 3, -1, 57, 6, + 59, 8, 9, -1, 11, 64, 13, -1, -1, 16, + 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, + 27, 28, 29, 30, -1, -1, 33, 34, 35, 36, + -1, 38, -1, -1, -1, -1, 43, 44, -1, 46, + -1, -1, 49, -1, -1, -1, -1, -1, 55, 56, + -1, 58, -1, 60, 61, 62, 3, -1, 65, 6, + -1, 8, 9, -1, 11, -1, 13, -1, -1, 16, + 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, + 27, 28, 29, 30, -1, -1, 33, 34, -1, 36, + 37, 38, -1, -1, -1, -1, 43, 44, -1, 46, + -1, -1, 49, -1, -1, -1, -1, -1, 55, 56, + -1, 58, -1, 60, 61, 62, 3, -1, 65, 6, + -1, 8, 9, -1, 11, -1, 13, -1, -1, 16, + 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, + 27, 28, 29, 30, -1, -1, 33, 34, -1, 36, + 37, 38, -1, -1, -1, -1, 43, 44, -1, 46, + -1, -1, 49, -1, -1, -1, -1, -1, 55, 56, + -1, 58, -1, 60, 61, 62, 3, -1, 65, 6, + -1, 8, 9, -1, 11, -1, 13, -1, -1, 16, + 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, + 27, 28, 29, 30, -1, -1, 33, 34, -1, 36, + 37, 38, -1, -1, -1, -1, 43, 44, -1, 46, + -1, -1, 49, -1, -1, -1, -1, -1, 55, 56, + -1, 58, -1, 60, 61, 62, 3, -1, 65, 6, -1, 8, 9, -1, 11, -1, 13, -1, -1, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, -1, -1, 33, 34, -1, 36, -1, 38, -1, -1, -1, -1, 43, 44, -1, 46, - -1, 48, -1, -1, 51, -1, -1, -1, -1, -1, - 57, 58, 8, 60, -1, 62, 63, 64, -1, -1, + -1, -1, 49, -1, -1, -1, -1, -1, 55, 56, + -1, 58, 8, 60, 61, 62, -1, -1, 65, -1, 16, 17, 18, -1, -1, 21, -1, 23, 24, -1, 26, -1, 28, -1, -1, -1, -1, 33, 34, -1, 36, -1, 38, -1, -1, -1, -1, 43, 44, -1, - 46, -1, 48, -1, -1, -1, -1, -1, -1, -1, - -1, 57, 58, 8, 60, -1, 62, 63, 64, 65, - -1, 16, 17, 18, -1, -1, 21, -1, 23, 24, + 46, -1, -1, -1, -1, -1, -1, -1, -1, 55, + 56, -1, 58, 8, 60, 61, 62, -1, -1, 65, + 66, 16, 17, 18, -1, -1, 21, -1, 23, 24, -1, 26, 27, 28, -1, -1, -1, -1, 33, 34, -1, 36, -1, 38, -1, -1, -1, -1, 43, 44, - -1, 46, -1, 48, -1, -1, -1, -1, -1, -1, - -1, -1, 57, 58, 8, 60, -1, 62, 63, 64, - -1, -1, 16, 17, 18, -1, -1, 21, -1, 23, + -1, 46, -1, -1, -1, -1, -1, -1, -1, -1, + 55, 56, -1, 58, 8, 60, 61, 62, -1, -1, + 65, -1, 16, 17, 18, -1, -1, 21, -1, 23, 24, -1, 26, -1, 28, -1, -1, -1, -1, 33, 34, -1, 36, -1, 38, -1, -1, -1, -1, 43, - 44, -1, 46, 47, 48, -1, -1, -1, -1, -1, - -1, -1, -1, 57, 58, 8, 60, -1, 62, 63, - 64, -1, -1, 16, 17, 18, -1, -1, 21, -1, + 44, -1, 46, -1, -1, -1, -1, -1, -1, -1, + -1, 55, 56, -1, 58, 8, 60, 61, 62, 63, + -1, 65, -1, 16, 17, 18, -1, -1, 21, -1, 23, 24, -1, 26, -1, 28, -1, -1, -1, -1, 33, 34, -1, 36, -1, 38, -1, -1, -1, -1, - 43, 44, -1, 46, -1, 48, -1, -1, -1, -1, - -1, -1, -1, -1, 57, 58, -1, 60, -1, 62, - 63, 64 + 43, 44, -1, 46, -1, -1, -1, -1, -1, -1, + -1, -1, 55, 56, -1, 58, -1, 60, 61, 62, + -1, -1, 65 }; /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing @@ -1133,39 +1162,40 @@ static const yytype_uint8 yystos[] = 0, 68, 70, 0, 3, 6, 8, 9, 11, 13, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 33, 34, 35, 36, 38, - 43, 44, 46, 48, 51, 57, 58, 60, 62, 63, - 64, 69, 71, 72, 76, 79, 80, 89, 90, 91, - 92, 93, 94, 95, 96, 97, 98, 104, 105, 109, - 112, 114, 116, 118, 120, 122, 124, 126, 128, 130, - 131, 132, 133, 134, 135, 136, 137, 138, 141, 142, - 146, 150, 151, 38, 149, 149, 38, 48, 133, 135, - 76, 46, 46, 136, 137, 108, 109, 46, 109, 48, - 79, 133, 38, 81, 83, 133, 46, 46, 133, 133, - 52, 109, 37, 38, 43, 44, 76, 77, 147, 148, - 133, 133, 133, 133, 49, 65, 143, 144, 145, 149, - 1, 49, 51, 152, 32, 53, 31, 54, 55, 56, - 40, 14, 15, 42, 41, 57, 58, 59, 60, 61, - 33, 34, 39, 50, 46, 64, 66, 139, 64, 66, - 139, 152, 152, 37, 38, 43, 44, 29, 109, 27, - 110, 111, 113, 115, 117, 119, 121, 123, 125, 127, - 129, 130, 135, 139, 152, 109, 152, 37, 5, 12, - 106, 107, 50, 85, 86, 49, 152, 109, 109, 76, - 47, 37, 76, 37, 49, 52, 49, 65, 49, 65, - 112, 46, 112, 118, 112, 120, 122, 124, 126, 128, - 130, 130, 130, 131, 132, 132, 133, 133, 133, 112, - 112, 47, 112, 140, 109, 38, 109, 38, 46, 47, - 38, 82, 84, 51, 49, 32, 53, 31, 54, 55, - 56, 40, 15, 42, 14, 39, 50, 47, 46, 79, - 107, 112, 83, 47, 47, 148, 112, 144, 145, 38, - 74, 75, 52, 47, 49, 65, 65, 109, 76, 50, - 87, 88, 49, 51, 14, 108, 113, 135, 119, 113, - 121, 123, 125, 127, 129, 130, 130, 109, 113, 113, - 48, 99, 38, 76, 76, 52, 65, 112, 49, 47, - 112, 112, 47, 10, 113, 84, 108, 109, 51, 52, - 47, 4, 100, 101, 102, 47, 112, 38, 48, 51, - 76, 51, 47, 108, 113, 76, 109, 7, 37, 103, - 102, 79, 70, 73, 108, 76, 47, 52, 52, 100, - 37, 47, 76, 77, 78, 78, 37, 76 + 43, 44, 46, 49, 55, 56, 58, 60, 61, 62, + 65, 69, 71, 72, 76, 79, 80, 89, 90, 91, + 92, 97, 98, 99, 100, 101, 102, 108, 109, 114, + 117, 119, 121, 123, 125, 127, 129, 131, 133, 135, + 136, 137, 138, 139, 140, 141, 142, 143, 146, 147, + 151, 155, 156, 38, 154, 154, 38, 46, 138, 140, + 76, 1, 65, 158, 158, 141, 142, 112, 114, 158, + 114, 46, 79, 138, 38, 81, 83, 138, 158, 158, + 138, 138, 50, 37, 38, 43, 44, 76, 77, 152, + 153, 138, 138, 138, 138, 47, 63, 148, 149, 150, + 114, 154, 1, 47, 49, 157, 32, 51, 31, 52, + 53, 54, 40, 14, 15, 42, 41, 55, 56, 57, + 58, 59, 33, 34, 39, 48, 62, 64, 65, 144, + 62, 64, 144, 157, 157, 37, 38, 43, 44, 29, + 1, 113, 114, 27, 115, 116, 118, 120, 122, 124, + 126, 128, 130, 132, 134, 135, 140, 144, 157, 114, + 157, 37, 5, 12, 110, 111, 48, 85, 86, 47, + 157, 113, 114, 76, 37, 76, 37, 47, 50, 47, + 63, 47, 63, 117, 66, 158, 117, 123, 117, 125, + 127, 129, 131, 133, 135, 135, 135, 136, 137, 137, + 138, 138, 138, 117, 117, 114, 38, 66, 117, 145, + 114, 38, 158, 1, 66, 159, 38, 82, 84, 93, + 47, 32, 51, 31, 52, 53, 54, 40, 15, 42, + 14, 39, 48, 159, 158, 79, 111, 117, 83, 159, + 159, 153, 117, 149, 150, 38, 74, 75, 50, 63, + 47, 66, 63, 113, 76, 48, 87, 88, 47, 95, + 14, 1, 49, 160, 118, 140, 124, 118, 126, 128, + 130, 132, 134, 135, 135, 113, 118, 118, 46, 103, + 38, 76, 76, 50, 63, 117, 47, 159, 117, 117, + 159, 10, 118, 84, 160, 113, 112, 50, 159, 4, + 104, 105, 106, 159, 117, 38, 46, 157, 76, 112, + 159, 94, 118, 76, 114, 7, 37, 107, 106, 79, + 70, 73, 96, 76, 160, 50, 50, 104, 37, 160, + 112, 77, 78, 78, 37, 112, 159, 159, 76, 76 }; #define yyerrok (yyerrstatus = 0) @@ -1978,861 +2008,861 @@ yyreduce: case 2: /* Line 1455 of yacc.c */ -#line 255 "parser.y" +#line 257 "parser.y" { program_parsed(ctx, (yyvsp[(1) - (2)].source_elements)); ;} break; case 3: /* Line 1455 of yacc.c */ -#line 258 "parser.y" +#line 260 "parser.y" {;} break; case 4: /* Line 1455 of yacc.c */ -#line 259 "parser.y" +#line 261 "parser.y" {;} break; case 5: /* Line 1455 of yacc.c */ -#line 263 "parser.y" +#line 265 "parser.y" { (yyval.source_elements) = new_source_elements(ctx); ;} break; case 6: /* Line 1455 of yacc.c */ -#line 265 "parser.y" +#line 267 "parser.y" { (yyval.source_elements) = source_elements_add_statement((yyvsp[(1) - (2)].source_elements), (yyvsp[(2) - (2)].statement)); ;} break; case 7: /* Line 1455 of yacc.c */ -#line 270 "parser.y" +#line 272 "parser.y" { (yyval.expr) = new_function_expression(ctx, (yyvsp[(2) - (8)].identifier), (yyvsp[(4) - (8)].parameter_list), (yyvsp[(7) - (8)].source_elements), (yyvsp[(1) - (8)].srcptr), (yyvsp[(8) - (8)].srcptr)-(yyvsp[(1) - (8)].srcptr)+1); ;} break; case 8: /* Line 1455 of yacc.c */ -#line 273 "parser.y" +#line 275 "parser.y" { push_func(ctx); (yyval.srcptr) = (yyvsp[(1) - (1)].srcptr); ;} break; case 9: /* Line 1455 of yacc.c */ -#line 277 "parser.y" +#line 279 "parser.y" { (yyval.source_elements) = function_body_parsed(ctx, (yyvsp[(1) - (1)].source_elements)); ;} break; case 10: /* Line 1455 of yacc.c */ -#line 281 "parser.y" +#line 283 "parser.y" { (yyval.parameter_list) = new_parameter_list(ctx, (yyvsp[(1) - (1)].identifier)); ;} break; case 11: /* Line 1455 of yacc.c */ -#line 283 "parser.y" +#line 285 "parser.y" { (yyval.parameter_list) = parameter_list_add(ctx, (yyvsp[(1) - (3)].parameter_list), (yyvsp[(3) - (3)].identifier)); ;} break; case 12: /* Line 1455 of yacc.c */ -#line 287 "parser.y" +#line 289 "parser.y" { (yyval.parameter_list) = NULL; ;} break; case 13: /* Line 1455 of yacc.c */ -#line 288 "parser.y" +#line 290 "parser.y" { (yyval.parameter_list) = (yyvsp[(1) - (1)].parameter_list); ;} break; case 14: /* Line 1455 of yacc.c */ -#line 292 "parser.y" +#line 294 "parser.y" { (yyval.statement) = (yyvsp[(1) - (1)].statement); ;} break; case 15: /* Line 1455 of yacc.c */ -#line 293 "parser.y" +#line 295 "parser.y" { (yyval.statement) = (yyvsp[(1) - (1)].statement); ;} break; case 16: /* Line 1455 of yacc.c */ -#line 294 "parser.y" +#line 296 "parser.y" { (yyval.statement) = (yyvsp[(1) - (1)].statement); ;} break; case 17: /* Line 1455 of yacc.c */ -#line 295 "parser.y" +#line 297 "parser.y" { (yyval.statement) = (yyvsp[(1) - (1)].statement); ;} break; case 18: /* Line 1455 of yacc.c */ -#line 296 "parser.y" +#line 298 "parser.y" { (yyval.statement) = (yyvsp[(1) - (1)].statement); ;} break; case 19: /* Line 1455 of yacc.c */ -#line 297 "parser.y" +#line 299 "parser.y" { (yyval.statement) = (yyvsp[(1) - (1)].statement); ;} break; case 20: /* Line 1455 of yacc.c */ -#line 298 "parser.y" +#line 300 "parser.y" { (yyval.statement) = (yyvsp[(1) - (1)].statement); ;} break; case 21: /* Line 1455 of yacc.c */ -#line 299 "parser.y" +#line 301 "parser.y" { (yyval.statement) = (yyvsp[(1) - (1)].statement); ;} break; case 22: /* Line 1455 of yacc.c */ -#line 300 "parser.y" +#line 302 "parser.y" { (yyval.statement) = (yyvsp[(1) - (1)].statement); ;} break; case 23: /* Line 1455 of yacc.c */ -#line 301 "parser.y" +#line 303 "parser.y" { (yyval.statement) = (yyvsp[(1) - (1)].statement); ;} break; case 24: /* Line 1455 of yacc.c */ -#line 302 "parser.y" +#line 304 "parser.y" { (yyval.statement) = (yyvsp[(1) - (1)].statement); ;} break; case 25: /* Line 1455 of yacc.c */ -#line 303 "parser.y" +#line 305 "parser.y" { (yyval.statement) = (yyvsp[(1) - (1)].statement); ;} break; case 26: /* Line 1455 of yacc.c */ -#line 304 "parser.y" +#line 306 "parser.y" { (yyval.statement) = (yyvsp[(1) - (1)].statement); ;} break; case 27: /* Line 1455 of yacc.c */ -#line 305 "parser.y" +#line 307 "parser.y" { (yyval.statement) = (yyvsp[(1) - (1)].statement); ;} break; case 28: /* Line 1455 of yacc.c */ -#line 309 "parser.y" +#line 311 "parser.y" { (yyval.statement_list) = new_statement_list(ctx, (yyvsp[(1) - (1)].statement)); ;} break; case 29: /* Line 1455 of yacc.c */ -#line 311 "parser.y" +#line 313 "parser.y" { (yyval.statement_list) = statement_list_add((yyvsp[(1) - (2)].statement_list), (yyvsp[(2) - (2)].statement)); ;} break; case 30: /* Line 1455 of yacc.c */ -#line 315 "parser.y" +#line 317 "parser.y" { (yyval.statement_list) = NULL; ;} break; case 31: /* Line 1455 of yacc.c */ -#line 316 "parser.y" +#line 318 "parser.y" { (yyval.statement_list) = (yyvsp[(1) - (1)].statement_list); ;} break; case 32: /* Line 1455 of yacc.c */ -#line 320 "parser.y" +#line 322 "parser.y" { (yyval.statement) = new_block_statement(ctx, (yyvsp[(2) - (3)].statement_list)); ;} break; case 33: /* Line 1455 of yacc.c */ -#line 321 "parser.y" +#line 323 "parser.y" { (yyval.statement) = new_block_statement(ctx, NULL); ;} break; case 34: /* Line 1455 of yacc.c */ -#line 326 "parser.y" +#line 328 "parser.y" { (yyval.statement) = new_var_statement(ctx, (yyvsp[(2) - (3)].variable_list)); ;} break; case 35: /* Line 1455 of yacc.c */ -#line 330 "parser.y" +#line 332 "parser.y" { (yyval.variable_list) = new_variable_list(ctx, (yyvsp[(1) - (1)].variable_declaration)); ;} break; case 36: /* Line 1455 of yacc.c */ -#line 332 "parser.y" +#line 334 "parser.y" { (yyval.variable_list) = variable_list_add(ctx, (yyvsp[(1) - (3)].variable_list), (yyvsp[(3) - (3)].variable_declaration)); ;} break; case 37: /* Line 1455 of yacc.c */ -#line 337 "parser.y" +#line 339 "parser.y" { (yyval.variable_list) = new_variable_list(ctx, (yyvsp[(1) - (1)].variable_declaration)); ;} break; case 38: /* Line 1455 of yacc.c */ -#line 339 "parser.y" +#line 341 "parser.y" { (yyval.variable_list) = variable_list_add(ctx, (yyvsp[(1) - (3)].variable_list), (yyvsp[(3) - (3)].variable_declaration)); ;} break; case 39: /* Line 1455 of yacc.c */ -#line 344 "parser.y" +#line 346 "parser.y" { (yyval.variable_declaration) = new_variable_declaration(ctx, (yyvsp[(1) - (2)].identifier), (yyvsp[(2) - (2)].expr)); ;} break; case 40: /* Line 1455 of yacc.c */ -#line 349 "parser.y" +#line 351 "parser.y" { (yyval.variable_declaration) = new_variable_declaration(ctx, (yyvsp[(1) - (2)].identifier), (yyvsp[(2) - (2)].expr)); ;} break; case 41: /* Line 1455 of yacc.c */ -#line 353 "parser.y" +#line 355 "parser.y" { (yyval.expr) = NULL; ;} break; case 42: /* Line 1455 of yacc.c */ -#line 354 "parser.y" +#line 356 "parser.y" { (yyval.expr) = (yyvsp[(1) - (1)].expr); ;} break; case 43: /* Line 1455 of yacc.c */ -#line 359 "parser.y" +#line 361 "parser.y" { (yyval.expr) = (yyvsp[(2) - (2)].expr); ;} break; case 44: /* Line 1455 of yacc.c */ -#line 363 "parser.y" +#line 365 "parser.y" { (yyval.expr) = NULL; ;} break; case 45: /* Line 1455 of yacc.c */ -#line 364 "parser.y" +#line 366 "parser.y" { (yyval.expr) = (yyvsp[(1) - (1)].expr); ;} break; case 46: /* Line 1455 of yacc.c */ -#line 369 "parser.y" +#line 371 "parser.y" { (yyval.expr) = (yyvsp[(2) - (2)].expr); ;} break; case 47: /* Line 1455 of yacc.c */ -#line 373 "parser.y" +#line 375 "parser.y" { (yyval.statement) = new_empty_statement(ctx); ;} break; case 48: /* Line 1455 of yacc.c */ -#line 378 "parser.y" +#line 380 "parser.y" { (yyval.statement) = new_expression_statement(ctx, (yyvsp[(1) - (2)].expr)); ;} break; case 49: /* Line 1455 of yacc.c */ -#line 383 "parser.y" +#line 385 "parser.y" { (yyval.statement) = new_if_statement(ctx, (yyvsp[(3) - (7)].expr), (yyvsp[(5) - (7)].statement), (yyvsp[(7) - (7)].statement)); ;} break; case 50: /* Line 1455 of yacc.c */ -#line 385 "parser.y" +#line 387 "parser.y" { (yyval.statement) = new_if_statement(ctx, (yyvsp[(3) - (5)].expr), (yyvsp[(5) - (5)].statement), NULL); ;} break; case 51: /* Line 1455 of yacc.c */ -#line 390 "parser.y" +#line 392 "parser.y" { (yyval.statement) = new_while_statement(ctx, TRUE, (yyvsp[(5) - (7)].expr), (yyvsp[(2) - (7)].statement)); ;} break; case 52: /* Line 1455 of yacc.c */ -#line 392 "parser.y" +#line 394 "parser.y" { (yyval.statement) = new_while_statement(ctx, FALSE, (yyvsp[(3) - (5)].expr), (yyvsp[(5) - (5)].statement)); ;} break; case 53: /* Line 1455 of yacc.c */ -#line 394 "parser.y" - { (yyval.statement) = new_for_statement(ctx, NULL, (yyvsp[(3) - (9)].expr), (yyvsp[(5) - (9)].expr), (yyvsp[(7) - (9)].expr), (yyvsp[(9) - (9)].statement)); ;} +#line 396 "parser.y" + { if(!explicit_error(ctx, (yyvsp[(3) - (3)].expr), ';')) YYABORT; ;} break; case 54: /* Line 1455 of yacc.c */ -#line 396 "parser.y" - { (yyval.statement) = new_for_statement(ctx, (yyvsp[(4) - (10)].variable_list), NULL, (yyvsp[(6) - (10)].expr), (yyvsp[(8) - (10)].expr), (yyvsp[(10) - (10)].statement)); ;} +#line 398 "parser.y" + { if(!explicit_error(ctx, (yyvsp[(6) - (6)].expr), ';')) YYABORT; ;} break; case 55: /* Line 1455 of yacc.c */ -#line 398 "parser.y" - { (yyval.statement) = new_forin_statement(ctx, NULL, (yyvsp[(3) - (7)].expr), (yyvsp[(5) - (7)].expr), (yyvsp[(7) - (7)].statement)); ;} +#line 400 "parser.y" + { (yyval.statement) = new_for_statement(ctx, NULL, (yyvsp[(3) - (11)].expr), (yyvsp[(6) - (11)].expr), (yyvsp[(9) - (11)].expr), (yyvsp[(11) - (11)].statement)); ;} break; case 56: /* Line 1455 of yacc.c */ -#line 400 "parser.y" - { (yyval.statement) = new_forin_statement(ctx, (yyvsp[(4) - (8)].variable_declaration), NULL, (yyvsp[(6) - (8)].expr), (yyvsp[(8) - (8)].statement)); ;} +#line 402 "parser.y" + { if(!explicit_error(ctx, (yyvsp[(4) - (4)].variable_list), ';')) YYABORT; ;} break; case 57: /* Line 1455 of yacc.c */ -#line 405 "parser.y" - { (yyval.statement) = new_continue_statement(ctx, (yyvsp[(2) - (3)].identifier)); ;} +#line 404 "parser.y" + { if(!explicit_error(ctx, (yyvsp[(7) - (7)].expr), ';')) YYABORT; ;} break; case 58: /* Line 1455 of yacc.c */ -#line 410 "parser.y" - { (yyval.statement) = new_break_statement(ctx, (yyvsp[(2) - (3)].identifier)); ;} +#line 406 "parser.y" + { (yyval.statement) = new_for_statement(ctx, (yyvsp[(4) - (12)].variable_list), NULL, (yyvsp[(7) - (12)].expr), (yyvsp[(10) - (12)].expr), (yyvsp[(12) - (12)].statement)); ;} break; case 59: /* Line 1455 of yacc.c */ -#line 415 "parser.y" - { (yyval.statement) = new_return_statement(ctx, (yyvsp[(2) - (3)].expr)); ;} +#line 408 "parser.y" + { (yyval.statement) = new_forin_statement(ctx, NULL, (yyvsp[(3) - (7)].expr), (yyvsp[(5) - (7)].expr), (yyvsp[(7) - (7)].statement)); ;} break; case 60: /* Line 1455 of yacc.c */ -#line 420 "parser.y" - { (yyval.statement) = new_with_statement(ctx, (yyvsp[(3) - (5)].expr), (yyvsp[(5) - (5)].statement)); ;} +#line 410 "parser.y" + { (yyval.statement) = new_forin_statement(ctx, (yyvsp[(4) - (8)].variable_declaration), NULL, (yyvsp[(6) - (8)].expr), (yyvsp[(8) - (8)].statement)); ;} break; case 61: /* Line 1455 of yacc.c */ -#line 425 "parser.y" - { (yyval.statement) = new_labelled_statement(ctx, (yyvsp[(1) - (3)].identifier), (yyvsp[(3) - (3)].statement)); ;} +#line 415 "parser.y" + { (yyval.statement) = new_continue_statement(ctx, (yyvsp[(2) - (3)].identifier)); ;} break; case 62: /* Line 1455 of yacc.c */ -#line 430 "parser.y" - { (yyval.statement) = new_switch_statement(ctx, (yyvsp[(3) - (5)].expr), (yyvsp[(5) - (5)].case_clausule)); ;} +#line 420 "parser.y" + { (yyval.statement) = new_break_statement(ctx, (yyvsp[(2) - (3)].identifier)); ;} break; case 63: /* Line 1455 of yacc.c */ -#line 435 "parser.y" - { (yyval.case_clausule) = new_case_block(ctx, (yyvsp[(2) - (3)].case_list), NULL, NULL); ;} +#line 425 "parser.y" + { (yyval.statement) = new_return_statement(ctx, (yyvsp[(2) - (3)].expr)); ;} break; case 64: /* Line 1455 of yacc.c */ -#line 437 "parser.y" - { (yyval.case_clausule) = new_case_block(ctx, (yyvsp[(2) - (5)].case_list), (yyvsp[(3) - (5)].case_clausule), (yyvsp[(4) - (5)].case_list)); ;} +#line 430 "parser.y" + { (yyval.statement) = new_with_statement(ctx, (yyvsp[(3) - (5)].expr), (yyvsp[(5) - (5)].statement)); ;} break; case 65: /* Line 1455 of yacc.c */ -#line 441 "parser.y" - { (yyval.case_list) = NULL; ;} +#line 435 "parser.y" + { (yyval.statement) = new_labelled_statement(ctx, (yyvsp[(1) - (3)].identifier), (yyvsp[(3) - (3)].statement)); ;} break; case 66: /* Line 1455 of yacc.c */ -#line 442 "parser.y" - { (yyval.case_list) = (yyvsp[(1) - (1)].case_list); ;} +#line 440 "parser.y" + { (yyval.statement) = new_switch_statement(ctx, (yyvsp[(3) - (5)].expr), (yyvsp[(5) - (5)].case_clausule)); ;} break; case 67: /* Line 1455 of yacc.c */ -#line 446 "parser.y" - { (yyval.case_list) = new_case_list(ctx, (yyvsp[(1) - (1)].case_clausule)); ;} +#line 445 "parser.y" + { (yyval.case_clausule) = new_case_block(ctx, (yyvsp[(2) - (3)].case_list), NULL, NULL); ;} break; case 68: /* Line 1455 of yacc.c */ -#line 448 "parser.y" - { (yyval.case_list) = case_list_add(ctx, (yyvsp[(1) - (2)].case_list), (yyvsp[(2) - (2)].case_clausule)); ;} +#line 447 "parser.y" + { (yyval.case_clausule) = new_case_block(ctx, (yyvsp[(2) - (5)].case_list), (yyvsp[(3) - (5)].case_clausule), (yyvsp[(4) - (5)].case_list)); ;} break; case 69: /* Line 1455 of yacc.c */ -#line 453 "parser.y" - { (yyval.case_clausule) = new_case_clausule(ctx, (yyvsp[(2) - (4)].expr), (yyvsp[(4) - (4)].statement_list)); ;} +#line 451 "parser.y" + { (yyval.case_list) = NULL; ;} break; case 70: /* Line 1455 of yacc.c */ -#line 458 "parser.y" - { (yyval.case_clausule) = new_case_clausule(ctx, NULL, (yyvsp[(3) - (3)].statement_list)); ;} +#line 452 "parser.y" + { (yyval.case_list) = (yyvsp[(1) - (1)].case_list); ;} break; case 71: /* Line 1455 of yacc.c */ -#line 463 "parser.y" - { (yyval.statement) = new_throw_statement(ctx, (yyvsp[(2) - (3)].expr)); ;} +#line 456 "parser.y" + { (yyval.case_list) = new_case_list(ctx, (yyvsp[(1) - (1)].case_clausule)); ;} break; case 72: /* Line 1455 of yacc.c */ -#line 467 "parser.y" - { (yyval.statement) = new_try_statement(ctx, (yyvsp[(2) - (3)].statement), (yyvsp[(3) - (3)].catch_block), NULL); ;} +#line 458 "parser.y" + { (yyval.case_list) = case_list_add(ctx, (yyvsp[(1) - (2)].case_list), (yyvsp[(2) - (2)].case_clausule)); ;} break; case 73: /* Line 1455 of yacc.c */ -#line 468 "parser.y" - { (yyval.statement) = new_try_statement(ctx, (yyvsp[(2) - (3)].statement), NULL, (yyvsp[(3) - (3)].statement)); ;} +#line 463 "parser.y" + { (yyval.case_clausule) = new_case_clausule(ctx, (yyvsp[(2) - (4)].expr), (yyvsp[(4) - (4)].statement_list)); ;} break; case 74: /* Line 1455 of yacc.c */ -#line 470 "parser.y" - { (yyval.statement) = new_try_statement(ctx, (yyvsp[(2) - (4)].statement), (yyvsp[(3) - (4)].catch_block), (yyvsp[(4) - (4)].statement)); ;} +#line 468 "parser.y" + { (yyval.case_clausule) = new_case_clausule(ctx, NULL, (yyvsp[(3) - (3)].statement_list)); ;} break; case 75: /* Line 1455 of yacc.c */ -#line 475 "parser.y" - { (yyval.catch_block) = new_catch_block(ctx, (yyvsp[(3) - (5)].identifier), (yyvsp[(5) - (5)].statement)); ;} +#line 473 "parser.y" + { (yyval.statement) = new_throw_statement(ctx, (yyvsp[(2) - (3)].expr)); ;} break; case 76: /* Line 1455 of yacc.c */ -#line 479 "parser.y" - { (yyval.statement) = (yyvsp[(2) - (2)].statement); ;} +#line 477 "parser.y" + { (yyval.statement) = new_try_statement(ctx, (yyvsp[(2) - (3)].statement), (yyvsp[(3) - (3)].catch_block), NULL); ;} break; case 77: /* Line 1455 of yacc.c */ -#line 483 "parser.y" - { (yyval.expr) = NULL; ;} +#line 478 "parser.y" + { (yyval.statement) = new_try_statement(ctx, (yyvsp[(2) - (3)].statement), NULL, (yyvsp[(3) - (3)].statement)); ;} break; case 78: /* Line 1455 of yacc.c */ -#line 484 "parser.y" - { (yyval.expr) = (yyvsp[(1) - (1)].expr); ;} +#line 480 "parser.y" + { (yyval.statement) = new_try_statement(ctx, (yyvsp[(2) - (4)].statement), (yyvsp[(3) - (4)].catch_block), (yyvsp[(4) - (4)].statement)); ;} break; case 79: /* Line 1455 of yacc.c */ -#line 488 "parser.y" - { (yyval.expr) = (yyvsp[(1) - (1)].expr); ;} +#line 485 "parser.y" + { (yyval.catch_block) = new_catch_block(ctx, (yyvsp[(3) - (5)].identifier), (yyvsp[(5) - (5)].statement)); ;} break; case 80: /* Line 1455 of yacc.c */ -#line 490 "parser.y" - { (yyval.expr) = new_binary_expression(ctx, EXPR_COMMA, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;} +#line 489 "parser.y" + { (yyval.statement) = (yyvsp[(2) - (2)].statement); ;} break; case 81: /* Line 1455 of yacc.c */ -#line 494 "parser.y" +#line 493 "parser.y" { (yyval.expr) = NULL; ;} break; case 82: /* Line 1455 of yacc.c */ -#line 495 "parser.y" +#line 494 "parser.y" { (yyval.expr) = (yyvsp[(1) - (1)].expr); ;} break; case 83: /* Line 1455 of yacc.c */ -#line 500 "parser.y" +#line 497 "parser.y" { (yyval.expr) = (yyvsp[(1) - (1)].expr); ;} break; case 84: /* Line 1455 of yacc.c */ -#line 502 "parser.y" - { (yyval.expr) = new_binary_expression(ctx, EXPR_COMMA, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;} +#line 498 "parser.y" + { set_error(ctx, IDS_SYNTAX_ERROR); YYABORT; ;} break; case 85: /* Line 1455 of yacc.c */ -#line 506 "parser.y" +#line 502 "parser.y" { (yyval.expr) = (yyvsp[(1) - (1)].expr); ;} break; case 86: /* Line 1455 of yacc.c */ -#line 508 "parser.y" - { (yyval.expr) = new_binary_expression(ctx, EXPR_ASSIGN, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;} +#line 504 "parser.y" + { (yyval.expr) = new_binary_expression(ctx, EXPR_COMMA, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;} break; case 87: /* Line 1455 of yacc.c */ -#line 510 "parser.y" - { (yyval.expr) = new_binary_expression(ctx, (yyvsp[(2) - (3)].ival), (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;} +#line 508 "parser.y" + { (yyval.expr) = NULL; ;} break; case 88: /* Line 1455 of yacc.c */ -#line 515 "parser.y" +#line 509 "parser.y" { (yyval.expr) = (yyvsp[(1) - (1)].expr); ;} break; case 89: /* Line 1455 of yacc.c */ -#line 517 "parser.y" - { (yyval.expr) = new_binary_expression(ctx, EXPR_ASSIGN, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;} +#line 514 "parser.y" + { (yyval.expr) = (yyvsp[(1) - (1)].expr); ;} break; case 90: /* Line 1455 of yacc.c */ -#line 519 "parser.y" - { (yyval.expr) = new_binary_expression(ctx, (yyvsp[(2) - (3)].ival), (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;} +#line 516 "parser.y" + { (yyval.expr) = new_binary_expression(ctx, EXPR_COMMA, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;} break; case 91: /* Line 1455 of yacc.c */ -#line 523 "parser.y" +#line 520 "parser.y" { (yyval.expr) = (yyvsp[(1) - (1)].expr); ;} break; case 92: /* Line 1455 of yacc.c */ -#line 525 "parser.y" - { (yyval.expr) = new_conditional_expression(ctx, (yyvsp[(1) - (5)].expr), (yyvsp[(3) - (5)].expr), (yyvsp[(5) - (5)].expr)); ;} +#line 522 "parser.y" + { (yyval.expr) = new_binary_expression(ctx, EXPR_ASSIGN, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;} break; case 93: /* Line 1455 of yacc.c */ -#line 530 "parser.y" - { (yyval.expr) = (yyvsp[(1) - (1)].expr); ;} +#line 524 "parser.y" + { (yyval.expr) = new_binary_expression(ctx, (yyvsp[(2) - (3)].ival), (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;} break; case 94: /* Line 1455 of yacc.c */ -#line 532 "parser.y" - { (yyval.expr) = new_conditional_expression(ctx, (yyvsp[(1) - (5)].expr), (yyvsp[(3) - (5)].expr), (yyvsp[(5) - (5)].expr)); ;} +#line 529 "parser.y" + { (yyval.expr) = (yyvsp[(1) - (1)].expr); ;} break; case 95: /* Line 1455 of yacc.c */ -#line 536 "parser.y" - { (yyval.expr) = (yyvsp[(1) - (1)].expr); ;} +#line 531 "parser.y" + { (yyval.expr) = new_binary_expression(ctx, EXPR_ASSIGN, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;} break; case 96: /* Line 1455 of yacc.c */ -#line 538 "parser.y" - { (yyval.expr) = new_binary_expression(ctx, EXPR_OR, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;} +#line 533 "parser.y" + { (yyval.expr) = new_binary_expression(ctx, (yyvsp[(2) - (3)].ival), (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;} break; case 97: /* Line 1455 of yacc.c */ -#line 543 "parser.y" +#line 537 "parser.y" { (yyval.expr) = (yyvsp[(1) - (1)].expr); ;} break; case 98: /* Line 1455 of yacc.c */ -#line 545 "parser.y" - { (yyval.expr) = new_binary_expression(ctx, EXPR_OR, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;} +#line 539 "parser.y" + { (yyval.expr) = new_conditional_expression(ctx, (yyvsp[(1) - (5)].expr), (yyvsp[(3) - (5)].expr), (yyvsp[(5) - (5)].expr)); ;} break; case 99: /* Line 1455 of yacc.c */ -#line 549 "parser.y" +#line 544 "parser.y" { (yyval.expr) = (yyvsp[(1) - (1)].expr); ;} break; case 100: /* Line 1455 of yacc.c */ -#line 551 "parser.y" - { (yyval.expr) = new_binary_expression(ctx, EXPR_AND, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;} +#line 546 "parser.y" + { (yyval.expr) = new_conditional_expression(ctx, (yyvsp[(1) - (5)].expr), (yyvsp[(3) - (5)].expr), (yyvsp[(5) - (5)].expr)); ;} break; case 101: /* Line 1455 of yacc.c */ -#line 556 "parser.y" +#line 550 "parser.y" { (yyval.expr) = (yyvsp[(1) - (1)].expr); ;} break; case 102: /* Line 1455 of yacc.c */ -#line 558 "parser.y" - { (yyval.expr) = new_binary_expression(ctx, EXPR_AND, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;} +#line 552 "parser.y" + { (yyval.expr) = new_binary_expression(ctx, EXPR_OR, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;} break; case 103: /* Line 1455 of yacc.c */ -#line 562 "parser.y" +#line 557 "parser.y" { (yyval.expr) = (yyvsp[(1) - (1)].expr); ;} break; case 104: /* Line 1455 of yacc.c */ -#line 564 "parser.y" - { (yyval.expr) = new_binary_expression(ctx, EXPR_BOR, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;} +#line 559 "parser.y" + { (yyval.expr) = new_binary_expression(ctx, EXPR_OR, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;} break; case 105: /* Line 1455 of yacc.c */ -#line 569 "parser.y" +#line 563 "parser.y" { (yyval.expr) = (yyvsp[(1) - (1)].expr); ;} break; case 106: /* Line 1455 of yacc.c */ -#line 571 "parser.y" - { (yyval.expr) = new_binary_expression(ctx, EXPR_BOR, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;} +#line 565 "parser.y" + { (yyval.expr) = new_binary_expression(ctx, EXPR_AND, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;} break; case 107: /* Line 1455 of yacc.c */ -#line 575 "parser.y" +#line 570 "parser.y" { (yyval.expr) = (yyvsp[(1) - (1)].expr); ;} break; case 108: /* Line 1455 of yacc.c */ -#line 577 "parser.y" - { (yyval.expr) = new_binary_expression(ctx, EXPR_BXOR, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;} +#line 572 "parser.y" + { (yyval.expr) = new_binary_expression(ctx, EXPR_AND, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;} break; case 109: /* Line 1455 of yacc.c */ -#line 582 "parser.y" +#line 576 "parser.y" { (yyval.expr) = (yyvsp[(1) - (1)].expr); ;} break; case 110: /* Line 1455 of yacc.c */ -#line 584 "parser.y" - { (yyval.expr) = new_binary_expression(ctx, EXPR_BXOR, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;} +#line 578 "parser.y" + { (yyval.expr) = new_binary_expression(ctx, EXPR_BOR, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;} break; case 111: /* Line 1455 of yacc.c */ -#line 588 "parser.y" +#line 583 "parser.y" { (yyval.expr) = (yyvsp[(1) - (1)].expr); ;} break; case 112: /* Line 1455 of yacc.c */ -#line 590 "parser.y" - { (yyval.expr) = new_binary_expression(ctx, EXPR_BAND, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;} +#line 585 "parser.y" + { (yyval.expr) = new_binary_expression(ctx, EXPR_BOR, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;} break; case 113: /* Line 1455 of yacc.c */ -#line 595 "parser.y" +#line 589 "parser.y" { (yyval.expr) = (yyvsp[(1) - (1)].expr); ;} break; case 114: /* Line 1455 of yacc.c */ -#line 597 "parser.y" - { (yyval.expr) = new_binary_expression(ctx, EXPR_BAND, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;} +#line 591 "parser.y" + { (yyval.expr) = new_binary_expression(ctx, EXPR_BXOR, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;} break; case 115: /* Line 1455 of yacc.c */ -#line 601 "parser.y" +#line 596 "parser.y" { (yyval.expr) = (yyvsp[(1) - (1)].expr); ;} break; case 116: /* Line 1455 of yacc.c */ -#line 603 "parser.y" - { (yyval.expr) = new_binary_expression(ctx, (yyvsp[(2) - (3)].ival), (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;} +#line 598 "parser.y" + { (yyval.expr) = new_binary_expression(ctx, EXPR_BXOR, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;} break; case 117: /* Line 1455 of yacc.c */ -#line 607 "parser.y" +#line 602 "parser.y" { (yyval.expr) = (yyvsp[(1) - (1)].expr); ;} break; case 118: /* Line 1455 of yacc.c */ -#line 609 "parser.y" - { (yyval.expr) = new_binary_expression(ctx, (yyvsp[(2) - (3)].ival), (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;} +#line 604 "parser.y" + { (yyval.expr) = new_binary_expression(ctx, EXPR_BAND, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;} break; case 119: /* Line 1455 of yacc.c */ -#line 613 "parser.y" +#line 609 "parser.y" { (yyval.expr) = (yyvsp[(1) - (1)].expr); ;} break; case 120: /* Line 1455 of yacc.c */ -#line 615 "parser.y" - { (yyval.expr) = new_binary_expression(ctx, (yyvsp[(2) - (3)].ival), (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;} +#line 611 "parser.y" + { (yyval.expr) = new_binary_expression(ctx, EXPR_BAND, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;} break; case 121: /* Line 1455 of yacc.c */ -#line 617 "parser.y" - { (yyval.expr) = new_binary_expression(ctx, EXPR_INSTANCEOF, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;} +#line 615 "parser.y" + { (yyval.expr) = (yyvsp[(1) - (1)].expr); ;} break; case 122: /* Line 1455 of yacc.c */ -#line 619 "parser.y" - { (yyval.expr) = new_binary_expression(ctx, EXPR_IN, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;} +#line 617 "parser.y" + { (yyval.expr) = new_binary_expression(ctx, (yyvsp[(2) - (3)].ival), (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;} break; case 123: /* Line 1455 of yacc.c */ -#line 623 "parser.y" +#line 621 "parser.y" { (yyval.expr) = (yyvsp[(1) - (1)].expr); ;} break; case 124: /* Line 1455 of yacc.c */ -#line 625 "parser.y" +#line 623 "parser.y" { (yyval.expr) = new_binary_expression(ctx, (yyvsp[(2) - (3)].ival), (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;} break; @@ -2840,525 +2870,588 @@ yyreduce: /* Line 1455 of yacc.c */ #line 627 "parser.y" - { (yyval.expr) = new_binary_expression(ctx, EXPR_INSTANCEOF, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;} + { (yyval.expr) = (yyvsp[(1) - (1)].expr); ;} break; case 126: /* Line 1455 of yacc.c */ -#line 631 "parser.y" - { (yyval.expr) = (yyvsp[(1) - (1)].expr); ;} +#line 629 "parser.y" + { (yyval.expr) = new_binary_expression(ctx, (yyvsp[(2) - (3)].ival), (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;} break; case 127: /* Line 1455 of yacc.c */ -#line 633 "parser.y" - { (yyval.expr) = new_binary_expression(ctx, (yyvsp[(2) - (3)].ival), (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;} +#line 631 "parser.y" + { (yyval.expr) = new_binary_expression(ctx, EXPR_INSTANCEOF, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;} break; case 128: /* Line 1455 of yacc.c */ -#line 638 "parser.y" - { (yyval.expr) = (yyvsp[(1) - (1)].expr); ;} +#line 633 "parser.y" + { (yyval.expr) = new_binary_expression(ctx, EXPR_IN, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;} break; case 129: /* Line 1455 of yacc.c */ -#line 640 "parser.y" - { (yyval.expr) = new_binary_expression(ctx, EXPR_ADD, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;} +#line 637 "parser.y" + { (yyval.expr) = (yyvsp[(1) - (1)].expr); ;} break; case 130: /* Line 1455 of yacc.c */ -#line 642 "parser.y" - { (yyval.expr) = new_binary_expression(ctx, EXPR_SUB, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;} +#line 639 "parser.y" + { (yyval.expr) = new_binary_expression(ctx, (yyvsp[(2) - (3)].ival), (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;} break; case 131: /* Line 1455 of yacc.c */ -#line 646 "parser.y" - { (yyval.expr) = (yyvsp[(1) - (1)].expr); ;} +#line 641 "parser.y" + { (yyval.expr) = new_binary_expression(ctx, EXPR_INSTANCEOF, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;} break; case 132: /* Line 1455 of yacc.c */ -#line 648 "parser.y" - { (yyval.expr) = new_binary_expression(ctx, EXPR_MUL, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;} +#line 645 "parser.y" + { (yyval.expr) = (yyvsp[(1) - (1)].expr); ;} break; case 133: /* Line 1455 of yacc.c */ -#line 650 "parser.y" - { (yyval.expr) = new_binary_expression(ctx, EXPR_DIV, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;} +#line 647 "parser.y" + { (yyval.expr) = new_binary_expression(ctx, (yyvsp[(2) - (3)].ival), (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;} break; case 134: /* Line 1455 of yacc.c */ #line 652 "parser.y" - { (yyval.expr) = new_binary_expression(ctx, EXPR_MOD, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;} + { (yyval.expr) = (yyvsp[(1) - (1)].expr); ;} break; case 135: /* Line 1455 of yacc.c */ -#line 656 "parser.y" - { (yyval.expr) = (yyvsp[(1) - (1)].expr); ;} +#line 654 "parser.y" + { (yyval.expr) = new_binary_expression(ctx, EXPR_ADD, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;} break; case 136: /* Line 1455 of yacc.c */ -#line 658 "parser.y" - { (yyval.expr) = new_unary_expression(ctx, EXPR_DELETE, (yyvsp[(2) - (2)].expr)); ;} +#line 656 "parser.y" + { (yyval.expr) = new_binary_expression(ctx, EXPR_SUB, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;} break; case 137: /* Line 1455 of yacc.c */ -#line 659 "parser.y" - { (yyval.expr) = new_unary_expression(ctx, EXPR_VOID, (yyvsp[(2) - (2)].expr)); ;} +#line 660 "parser.y" + { (yyval.expr) = (yyvsp[(1) - (1)].expr); ;} break; case 138: /* Line 1455 of yacc.c */ -#line 661 "parser.y" - { (yyval.expr) = new_unary_expression(ctx, EXPR_TYPEOF, (yyvsp[(2) - (2)].expr)); ;} +#line 662 "parser.y" + { (yyval.expr) = new_binary_expression(ctx, EXPR_MUL, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;} break; case 139: /* Line 1455 of yacc.c */ -#line 662 "parser.y" - { (yyval.expr) = new_unary_expression(ctx, EXPR_PREINC, (yyvsp[(2) - (2)].expr)); ;} +#line 664 "parser.y" + { (yyval.expr) = new_binary_expression(ctx, EXPR_DIV, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;} break; case 140: /* Line 1455 of yacc.c */ -#line 663 "parser.y" - { (yyval.expr) = new_unary_expression(ctx, EXPR_PREDEC, (yyvsp[(2) - (2)].expr)); ;} +#line 666 "parser.y" + { (yyval.expr) = new_binary_expression(ctx, EXPR_MOD, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;} break; case 141: /* Line 1455 of yacc.c */ -#line 664 "parser.y" - { (yyval.expr) = new_unary_expression(ctx, EXPR_PLUS, (yyvsp[(2) - (2)].expr)); ;} +#line 670 "parser.y" + { (yyval.expr) = (yyvsp[(1) - (1)].expr); ;} break; case 142: /* Line 1455 of yacc.c */ -#line 665 "parser.y" - { (yyval.expr) = new_unary_expression(ctx, EXPR_MINUS, (yyvsp[(2) - (2)].expr)); ;} +#line 672 "parser.y" + { (yyval.expr) = new_unary_expression(ctx, EXPR_DELETE, (yyvsp[(2) - (2)].expr)); ;} break; case 143: /* Line 1455 of yacc.c */ -#line 666 "parser.y" - { (yyval.expr) = new_unary_expression(ctx, EXPR_BITNEG, (yyvsp[(2) - (2)].expr)); ;} +#line 673 "parser.y" + { (yyval.expr) = new_unary_expression(ctx, EXPR_VOID, (yyvsp[(2) - (2)].expr)); ;} break; case 144: /* Line 1455 of yacc.c */ -#line 667 "parser.y" - { (yyval.expr) = new_unary_expression(ctx, EXPR_LOGNEG, (yyvsp[(2) - (2)].expr)); ;} +#line 675 "parser.y" + { (yyval.expr) = new_unary_expression(ctx, EXPR_TYPEOF, (yyvsp[(2) - (2)].expr)); ;} break; case 145: /* Line 1455 of yacc.c */ -#line 672 "parser.y" - { (yyval.expr) = (yyvsp[(1) - (1)].expr); ;} +#line 676 "parser.y" + { (yyval.expr) = new_unary_expression(ctx, EXPR_PREINC, (yyvsp[(2) - (2)].expr)); ;} break; case 146: /* Line 1455 of yacc.c */ -#line 674 "parser.y" - { (yyval.expr) = new_unary_expression(ctx, EXPR_POSTINC, (yyvsp[(1) - (2)].expr)); ;} +#line 677 "parser.y" + { (yyval.expr) = new_unary_expression(ctx, EXPR_PREDEC, (yyvsp[(2) - (2)].expr)); ;} break; case 147: /* Line 1455 of yacc.c */ -#line 676 "parser.y" - { (yyval.expr) = new_unary_expression(ctx, EXPR_POSTDEC, (yyvsp[(1) - (2)].expr)); ;} +#line 678 "parser.y" + { (yyval.expr) = new_unary_expression(ctx, EXPR_PLUS, (yyvsp[(2) - (2)].expr)); ;} break; case 148: /* Line 1455 of yacc.c */ -#line 681 "parser.y" - { (yyval.expr) = (yyvsp[(1) - (1)].expr); ;} +#line 679 "parser.y" + { (yyval.expr) = new_unary_expression(ctx, EXPR_MINUS, (yyvsp[(2) - (2)].expr)); ;} break; case 149: /* Line 1455 of yacc.c */ -#line 682 "parser.y" - { (yyval.expr) = (yyvsp[(1) - (1)].expr); ;} +#line 680 "parser.y" + { (yyval.expr) = new_unary_expression(ctx, EXPR_BITNEG, (yyvsp[(2) - (2)].expr)); ;} break; case 150: +/* Line 1455 of yacc.c */ +#line 681 "parser.y" + { (yyval.expr) = new_unary_expression(ctx, EXPR_LOGNEG, (yyvsp[(2) - (2)].expr)); ;} + break; + + case 151: + /* Line 1455 of yacc.c */ #line 686 "parser.y" { (yyval.expr) = (yyvsp[(1) - (1)].expr); ;} break; - case 151: - -/* Line 1455 of yacc.c */ -#line 687 "parser.y" - { (yyval.expr) = new_new_expression(ctx, (yyvsp[(2) - (2)].expr), NULL); ;} - break; - case 152: /* Line 1455 of yacc.c */ -#line 691 "parser.y" - { (yyval.expr) = (yyvsp[(1) - (1)].expr); ;} +#line 688 "parser.y" + { (yyval.expr) = new_unary_expression(ctx, EXPR_POSTINC, (yyvsp[(1) - (2)].expr)); ;} break; case 153: /* Line 1455 of yacc.c */ -#line 692 "parser.y" - { (yyval.expr) = (yyvsp[(1) - (1)].expr); ;} +#line 690 "parser.y" + { (yyval.expr) = new_unary_expression(ctx, EXPR_POSTDEC, (yyvsp[(1) - (2)].expr)); ;} break; case 154: /* Line 1455 of yacc.c */ -#line 694 "parser.y" - { (yyval.expr) = new_array_expression(ctx, (yyvsp[(1) - (4)].expr), (yyvsp[(3) - (4)].expr)); ;} +#line 695 "parser.y" + { (yyval.expr) = (yyvsp[(1) - (1)].expr); ;} break; case 155: /* Line 1455 of yacc.c */ #line 696 "parser.y" - { (yyval.expr) = new_member_expression(ctx, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].identifier)); ;} + { (yyval.expr) = (yyvsp[(1) - (1)].expr); ;} break; case 156: /* Line 1455 of yacc.c */ -#line 698 "parser.y" - { (yyval.expr) = new_new_expression(ctx, (yyvsp[(2) - (3)].expr), (yyvsp[(3) - (3)].argument_list)); ;} +#line 700 "parser.y" + { (yyval.expr) = (yyvsp[(1) - (1)].expr); ;} break; case 157: /* Line 1455 of yacc.c */ -#line 703 "parser.y" - { (yyval.expr) = new_call_expression(ctx, (yyvsp[(1) - (2)].expr), (yyvsp[(2) - (2)].argument_list)); ;} +#line 701 "parser.y" + { (yyval.expr) = new_new_expression(ctx, (yyvsp[(2) - (2)].expr), NULL); ;} break; case 158: /* Line 1455 of yacc.c */ #line 705 "parser.y" - { (yyval.expr) = new_call_expression(ctx, (yyvsp[(1) - (2)].expr), (yyvsp[(2) - (2)].argument_list)); ;} + { (yyval.expr) = (yyvsp[(1) - (1)].expr); ;} break; case 159: /* Line 1455 of yacc.c */ -#line 707 "parser.y" - { (yyval.expr) = new_array_expression(ctx, (yyvsp[(1) - (4)].expr), (yyvsp[(3) - (4)].expr)); ;} +#line 706 "parser.y" + { (yyval.expr) = (yyvsp[(1) - (1)].expr); ;} break; case 160: /* Line 1455 of yacc.c */ -#line 709 "parser.y" - { (yyval.expr) = new_member_expression(ctx, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].identifier)); ;} +#line 708 "parser.y" + { (yyval.expr) = new_array_expression(ctx, (yyvsp[(1) - (4)].expr), (yyvsp[(3) - (4)].expr)); ;} break; case 161: /* Line 1455 of yacc.c */ -#line 713 "parser.y" - { (yyval.argument_list) = NULL; ;} +#line 710 "parser.y" + { (yyval.expr) = new_member_expression(ctx, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].identifier)); ;} break; case 162: /* Line 1455 of yacc.c */ -#line 714 "parser.y" - { (yyval.argument_list) = (yyvsp[(2) - (3)].argument_list); ;} +#line 712 "parser.y" + { (yyval.expr) = new_new_expression(ctx, (yyvsp[(2) - (3)].expr), (yyvsp[(3) - (3)].argument_list)); ;} break; case 163: /* Line 1455 of yacc.c */ -#line 718 "parser.y" - { (yyval.argument_list) = new_argument_list(ctx, (yyvsp[(1) - (1)].expr)); ;} +#line 717 "parser.y" + { (yyval.expr) = new_call_expression(ctx, (yyvsp[(1) - (2)].expr), (yyvsp[(2) - (2)].argument_list)); ;} break; case 164: /* Line 1455 of yacc.c */ -#line 720 "parser.y" - { (yyval.argument_list) = argument_list_add(ctx, (yyvsp[(1) - (3)].argument_list), (yyvsp[(3) - (3)].expr)); ;} +#line 719 "parser.y" + { (yyval.expr) = new_call_expression(ctx, (yyvsp[(1) - (2)].expr), (yyvsp[(2) - (2)].argument_list)); ;} break; case 165: /* Line 1455 of yacc.c */ -#line 724 "parser.y" - { (yyval.expr) = new_this_expression(ctx); ;} +#line 721 "parser.y" + { (yyval.expr) = new_array_expression(ctx, (yyvsp[(1) - (4)].expr), (yyvsp[(3) - (4)].expr)); ;} break; case 166: /* Line 1455 of yacc.c */ -#line 725 "parser.y" - { (yyval.expr) = new_identifier_expression(ctx, (yyvsp[(1) - (1)].identifier)); ;} +#line 723 "parser.y" + { (yyval.expr) = new_member_expression(ctx, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].identifier)); ;} break; case 167: /* Line 1455 of yacc.c */ -#line 726 "parser.y" - { (yyval.expr) = new_literal_expression(ctx, (yyvsp[(1) - (1)].literal)); ;} +#line 727 "parser.y" + { (yyval.argument_list) = NULL; ;} break; case 168: /* Line 1455 of yacc.c */ -#line 727 "parser.y" - { (yyval.expr) = (yyvsp[(1) - (1)].expr); ;} +#line 728 "parser.y" + { (yyval.argument_list) = (yyvsp[(2) - (3)].argument_list); ;} break; case 169: /* Line 1455 of yacc.c */ -#line 728 "parser.y" - { (yyval.expr) = (yyvsp[(1) - (1)].expr); ;} +#line 732 "parser.y" + { (yyval.argument_list) = new_argument_list(ctx, (yyvsp[(1) - (1)].expr)); ;} break; case 170: /* Line 1455 of yacc.c */ -#line 729 "parser.y" - { (yyval.expr) = (yyvsp[(2) - (3)].expr); ;} +#line 734 "parser.y" + { (yyval.argument_list) = argument_list_add(ctx, (yyvsp[(1) - (3)].argument_list), (yyvsp[(3) - (3)].expr)); ;} break; case 171: /* Line 1455 of yacc.c */ -#line 733 "parser.y" - { (yyval.expr) = new_array_literal_expression(ctx, NULL, 0); ;} +#line 738 "parser.y" + { (yyval.expr) = new_this_expression(ctx); ;} break; case 172: /* Line 1455 of yacc.c */ -#line 734 "parser.y" - { (yyval.expr) = new_array_literal_expression(ctx, NULL, (yyvsp[(2) - (3)].ival)+1); ;} +#line 739 "parser.y" + { (yyval.expr) = new_identifier_expression(ctx, (yyvsp[(1) - (1)].identifier)); ;} break; case 173: /* Line 1455 of yacc.c */ -#line 735 "parser.y" - { (yyval.expr) = new_array_literal_expression(ctx, (yyvsp[(2) - (3)].element_list), 0); ;} +#line 740 "parser.y" + { (yyval.expr) = new_literal_expression(ctx, (yyvsp[(1) - (1)].literal)); ;} break; case 174: /* Line 1455 of yacc.c */ -#line 737 "parser.y" - { (yyval.expr) = new_array_literal_expression(ctx, (yyvsp[(2) - (5)].element_list), (yyvsp[(4) - (5)].ival)+1); ;} +#line 741 "parser.y" + { (yyval.expr) = (yyvsp[(1) - (1)].expr); ;} break; case 175: /* Line 1455 of yacc.c */ #line 742 "parser.y" - { (yyval.element_list) = new_element_list(ctx, (yyvsp[(1) - (2)].ival), (yyvsp[(2) - (2)].expr)); ;} + { (yyval.expr) = (yyvsp[(1) - (1)].expr); ;} break; case 176: /* Line 1455 of yacc.c */ -#line 744 "parser.y" - { (yyval.element_list) = element_list_add(ctx, (yyvsp[(1) - (4)].element_list), (yyvsp[(3) - (4)].ival), (yyvsp[(4) - (4)].expr)); ;} +#line 743 "parser.y" + { (yyval.expr) = (yyvsp[(2) - (3)].expr); ;} break; case 177: /* Line 1455 of yacc.c */ -#line 748 "parser.y" - { (yyval.ival) = 1; ;} +#line 747 "parser.y" + { (yyval.expr) = new_array_literal_expression(ctx, NULL, 0); ;} break; case 178: /* Line 1455 of yacc.c */ -#line 749 "parser.y" - { (yyval.ival) = (yyvsp[(1) - (2)].ival) + 1; ;} +#line 748 "parser.y" + { (yyval.expr) = new_array_literal_expression(ctx, NULL, (yyvsp[(2) - (3)].ival)+1); ;} break; case 179: /* Line 1455 of yacc.c */ -#line 753 "parser.y" - { (yyval.ival) = 0; ;} +#line 749 "parser.y" + { (yyval.expr) = new_array_literal_expression(ctx, (yyvsp[(2) - (3)].element_list), 0); ;} break; case 180: /* Line 1455 of yacc.c */ -#line 754 "parser.y" - { (yyval.ival) = (yyvsp[(1) - (1)].ival); ;} +#line 751 "parser.y" + { (yyval.expr) = new_array_literal_expression(ctx, (yyvsp[(2) - (5)].element_list), (yyvsp[(4) - (5)].ival)+1); ;} break; case 181: /* Line 1455 of yacc.c */ -#line 758 "parser.y" - { (yyval.expr) = new_prop_and_value_expression(ctx, NULL); ;} +#line 756 "parser.y" + { (yyval.element_list) = new_element_list(ctx, (yyvsp[(1) - (2)].ival), (yyvsp[(2) - (2)].expr)); ;} break; case 182: /* Line 1455 of yacc.c */ -#line 760 "parser.y" - { (yyval.expr) = new_prop_and_value_expression(ctx, (yyvsp[(2) - (3)].property_list)); ;} +#line 758 "parser.y" + { (yyval.element_list) = element_list_add(ctx, (yyvsp[(1) - (4)].element_list), (yyvsp[(3) - (4)].ival), (yyvsp[(4) - (4)].expr)); ;} break; case 183: /* Line 1455 of yacc.c */ -#line 765 "parser.y" - { (yyval.property_list) = new_property_list(ctx, (yyvsp[(1) - (3)].literal), (yyvsp[(3) - (3)].expr)); ;} +#line 762 "parser.y" + { (yyval.ival) = 1; ;} break; case 184: /* Line 1455 of yacc.c */ -#line 767 "parser.y" - { (yyval.property_list) = property_list_add(ctx, (yyvsp[(1) - (5)].property_list), (yyvsp[(3) - (5)].literal), (yyvsp[(5) - (5)].expr)); ;} +#line 763 "parser.y" + { (yyval.ival) = (yyvsp[(1) - (2)].ival) + 1; ;} break; case 185: /* Line 1455 of yacc.c */ -#line 771 "parser.y" - { (yyval.literal) = new_string_literal(ctx, (yyvsp[(1) - (1)].identifier)); ;} +#line 767 "parser.y" + { (yyval.ival) = 0; ;} break; case 186: /* Line 1455 of yacc.c */ -#line 772 "parser.y" - { (yyval.literal) = new_string_literal(ctx, (yyvsp[(1) - (1)].wstr)); ;} +#line 768 "parser.y" + { (yyval.ival) = (yyvsp[(1) - (1)].ival); ;} break; case 187: /* Line 1455 of yacc.c */ -#line 773 "parser.y" - { (yyval.literal) = (yyvsp[(1) - (1)].literal); ;} +#line 772 "parser.y" + { (yyval.expr) = new_prop_and_value_expression(ctx, NULL); ;} break; case 188: /* Line 1455 of yacc.c */ -#line 777 "parser.y" - { (yyval.identifier) = NULL; ;} +#line 774 "parser.y" + { (yyval.expr) = new_prop_and_value_expression(ctx, (yyvsp[(2) - (3)].property_list)); ;} break; case 189: /* Line 1455 of yacc.c */ -#line 778 "parser.y" - { (yyval.identifier) = (yyvsp[(1) - (1)].identifier); ;} +#line 779 "parser.y" + { (yyval.property_list) = new_property_list(ctx, (yyvsp[(1) - (3)].literal), (yyvsp[(3) - (3)].expr)); ;} break; case 190: /* Line 1455 of yacc.c */ -#line 782 "parser.y" - { (yyval.literal) = new_null_literal(ctx); ;} +#line 781 "parser.y" + { (yyval.property_list) = property_list_add(ctx, (yyvsp[(1) - (5)].property_list), (yyvsp[(3) - (5)].literal), (yyvsp[(5) - (5)].expr)); ;} break; case 191: /* Line 1455 of yacc.c */ -#line 783 "parser.y" - { (yyval.literal) = new_undefined_literal(ctx); ;} +#line 785 "parser.y" + { (yyval.literal) = new_string_literal(ctx, (yyvsp[(1) - (1)].identifier)); ;} break; case 192: -/* Line 1455 of yacc.c */ -#line 784 "parser.y" - { (yyval.literal) = (yyvsp[(1) - (1)].literal); ;} - break; - - case 193: - -/* Line 1455 of yacc.c */ -#line 785 "parser.y" - { (yyval.literal) = (yyvsp[(1) - (1)].literal); ;} - break; - - case 194: - /* Line 1455 of yacc.c */ #line 786 "parser.y" { (yyval.literal) = new_string_literal(ctx, (yyvsp[(1) - (1)].wstr)); ;} break; - case 195: + case 193: /* Line 1455 of yacc.c */ #line 787 "parser.y" - { (yyval.literal) = parse_regexp(ctx); - if(!(yyval.literal)) YYABORT; ;} + { (yyval.literal) = (yyvsp[(1) - (1)].literal); ;} + break; + + case 194: + +/* Line 1455 of yacc.c */ +#line 791 "parser.y" + { (yyval.identifier) = NULL; ;} + break; + + case 195: + +/* Line 1455 of yacc.c */ +#line 792 "parser.y" + { (yyval.identifier) = (yyvsp[(1) - (1)].identifier); ;} break; case 196: /* Line 1455 of yacc.c */ -#line 792 "parser.y" - { (yyval.literal) = new_boolean_literal(ctx, TRUE); ;} +#line 796 "parser.y" + { (yyval.literal) = new_null_literal(ctx); ;} break; case 197: /* Line 1455 of yacc.c */ -#line 793 "parser.y" - { (yyval.literal) = new_boolean_literal(ctx, FALSE); ;} +#line 797 "parser.y" + { (yyval.literal) = new_undefined_literal(ctx); ;} + break; + + case 198: + +/* Line 1455 of yacc.c */ +#line 798 "parser.y" + { (yyval.literal) = (yyvsp[(1) - (1)].literal); ;} break; case 199: /* Line 1455 of yacc.c */ -#line 797 "parser.y" +#line 799 "parser.y" + { (yyval.literal) = (yyvsp[(1) - (1)].literal); ;} + break; + + case 200: + +/* Line 1455 of yacc.c */ +#line 800 "parser.y" + { (yyval.literal) = new_string_literal(ctx, (yyvsp[(1) - (1)].wstr)); ;} + break; + + case 201: + +/* Line 1455 of yacc.c */ +#line 801 "parser.y" + { (yyval.literal) = parse_regexp(ctx); + if(!(yyval.literal)) YYABORT; ;} + break; + + case 202: + +/* Line 1455 of yacc.c */ +#line 806 "parser.y" + { (yyval.literal) = new_boolean_literal(ctx, TRUE); ;} + break; + + case 203: + +/* Line 1455 of yacc.c */ +#line 807 "parser.y" + { (yyval.literal) = new_boolean_literal(ctx, FALSE); ;} + break; + + case 205: + +/* Line 1455 of yacc.c */ +#line 811 "parser.y" { if(!allow_auto_semicolon(ctx)) {YYABORT;} ;} break; + case 207: + +/* Line 1455 of yacc.c */ +#line 815 "parser.y" + { set_error(ctx, IDS_LBRACKET); YYABORT; ;} + break; + + case 209: + +/* Line 1455 of yacc.c */ +#line 819 "parser.y" + { set_error(ctx, IDS_RBRACKET); YYABORT; ;} + break; + + case 211: + +/* Line 1455 of yacc.c */ +#line 823 "parser.y" + { set_error(ctx, IDS_SEMICOLON); YYABORT; ;} + break; + /* Line 1455 of yacc.c */ -#line 3362 "parser.tab.c" +#line 3455 "parser.tab.c" default: break; } YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc); @@ -3570,7 +3663,7 @@ yyreturn: /* Line 1675 of yacc.c */ -#line 799 "parser.y" +#line 825 "parser.y" static BOOL allow_auto_semicolon(parser_ctx_t *ctx) @@ -4209,6 +4302,20 @@ static int parser_error(const char *str) return 0; } +static void set_error(parser_ctx_t *ctx, UINT error) +{ + ctx->hres = JSCRIPT_ERROR|error; +} + +static BOOL explicit_error(parser_ctx_t *ctx, void *obj, WCHAR next) +{ + if(obj || *(ctx->ptr-1)==next) return TRUE; + + set_error(ctx, IDS_SYNTAX_ERROR); + return FALSE; +} + + static expression_t *new_identifier_expression(parser_ctx_t *ctx, const WCHAR *identifier) { identifier_expression_t *ret = parser_alloc(ctx, sizeof(identifier_expression_t)); @@ -4312,7 +4419,8 @@ static void program_parsed(parser_ctx_t *ctx, source_elements_t *source) pop_func(ctx); ctx->source = source; - ctx->hres = S_OK; + if(!ctx->lexer_error) + ctx->hres = S_OK; } void parser_release(parser_ctx_t *ctx) @@ -4343,7 +4451,7 @@ HRESULT script_parse(script_ctx_t *ctx, const WCHAR *code, const WCHAR *delimite return E_OUTOFMEMORY; parser_ctx->ref = 1; - parser_ctx->hres = E_FAIL; + parser_ctx->hres = JSCRIPT_ERROR|IDS_SYNTAX_ERROR; parser_ctx->is_html = delimiter && !strcmpiW(delimiter, html_tagW); parser_ctx->begin = parser_ctx->ptr = code; diff --git a/reactos/dll/win32/jscript/parser.tab.h b/reactos/dll/win32/jscript/parser.tab.h index 98b62a20aab..69ae5827db1 100644 --- a/reactos/dll/win32/jscript/parser.tab.h +++ b/reactos/dll/win32/jscript/parser.tab.h @@ -91,7 +91,7 @@ typedef union YYSTYPE { /* Line 1676 of yacc.c */ -#line 149 "parser.y" +#line 151 "parser.y" int ival; const WCHAR *srcptr; diff --git a/reactos/dll/win32/jscript/parser.y b/reactos/dll/win32/jscript/parser.y index 52a31c88a79..29d805f4df0 100644 --- a/reactos/dll/win32/jscript/parser.y +++ b/reactos/dll/win32/jscript/parser.y @@ -25,6 +25,8 @@ #define YYPARSE_PARAM ctx static int parser_error(const char*); +static void set_error(parser_ctx_t*,UINT); +static BOOL explicit_error(parser_ctx_t*,void*,WCHAR); static BOOL allow_auto_semicolon(parser_ctx_t*); static void program_parsed(parser_ctx_t*,source_elements_t*); static source_elements_t *function_body_parsed(parser_ctx_t*,source_elements_t*); @@ -200,7 +202,7 @@ static source_elements_t *source_elements_add_statement(source_elements_t*,state %type Finally %type StatementList StatementList_opt %type FormalParameterList FormalParameterList_opt -%type Expression Expression_opt +%type Expression Expression_opt Expression_err %type ExpressionNoIn ExpressionNoIn_opt %type FunctionExpression %type AssignmentExpression AssignmentExpressionNoIn @@ -266,7 +268,7 @@ SourceElements /* ECMA-262 3rd Edition 13 */ FunctionExpression - : KFunction Identifier_opt '(' FormalParameterList_opt ')' '{' FunctionBody '}' + : KFunction Identifier_opt left_bracket FormalParameterList_opt right_bracket '{' FunctionBody '}' { $$ = new_function_expression(ctx, $2, $4, $7, $1, $8-$1+1); } KFunction @@ -379,24 +381,32 @@ ExpressionStatement /* ECMA-262 3rd Edition 12.5 */ IfStatement - : kIF '(' Expression ')' Statement kELSE Statement + : kIF left_bracket Expression_err right_bracket Statement kELSE Statement { $$ = new_if_statement(ctx, $3, $5, $7); } - | kIF '(' Expression ')' Statement %prec LOWER_THAN_ELSE + | kIF left_bracket Expression_err right_bracket Statement %prec LOWER_THAN_ELSE { $$ = new_if_statement(ctx, $3, $5, NULL); } /* ECMA-262 3rd Edition 12.6 */ IterationStatement - : kDO Statement kWHILE '(' Expression ')' ';' + : kDO Statement kWHILE left_bracket Expression_err right_bracket semicolon_opt { $$ = new_while_statement(ctx, TRUE, $5, $2); } - | kWHILE '(' Expression ')' Statement + | kWHILE left_bracket Expression_err right_bracket Statement { $$ = new_while_statement(ctx, FALSE, $3, $5); } - | kFOR '(' ExpressionNoIn_opt ';' Expression_opt ';' Expression_opt ')' Statement - { $$ = new_for_statement(ctx, NULL, $3, $5, $7, $9); } - | kFOR '(' kVAR VariableDeclarationListNoIn ';' Expression_opt ';' Expression_opt ')' Statement - { $$ = new_for_statement(ctx, $4, NULL, $6, $8, $10); } - | kFOR '(' LeftHandSideExpression kIN Expression ')' Statement + | kFOR left_bracket ExpressionNoIn_opt + { if(!explicit_error(ctx, $3, ';')) YYABORT; } + semicolon Expression_opt + { if(!explicit_error(ctx, $6, ';')) YYABORT; } + semicolon Expression_opt right_bracket Statement + { $$ = new_for_statement(ctx, NULL, $3, $6, $9, $11); } + | kFOR left_bracket kVAR VariableDeclarationListNoIn + { if(!explicit_error(ctx, $4, ';')) YYABORT; } + semicolon Expression_opt + { if(!explicit_error(ctx, $7, ';')) YYABORT; } + semicolon Expression_opt right_bracket Statement + { $$ = new_for_statement(ctx, $4, NULL, $7, $10, $12); } + | kFOR left_bracket LeftHandSideExpression kIN Expression_err right_bracket Statement { $$ = new_forin_statement(ctx, NULL, $3, $5, $7); } - | kFOR '(' kVAR VariableDeclarationNoIn kIN Expression ')' Statement + | kFOR left_bracket kVAR VariableDeclarationNoIn kIN Expression_err right_bracket Statement { $$ = new_forin_statement(ctx, $4, NULL, $6, $8); } /* ECMA-262 3rd Edition 12.7 */ @@ -416,7 +426,7 @@ ReturnStatement /* ECMA-262 3rd Edition 12.10 */ WithStatement - : kWITH '(' Expression ')' Statement + : kWITH left_bracket Expression right_bracket Statement { $$ = new_with_statement(ctx, $3, $5); } /* ECMA-262 3rd Edition 12.12 */ @@ -426,8 +436,8 @@ LabelledStatement /* ECMA-262 3rd Edition 12.11 */ SwitchStatement - : kSWITCH '(' Expression ')' CaseBlock - { $$ = new_switch_statement(ctx, $3, $5); } + : kSWITCH left_bracket Expression right_bracket CaseBlock + { $$ = new_switch_statement(ctx, $3, $5); } /* ECMA-262 3rd Edition 12.11 */ CaseBlock @@ -471,8 +481,8 @@ TryStatement /* ECMA-262 3rd Edition 12.14 */ Catch - : kCATCH '(' tIdentifier ')' Block - { $$ = new_catch_block(ctx, $3, $5); } + : kCATCH left_bracket tIdentifier right_bracket Block + { $$ = new_catch_block(ctx, $3, $5); } /* ECMA-262 3rd Edition 12.14 */ Finally @@ -483,6 +493,10 @@ Expression_opt : /* empty */ { $$ = NULL; } | Expression { $$ = $1; } +Expression_err + : Expression { $$ = $1; } + | error { set_error(ctx, IDS_SYNTAX_ERROR); YYABORT; } + /* ECMA-262 3rd Edition 11.14 */ Expression : AssignmentExpression { $$ = $1; } @@ -796,6 +810,18 @@ semicolon_opt : ';' | error { if(!allow_auto_semicolon(ctx)) {YYABORT;} } +left_bracket + : '(' + | error { set_error(ctx, IDS_LBRACKET); YYABORT; } + +right_bracket + : ')' + | error { set_error(ctx, IDS_RBRACKET); YYABORT; } + +semicolon + : ';' + | error { set_error(ctx, IDS_SEMICOLON); YYABORT; } + %% static BOOL allow_auto_semicolon(parser_ctx_t *ctx) @@ -1434,6 +1460,20 @@ static int parser_error(const char *str) return 0; } +static void set_error(parser_ctx_t *ctx, UINT error) +{ + ctx->hres = JSCRIPT_ERROR|error; +} + +static BOOL explicit_error(parser_ctx_t *ctx, void *obj, WCHAR next) +{ + if(obj || *(ctx->ptr-1)==next) return TRUE; + + set_error(ctx, IDS_SYNTAX_ERROR); + return FALSE; +} + + static expression_t *new_identifier_expression(parser_ctx_t *ctx, const WCHAR *identifier) { identifier_expression_t *ret = parser_alloc(ctx, sizeof(identifier_expression_t)); @@ -1537,7 +1577,8 @@ static void program_parsed(parser_ctx_t *ctx, source_elements_t *source) pop_func(ctx); ctx->source = source; - ctx->hres = S_OK; + if(!ctx->lexer_error) + ctx->hres = S_OK; } void parser_release(parser_ctx_t *ctx) @@ -1568,7 +1609,7 @@ HRESULT script_parse(script_ctx_t *ctx, const WCHAR *code, const WCHAR *delimite return E_OUTOFMEMORY; parser_ctx->ref = 1; - parser_ctx->hres = E_FAIL; + parser_ctx->hres = JSCRIPT_ERROR|IDS_SYNTAX_ERROR; parser_ctx->is_html = delimiter && !strcmpiW(delimiter, html_tagW); parser_ctx->begin = parser_ctx->ptr = code; diff --git a/reactos/dll/win32/jscript/regexp.c b/reactos/dll/win32/jscript/regexp.c index 0acc47815c8..a4d640ef860 100644 --- a/reactos/dll/win32/jscript/regexp.c +++ b/reactos/dll/win32/jscript/regexp.c @@ -96,6 +96,7 @@ 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}; static const WCHAR emptyW[] = {0}; @@ -3505,13 +3506,29 @@ static HRESULT RegExp_exec(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS return E_NOTIMPL; } -static HRESULT RegExp_value(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, +static HRESULT RegExp_test(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp) { FIXME("\n"); return E_NOTIMPL; } +static HRESULT RegExp_value(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, + VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp) +{ + TRACE("\n"); + + switch(flags) { + case INVOKE_FUNC: + return throw_type_error(dispex->ctx, ei, IDS_NOT_FUNC, NULL); + default: + FIXME("unimplemented flags %x\n", flags); + return E_NOTIMPL; + } + + return S_OK; +} + static void RegExp_destructor(DispatchEx *dispex) { RegExpInstance *This = (RegExpInstance*)dispex; @@ -3532,6 +3549,7 @@ static const builtin_prop_t RegExp_props[] = { {multilineW, RegExp_multiline, 0}, {propertyIsEnumerableW, RegExp_propertyIsEnumerable, PROPF_METHOD}, {sourceW, RegExp_source, 0}, + {testW, RegExp_test, PROPF_METHOD}, {toLocaleStringW, RegExp_toLocaleString, PROPF_METHOD}, {toStringW, RegExp_toString, PROPF_METHOD} }; diff --git a/reactos/dll/win32/jscript/resource.h b/reactos/dll/win32/jscript/resource.h new file mode 100644 index 00000000000..f7e94b90241 --- /dev/null +++ b/reactos/dll/win32/jscript/resource.h @@ -0,0 +1,36 @@ +/* + * Copyright 2009 Piotr Caban + * + * 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 + */ + +#include + +#define IDS_TO_PRIMITIVE 0x0001 +#define IDS_INVALID_CALL_ARG 0x0005 +#define IDS_NO_PROPERTY 0x01B6 +#define IDS_ARG_NOT_OPT 0x01c1 +#define IDS_SYNTAX_ERROR 0x03EA +#define IDS_SEMICOLON 0x03EC +#define IDS_LBRACKET 0x03ED +#define IDS_RBRACKET 0x03EE +#define IDS_UNTERMINATED_STR 0x03F7 +#define IDS_NOT_FUNC 0x138A +#define IDS_NOT_DATE 0x138E +#define IDS_NOT_NUM 0x1389 +#define IDS_ILLEGAL_ASSIGN 0x1390 +#define IDS_UNDEFINED 0x1391 +#define IDS_NOT_BOOL 0x1392 +#define IDS_INVALID_LENGTH 0x13A5 diff --git a/reactos/dll/win32/jscript/rsrc.rc b/reactos/dll/win32/jscript/rsrc.rc index cb0f31a57ec..d57f83c09dc 100644 --- a/reactos/dll/win32/jscript/rsrc.rc +++ b/reactos/dll/win32/jscript/rsrc.rc @@ -21,3 +21,10 @@ REGINST REGINST jscript.inf /* @makedep: jsglobal.tlb */ 1 TYPELIB LOADONCALL DISCARDABLE jsglobal.tlb + +#include "jscript_De.rc" +#include "jscript_En.rc" +#include "jscript_Fr.rc" +#include "jscript_Lt.rc" +#include "jscript_Nl.rc" +#include "jscript_Pt.rc" diff --git a/reactos/dll/win32/jscript/string.c b/reactos/dll/win32/jscript/string.c index 9f2ab9b2f3a..6695bf893cb 100644 --- a/reactos/dll/win32/jscript/string.c +++ b/reactos/dll/win32/jscript/string.c @@ -66,6 +66,7 @@ static const WCHAR hasOwnPropertyW[] = {'h','a','s','O','w','n','P','r','o','p', 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, VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp) @@ -127,34 +128,123 @@ static HRESULT do_attributeless_tag_format(DispatchEx *dispex, LCID lcid, WORD f VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp, const WCHAR *tagname) { static const WCHAR tagfmt[] = {'<','%','s','>','%','s','<','/','%','s','>',0}; - StringInstance *string; - BSTR ret; + const WCHAR *str; + DWORD length; + BSTR val_str = NULL; + HRESULT hres; if(!is_class(dispex, JSCLASS_STRING)) { - WARN("this is not a string object\n"); - return E_NOTIMPL; + VARIANT this; + + V_VT(&this) = VT_DISPATCH; + V_DISPATCH(&this) = (IDispatch*)_IDispatchEx_(dispex); + + hres = to_string(dispex->ctx, &this, ei, &val_str); + if(FAILED(hres)) + return hres; + + str = val_str; + length = SysStringLen(val_str); + } + else { + StringInstance *this = (StringInstance*)dispex; + + str = this->str; + length = this->length; } - string = (StringInstance*)dispex; - if(retv) { - ret = SysAllocStringLen(NULL, string->length + 2*strlenW(tagname) + 5); - if(!ret) + BSTR ret = SysAllocStringLen(NULL, length + 2*strlenW(tagname) + 5); + if(!ret) { + SysFreeString(val_str); return E_OUTOFMEMORY; + } - sprintfW(ret, tagfmt, tagname, string->str, tagname); + sprintfW(ret, tagfmt, tagname, str, tagname); V_VT(retv) = VT_BSTR; V_BSTR(retv) = ret; } + + SysFreeString(val_str); + return S_OK; +} + +static HRESULT do_attribute_tag_format(DispatchEx *dispex, LCID lcid, WORD flags, + DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp, + const WCHAR *tagname, const WCHAR *attr) +{ + static const WCHAR tagfmtW[] + = {'<','%','s',' ','%','s','=','\"','%','s','\"','>','%','s','<','/','%','s','>',0}; + static const WCHAR undefinedW[] = {'u','n','d','e','f','i','n','e','d',0}; + + const WCHAR *str; + DWORD length; + BSTR attr_value, val_str = NULL; + HRESULT hres; + + if(!is_class(dispex, JSCLASS_STRING)) { + VARIANT this; + + V_VT(&this) = VT_DISPATCH; + V_DISPATCH(&this) = (IDispatch*)_IDispatchEx_(dispex); + + hres = to_string(dispex->ctx, &this, ei, &val_str); + if(FAILED(hres)) + return hres; + + str = val_str; + length = SysStringLen(val_str); + } + else { + StringInstance *this = (StringInstance*)dispex; + + str = this->str; + length = this->length; + } + + if(arg_cnt(dp)) { + hres = to_string(dispex->ctx, get_arg(dp, 0), ei, &attr_value); + if(FAILED(hres)) { + SysFreeString(val_str); + return hres; + } + } + else { + attr_value = SysAllocString(undefinedW); + if(!attr_value) { + SysFreeString(val_str); + return E_OUTOFMEMORY; + } + } + + if(retv) { + BSTR ret = SysAllocStringLen(NULL, length + 2*strlenW(tagname) + + strlenW(attr) + SysStringLen(attr_value) + 9); + if(!ret) { + SysFreeString(attr_value); + SysFreeString(val_str); + return E_OUTOFMEMORY; + } + + sprintfW(ret, tagfmtW, tagname, attr, attr_value, str, tagname); + + V_VT(retv) = VT_BSTR; + V_BSTR(retv) = ret; + } + + SysFreeString(attr_value); + SysFreeString(val_str); return S_OK; } static HRESULT String_anchor(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp) { - FIXME("\n"); - return E_NOTIMPL; + static const WCHAR fontW[] = {'A',0}; + static const WCHAR colorW[] = {'N','A','M','E',0}; + + return do_attribute_tag_format(dispex, lcid, flags, dp, retv, ei, sp, fontW, colorW); } static HRESULT String_big(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, @@ -182,26 +272,42 @@ static HRESULT String_bold(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS static HRESULT String_charAt(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp) { - StringInstance *strobj; - BSTR str; + const WCHAR *str; + DWORD length; + BSTR ret, val_str = NULL; INT pos = 0; HRESULT hres; TRACE("\n"); - if(dispex->builtin_info->class != JSCLASS_STRING) { - FIXME("not string this not supported\n"); - return E_NOTIMPL; - } + if(!is_class(dispex, JSCLASS_STRING)) { + VARIANT this; - strobj = (StringInstance*)dispex; + V_VT(&this) = VT_DISPATCH; + V_DISPATCH(&this) = (IDispatch*)_IDispatchEx_(dispex); + + hres = to_string(dispex->ctx, &this, ei, &val_str); + if(FAILED(hres)) + return hres; + + str = val_str; + length = SysStringLen(val_str); + } + else { + StringInstance *this = (StringInstance*)dispex; + + str = this->str; + length = this->length; + } if(arg_cnt(dp)) { VARIANT num; hres = to_integer(dispex->ctx, get_arg(dp, 0), ei, &num); - if(FAILED(hres)) + if(FAILED(hres)) { + SysFreeString(val_str); return hres; + } if(V_VT(&num) == VT_I4) { pos = V_I4(&num); @@ -211,18 +317,22 @@ static HRESULT String_charAt(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARA } } - if(!retv) + if(!retv) { + SysFreeString(val_str); return S_OK; + } - if(0 <= pos && pos < strobj->length) - str = SysAllocStringLen(strobj->str+pos, 1); + if(0 <= pos && pos < length) + ret = SysAllocStringLen(str+pos, 1); else - str = SysAllocStringLen(NULL, 0); - if(!str) + ret = SysAllocStringLen(NULL, 0); + SysFreeString(val_str); + if(!ret) { return E_OUTOFMEMORY; + } V_VT(retv) = VT_BSTR; - V_BSTR(retv) = str; + V_BSTR(retv) = ret; return S_OK; } @@ -231,30 +341,44 @@ static HRESULT String_charCodeAt(DispatchEx *dispex, LCID lcid, WORD flags, DISP VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp) { const WCHAR *str; + BSTR val_str = NULL; DWORD length, idx = 0; HRESULT hres; TRACE("\n"); - if(dispex->builtin_info->class == JSCLASS_STRING) { - StringInstance *string = (StringInstance*)dispex; + if(!is_class(dispex, JSCLASS_STRING)) { + VARIANT this; - str = string->str; - length = string->length; - }else { - FIXME("not string this not supported\n"); - return E_NOTIMPL; + V_VT(&this) = VT_DISPATCH; + V_DISPATCH(&this) = (IDispatch*)_IDispatchEx_(dispex); + + hres = to_string(dispex->ctx, &this, ei, &val_str); + if(FAILED(hres)) + return hres; + + str = val_str; + length = SysStringLen(val_str); + } + else { + StringInstance *this = (StringInstance*)dispex; + + str = this->str; + length = this->length; } if(arg_cnt(dp) > 0) { VARIANT v; hres = to_integer(dispex->ctx, get_arg(dp, 0), ei, &v); - if(FAILED(hres)) + if(FAILED(hres)) { + SysFreeString(val_str); return hres; + } if(V_VT(&v) != VT_I4 || V_I4(&v) < 0 || V_I4(&v) >= length) { if(retv) num_set_nan(&v); + SysFreeString(val_str); return S_OK; } @@ -265,6 +389,8 @@ static HRESULT String_charCodeAt(DispatchEx *dispex, LCID lcid, WORD flags, DISP V_VT(retv) = VT_I4; V_I4(retv) = str[idx]; } + + SysFreeString(val_str); return S_OK; } @@ -336,15 +462,19 @@ static HRESULT String_fixed(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAM static HRESULT String_fontcolor(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp) { - FIXME("\n"); - return E_NOTIMPL; + static const WCHAR fontW[] = {'F','O','N','T',0}; + static const WCHAR colorW[] = {'C','O','L','O','R',0}; + + return do_attribute_tag_format(dispex, lcid, flags, dp, retv, ei, sp, fontW, colorW); } static HRESULT String_fontsize(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp) { - FIXME("\n"); - return E_NOTIMPL; + static const WCHAR fontW[] = {'F','O','N','T',0}; + static const WCHAR colorW[] = {'S','I','Z','E',0}; + + return do_attribute_tag_format(dispex, lcid, flags, dp, retv, ei, sp, fontW, colorW); } static HRESULT String_indexOf(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, @@ -352,20 +482,30 @@ static HRESULT String_indexOf(DispatchEx *dispex, LCID lcid, WORD flags, DISPPAR { DWORD length, pos = 0; const WCHAR *str; - BSTR search_str; + BSTR search_str, val_str = NULL; INT ret = -1; HRESULT hres; TRACE("\n"); - if(is_class(dispex, JSCLASS_STRING)) { - StringInstance *string = (StringInstance*)dispex; + if(!is_class(dispex, JSCLASS_STRING)) { + VARIANT this; - str = string->str; - length = string->length; - }else { - FIXME("not String this\n"); - return E_NOTIMPL; + V_VT(&this) = VT_DISPATCH; + V_DISPATCH(&this) = (IDispatch*)_IDispatchEx_(dispex); + + hres = to_string(dispex->ctx, &this, ei, &val_str); + if(FAILED(hres)) + return hres; + + str = val_str; + length = SysStringLen(val_str); + } + else { + StringInstance *this = (StringInstance*)dispex; + + str = this->str; + length = this->length; } if(!arg_cnt(dp)) { @@ -373,12 +513,15 @@ static HRESULT String_indexOf(DispatchEx *dispex, LCID lcid, WORD flags, DISPPAR V_VT(retv) = VT_I4; V_I4(retv) = -1; } + SysFreeString(val_str); return S_OK; } hres = to_string(dispex->ctx, get_arg(dp,0), ei, &search_str); - if(FAILED(hres)) + if(FAILED(hres)) { + SysFreeString(val_str); return hres; + } if(arg_cnt(dp) >= 2) { VARIANT ival; @@ -405,6 +548,7 @@ static HRESULT String_indexOf(DispatchEx *dispex, LCID lcid, WORD flags, DISPPAR } SysFreeString(search_str); + SysFreeString(val_str); if(FAILED(hres)) return hres; @@ -432,27 +576,33 @@ static HRESULT String_lastIndexOf(DispatchEx *dispex, LCID lcid, WORD flags, DIS static HRESULT String_link(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp) { - FIXME("\n"); - return E_NOTIMPL; + static const WCHAR fontW[] = {'A',0}; + static const WCHAR colorW[] = {'H','R','E','F',0}; + + return do_attribute_tag_format(dispex, lcid, flags, dp, retv, ei, sp, fontW, colorW); } /* ECMA-262 3rd Edition 15.5.4.10 */ static HRESULT String_match(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp) { - StringInstance *This = (StringInstance*)dispex; + const WCHAR *str; match_result_t *match_result; DispatchEx *regexp; DispatchEx *array; VARIANT var, *arg_var; - DWORD match_cnt, i; + DWORD length, match_cnt, i; + BSTR val_str = NULL; HRESULT hres = S_OK; TRACE("\n"); - if(arg_cnt(dp) != 1) { - FIXME("unsupported args\n"); - return E_NOTIMPL; + if(!arg_cnt(dp)) { + if(retv) { + V_VT(retv) = VT_NULL; + } + + return S_OK; } arg_var = get_arg(dp, 0); @@ -478,22 +628,50 @@ static HRESULT String_match(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAM } } - hres = regexp_match(regexp, This->str, This->length, FALSE, &match_result, &match_cnt); + if(!is_class(dispex, JSCLASS_STRING)) { + VARIANT this; + + V_VT(&this) = VT_DISPATCH; + V_DISPATCH(&this) = (IDispatch*)_IDispatchEx_(dispex); + + hres = to_string(dispex->ctx, &this, ei, &val_str); + if(FAILED(hres)) { + jsdisp_release(regexp); + return hres; + } + + str = val_str; + length = SysStringLen(val_str); + } + else { + StringInstance *this = (StringInstance*)dispex; + + str = this->str; + length = this->length; + } + + hres = regexp_match(regexp, str, length, FALSE, &match_result, &match_cnt); jsdisp_release(regexp); - if(FAILED(hres)) + if(FAILED(hres)) { + SysFreeString(val_str); return hres; + } if(!match_cnt) { TRACE("no match\n"); if(retv) V_VT(retv) = VT_NULL; + + SysFreeString(val_str); return S_OK; } hres = create_array(dispex->ctx, match_cnt, &array); - if(FAILED(hres)) + if(FAILED(hres)) { + SysFreeString(val_str); return hres; + } V_VT(&var) = VT_BSTR; @@ -510,6 +688,8 @@ static HRESULT String_match(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAM break; } + SysFreeString(val_str); + if(SUCCEEDED(hres) && retv) { V_VT(retv) = VT_DISPATCH; V_DISPATCH(retv) = (IDispatch*)_IDispatchEx_(array); @@ -618,11 +798,11 @@ static HRESULT rep_call(DispatchEx *func, const WCHAR *str, match_result_t *matc static HRESULT String_replace(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller) { + const WCHAR *str; DWORD parens_cnt = 0, parens_size=0, rep_len=0, length; - BSTR rep_str = NULL, match_str = NULL, ret_str; + BSTR rep_str = NULL, match_str = NULL, ret_str, val_str = NULL; DispatchEx *rep_func = NULL, *regexp = NULL; match_result_t *parens = NULL, match; - const WCHAR *str; strbuf_t ret = {NULL,0,0}; BOOL gcheck = FALSE; VARIANT *arg_var; @@ -630,23 +810,36 @@ static HRESULT String_replace(DispatchEx *dispex, LCID lcid, WORD flags, DISPPAR TRACE("\n"); - if(is_class(dispex, JSCLASS_STRING)) { - StringInstance *string = (StringInstance*)dispex; - str = string->str; - length = string->length; - }else { - FIXME("not String this\n"); - return E_NOTIMPL; + if(!is_class(dispex, JSCLASS_STRING)) { + VARIANT this; + + V_VT(&this) = VT_DISPATCH; + V_DISPATCH(&this) = (IDispatch*)_IDispatchEx_(dispex); + + hres = to_string(dispex->ctx, &this, ei, &val_str); + if(FAILED(hres)) + return hres; + + str = val_str; + length = SysStringLen(val_str); + } + else { + StringInstance *this = (StringInstance*)dispex; + + str = this->str; + length = this->length; } if(!arg_cnt(dp)) { if(retv) { - ret_str = SysAllocString(str); - if(!ret_str) - return E_OUTOFMEMORY; + if(!val_str) { + val_str = SysAllocStringLen(str, length); + if(!val_str) + return E_OUTOFMEMORY; + } V_VT(retv) = VT_BSTR; - V_BSTR(retv) = ret_str; + V_BSTR(retv) = val_str; } return S_OK; } @@ -666,8 +859,10 @@ static HRESULT String_replace(DispatchEx *dispex, LCID lcid, WORD flags, DISPPAR default: hres = to_string(dispex->ctx, arg_var, ei, &match_str); - if(FAILED(hres)) + if(FAILED(hres)) { + SysFreeString(val_str); return hres; + } } if(arg_cnt(dp) >= 2) { @@ -760,6 +955,7 @@ static HRESULT String_replace(DispatchEx *dispex, LCID lcid, WORD flags, DISPPAR jsdisp_release(rep_func); if(regexp) jsdisp_release(regexp); + SysFreeString(val_str); SysFreeString(rep_str); SysFreeString(match_str); heap_free(parens); @@ -790,6 +986,7 @@ static HRESULT String_slice(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAM VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp) { const WCHAR *str; + BSTR val_str = NULL; DWORD length; INT start=0, end; VARIANT v; @@ -797,20 +994,32 @@ static HRESULT String_slice(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAM TRACE("\n"); - if(is_class(dispex, JSCLASS_STRING)) { - StringInstance *string = (StringInstance*)dispex; + if(!is_class(dispex, JSCLASS_STRING)) { + VARIANT this; - str = string->str; - length = string->length; - }else { - FIXME("this is not a string class\n"); - return E_NOTIMPL; + V_VT(&this) = VT_DISPATCH; + V_DISPATCH(&this) = (IDispatch*)_IDispatchEx_(dispex); + + hres = to_string(dispex->ctx, &this, ei, &val_str); + if(FAILED(hres)) + return hres; + + str = val_str; + length = SysStringLen(val_str); + } + else { + StringInstance *this = (StringInstance*)dispex; + + str = this->str; + length = this->length; } if(arg_cnt(dp)) { hres = to_integer(dispex->ctx, dp->rgvarg + dp->cArgs-1, ei, &v); - if(FAILED(hres)) + if(FAILED(hres)) { + SysFreeString(val_str); return hres; + } if(V_VT(&v) == VT_I4) { start = V_I4(&v); @@ -830,8 +1039,10 @@ static HRESULT String_slice(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAM if(arg_cnt(dp) >= 2) { hres = to_integer(dispex->ctx, dp->rgvarg + dp->cArgs-2, ei, &v); - if(FAILED(hres)) + if(FAILED(hres)) { + SysFreeString(val_str); return hres; + } if(V_VT(&v) == VT_I4) { end = V_I4(&v); @@ -854,12 +1065,16 @@ static HRESULT String_slice(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAM if(retv) { BSTR retstr = SysAllocStringLen(str+start, end-start); - if(!str) + if(!retstr) { + SysFreeString(val_str); return E_OUTOFMEMORY; + } V_VT(retv) = VT_BSTR; V_BSTR(retv) = retstr; } + + SysFreeString(val_str); return S_OK; } @@ -874,28 +1089,40 @@ static HRESULT String_split(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAM VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp) { match_result_t *match_result = NULL; - DWORD match_cnt, i, match_len = 0; - StringInstance *string; - const WCHAR *ptr, *ptr2; + DWORD length, match_cnt, i, match_len = 0; + const WCHAR *str, *ptr, *ptr2; VARIANT *arg, var; DispatchEx *array; - BSTR match_str = NULL; + BSTR val_str = NULL, match_str = NULL; HRESULT hres; TRACE("\n"); - if(!is_class(dispex, JSCLASS_STRING)) { - FIXME("not String this\n"); - return E_NOTIMPL; - } - - string = (StringInstance*)dispex; - if(arg_cnt(dp) != 1) { FIXME("unsupported args\n"); return E_NOTIMPL; } + if(!is_class(dispex, JSCLASS_STRING)) { + VARIANT this; + + V_VT(&this) = VT_DISPATCH; + V_DISPATCH(&this) = (IDispatch*)_IDispatchEx_(dispex); + + hres = to_string(dispex->ctx, &this, ei, &val_str); + if(FAILED(hres)) + return hres; + + str = val_str; + length = SysStringLen(val_str); + } + else { + StringInstance *this = (StringInstance*)dispex; + + str = this->str; + length = this->length; + } + arg = get_arg(dp, 0); switch(V_VT(arg)) { case VT_DISPATCH: { @@ -904,10 +1131,12 @@ static HRESULT String_split(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAM regexp = iface_to_jsdisp((IUnknown*)V_DISPATCH(arg)); if(regexp) { if(is_class(regexp, JSCLASS_REGEXP)) { - hres = regexp_match(regexp, string->str, string->length, TRUE, &match_result, &match_cnt); + hres = regexp_match(regexp, str, length, TRUE, &match_result, &match_cnt); jsdisp_release(regexp); - if(FAILED(hres)) + if(FAILED(hres)) { + SysFreeString(val_str); return hres; + } break; } jsdisp_release(regexp); @@ -915,8 +1144,10 @@ static HRESULT String_split(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAM } default: hres = to_string(dispex->ctx, arg, ei, &match_str); - if(FAILED(hres)) + if(FAILED(hres)) { + SysFreeString(val_str); return hres; + } match_len = SysStringLen(match_str); if(!match_len) { @@ -928,7 +1159,7 @@ static HRESULT String_split(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAM hres = create_array(dispex->ctx, 0, &array); if(SUCCEEDED(hres)) { - ptr = string->str; + ptr = str; for(i=0;; i++) { if(match_result) { if(i == match_cnt) @@ -966,7 +1197,7 @@ static HRESULT String_split(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAM } if(SUCCEEDED(hres) && (match_str || match_result)) { - DWORD len = (string->str+string->length) - ptr; + DWORD len = (str+length) - ptr; if(len || match_str) { V_VT(&var) = VT_BSTR; @@ -982,6 +1213,7 @@ static HRESULT String_split(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAM } SysFreeString(match_str); + SysFreeString(val_str); heap_free(match_result); if(SUCCEEDED(hres) && retv) { @@ -1013,6 +1245,7 @@ static HRESULT String_substring(DispatchEx *dispex, LCID lcid, WORD flags, DISPP VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp) { const WCHAR *str; + BSTR val_str = NULL; INT start=0, end; DWORD length; VARIANT v; @@ -1020,20 +1253,32 @@ static HRESULT String_substring(DispatchEx *dispex, LCID lcid, WORD flags, DISPP TRACE("\n"); - if(is_class(dispex, JSCLASS_STRING)) { - StringInstance *string = (StringInstance*)dispex; + if(!is_class(dispex, JSCLASS_STRING)) { + VARIANT this; - length = string->length; - str = string->str; - }else { - FIXME("not string this not supported\n"); - return E_NOTIMPL; + V_VT(&this) = VT_DISPATCH; + V_DISPATCH(&this) = (IDispatch*)_IDispatchEx_(dispex); + + hres = to_string(dispex->ctx, &this, ei, &val_str); + if(FAILED(hres)) + return hres; + + str = val_str; + length = SysStringLen(val_str); + } + else { + StringInstance *this = (StringInstance*)dispex; + + str = this->str; + length = this->length; } if(arg_cnt(dp) >= 1) { hres = to_integer(dispex->ctx, dp->rgvarg + dp->cArgs-1, ei, &v); - if(FAILED(hres)) + if(FAILED(hres)) { + SysFreeString(val_str); return hres; + } if(V_VT(&v) == VT_I4) { start = V_I4(&v); @@ -1048,8 +1293,10 @@ static HRESULT String_substring(DispatchEx *dispex, LCID lcid, WORD flags, DISPP if(arg_cnt(dp) >= 2) { hres = to_integer(dispex->ctx, dp->rgvarg + dp->cArgs-2, ei, &v); - if(FAILED(hres)) + if(FAILED(hres)) { + SysFreeString(val_str); return hres; + } if(V_VT(&v) == VT_I4) { end = V_I4(&v); @@ -1073,9 +1320,12 @@ static HRESULT String_substring(DispatchEx *dispex, LCID lcid, WORD flags, DISPP if(retv) { V_VT(retv) = VT_BSTR; V_BSTR(retv) = SysAllocStringLen(str+start, end-start); - if(!V_BSTR(retv)) + if(!V_BSTR(retv)) { + SysFreeString(val_str); return E_OUTOFMEMORY; + } } + SysFreeString(val_str); return S_OK; } @@ -1096,66 +1346,92 @@ static HRESULT String_sup(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS static HRESULT String_toLowerCase(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp) { - StringInstance *string; const WCHAR* str; DWORD length; - BSTR bstr; + BSTR val_str = NULL; + HRESULT hres; TRACE("\n"); - if(is_class(dispex, JSCLASS_STRING)) { - string = (StringInstance*)dispex; + if(!is_class(dispex, JSCLASS_STRING)) { + VARIANT this; - length = string->length; - str = string->str; - }else { - FIXME("not string this not supported\n"); - return E_NOTIMPL; + V_VT(&this) = VT_DISPATCH; + V_DISPATCH(&this) = (IDispatch*)_IDispatchEx_(dispex); + + hres = to_string(dispex->ctx, &this, ei, &val_str); + if(FAILED(hres)) + return hres; + + str = val_str; + length = SysStringLen(val_str); + } + else { + StringInstance *this = (StringInstance*)dispex; + + str = this->str; + length = this->length; } if(retv) { - bstr = SysAllocStringLen(str, length); - if (!bstr) - return E_OUTOFMEMORY; + if(!val_str) { + val_str = SysAllocStringLen(str, length); + if(!val_str) + return E_OUTOFMEMORY; + } - strlwrW(bstr); + strlwrW(val_str); V_VT(retv) = VT_BSTR; - V_BSTR(retv) = bstr; + V_BSTR(retv) = val_str; } + else SysFreeString(val_str); return S_OK; } static HRESULT String_toUpperCase(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp) { - StringInstance *string; const WCHAR* str; DWORD length; - BSTR bstr; + BSTR val_str = NULL; + HRESULT hres; TRACE("\n"); - if(is_class(dispex, JSCLASS_STRING)) { - string = (StringInstance*)dispex; + if(!is_class(dispex, JSCLASS_STRING)) { + VARIANT this; - length = string->length; - str = string->str; - }else { - FIXME("not string this not supported\n"); - return E_NOTIMPL; + V_VT(&this) = VT_DISPATCH; + V_DISPATCH(&this) = (IDispatch*)_IDispatchEx_(dispex); + + hres = to_string(dispex->ctx, &this, ei, &val_str); + if(FAILED(hres)) + return hres; + + str = val_str; + length = SysStringLen(val_str); + } + else { + StringInstance *this = (StringInstance*)dispex; + + str = this->str; + length = this->length; } if(retv) { - bstr = SysAllocStringLen(str, length); - if (!bstr) - return E_OUTOFMEMORY; + if(!val_str) { + val_str = SysAllocStringLen(str, length); + if(!val_str) + return E_OUTOFMEMORY; + } - struprW(bstr); + struprW(val_str); V_VT(retv) = VT_BSTR; - V_BSTR(retv) = bstr; + V_BSTR(retv) = val_str; } + else SysFreeString(val_str); return S_OK; } @@ -1209,6 +1485,8 @@ static HRESULT String_value(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAM TRACE("\n"); switch(flags) { + case INVOKE_FUNC: + return throw_type_error(dispex->ctx, ei, IDS_NOT_FUNC, NULL); case DISPATCH_PROPERTYGET: { BSTR str = SysAllocString(This->str); if(!str) @@ -1282,6 +1560,37 @@ static const builtin_info_t String_info = { NULL }; +/* ECMA-262 3rd Edition 15.5.3.2 */ +static HRESULT StringConstr_fromCharCode(DispatchEx *dispex, LCID lcid, WORD flags, + DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp) +{ + DWORD i, code; + BSTR ret; + HRESULT hres; + + ret = SysAllocStringLen(NULL, arg_cnt(dp)); + if(!ret) + return E_OUTOFMEMORY; + + for(i=0; ictx, get_arg(dp, i), ei, &code); + if(FAILED(hres)) { + SysFreeString(ret); + return hres; + } + + ret[i] = code; + } + + if(retv) { + V_VT(retv) = VT_BSTR; + V_BSTR(retv) = ret; + } + else SysFreeString(ret); + + return S_OK; +} + static HRESULT StringConstr_value(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp) { @@ -1361,6 +1670,19 @@ static HRESULT string_alloc(script_ctx_t *ctx, BOOL use_constr, StringInstance * return S_OK; } +static const builtin_prop_t StringConstr_props[] = { + {fromCharCodeW, StringConstr_fromCharCode, PROPF_METHOD}, +}; + +static const builtin_info_t StringConstr_info = { + JSCLASS_FUNCTION, + {NULL, Function_value, 0}, + sizeof(StringConstr_props)/sizeof(*StringConstr_props), + StringConstr_props, + NULL, + NULL +}; + HRESULT create_string_constr(script_ctx_t *ctx, DispatchEx **ret) { StringInstance *string; @@ -1370,7 +1692,7 @@ HRESULT create_string_constr(script_ctx_t *ctx, DispatchEx **ret) if(FAILED(hres)) return hres; - hres = create_builtin_function(ctx, StringConstr_value, NULL, PROPF_CONSTR, &string->dispex, ret); + hres = create_builtin_function(ctx, StringConstr_value, &StringConstr_info, PROPF_CONSTR, &string->dispex, ret); jsdisp_release(&string->dispex); return hres;