From c168918d7534e641f71e1972eaf2ca54be72b137 Mon Sep 17 00:00:00 2001 From: Jacek Caban Date: Thu, 24 Sep 2009 00:45:00 +0200 Subject: [PATCH] jscript: Throw type error fot Array.toString with wrong 'this' call. --- dlls/jscript/array.c | 6 ++-- dlls/jscript/jscript_En.rc | 1 + dlls/jscript/resource.h | 1 + dlls/jscript/tests/api.js | 63 ++++++++++++++++++++++++++++++++++++++ 4 files changed, 67 insertions(+), 4 deletions(-) diff --git a/dlls/jscript/array.c b/dlls/jscript/array.c index 1fa20fe8cb9..941e414567b 100644 --- a/dlls/jscript/array.c +++ b/dlls/jscript/array.c @@ -936,10 +936,8 @@ static HRESULT Array_toString(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DI TRACE("\n"); array = array_this(jsthis); - if(!array) { - FIXME("not Array object\n"); - return E_FAIL; - } + if(!array) + return throw_type_error(ctx, ei, IDS_ARRAY_EXPECTED, NULL); return array_join(ctx, &array->dispex, array->length, default_separatorW, retv, ei, sp); } diff --git a/dlls/jscript/jscript_En.rc b/dlls/jscript/jscript_En.rc index 79921b46e8f..7962ad36c8c 100644 --- a/dlls/jscript/jscript_En.rc +++ b/dlls/jscript/jscript_En.rc @@ -41,4 +41,5 @@ STRINGTABLE DISCARDABLE IDS_JSCRIPT_EXPECTED "JScript object expected" IDS_REGEXP_SYNTAX_ERROR "Syntax error in regular expression" IDS_INVALID_LENGTH "Array length must be a finite positive integer" + IDS_ARRAY_EXPECTED "Array object expected" } diff --git a/dlls/jscript/resource.h b/dlls/jscript/resource.h index 81cd74dfa1b..fcebcb903c2 100644 --- a/dlls/jscript/resource.h +++ b/dlls/jscript/resource.h @@ -37,3 +37,4 @@ #define IDS_JSCRIPT_EXPECTED 0x1396 #define IDS_REGEXP_SYNTAX_ERROR 0x1399 #define IDS_INVALID_LENGTH 0x13A5 +#define IDS_ARRAY_EXPECTED 0x13A7 diff --git a/dlls/jscript/tests/api.js b/dlls/jscript/tests/api.js index 1c2f56b9a2f..aed26ece24c 100644 --- a/dlls/jscript/tests/api.js +++ b/dlls/jscript/tests/api.js @@ -1621,6 +1621,69 @@ exception_test(function() {eval("'unterminated")}, "SyntaxError", -2146827273); exception_test(function() {eval("nonexistingfunc()")}, "TypeError", -2146823281); exception_test(function() {RegExp(/a/, "g");}, "RegExpError", -2146823271); +function testThisExcept(func, number) { + exception_test(function() {func.call(new Object())}, "TypeError", number); +} + +function testBoolThis(func) { + testThisExcept(Boolean.prototype[func], -2146823278); +} + +testBoolThis("toString"); +testBoolThis("valueOf"); + +function testDateThis(func) { + testThisExcept(Date.prototype[func], -2146823282); +} + +testDateThis("getDate"); +testDateThis("getDay"); +testDateThis("getFullYear"); +testDateThis("getHours"); +testDateThis("getMilliseconds"); +testDateThis("getMinutes"); +testDateThis("getMonth"); +testDateThis("getSeconds"); +testDateThis("getTime"); +testDateThis("getTimezoneOffset"); +testDateThis("getUTCDate"); +testDateThis("getUTCDay"); +testDateThis("getUTCFullYear"); +testDateThis("getUTCHours"); +testDateThis("getUTCMilliseconds"); +testDateThis("getUTCMinutes"); +testDateThis("getUTCMonth"); +testDateThis("getUTCSeconds"); +testDateThis("setDate"); +testDateThis("setFullYear"); +testDateThis("setHours"); +testDateThis("setMilliseconds"); +testDateThis("setMinutes"); +testDateThis("setMonth"); +testDateThis("setSeconds"); +testDateThis("setTime"); +testDateThis("setUTCDate"); +testDateThis("setUTCFullYear"); +testDateThis("setUTCHours"); +testDateThis("setUTCMilliseconds"); +testDateThis("setUTCMinutes"); +testDateThis("setUTCMonth"); +testDateThis("setUTCSeconds"); +testDateThis("toDateString"); +testDateThis("toLocaleDateString"); +testDateThis("toLocaleString"); +testDateThis("toLocaleTimeString"); +testDateThis("toString"); +testDateThis("toTimeString"); +testDateThis("toUTCString"); +testDateThis("valueOf"); + +function testArrayThis(func) { + testThisExcept(Array.prototype[func], -2146823257); +} + +testArrayThis("toString"); + function testArrayHostThis(func) { exception_test(function() { Array.prototype[func].call(testObj); }, "TypeError", -2146823274); }