blob: fb555b862f316bed3bf926b9db6444d2a213ea82 [file] [log] [blame]
/*
* Copyright (C) Igor Sysoev
* Copyright (C) NGINX, Inc.
*/
#include <nxt_auto_config.h>
#include <nxt_types.h>
#include <nxt_clang.h>
#include <nxt_string.h>
#include <nxt_stub.h>
#include <nxt_malloc.h>
#include <nxt_array.h>
#include <nxt_lvlhsh.h>
#include <nxt_mem_cache_pool.h>
#include <njscript.h>
#include <njs_vm.h>
#include <string.h>
#include <stdio.h>
#include <sys/resource.h>
#include <time.h>
typedef struct {
nxt_str_t script;
nxt_str_t ret;
} njs_unit_test_t;
static njs_unit_test_t njs_test[] =
{
{ nxt_string("}"),
nxt_string("SyntaxError: Unexpected token \"}\" in 1") },
{ nxt_string("1}"),
nxt_string("SyntaxError: Unexpected token \"}\" in 1") },
/* Variable declarations. */
{ nxt_string("var x"),
nxt_string("undefined") },
{ nxt_string("var x;"),
nxt_string("undefined") },
{ nxt_string("var x;;"),
nxt_string("undefined") },
{ nxt_string("var x = 0"),
nxt_string("undefined") },
{ nxt_string("var x = 0;"),
nxt_string("undefined") },
{ nxt_string("var x = 0;;"),
nxt_string("undefined") },
{ nxt_string("var; a"),
nxt_string("SyntaxError: Unexpected token \";\" in 1") },
{ nxt_string("var + a"),
nxt_string("SyntaxError: Unexpected token \"+\" in 1") },
{ nxt_string("//\r\n; var + a"),
nxt_string("SyntaxError: Unexpected token \"+\" in 2") },
{ nxt_string("/*\n*/; var + a"),
nxt_string("SyntaxError: Unexpected token \"+\" in 2") },
{ nxt_string("var \n a \n = 1; a"),
nxt_string("1") },
{ nxt_string("var \n a, \n b; b"),
nxt_string("undefined") },
{ nxt_string("var a = 1; var b; a"),
nxt_string("1") },
{ nxt_string("a = 1;for(;a;a--)var a; a"),
nxt_string("0") },
{ nxt_string("if(1)if(0){0?0:0}else\nvar a\nelse\nvar b"),
nxt_string("undefined") },
{ nxt_string("function f(){} function f(){}"),
nxt_string("SyntaxError: Identifier \"f\" has already been declared in 1") },
{ nxt_string("var f = 1; function f() {}"),
nxt_string("SyntaxError: Identifier \"f\" has already been declared in 1") },
{ nxt_string("f() = 1"),
nxt_string("ReferenceError: Invalid left-hand side in assignment in 1") },
{ nxt_string("f.a() = 1"),
nxt_string("ReferenceError: Invalid left-hand side in assignment in 1") },
{ nxt_string("++f()"),
nxt_string("ReferenceError: Invalid left-hand side in prefix operation in 1") },
{ nxt_string("f()++"),
nxt_string("ReferenceError: Invalid left-hand side in postfix operation in 1") },
/* Numbers. */
{ nxt_string("999999999999999999999"),
nxt_string("1e+21") },
#if 0
{ nxt_string("9223372036854775808"),
nxt_string("9223372036854775808") },
{ nxt_string("18446744073709551616"),
nxt_string("18446744073709552000") },
{ nxt_string("1.7976931348623157E+308"),
nxt_string("1.7976931348623157e+308") },
#endif
{ nxt_string("+1"),
nxt_string("1") },
{ nxt_string("+1\n"),
nxt_string("1") },
/* Octal Numbers. */
{ nxt_string("0o0"),
nxt_string("0") },
{ nxt_string("0o011"),
nxt_string("9") },
{ nxt_string("-0o777"),
nxt_string("-511") },
/* Legacy Octal Numbers are deprecated. */
{ nxt_string("00"),
nxt_string("SyntaxError: Unexpected token \"\" in 1") },
{ nxt_string("08"),
nxt_string("SyntaxError: Unexpected token \"\" in 1") },
{ nxt_string("09"),
nxt_string("SyntaxError: Unexpected token \"\" in 1") },
{ nxt_string("0011"),
nxt_string("SyntaxError: Unexpected token \"\" in 1") },
{ nxt_string("0o"),
nxt_string("SyntaxError: Unexpected token \"\" in 1") },
{ nxt_string("0o778"),
nxt_string("SyntaxError: Unexpected token \"\" in 1") },
/* Hex Numbers. */
{ nxt_string("0x0"),
nxt_string("0") },
{ nxt_string("-0x1"),
nxt_string("-1") },
{ nxt_string("0xffFF"),
nxt_string("65535") },
{ nxt_string("0X0000BEEF"),
nxt_string("48879") },
{ nxt_string("0x"),
nxt_string("SyntaxError: Unexpected token \"\" in 1") },
{ nxt_string("0xffff."),
nxt_string("SyntaxError: Unexpected token \"\" in 1") },
{ nxt_string("0x12g"),
nxt_string("SyntaxError: Unexpected token \"g\" in 1") },
{ nxt_string(""),
nxt_string("undefined") },
{ nxt_string("\n"),
nxt_string("undefined") },
{ nxt_string(";"),
nxt_string("undefined") },
{ nxt_string("\n +1"),
nxt_string("1") },
/* Scientific notation. */
{ nxt_string("0e0"),
nxt_string("0") },
{ nxt_string("0.0e0"),
nxt_string("0") },
{ nxt_string("1e0"),
nxt_string("1") },
{ nxt_string("1e1"),
nxt_string("10") },
{ nxt_string("1.e01"),
nxt_string("10") },
{ nxt_string("5.7e1"),
nxt_string("57") },
{ nxt_string("5.7e-1"),
nxt_string("0.570000") },
{ nxt_string("-5.7e-1"),
nxt_string("-0.570000") },
{ nxt_string("1.1e-01"),
nxt_string("0.110000") },
{ nxt_string("5.7e-2"),
nxt_string("0.057000") },
{ nxt_string("1.1e+01"),
nxt_string("11") },
{ nxt_string("1e9"),
nxt_string("1000000000") },
{ nxt_string("1.0e308"),
nxt_string("1e+308") },
{ nxt_string("0e309"),
nxt_string("0") },
{ nxt_string("0e-309"),
nxt_string("0") },
{ nxt_string("1e309"),
nxt_string("Infinity") },
{ nxt_string("-1e309"),
nxt_string("-Infinity") },
{ nxt_string("1e"),
nxt_string("SyntaxError: Unexpected token \"e\" in 1") },
{ nxt_string("1.e"),
nxt_string("SyntaxError: Unexpected token \"e\" in 1") },
{ nxt_string("1e+"),
nxt_string("SyntaxError: Unexpected token \"e\" in 1") },
{ nxt_string("1.e-"),
nxt_string("SyntaxError: Unexpected token \"e\" in 1") },
{ nxt_string("1eZ"),
nxt_string("SyntaxError: Unexpected token \"eZ\" in 1") },
/* Indexes. */
{ nxt_string("var a = []; a[-1] = 2; a[-1] == a['-1']"),
nxt_string("true") },
{ nxt_string("var a = []; a[Infinity] = 2; a[Infinity] == a['Infinity']"),
nxt_string("true") },
{ nxt_string("var a = []; a[NaN] = 2; a[NaN] == a['NaN']"),
nxt_string("true") },
/* Number.toString(radix) method. */
{ nxt_string("0..toString(2)"),
nxt_string("0") },
{ nxt_string("240..toString(2)"),
nxt_string("11110000") },
{ nxt_string("Math.pow(-2, 1023).toString(2).length"),
nxt_string("1025") },
{ nxt_string("8.0625.toString(2)"),
nxt_string("1000.0001") },
{ nxt_string("(1/3).toString(2)"),
nxt_string("0.010101010101010101010101010101010101010101010101010101") },
{ nxt_string("9999..toString(3)"),
nxt_string("111201100") },
{ nxt_string("-9999..toString(3)"),
nxt_string("-111201100") },
{ nxt_string("81985529216486895..toString(16)"),
nxt_string("123456789abcdf0") },
{ nxt_string("0xffff.toString(16)"),
nxt_string("ffff") },
{ nxt_string("1845449130881..toString(36)"),
nxt_string("njscript") },
{ nxt_string("Infinity.toString()"),
nxt_string("Infinity") },
{ nxt_string("Infinity.toString(2)"),
nxt_string("Infinity") },
{ nxt_string("Infinity.toString(10)"),
nxt_string("Infinity") },
{ nxt_string("Infinity.toString(NaN)"),
nxt_string("RangeError") },
{ nxt_string("Infinity.toString({})"),
nxt_string("RangeError") },
{ nxt_string("Infinity.toString(Infinity)"),
nxt_string("RangeError") },
{ nxt_string("NaN.toString()"),
nxt_string("NaN") },
{ nxt_string("NaN.toString(2)"),
nxt_string("NaN") },
{ nxt_string("NaN.toString(10)"),
nxt_string("NaN") },
{ nxt_string("NaN.toString(Infinity)"),
nxt_string("RangeError") },
{ nxt_string("NaN.toString({})"),
nxt_string("RangeError") },
{ nxt_string("NaN.toString(NaN)"),
nxt_string("RangeError") },
/* An object "valueOf/toString" methods. */
{ nxt_string("var a = { valueOf: function() { return 1 } }; +a"),
nxt_string("1") },
{ nxt_string("var a = { valueOf: function() { return '1' } }; +a"),
nxt_string("1") },
{ nxt_string("var a = { valueOf: 2,"
" toString: function() { return '1' } }; +a"),
nxt_string("1") },
{ nxt_string("var a = { valueOf: function() { return [] },"
" toString: function() { return '1' } }; +a"),
nxt_string("1") },
{ nxt_string("var a = { toString: function() { return 'a' } };"
"var b = { toString: function() { return a+'b' } }; '0'+b"),
nxt_string("0ab") },
/**/
{ nxt_string("1 + undefined"),
nxt_string("NaN") },
{ nxt_string("1 + ''"),
nxt_string("1") },
{ nxt_string("0xA + ''"),
nxt_string("10") },
{ nxt_string("undefined + undefined"),
nxt_string("NaN") },
{ nxt_string("1.2 + 5.7"),
nxt_string("6.9") },
{ nxt_string("0xf + 1"),
nxt_string("16") },
{ nxt_string("1 + 1 + '2' + 1 + 1"),
nxt_string("2211") },
{ nxt_string("1.2 - '5.7'"),
nxt_string("-4.5") },
{ nxt_string("1.2 + -'5.7'"),
nxt_string("-4.5") },
{ nxt_string("1.2 - '-5.7'"),
nxt_string("6.9") },
{ nxt_string("5 - ' \t 12 \t'"),
nxt_string("-7") },
{ nxt_string("5 - '12zz'"),
nxt_string("NaN") },
{ nxt_string("5 - '0x2'"),
nxt_string("3") },
{ nxt_string("5 - '-0x2'"),
nxt_string("7") },
{ nxt_string("5 - '\t 0x2 \t'"),
nxt_string("3") },
{ nxt_string("5 - '0x2 z'"),
nxt_string("NaN") },
{ nxt_string("12 - '5.7e1'"),
nxt_string("-45") },
{ nxt_string("12 - '5.e1'"),
nxt_string("-38") },
{ nxt_string("12 - '5.7e+01'"),
nxt_string("-45") },
{ nxt_string("12 - '5.7e-01'"),
nxt_string("11.43") },
{ nxt_string("12 - ' 5.7e1 '"),
nxt_string("-45") },
{ nxt_string("12 - '5.7e'"),
nxt_string("NaN") },
{ nxt_string("12 - '5.7e+'"),
nxt_string("NaN") },
{ nxt_string("12 - '5.7e-'"),
nxt_string("NaN") },
{ nxt_string("12 - ' 5.7e1 z'"),
nxt_string("NaN") },
{ nxt_string("5 - '0x'"),
nxt_string("NaN") },
{ nxt_string("1 + +'3'"),
nxt_string("4") },
{ nxt_string("1 - undefined"),
nxt_string("NaN") },
{ nxt_string("1 - ''"),
nxt_string("1") },
{ nxt_string("undefined - undefined"),
nxt_string("NaN") },
/* Assignment. */
{ nxt_string("var a, b = (a = [2]) * (3 * 4); a +' '+ b"),
nxt_string("2 24") },
/* 3 address operation and side effect. */
{ nxt_string("var a = 1; function f(x) { a = x; return 2 }; a+f(5)+' '+a"),
nxt_string("3 5") },
{ nxt_string("var a = 1; function f(x) { a = x; return 2 }; a += f(5)"),
nxt_string("3") },
{ nxt_string("var x; x in (x = 1, [1, 2, 3])"),
nxt_string("false") },
/* Exponentiation. */
{ nxt_string("2 ** 3 ** 2"),
nxt_string("512") },
{ nxt_string("2 ** (3 ** 2)"),
nxt_string("512") },
{ nxt_string("(2 ** 3) ** 2"),
nxt_string("64") },
{ nxt_string("3 ** 2 - 9"),
nxt_string("0") },
{ nxt_string("-9 + 3 ** 2"),
nxt_string("0") },
{ nxt_string("-3 ** 2"),
nxt_string("SyntaxError: Either left-hand side or entire exponentiation "
"must be parenthesized in 1") },
{ nxt_string("-(3) ** 2"),
nxt_string("SyntaxError: Either left-hand side or entire exponentiation "
"must be parenthesized in 1") },
{ nxt_string("-(3 ** 2)"),
nxt_string("-9") },
{ nxt_string("(-3) ** 2"),
nxt_string("9") },
{ nxt_string("1 ** NaN"),
nxt_string("NaN") },
{ nxt_string("'a' ** -0"),
nxt_string("1") },
{ nxt_string("1.1 ** Infinity"),
nxt_string("Infinity") },
{ nxt_string("(-1.1) ** -Infinity"),
nxt_string("0") },
{ nxt_string("(-1) ** Infinity"),
nxt_string("NaN") },
{ nxt_string("1 ** -Infinity"),
nxt_string("NaN") },
{ nxt_string("(-0.9) ** Infinity"),
nxt_string("0") },
{ nxt_string("0.9 ** -Infinity"),
nxt_string("Infinity") },
{ nxt_string("'Infinity' ** 0.1"),
nxt_string("Infinity") },
{ nxt_string("Infinity ** '-0.1'"),
nxt_string("0") },
{ nxt_string("(-Infinity) ** 3"),
nxt_string("-Infinity") },
{ nxt_string("'-Infinity' ** '3.1'"),
nxt_string("Infinity") },
{ nxt_string("(-Infinity) ** '-3'"),
nxt_string("-0") },
{ nxt_string("'-Infinity' ** -2"),
nxt_string("0") },
{ nxt_string("'0' ** 0.1"),
nxt_string("0") },
#ifndef __NetBSD__ /* NetBSD 7: pow(0, negative) == -Infinity. */
{ nxt_string("0 ** '-0.1'"),
nxt_string("Infinity") },
#endif
{ nxt_string("(-0) ** 3"),
nxt_string("-0") },
{ nxt_string("'-0' ** '3.1'"),
nxt_string("0") },
{ nxt_string("(-0) ** '-3'"),
nxt_string("-Infinity") },
#ifndef __NetBSD__ /* NetBSD 7: pow(0, negative) == -Infinity. */
{ nxt_string("'-0' ** -2"),
nxt_string("Infinity") },
#endif
{ nxt_string("(-3) ** 0.1"),
nxt_string("NaN") },
{ nxt_string("var a = 0.1; a **= -2"),
nxt_string("100") },
{ nxt_string("var a = 1; a **= NaN"),
nxt_string("NaN") },
{ nxt_string("var a = 'a'; a **= -0"),
nxt_string("1") },
{ nxt_string("var a = 1.1; a **= Infinity"),
nxt_string("Infinity") },
{ nxt_string("var a = -1.1; a **= -Infinity"),
nxt_string("0") },
{ nxt_string("var a = -1; a **= Infinity"),
nxt_string("NaN") },
{ nxt_string("var a = 1; a **= -Infinity"),
nxt_string("NaN") },
{ nxt_string("var a = -0.9; a **= Infinity"),
nxt_string("0") },
{ nxt_string("var a = 0.9; a **= -Infinity"),
nxt_string("Infinity") },
{ nxt_string("var a = 'Infinity'; a **= 0.1"),
nxt_string("Infinity") },
{ nxt_string("var a = Infinity; a **= '-0.1'"),
nxt_string("0") },
{ nxt_string("var a = -Infinity; a **= 3"),
nxt_string("-Infinity") },
{ nxt_string("var a = '-Infinity'; a **= '3.1'"),
nxt_string("Infinity") },
{ nxt_string("var a = -Infinity; a **= '-3'"),
nxt_string("-0") },
{ nxt_string("var a = '-Infinity'; a **= -2"),
nxt_string("0") },
{ nxt_string("var a = '0'; a **= 0.1"),
nxt_string("0") },
#ifndef __NetBSD__ /* NetBSD 7: pow(0, negative) == -Infinity. */
{ nxt_string("var a = 0; a **= '-0.1'"),
nxt_string("Infinity") },
#endif
{ nxt_string("var a = -0; a **= 3"),
nxt_string("-0") },
{ nxt_string("var a = '-0'; a **= '3.1'"),
nxt_string("0") },
{ nxt_string("var a = -0; a **= '-3'"),
nxt_string("-Infinity") },
#ifndef __NetBSD__ /* NetBSD 7: pow(0, negative) == -Infinity. */
{ nxt_string("var a = '-0'; a **= -2"),
nxt_string("Infinity") },
#endif
{ nxt_string("var a = -3; a **= 0.1"),
nxt_string("NaN") },
/**/
{ nxt_string("12 | 6"),
nxt_string("14") },
{ nxt_string("12 | 'abc'"),
nxt_string("12") },
{ nxt_string("-1 | 0"),
nxt_string("-1") },
{ nxt_string("-2147483648 | 0"),
nxt_string("-2147483648") },
{ nxt_string("1024.9 | 0"),
nxt_string("1024") },
{ nxt_string("-1024.9 | 0"),
nxt_string("-1024") },
{ nxt_string("9007199254740991 | 0"),
nxt_string("-1") },
{ nxt_string("9007199254740992 | 0"),
nxt_string("0") },
{ nxt_string("9007199254740993 | 0"),
nxt_string("0") },
#if 0
{ nxt_string("9223372036854775808 | 0"),
nxt_string("0") },
#endif
{ nxt_string("9223372036854777856 | 0"),
nxt_string("2048") },
{ nxt_string("-9223372036854777856 | 0"),
nxt_string("-2048") },
{ nxt_string("NaN | 0"),
nxt_string("0") },
{ nxt_string("-NaN | 0"),
nxt_string("0") },
{ nxt_string("Infinity | 0"),
nxt_string("0") },
{ nxt_string("-Infinity | 0"),
nxt_string("0") },
{ nxt_string("+0 | 0"),
nxt_string("0") },
{ nxt_string("-0 | 0"),
nxt_string("0") },
{ nxt_string("32.5 << 2.4"),
nxt_string("128") },
{ nxt_string("32.5 << 'abc'"),
nxt_string("32") },
{ nxt_string("'abc' << 2"),
nxt_string("0") },
{ nxt_string("-1 << 0"),
nxt_string("-1") },
{ nxt_string("-1 << -1"),
nxt_string("-2147483648") },
{ nxt_string("-2147483648 << 0"),
nxt_string("-2147483648") },
#if 0
{ nxt_string("9223372036854775808 << 0"),
nxt_string("0") },
#endif
{ nxt_string("9223372036854777856 << 0"),
nxt_string("2048") },
{ nxt_string("-9223372036854777856 << 0"),
nxt_string("-2048") },
{ nxt_string("NaN << 0"),
nxt_string("0") },
{ nxt_string("32.5 >> 2.4"),
nxt_string("8") },
{ nxt_string("-1 >> 30"),
nxt_string("-1") },
{ nxt_string("'abc' >> 2"),
nxt_string("0") },
{ nxt_string("-1 >> 0"),
nxt_string("-1") },
{ nxt_string("-1 >> -1"),
nxt_string("-1") },
{ nxt_string("-2147483648 >> 0"),
nxt_string("-2147483648") },
{ nxt_string("-2147483648 >> -1"),
nxt_string("-1") },
#if 0
{ nxt_string("9223372036854775808 >> 0"),
nxt_string("0") },
#endif
{ nxt_string("9223372036854777856 >> 0"),
nxt_string("2048") },
{ nxt_string("-9223372036854777856 >> 0"),
nxt_string("-2048") },
{ nxt_string("NaN >> 0"),
nxt_string("0") },
{ nxt_string("-1 >>> 30"),
nxt_string("3") },
{ nxt_string("NaN >>> 1"),
nxt_string("0") },
#if 0
{ nxt_string("9223372036854775808 >>> 1"),
nxt_string("0") },
#endif
{ nxt_string("-1 >>> 0"),
nxt_string("4294967295") },
{ nxt_string("-1 >>> -1"),
nxt_string("1") },
{ nxt_string("-2147483648 >>> 0"),
nxt_string("2147483648") },
{ nxt_string("-2147483648 >>> -1"),
nxt_string("1") },
#if 0
{ nxt_string("9223372036854775808 >>> 0"),
nxt_string("0") },
#endif
{ nxt_string("9223372036854777856 >>> 0"),
nxt_string("2048") },
{ nxt_string("-9223372036854777856 >>> 0"),
nxt_string("4294965248") },
{ nxt_string("NaN >>> 0"),
nxt_string("0") },
{ nxt_string("!2"),
nxt_string("false") },
/**/
{ nxt_string("var a = { valueOf: function() { return 1 } }; ~a"),
nxt_string("-2") },
{ nxt_string("var a = { valueOf: function() { return '1' } }; ~a"),
nxt_string("-2") },
/**/
{ nxt_string("1 || 2"),
nxt_string("1") },
{ nxt_string("var a = 1; 1 || (a = 2); a"),
nxt_string("1") },
{ nxt_string("var x; x = 0 || x; x"),
nxt_string("undefined") },
{ nxt_string("var x; x = 1 && x; x"),
nxt_string("undefined") },
{ nxt_string("1 || 2 || 3"),
nxt_string("1") },
{ nxt_string("1 || (2 + 2) || 3"),
nxt_string("1") },
{ nxt_string("1 && 2"),
nxt_string("2") },
{ nxt_string("1 && 2 && 3"),
nxt_string("3") },
{ nxt_string("var a = 1; 0 && (a = 2); a"),
nxt_string("1") },
{ nxt_string("false && true || true"),
nxt_string("true") },
{ nxt_string("false && (true || true)"),
nxt_string("false") },
{ nxt_string("var a = true; a = -~!a"),
nxt_string("1") },
{ nxt_string("12 & 6"),
nxt_string("4") },
{ nxt_string("-1 & 65536"),
nxt_string("65536") },
{ nxt_string("-2147483648 & 65536"),
nxt_string("0") },
#if 0
{ nxt_string("9223372036854775808 & 65536"),
nxt_string("0") },
#endif
{ nxt_string("NaN & 65536"),
nxt_string("0") },
{ nxt_string("12 ^ 6"),
nxt_string("10") },
{ nxt_string("-1 ^ 65536"),
nxt_string("-65537") },
{ nxt_string("-2147483648 ^ 65536"),
nxt_string("-2147418112") },
#if 0
{ nxt_string("9223372036854775808 ^ 65536"),
nxt_string("65536") },
#endif
{ nxt_string("NaN ^ 65536"),
nxt_string("65536") },
{ nxt_string("var x = '1'; +x + 2"),
nxt_string("3") },
/* Weird things. */
{ nxt_string("'3' -+-+-+ '1' + '1' / '3' * '6' + '2'"),
nxt_string("42") },
{ nxt_string("((+!![])+(+!![])+(+!![])+(+!![])+[])+((+!![])+(+!![])+[])"),
nxt_string("42") },
{ nxt_string("1+[[]+[]]-[]+[[]-[]]-1"),
nxt_string("9") },
{ nxt_string("[[]+[]]-[]+[[]-[]]"),
nxt_string("00") },
{ nxt_string("!--[][1]"),
nxt_string("true") },
{ nxt_string("[].concat[1,2,3]"),
nxt_string("undefined") },
/**/
{ nxt_string("'true' == true"),
nxt_string("false") },
{ nxt_string("null == false"),
nxt_string("false") },
{ nxt_string("!null"),
nxt_string("true") },
{ nxt_string("0 === -0"),
nxt_string("true") },
{ nxt_string("1/-0"),
nxt_string("-Infinity") },
{ nxt_string("1/0 === 1/-0"),
nxt_string("false") },
{ nxt_string("1 == true"),
nxt_string("true") },
{ nxt_string("NaN === NaN"),
nxt_string("false") },
{ nxt_string("NaN !== NaN"),
nxt_string("true") },
{ nxt_string("NaN == NaN"),
nxt_string("false") },
{ nxt_string("NaN != NaN"),
nxt_string("true") },
{ nxt_string("NaN == false"),
nxt_string("false") },
{ nxt_string("Infinity == Infinity"),
nxt_string("true") },
{ nxt_string("-Infinity == -Infinity"),
nxt_string("true") },
{ nxt_string("-Infinity < Infinity"),
nxt_string("true") },
{ nxt_string("Infinity - Infinity"),
nxt_string("NaN") },
{ nxt_string("Infinity - -Infinity"),
nxt_string("Infinity") },
{ nxt_string("undefined == 0"),
nxt_string("false") },
{ nxt_string("undefined == null"),
nxt_string("true") },
{ nxt_string("'1' == 1"),
nxt_string("true") },
{ nxt_string("'1a' == '1'"),
nxt_string("false") },
{ nxt_string("'abc' == 'abc'"),
nxt_string("true") },
{ nxt_string("'abc' < 'abcde'"),
nxt_string("true") },
{ nxt_string("0 == ''"),
nxt_string("true") },
{ nxt_string("0 == ' '"),
nxt_string("true") },
{ nxt_string("0 == ' '"),
nxt_string("true") },
{ nxt_string("0 == '0'"),
nxt_string("true") },
{ nxt_string("0 == ' 0 '"),
nxt_string("true") },
{ nxt_string("0 == '000'"),
nxt_string("true") },
{ nxt_string("'0' == ''"),
nxt_string("false") },
{ nxt_string("1 < 2"),
nxt_string("true") },
{ nxt_string("NaN < NaN"),
nxt_string("false") },
{ nxt_string("NaN > NaN"),
nxt_string("false") },
{ nxt_string("undefined < 1"),
nxt_string("false") },
{ nxt_string("[] == false"),
nxt_string("true") },
{ nxt_string("[0] == false"),
nxt_string("true") },
{ nxt_string("[0,0] == false"),
nxt_string("false") },
{ nxt_string("({}) == false"),
nxt_string("false") },
{ nxt_string("var a = { valueOf: function() { return 5 } }; a == 5"),
nxt_string("true") },
{ nxt_string("var a = { valueOf: function() { return '5' } }; a == 5"),
nxt_string("true") },
{ nxt_string("var a = { valueOf: function() { return '5' } }; a == '5'"),
nxt_string("true") },
/* Comparisions. */
{ nxt_string("1 < 2"),
nxt_string("true") },
{ nxt_string("1 < 1"),
nxt_string("false") },
{ nxt_string("1 <= 1"),
nxt_string("true") },
{ nxt_string("1 <= 2"),
nxt_string("true") },
{ nxt_string("2 > 1"),
nxt_string("true") },
{ nxt_string("1 > 2"),
nxt_string("false") },
{ nxt_string("1 > 1"),
nxt_string("false") },
{ nxt_string("1 >= 1"),
nxt_string("true") },
{ nxt_string("2 >= 1"),
nxt_string("true") },
{ nxt_string("1 >= 2"),
nxt_string("false") },
/**/
{ nxt_string("null === null"),
nxt_string("true") },
{ nxt_string("null !== null"),
nxt_string("false") },
{ nxt_string("null == null"),
nxt_string("true") },
{ nxt_string("null != null"),
nxt_string("false") },
{ nxt_string("null < null"),
nxt_string("false") },
{ nxt_string("null > null"),
nxt_string("false") },
{ nxt_string("null <= null"),
nxt_string("true") },
{ nxt_string("null >= null"),
nxt_string("true") },
/**/
{ nxt_string("null === undefined"),
nxt_string("false") },
{ nxt_string("null !== undefined"),
nxt_string("true") },
{ nxt_string("null == undefined"),
nxt_string("true") },
{ nxt_string("null != undefined"),
nxt_string("false") },
{ nxt_string("null < undefined"),
nxt_string("false") },
{ nxt_string("null > undefined"),
nxt_string("false") },
{ nxt_string("null <= undefined"),
nxt_string("false") },
{ nxt_string("null >= undefined"),
nxt_string("false") },
/**/
{ nxt_string("null === false"),
nxt_string("false") },
{ nxt_string("null !== false"),
nxt_string("true") },
{ nxt_string("null == false"),
nxt_string("false") },
{ nxt_string("null != false"),
nxt_string("true") },
{ nxt_string("null < false"),
nxt_string("false") },
{ nxt_string("null > false"),
nxt_string("false") },
{ nxt_string("null <= false"),
nxt_string("true") },
{ nxt_string("null >= false"),
nxt_string("true") },
/**/
{ nxt_string("null === true"),
nxt_string("false") },
{ nxt_string("null !== true"),
nxt_string("true") },
{ nxt_string("null == true"),
nxt_string("false") },
{ nxt_string("null != true"),
nxt_string("true") },
{ nxt_string("null < true"),
nxt_string("true") },
{ nxt_string("null > true"),
nxt_string("false") },
{ nxt_string("null <= true"),
nxt_string("true") },
{ nxt_string("null >= true"),
nxt_string("false") },
/**/
{ nxt_string("Infinity === Infinity"),
nxt_string("true") },
{ nxt_string("Infinity !== Infinity"),
nxt_string("false") },
{ nxt_string("Infinity == Infinity"),
nxt_string("true") },
{ nxt_string("Infinity != Infinity"),
nxt_string("false") },
{ nxt_string("Infinity < Infinity"),
nxt_string("false") },
{ nxt_string("Infinity > Infinity"),
nxt_string("false") },
{ nxt_string("Infinity <= Infinity"),
nxt_string("true") },
{ nxt_string("Infinity >= Infinity"),
nxt_string("true") },
/**/
{ nxt_string("-Infinity === Infinity"),
nxt_string("false") },
{ nxt_string("-Infinity !== Infinity"),
nxt_string("true") },
{ nxt_string("-Infinity == Infinity"),
nxt_string("false") },
{ nxt_string("-Infinity != Infinity"),
nxt_string("true") },
{ nxt_string("-Infinity < Infinity"),
nxt_string("true") },
{ nxt_string("-Infinity > Infinity"),
nxt_string("false") },
{ nxt_string("-Infinity <= Infinity"),
nxt_string("true") },
{ nxt_string("-Infinity >= Infinity"),
nxt_string("false") },
/**/
{ nxt_string("NaN === NaN"),
nxt_string("false") },
{ nxt_string("NaN !== NaN"),
nxt_string("true") },
{ nxt_string("NaN == NaN"),
nxt_string("false") },
{ nxt_string("NaN != NaN"),
nxt_string("true") },
{ nxt_string("NaN < NaN"),
nxt_string("false") },
{ nxt_string("NaN > NaN"),
nxt_string("false") },
{ nxt_string("NaN >= NaN"),
nxt_string("false") },
{ nxt_string("NaN <= NaN"),
nxt_string("false") },
/**/
{ nxt_string("null < 0"),
nxt_string("false") },
{ nxt_string("null < 1"),
nxt_string("true") },
{ nxt_string("null < NaN"),
nxt_string("false") },
{ nxt_string("null < -Infinity"),
nxt_string("false") },
{ nxt_string("null < Infinity"),
nxt_string("true") },
{ nxt_string("null < 'null'"),
nxt_string("false") },
{ nxt_string("null < '1'"),
nxt_string("true") },
{ nxt_string("null < [1]"),
nxt_string("true") },
{ nxt_string("null < ({})"),
nxt_string("false") },
{ nxt_string("var a = { valueOf: function() { return 1 } }; null < a"),
nxt_string("true") },
{ nxt_string("var a = { valueOf: function() { return 'null' } };null < a"),
nxt_string("false") },
{ nxt_string("var a = { valueOf: function() { return '1' } }; null < a"),
nxt_string("true") },
/**/
{ nxt_string("undefined == undefined"),
nxt_string("true") },
{ nxt_string("undefined != undefined"),
nxt_string("false") },
{ nxt_string("undefined === undefined"),
nxt_string("true") },
{ nxt_string("undefined !== undefined"),
nxt_string("false") },
{ nxt_string("undefined < undefined"),
nxt_string("false") },
{ nxt_string("undefined < null"),
nxt_string("false") },
{ nxt_string("undefined < false"),
nxt_string("false") },
{ nxt_string("undefined < true"),
nxt_string("false") },
{ nxt_string("undefined < 0"),
nxt_string("false") },
{ nxt_string("undefined < 1"),
nxt_string("false") },
{ nxt_string("undefined < NaN"),
nxt_string("false") },
{ nxt_string("undefined < -Infinity"),
nxt_string("false") },
{ nxt_string("undefined < Infinity"),
nxt_string("false") },
{ nxt_string("undefined < 'undefined'"),
nxt_string("false") },
{ nxt_string("undefined < '1'"),
nxt_string("false") },
{ nxt_string("undefined < [1]"),
nxt_string("false") },
{ nxt_string("undefined < ({})"),
nxt_string("false") },
{ nxt_string("var a = { valueOf: function() { return 1 } }; undefined < a"),
nxt_string("false") },
{ nxt_string("var a = { valueOf: function() { return 'undefined' } };"
"undefined < a"),
nxt_string("false") },
{ nxt_string("var a = { valueOf: function() { return '1' } };"
"undefined < a"),
nxt_string("false") },
/**/
{ nxt_string("false < 1"),
nxt_string("true") },
{ nxt_string("true < 1"),
nxt_string("false") },
{ nxt_string("-1 < 1"),
nxt_string("true") },
{ nxt_string("-1 < '1'"),
nxt_string("true") },
{ nxt_string("NaN < NaN"),
nxt_string("false") },
{ nxt_string("-Infinity < Infinity"),
nxt_string("true") },
{ nxt_string("Infinity < -Infinity"),
nxt_string("false") },
{ nxt_string("1 < 'abc'"),
nxt_string("false") },
/**/
{ nxt_string("[] === []"),
nxt_string("false") },
{ nxt_string("[] !== []"),
nxt_string("true") },
{ nxt_string("[] == []"),
nxt_string("false") },
{ nxt_string("[] != []"),
nxt_string("true") },
{ nxt_string("[] < []"),
nxt_string("false") },
{ nxt_string("[] > []"),
nxt_string("false") },
{ nxt_string("[] >= []"),
nxt_string("true") },
{ nxt_string("[] <= []"),
nxt_string("true") },
/**/
{ nxt_string("({}) === ({})"),
nxt_string("false") },
{ nxt_string("({}) !== ({})"),
nxt_string("true") },
{ nxt_string("({}) == ({})"),
nxt_string("false") },
{ nxt_string("({}) != ({})"),
nxt_string("true") },
{ nxt_string("({}) > ({})"),
nxt_string("false") },
{ nxt_string("({}) <= ({})"),
nxt_string("true") },
{ nxt_string("({}) >= ({})"),
nxt_string("true") },
/**/
{ nxt_string("[0] == ({})"),
nxt_string("false") },
{ nxt_string("[0] != ({})"),
nxt_string("true") },
{ nxt_string("[0] <= ({})"),
nxt_string("true") },
{ nxt_string("[0] >= ({})"),
nxt_string("false") },
/**/
{ nxt_string("var a; a = 1 ? 2 : 3"),
nxt_string("2") },
{ nxt_string("var a; a = 1 ? 2 : 3 ? 4 : 5"),
nxt_string("2") },
{ nxt_string("var a; a = 0 ? 2 : 3 ? 4 : 5"),
nxt_string("4") },
{ nxt_string("0 ? 2 ? 3 : 4 : 5"),
nxt_string("5") },
{ nxt_string("1 ? 2 ? 3 : 4 : 5"),
nxt_string("3") },
{ nxt_string("1 ? 0 ? 3 : 4 : 5"),
nxt_string("4") },
{ nxt_string("(1 ? 0 : 3) ? 4 : 5"),
nxt_string("5") },
{ nxt_string("var a; a = (1 + 2) ? 2 ? 3 + 4 : 5 : 6"),
nxt_string("7") },
{ nxt_string("var a; a = (1 ? 2 : 3) + 4"),
nxt_string("6") },
{ nxt_string("var a, b; a = 1 ? b = 2 + 4 : b = 3"),
nxt_string("6") },
{ nxt_string("var a; a = 1 ? [1,2] : []"),
nxt_string("1,2") },
/**/
{ nxt_string("var a = { valueOf: function() { return 1 } }; +a"),
nxt_string("1") },
{ nxt_string("var a = { valueOf: function() { return '1' } }; +a"),
nxt_string("1") },
{ nxt_string("var a = { valueOf: function() { return 1 } }; -a"),
nxt_string("-1") },
{ nxt_string("var a = { valueOf: function() { return '1' } }; -a"),
nxt_string("-1") },
/* Increment. */
{ nxt_string("var a = 1; ++a"),
nxt_string("2") },
{ nxt_string("var a = '1'; ++a"),
nxt_string("2") },
{ nxt_string("var a = [1]; ++a"),
nxt_string("2") },
{ nxt_string("var a = {}; ++a"),
nxt_string("NaN") },
{ nxt_string("var a = [1,2,3]; var b = 1; b = ++a[b]; b + ' '+ a"),
nxt_string("3 1,3,3") },
{ nxt_string("var a = { valueOf: function() { return 1 } };"
"++a +' '+ a +' '+ typeof a"),
nxt_string("2 2 number") },
{ nxt_string("var a = { valueOf: function() { return '1' } };"
"++a +' '+ a +' '+ typeof a"),
nxt_string("2 2 number") },
{ nxt_string("var a = { valueOf: function() { return [1] } };"
"++a +' '+ a +' '+ typeof a"),
nxt_string("NaN NaN number") },
{ nxt_string("var a = { valueOf: function() { return {} } };"
"++a +' '+ a +' '+ typeof a"),
nxt_string("NaN NaN number") },
/**/
{ nxt_string("var a = 1; a = ++a"),
nxt_string("2") },
{ nxt_string("var a = '1'; a = ++a"),
nxt_string("2") },
{ nxt_string("var a = [1]; a = ++a"),
nxt_string("2") },
{ nxt_string("var a = {}; a = ++a"),
nxt_string("NaN") },
{ nxt_string("var a = { valueOf: function() { return 1 } }; a = ++a"),
nxt_string("2") },
{ nxt_string("var a = { valueOf: function() { return '1' } }; a = ++a"),
nxt_string("2") },
{ nxt_string("var a = { valueOf: function() { return [1] } }; a = ++a"),
nxt_string("NaN") },
{ nxt_string("var a = { valueOf: function() { return {} } }; a = ++a"),
nxt_string("NaN") },
/**/
{ nxt_string("var a = 1; var b = ++a; a +' '+ b"),
nxt_string("2 2") },
{ nxt_string("var a = '1'; var b = ++a; a +' '+ b"),
nxt_string("2 2") },
{ nxt_string("var a = [1]; var b = ++a; a +' '+ b"),
nxt_string("2 2") },
{ nxt_string("var a = {}; var b = ++a; a +' '+ b"),
nxt_string("NaN NaN") },
{ nxt_string("var a = { valueOf: function() { return 1 } };"
"var b = ++a; a +' '+ b"),
nxt_string("2 2") },
{ nxt_string("var a = { valueOf: function() { return '1' } };"
"var b = ++a; a +' '+ b"),
nxt_string("2 2") },
{ nxt_string("var a = { valueOf: function() { return [1] } };"
"var b = ++a; a +' '+ b"),
nxt_string("NaN NaN") },
{ nxt_string("var a = { valueOf: function() { return {} } };"
"var b = ++a; a +' '+ b"),
nxt_string("NaN NaN") },
/* Post increment. */
{ nxt_string("var a = 1; a++"),
nxt_string("1") },
{ nxt_string("var a = '1'; a++"),
nxt_string("1") },
{ nxt_string("var a = [1]; a++"),
nxt_string("1") },
{ nxt_string("var a = {}; a++"),
nxt_string("NaN") },
{ nxt_string("var a = { valueOf: function() { return 1 } }; a++"),
nxt_string("1") },
{ nxt_string("var a = { valueOf: function() { return '1' } }; a++"),
nxt_string("1") },
{ nxt_string("var a = { valueOf: function() { return [1] } }; a++"),
nxt_string("NaN") },
{ nxt_string("var a = { valueOf: function() { return {} } }; a++"),
nxt_string("NaN") },
/**/
{ nxt_string("var a = 1; a = a++"),
nxt_string("1") },
{ nxt_string("var a = '1'; a = a++"),
nxt_string("1") },
{ nxt_string("var a = [1]; a = a++"),
nxt_string("1") },
{ nxt_string("var a = {}; a = a++"),
nxt_string("NaN") },
{ nxt_string("var a = { valueOf: function() { return 1 } }; a = a++"),
nxt_string("1") },
{ nxt_string("var a = { valueOf: function() { return '1' } }; a = a++"),
nxt_string("1") },
{ nxt_string("var a = { valueOf: function() { return [1] } }; a = a++"),
nxt_string("NaN") },
{ nxt_string("var a = { valueOf: function() { return {} } }; a = a++"),
nxt_string("NaN") },
/**/
{ nxt_string("var a = 1; var b = a++; a +' '+ b"),
nxt_string("2 1") },
{ nxt_string("var a = '1'; var b = a++; a +' '+ b"),
nxt_string("2 1") },
{ nxt_string("var a = [1]; var b = a++; a +' '+ b"),
nxt_string("2 1") },
{ nxt_string("var a = {}; var b = a++; a +' '+ b"),
nxt_string("NaN NaN") },
{ nxt_string("var a = { valueOf: function() { return 1 } };"
"var b = a++; a +' '+ b"),
nxt_string("2 1") },
{ nxt_string("var a = { valueOf: function() { return '1' } };"
"var b = a++; a +' '+ b"),
nxt_string("2 1") },
{ nxt_string("var a = { valueOf: function() { return [1] } };"
"var b = a++; a +' '+ b"),
nxt_string("NaN NaN") },
{ nxt_string("var a = { valueOf: function() { return {} } };"
"var b = a++; a +' '+ b"),
nxt_string("NaN NaN") },
/* Decrement. */
{ nxt_string("var a = 1; --a"),
nxt_string("0") },
{ nxt_string("var a = '1'; --a"),
nxt_string("0") },
{ nxt_string("var a = [1]; --a"),
nxt_string("0") },
{ nxt_string("var a = {}; --a"),
nxt_string("NaN") },
{ nxt_string("var a = { valueOf: function() { return 1} }; --a"),
nxt_string("0") },
{ nxt_string("var a = { valueOf: function() { return '1'} }; --a"),
nxt_string("0") },
{ nxt_string("var a = { valueOf: function() { return [1]} }; --a"),
nxt_string("NaN") },
{ nxt_string("var a = { valueOf: function() { return {} } }; --a"),
nxt_string("NaN") },
/**/
{ nxt_string("var a = 1; a = --a"),
nxt_string("0") },
{ nxt_string("var a = '1'; a = --a"),
nxt_string("0") },
{ nxt_string("var a = [1]; a = --a"),
nxt_string("0") },
{ nxt_string("var a = {}; a = --a"),
nxt_string("NaN") },
{ nxt_string("var a = { valueOf: function() { return 1} }; a = --a"),
nxt_string("0") },
{ nxt_string("var a = { valueOf: function() { return '1'} }; a = --a"),
nxt_string("0") },
{ nxt_string("var a = { valueOf: function() { return [1]} }; a = --a"),
nxt_string("NaN") },
{ nxt_string("var a = { valueOf: function() { return {} } }; a = --a"),
nxt_string("NaN") },
/**/
{ nxt_string("var a = 1; var b = --a; a +' '+ b"),
nxt_string("0 0") },
{ nxt_string("var a = '1'; var b = --a; a +' '+ b"),
nxt_string("0 0") },
{ nxt_string("var a = [1]; var b = --a; a +' '+ b"),
nxt_string("0 0") },
{ nxt_string("var a = {}; var b = --a; a +' '+ b"),
nxt_string("NaN NaN") },
{ nxt_string("var a = { valueOf: function() { return 1 } };"
"var b = --a; a +' '+ b"),
nxt_string("0 0") },
{ nxt_string("var a = { valueOf: function() { return '1' } };"
"var b = --a; a +' '+ b"),
nxt_string("0 0") },
{ nxt_string("var a = { valueOf: function() { return [1] } };"
"var b = --a; a +' '+ b"),
nxt_string("NaN NaN") },
{ nxt_string("var a = { valueOf: function() { return {} } };"
"var b = --a; a +' '+ b"),
nxt_string("NaN NaN") },
/* Post decrement. */
{ nxt_string("var a = 1; a--"),
nxt_string("1") },
{ nxt_string("var a = '1'; a--"),
nxt_string("1") },
{ nxt_string("var a = [1]; a--"),
nxt_string("1") },
{ nxt_string("var a = {}; a--"),
nxt_string("NaN") },
{ nxt_string("var a = { valueOf: function() { return 1 } }; a--"),
nxt_string("1") },
{ nxt_string("var a = { valueOf: function() { return '1' } }; a--"),
nxt_string("1") },
{ nxt_string("var a = { valueOf: function() { return [1] } }; a--"),
nxt_string("NaN") },
{ nxt_string("var a = { valueOf: function() { return {} } }; a--"),
nxt_string("NaN") },
/**/
{ nxt_string("var a = 1; a = a--"),
nxt_string("1") },
{ nxt_string("var a = '1'; a = a--"),
nxt_string("1") },
{ nxt_string("var a = [1]; a = a--"),
nxt_string("1") },
{ nxt_string("var a = {}; a = a--"),
nxt_string("NaN") },
{ nxt_string("var a = { valueOf: function() { return 1 } }; a = a--"),
nxt_string("1") },
{ nxt_string("var a = { valueOf: function() { return '1' } }; a = a--"),
nxt_string("1") },
{ nxt_string("var a = { valueOf: function() { return [1] } }; a = a--"),
nxt_string("NaN") },
{ nxt_string("var a = { valueOf: function() { return {} } }; a = a--"),
nxt_string("NaN") },
/**/
{ nxt_string("var a = 1; var b = a--; a +' '+ b"),
nxt_string("0 1") },
{ nxt_string("var a = '1'; var b = a--; a +' '+ b"),
nxt_string("0 1") },
{ nxt_string("var a = [1]; var b = a--; a +' '+ b"),
nxt_string("0 1") },
{ nxt_string("var a = {}; var b = a--; a +' '+ b"),
nxt_string("NaN NaN") },
{ nxt_string("var a = { valueOf: function() { return 1 } };"
"var b = a--; a +' '+ b"),
nxt_string("0 1") },
{ nxt_string("var a = { valueOf: function() { return '1' } };"
"var b = a--; a +' '+ b"),
nxt_string("0 1") },
{ nxt_string("var a = { valueOf: function() { return [1] } };"
"var b = a--; a +' '+ b"),
nxt_string("NaN NaN") },
{ nxt_string("var a = { valueOf: function() { return {} } };"
"var b = a--; a +' '+ b"),
nxt_string("NaN NaN") },
/**/
{ nxt_string("var a, b; a = 2; b = ++a + ++a; a + ' ' + b"),
nxt_string("4 7") },
{ nxt_string("var a, b; a = 2; b = a++ + a++; a + ' ' + b"),
nxt_string("4 5") },
{ nxt_string("var a, b; a = b = 7; a +' '+ b"),
nxt_string("7 7") },
{ nxt_string("var a, b, c; a = b = c = 5; a +' '+ b +' '+ c"),
nxt_string("5 5 5") },
{ nxt_string("var a, b, c; a = b = (c = 5) + 2; a +' '+ b +' '+ c"),
nxt_string("7 7 5") },
{ nxt_string("1, 2 + 5, 3"),
nxt_string("3") },
{ nxt_string("var a, b; a = 1 /* YES */\n b = a + 2 \n \n + 1 \n + 3"),
nxt_string("7") },
{ nxt_string("var a, b; a = 1 // YES \n b = a + 2 \n \n + 1 \n + 3"),
nxt_string("7") },
{ nxt_string("var a; a = 0; ++ \n a"),
nxt_string("1") },
{ nxt_string("a = 0; a \n ++"),
nxt_string("SyntaxError: Unexpected end of input in 2") },
{ nxt_string("var a; a = 1 ? 2 \n : 3"),
nxt_string("2") },
{ nxt_string("var a, b, c;"
"a = 0 / 0; b = 1 / 0; c = -1 / 0; a +' '+ b +' '+ c"),
nxt_string("NaN Infinity -Infinity") },
{ nxt_string("var a, b; a = (b = 7) + 5; var c; a +' '+ b +' '+ c"),
nxt_string("12 7 undefined") },
{ nxt_string("var a, b = 1, c; a +' '+ b +' '+ c"),
nxt_string("undefined 1 undefined") },
{ nxt_string("var a = 1, b = a + 1; a +' '+ b"),
nxt_string("1 2") },
{ nxt_string("var a; a = a = 1"),
nxt_string("1") },
{ nxt_string("var a = 1, \n b; a +' '+ b"),
nxt_string("1 undefined") },
{ nxt_string("var a; a = b + 1; var b; a +' '+ b"),
nxt_string("NaN undefined") },
{ nxt_string("var a += 1"),
nxt_string("SyntaxError: Unexpected token \"+=\" in 1") },
{ nxt_string("var a = a + 1"),
nxt_string("undefined") },
{ nxt_string("var a; a = b + 1; var b = 1; a +' '+ b"),
nxt_string("NaN 1") },
{ nxt_string("var a; (a) = 1"),
nxt_string("1") },
{ nxt_string("a"),
nxt_string("ReferenceError: \"a\" is not defined in 1") },
{ nxt_string("a + a"),
nxt_string("ReferenceError: \"a\" is not defined in 1") },
{ nxt_string("a = b + 1"),
nxt_string("ReferenceError: \"a\" is not defined in 1") },
{ nxt_string("a = a + 1"),
nxt_string("ReferenceError: \"a\" is not defined in 1") },
{ nxt_string("a += 1"),
nxt_string("ReferenceError: \"a\" is not defined in 1") },
{ nxt_string("a += 1; var a = 2"),
nxt_string("undefined") },
{ nxt_string("var a = 1"),
nxt_string("undefined") },
{ nxt_string("var a = 1; a = (a = 2) + a"),
nxt_string("4") },
{ nxt_string("var a = 1; a = a + (a = 2)"),
nxt_string("3") },
{ nxt_string("var a = 1; a += (a = 2)"),
nxt_string("3") },
{ nxt_string("var a = b = 1; var b; a +' '+ b"),
nxt_string("1 1") },
{ nxt_string("var a \n if (!a) a = 3; a"),
nxt_string("3") },
/* if. */
{ nxt_string("if (0);"),
nxt_string("undefined") },
{ nxt_string("if (0) {}"),
nxt_string("undefined") },
{ nxt_string("if (0);else;"),
nxt_string("undefined") },
{ nxt_string("var a = 1; if (true); else a = 2; a"),
nxt_string("1") },
{ nxt_string("var a = 1; if (false); else a = 2; a"),
nxt_string("2") },
{ nxt_string("var a = 1; if (true) a = 2; else a = 3; a"),
nxt_string("2") },
{ nxt_string("var a = 3; if (true) if (false); else a = 2; a"),
nxt_string("2") },
{ nxt_string("var a = 3; if (true) if (false); else; a = 2; a"),
nxt_string("2") },
{ nxt_string("var a = [3], b; if (1==1||2==2) { b = '1'+'2'+a[0] }; b"),
nxt_string("123") },
{ nxt_string("(function(){ if(true) return 1 else return 0; })()"),
nxt_string("1") },
{ nxt_string("(function(){ if(true) return 1; else return 0; })()"),
nxt_string("1") },
{ nxt_string("(function(){ if(true) return 1;; else return 0; })()"),
nxt_string("SyntaxError: Unexpected token \"else\" in 1") },
{ nxt_string("(function(){ if(true) return 1\n else return 0; })()"),
nxt_string("1") },
{ nxt_string("(function(){ if(true) return 1\n;\n else return 0; })()"),
nxt_string("1") },
/* do while. */
{ nxt_string("do { break } if (false)"),
nxt_string("SyntaxError: Unexpected token \"if\" in 1") },
/* for in. */
{ nxt_string("for (null in undefined);"),
nxt_string("ReferenceError: Invalid left-hand side \"null\" in for-in statement in 1") },
/* switch. */
{ nxt_string("switch"),
nxt_string("SyntaxError: Unexpected end of input in 1") },
{ nxt_string("switch (1);"),
nxt_string("SyntaxError: Unexpected token \";\" in 1") },
{ nxt_string("switch (1) { do { } while (1) }"),
nxt_string("SyntaxError: Unexpected token \"do\" in 1") },
{ nxt_string("switch (1) {}"),
nxt_string("undefined") },
{ nxt_string("switch (1) {default:}"),
nxt_string("undefined") },
{ nxt_string("switch (1) {case 0:}"),
nxt_string("undefined") },
{ nxt_string("switch (1) {default:;}"),
nxt_string("undefined") },
{ nxt_string("switch (1) {default:; default:}"),
nxt_string("SyntaxError: More than one default clause in switch statement in 1") },
{ nxt_string("switch (1) {case 0:;}"),
nxt_string("undefined") },
{ nxt_string("var a = 'A'; switch (a) {"
"case 0: a += '0';"
"case 1: a += '1';"
"}; a"),
nxt_string("A") },
{ nxt_string("var a = 'A'; switch (0) {"
"case 0: a += '0';"
"case 1: a += '1';"
"}; a"),
nxt_string("A01") },
{ nxt_string("var a = 'A'; switch (0) {"
"case 0: a += '0'; break;"
"case 1: a += '1';"
"}; a"),
nxt_string("A0") },
{ nxt_string("var a = 'A'; switch (1) {"
"case 0: a += '0';"
"case 1: a += '1';"
"}; a"),
nxt_string("A1") },
{ nxt_string("var a = 'A'; switch (2) {"
"case 0: a += '0';"
"case 1: a += '1';"
"default: a += 'D';"
"}; a"),
nxt_string("AD") },
{ nxt_string("var a = 'A'; switch (2) {"
"case 0: a += '0';"
"default: a += 'D';"
"case 1: a += '1';"
"}; a"),
nxt_string("AD1") },
{ nxt_string("var a = 'A'; function f(x) { a += x; return 0 }"
"switch (a) {"
"case f(1):"
"default:"
"case f(2): a += 'D';"
"case f(3): a += 'T';"
"} a"),
nxt_string("A123DT") },
/* continue. */
{ nxt_string("continue"),
nxt_string("SyntaxError: Illegal continue statement in 1") },
{ nxt_string("do continue while (false)"),
nxt_string("SyntaxError: Unexpected token \"while\" in 1") },
{ nxt_string("do continue; while (false)"),
nxt_string("undefined") },
{ nxt_string("do { continue } while (false)"),
nxt_string("undefined") },
{ nxt_string("var i = 0; do if (i++ > 9) continue; while (i < 100); i"),
nxt_string("100") },
{ nxt_string("while (false) continue"),
nxt_string("undefined") },
{ nxt_string("while (false) continue;"),
nxt_string("undefined") },
{ nxt_string("while (false) { continue }"),
nxt_string("undefined") },
{ nxt_string("var i = 0; while (i < 100) if (i++ > 9) continue; i"),
nxt_string("100") },
{ nxt_string("for ( ;null; ) continue"),
nxt_string("undefined") },
{ nxt_string("for ( ;null; ) continue;"),
nxt_string("undefined") },
{ nxt_string("for ( ;null; ) { continue }"),
nxt_string("undefined") },
{ nxt_string("var i; for (i = 0; i < 100; i++) if (i > 9) continue; i"),
nxt_string("100") },
{ nxt_string("var a = [], i; for (i in a) continue"),
nxt_string("undefined") },
{ nxt_string("var a = [], i; for (i in a) continue;"),
nxt_string("undefined") },
{ nxt_string("var a = [], i; for (i in a) { continue }"),
nxt_string("undefined") },
{ nxt_string("var a = [1,2,3,4,5]; var s = 0, i;"
"for (i in a) { if (a[i] > 4) continue; else s += a[i] } s"),
nxt_string("10") },
{ nxt_string("var a = [1,2,3,4,5]; var s = 0, i;"
"for (i in a) { if (a[i] > 4) continue; s += a[i] } s"),
nxt_string("10") },
{ nxt_string("var a; for (a = 1; a; a--) switch (a) { case 0: continue }"),
nxt_string("undefined") },
{ nxt_string("var a = [1,2,3], i; for (i in a) {Object.seal({})}"),
nxt_string("undefined") },
{ nxt_string("var i; for (i in [1,2,3]) {Object.seal({});}"),
nxt_string("undefined") },
/* break. */
{ nxt_string("break"),
nxt_string("SyntaxError: Illegal break statement in 1") },
{ nxt_string("do break while (true)"),
nxt_string("SyntaxError: Unexpected token \"while\" in 1") },
{ nxt_string("do break; while (true)"),
nxt_string("undefined") },
{ nxt_string("do { break } while (true)"),
nxt_string("undefined") },
{ nxt_string("var i = 0; do if (i++ > 9) break; while (i < 100); i"),
nxt_string("11") },
{ nxt_string("while (true) break"),
nxt_string("undefined") },
{ nxt_string("while (true) break;"),
nxt_string("undefined") },
{ nxt_string("while (true) { break }"),
nxt_string("undefined") },
{ nxt_string("var i = 0; while (i < 100) if (i++ > 9) break; i"),
nxt_string("11") },
{ nxt_string("for ( ;; ) break"),
nxt_string("undefined") },
{ nxt_string("for ( ;; ) break;"),
nxt_string("undefined") },
{ nxt_string("for ( ;; ) { break }"),
nxt_string("undefined") },
{ nxt_string("var i; for (i = 0; i < 100; i++) if (i > 9) break; i"),
nxt_string("10") },
{ nxt_string("var a = [], i; for (i in a) break"),
nxt_string("undefined") },
{ nxt_string("var a = [], i; for (i in a) break;"),
nxt_string("undefined") },
{ nxt_string("var a = [], i; for (i in a) { break }"),
nxt_string("undefined") },
{ nxt_string("var a = [1,2,3,4,5]; var s = 0, i;"
"for (i in a) { if (a[i] > 4) break; else s += a[i] } s"),
nxt_string("10") },
{ nxt_string("var a = [1,2,3,4,5]; var s = 0, i;"
"for (i in a) { if (a[i] > 4) break; s += a[i] } s"),
nxt_string("10") },
{ nxt_string("var a = [1,2,3,4,5]; var s = 0, i;"
"for (i in a) if (a[i] > 4) break; s += a[i]; s"),
nxt_string("5") },
/**/
{ nxt_string("var i; for (i = 0; i < 10; i++) { i += 1 } i"),
nxt_string("10") },
/* Factorial. */
{ nxt_string("var n = 5, f = 1; while (n--) f *= n + 1; f"),
nxt_string("120") },
{ nxt_string("var n = 5, f = 1; while (n) { f *= n; n-- } f"),
nxt_string("120") },
/* Fibonacci. */
{ nxt_string("var n = 50, x, i, j, k;"
"for(i=0,j=1,k=0; k<n; i=j,j=x,k++ ){ x=i+j } x"),
nxt_string("20365011074") },
{ nxt_string("3 + 'abc' + 'def' + null + true + false + undefined"),
nxt_string("3abcdefnulltruefalseundefined") },
{ nxt_string("var a = 0; do a++; while (a < 5) if (a == 5) a = 7.33 \n"
"else a = 8; while (a < 10) a++; a"),
nxt_string("10.33") },
/* typeof. */
{ nxt_string("typeof null"),
nxt_string("object") },
{ nxt_string("typeof undefined"),
nxt_string("undefined") },
{ nxt_string("typeof false"),
nxt_string("boolean") },
{ nxt_string("typeof true"),
nxt_string("boolean") },
{ nxt_string("typeof 0"),
nxt_string("number") },
{ nxt_string("typeof -1"),
nxt_string("number") },
{ nxt_string("typeof Infinity"),
nxt_string("number") },
{ nxt_string("typeof NaN"),
nxt_string("number") },
{ nxt_string("typeof 'a'"),
nxt_string("string") },
{ nxt_string("typeof {}"),
nxt_string("object") },
{ nxt_string("typeof Object()"),
nxt_string("object") },
{ nxt_string("typeof []"),
nxt_string("object") },
{ nxt_string("typeof function(){}"),
nxt_string("function") },
{ nxt_string("typeof Object"),
nxt_string("function") },
{ nxt_string("typeof /./i"),
nxt_string("object") },
{ nxt_string("typeof Date.prototype"),
nxt_string("object") },
{ nxt_string("typeof a"),
nxt_string("undefined") },
{ nxt_string("typeof a; var a"),
nxt_string("undefined") },
{ nxt_string("typeof a; var a; a"),
nxt_string("undefined") },
{ nxt_string("var a = 5; typeof a"),
nxt_string("number") },
{ nxt_string("typeof a; a"),
nxt_string("ReferenceError: \"a\" is not defined in 1") },
{ nxt_string("typeof a; a = 1"),
nxt_string("ReferenceError: \"a\" is not defined in 1") },
/**/
{ nxt_string("void 0"),
nxt_string("undefined") },
{ nxt_string("null = 1"),
nxt_string("ReferenceError: Invalid left-hand side in assignment in 1") },
{ nxt_string("undefined = 1"),
nxt_string("ReferenceError: Invalid left-hand side in assignment in 1") },
{ nxt_string("null++"),
nxt_string("ReferenceError: Invalid left-hand side in postfix operation in 1") },
{ nxt_string("++null"),
nxt_string("ReferenceError: Invalid left-hand side in prefix operation in 1") },
{ nxt_string("var a, b; b = a; a = 1; a +' '+ b"),
nxt_string("1 undefined") },
{ nxt_string("a = 1"),
nxt_string("ReferenceError: \"a\" is not defined in 1") },
{ nxt_string("var a; a = 1; a"),
nxt_string("1") },
{ nxt_string("var a = {}; typeof a +' '+ a"),
nxt_string("object [object Object]") },
{ nxt_string("var a = {}; a.b"),
nxt_string("undefined") },
{ nxt_string("var a = {}; a.b = 1 + 2; a.b"),
nxt_string("3") },
{ nxt_string("var a = {}; a['b']"),
nxt_string("undefined") },
{ nxt_string("var a = {}; a.b.c"),
nxt_string("TypeError: cannot get property 'c' of undefined") },
{ nxt_string("'a'.b = 1"),
nxt_string("TypeError: property set on primitive string type") },
{ nxt_string("var a = {}; a.b = 1; a.b"),
nxt_string("1") },
{ nxt_string("var a = {}; a.b = 1; a.b += 2"),
nxt_string("3") },
{ nxt_string("var a = {}; a.b = 1; a.b += a.b"),
nxt_string("2") },
{ nxt_string("var a = {}; a.b = 1; var x = {}; x.b = 3; a.b += (x.b = 2)"),
nxt_string("3") },
{ nxt_string("var a = {}; a.b = 1; a.b += (a.b = 2)"),
nxt_string("3") },
{ nxt_string("var a = {}; a.b += 1"),
nxt_string("NaN") },
{ nxt_string("var a = 1; var b = 2; a = b += 1"),
nxt_string("3") },
{ nxt_string("var a = 1; var b = { x:2 }; a = b.x += 1"),
nxt_string("3") },
{ nxt_string("var a = 1; var b = { x:2 }; a = b.x += (a = 1)"),
nxt_string("3") },
{ nxt_string("var a = undefined; a.b++; a.b"),
nxt_string("TypeError: cannot get property 'b' of undefined") },
{ nxt_string("var a = null; a.b++; a.b"),
nxt_string("TypeError: cannot get property 'b' of undefined") },
{ nxt_string("var a = true; a.b++; a.b"),
nxt_string("TypeError: property set on primitive boolean type") },
{ nxt_string("var a = 1; a.b++; a.b"),
nxt_string("TypeError: property set on primitive number type") },
{ nxt_string("var n = 1, o = { p: n += 1 }; o.p"),
nxt_string("2") },
{ nxt_string("var a = {}; a.b = {}; a.b.c = 1; a.b['c']"),
nxt_string("1") },
{ nxt_string("var a = {}; a.b = {}; a.b.c = 1; a['b']['c']"),
nxt_string("1") },
{ nxt_string("var a = {}; a.b = {}; var c = 'd'; a.b.d = 1; a['b'][c]"),
nxt_string("1") },
{ nxt_string("var a = {}; a.b = 1; var c = a.b++; a.b +' '+ c"),
nxt_string("2 1") },
{ nxt_string("var a = 2; a.b = 1; var c = a.b++; a +' '+ a.b +' '+ c"),
nxt_string("TypeError: property set on primitive number type") },
{ nxt_string("var x = { a: 1 }; x.a"),
nxt_string("1") },
{ nxt_string("var a = { x:1 }; var b = { y:2 }; a.x = b.y; a.x"),
nxt_string("2") },
{ nxt_string("var a = { x:1 }; var b = { y:2 }; var c; c = a.x = b.y"),
nxt_string("2") },
{ nxt_string("var a = { x:1 }; var b = { y:2 }; var c = a.x = b.y; c"),
nxt_string("2") },
{ nxt_string("var a = { x:1 }; var b = { y:2 }; a.x = b.y"),
nxt_string("2") },
{ nxt_string("var a = { x:1 }; var b = a.x = 1 + 2; a.x +' '+ b"),
nxt_string("3 3") },
{ nxt_string("var a = { x:1 }; var b = { y:2 }; var c = {};"
"c.x = a.x = b.y; c.x"),
nxt_string("2") },
{ nxt_string("var y = 2, x = { a:1, b: y + 5, c:3 };"
"x.a +' '+ x.b +' '+ x.c"),
nxt_string("1 7 3") },
{ nxt_string("var x = { a: 1, b: { a:2, c:5 } };"
"x.a +' '+ x.b.a +' '+ x.b.c"),
nxt_string("1 2 5") },
{ nxt_string("var y = 5, x = { a:y }; x.a"),
nxt_string("5") },
{ nxt_string("var x = { a: 1; b: 2 }"),
nxt_string("SyntaxError: Unexpected token \";\" in 1") },
{ nxt_string("var x = { a: 1, b: x.a }"),
nxt_string("TypeError: cannot get property 'a' of undefined") },
{ nxt_string("var a = { b: 2 }; a.b += 1"),
nxt_string("3") },
{ nxt_string("var o = {a:1}, c = o; o.a = o = {b:5};"
"o.a +' '+ o.b +' '+ c.a.b"),
nxt_string("undefined 5 5") },
{ nxt_string("var y = { a: 2 }, x = { a: 1, b: y.a }; x.a +' '+ x.b"),
nxt_string("1 2") },
{ nxt_string("var y = { a: 1 }, x = { a: y.a++, b: y.a++ }\n"
"x.a +' '+ x.b +' '+ y.a"),
nxt_string("1 2 3") },
{ nxt_string("var a='', o = {a:1, b:2}, p;"
"for (p in o) { a += p +':'+ o[p] +',' } a"),
nxt_string("a:1,b:2,") },
{ nxt_string("var x = { a: 1 }, b = delete x.a; x.a +' '+ b"),
nxt_string("undefined true") },
{ nxt_string("delete null"),
nxt_string("true") },
{ nxt_string("var a; delete a"),
nxt_string("SyntaxError: Delete of an unqualified identifier in 1") },
{ nxt_string("delete undefined"),
nxt_string("SyntaxError: Delete of an unqualified identifier in 1") },
/* ES5FIX: "SyntaxError". */
{ nxt_string("delete NaN"),
nxt_string("true") },
/* ES5FIX: "SyntaxError". */
{ nxt_string("delete Infinity"),
nxt_string("true") },
{ nxt_string("delete -Infinity"),
nxt_string("true") },
{ nxt_string("delete (1/0)"),
nxt_string("true") },
{ nxt_string("delete 1"),
nxt_string("true") },
{ nxt_string("var a; delete (a = 1); a"),
nxt_string("1") },
{ nxt_string("delete a"),
nxt_string("SyntaxError: Delete of an unqualified identifier in 1") },
{ nxt_string("var a = 1; delete a"),
nxt_string("SyntaxError: Delete of an unqualified identifier in 1") },
{ nxt_string("function f(){} delete f"),
nxt_string("SyntaxError: Delete of an unqualified identifier in 1") },
{ nxt_string("var a = { x:1 }; ('x' in a) +' '+ (1 in a)"),
nxt_string("true false") },
{ nxt_string("delete --[][1]"),
nxt_string("true") },
{ nxt_string("var a = {}; 1 in a"),
nxt_string("false") },
{ nxt_string("var a = 1; 1 in a"),
nxt_string("TypeError: property in on a primitive value") },
{ nxt_string("var a = true; 1 in a"),
nxt_string("TypeError: property in on a primitive value") },
{ nxt_string("var n = { toString: function() { return 'a' } };"
"var o = { a: 5 }; o[n]"),
nxt_string("5") },
{ nxt_string("var n = { valueOf: function() { return 'a' } };"
"var o = { a: 5, '[object Object]': 7 }; o[n]"),
nxt_string("7") },
{ nxt_string("var o = {}; o.new = 'OK'; o.new"),
nxt_string("OK") },
{ nxt_string("var o = { new: 'OK'}; o.new"),
nxt_string("OK") },
/* Arrays */
/* Empty array to primitive. */
{ nxt_string("3 + []"),
nxt_string("3") },
{ nxt_string("3 * []"),
nxt_string("0") },
/* Single element array to primitive. */
{ nxt_string("3 + [5]"),
nxt_string("35") },
{ nxt_string("3 * [5]"),
nxt_string("15") },
/* Array to primitive. */
{ nxt_string("3 + [5,7]"),
nxt_string("35,7") },
{ nxt_string("3 * [5,7]"),
nxt_string("NaN") },
{ nxt_string("var a = [ 1, 2, 3 ]; a[0] + a[1] + a[2]"),
nxt_string("6") },
{ nxt_string("var a = [ 1, 2, 3 ]; a[-1] = 4; a + a[-1]"),
nxt_string("1,2,34") },
{ nxt_string("var a = [ 1, 2, 3 ]; a[4294967295] = 4; a + a[4294967295]"),
nxt_string("1,2,34") },
{ nxt_string("var a = [ 1, 2, 3 ]; a[4294967296] = 4; a + a[4294967296]"),
nxt_string("1,2,34") },
{ nxt_string("delete[]['4e9']"),
nxt_string("false") },
{ nxt_string("var n = 1, a = [ n += 1 ]; a"),
nxt_string("2") },
{ nxt_string("var a = [ 1, 2; 3 ]; a[0] + a[1] + a[2]"),
nxt_string("SyntaxError: Unexpected token \";\" in 1") },
{ nxt_string("var a = [ 1, 2, 3 ]; a[0] +' '+ a[1] +' '+ a[2] +' '+ a[3]"),
nxt_string("1 2 3 undefined") },
{ nxt_string("var a = [ 5, 6, 7 ]; a['1']"),
nxt_string("6") },
{ nxt_string("var a = [ 5, 6, 7 ]; a['01']"),
nxt_string("undefined") },
{ nxt_string("var a = [ 5, 6, 7 ]; a[0x1]"),
nxt_string("6") },
{ nxt_string("var a = [ 5, 6, 7 ]; a['0x1']"),
nxt_string("undefined") },
{ nxt_string("[] - 2"),
nxt_string("-2") },
{ nxt_string("[1] - 2"),
nxt_string("-1") },
{ nxt_string("[[1]] - 2"),
nxt_string("-1") },
{ nxt_string("[[[1]]] - 2"),
nxt_string("-1") },
{ nxt_string("var a = []; a - 2"),
nxt_string("-2") },
{ nxt_string("var a = [1]; a - 2"),
nxt_string("-1") },
{ nxt_string("var a = []; a[0] = 1; a - 2"),
nxt_string("-1") },
{ nxt_string("[] + 2 + 3"),
nxt_string("23") },
{ nxt_string("[1] + 2 + 3"),
nxt_string("123") },
{ nxt_string("var a = []; a + 2 + 3"),
nxt_string("23") },
{ nxt_string("var a = [1]; a + 2 + 3"),
nxt_string("123") },
{ nxt_string("var a = [1,2], i = 0; a[i++] += a[0] = 5 + i;"
"a[0] +' '+ a[1]"),
nxt_string("7 2") },
{ nxt_string("var a = []; a[0] = 1; a + 2 + 3"),
nxt_string("123") },
{ nxt_string("var a = []; a['0'] = 1; a + 2 + 3"),
nxt_string("123") },
{ nxt_string("var a = []; a[2] = 1; a[2]"),
nxt_string("1") },
{ nxt_string("var a = [1, 2]; 1 in a"),
nxt_string("true") },
{ nxt_string("var a = [1, 2]; 2 in a"),
nxt_string("false") },
{ nxt_string("var a = [1, 2]; delete a[0]; 0 in a"),
nxt_string("false") },
{ nxt_string("var a = [ function(a) {return a + 1} ]; a[0](5)"),
nxt_string("6") },
{ nxt_string("var s = '', a = [5,1,2], i;"
"a[null] = null;"
"a[undefined] = 'defined';"
"a[false] = false;"
"a[true] = true;"
"a[-0] = 0;"
"a[Infinity] = Infinity;"
"a[-Infinity] = -Infinity;"
"a[NaN] = NaN;"
"a[-NaN] = -NaN;"
"for (i in a) { s += i +':'+ a[i] +',' } s"),
nxt_string("0:0,1:1,2:2,null:null,undefined:defined,false:false,"
"true:true,Infinity:Infinity,-Infinity:-Infinity,NaN:NaN,") },
{ nxt_string("[].length"),
nxt_string("0") },
{ nxt_string("[1,2].length"),
nxt_string("2") },
{ nxt_string("var a = [1,2]; a.length"),
nxt_string("2") },
{ nxt_string("var a = [1,2,3]; a.join()"),
nxt_string("1,2,3") },
{ nxt_string("var a = [1,2,3]; a.join(':')"),
nxt_string("1:2:3") },
{ nxt_string("var a = []; a[5] = 5; a.join()"),
nxt_string(",,,,,5") },
{ nxt_string("var a = [,null,undefined,false,true,0,1]; a.join()"),
nxt_string(",,,false,true,0,1") },
{ nxt_string("var o = { toString: function() { return null } };"
"[o].join()"),
nxt_string("null") },
{ nxt_string("var o = { toString: function() { return undefined } };"
"[o].join()"),
nxt_string("undefined") },
{ nxt_string("var a = []; a[5] = 5; a"),
nxt_string(",,,,,5") },
{ nxt_string("var a = []; a.concat([])"),
nxt_string("") },
{ nxt_string("var s = { toString: function() { return 'S' } };"
"var v = { toString: 8, valueOf: function() { return 'V' } };"
"var o = [9]; o.join = function() { return 'O' };"
"var a = [1,2,3,[4,5,6],s,v,o]; a.join('')"),
nxt_string("1234,5,6SVO") },
{ nxt_string("var s = { toString: function() { return 'S' } };"
"var v = { toString: 8, valueOf: function() { return 'V' } };"
"var o = [9]; o.join = function() { return 'O' };"
"var a = [1,2,3,[4,5,6],s,v,o]; a"),
nxt_string("1,2,3,4,5,6,S,V,O") },
/* Array.toString(). */
{ nxt_string("var a = [1,2,3]; a.join = 'NO';"
"Object.prototype.toString = function () { return 'A' }; a"),
nxt_string("[object Array]") },
{ nxt_string("Array.prototype.toString.call(1)"),
nxt_string("[object Number]") },
{ nxt_string("Array.prototype.toString.call('abc')"),
nxt_string("[object String]") },
/* Empty array elements. */
{ nxt_string("[,,]"),
nxt_string(",") },
{ nxt_string("[,,,]"),
nxt_string(",,") },
{ nxt_string("[1,2,]"),
nxt_string("1,2") },
{ nxt_string("[1,2,,3]"),
nxt_string("1,2,,3") },
{ nxt_string("[,,].length"),
nxt_string("2") },
{ nxt_string("[,,,].length"),
nxt_string("3") },
{ nxt_string("[1,2,,3].length"),
nxt_string("4") },
/**/
{ nxt_string("var n = { toString: function() { return 1 } }; [1,2][n]"),
nxt_string("2") },
{ nxt_string("var n = { toString: function() { return '1' } }; [1,2][n]"),
nxt_string("2") },
{ nxt_string("var n = { toString: function() { return 1 },"
" valueOf: function() { return 0 } }; [1,2][n]"),
nxt_string("2") },
{ nxt_string("var n = { toString: function() { return 1.5 } };"
"var a = [1,2]; a[1.5] = 5; a[n]"),
nxt_string("5") },
{ nxt_string("var n = { toString: function() { return 1.5 } };"
"var a = [1,2]; a[n] = 5; a[1.5]"),
nxt_string("5") },
{ nxt_string("var n = { toString: function() { return '1.5' } };"
"var a = [1,2]; a[1.5] = 5; a[n]"),
nxt_string("5") },
{ nxt_string("var n = { toString: function() { return '1.5' } };"
"var a = [1,2]; a[n] = 5; a[1.5]"),
nxt_string("5") },
{ nxt_string("var n = { toString: function() { return 1.5 } };"
"var a = [1,2]; a[1.5] = 5; n in a"),
nxt_string("true") },
{ nxt_string("var n = { toString: function() { return '1.5' } };"
"var a = [1,2]; a[1.5] = 5; '' + (n in a) + (delete a[n])"),
nxt_string("truetrue") },
/**/
{ nxt_string("Array.isArray()"),
nxt_string("false") },
{ nxt_string("Array.isArray(1)"),
nxt_string("false") },
{ nxt_string("Array.isArray([])"),
nxt_string("true") },
{ nxt_string("Array.of()"),
nxt_string("") },
{ nxt_string("Array.of(1,2,3)"),
nxt_string("1,2,3") },
{ nxt_string("Array.of(undefined,1)"),
nxt_string(",1") },
{ nxt_string("Array.of(NaN,-1,{})"),
nxt_string("NaN,-1,[object Object]") },
{ nxt_string("var a = [1,2,3]; a.concat(4, [5, 6, 7], 8)"),
nxt_string("1,2,3,4,5,6,7,8") },
{ nxt_string("var a = []; a[100] = a.length; a[100] +' '+ a.length"),
nxt_string("0 101") },
{ nxt_string("var a = [1,2]; a[100] = 100; a[100] +' '+ a.length"),
nxt_string("100 101") },
{ nxt_string("Array.prototype.slice(1)"),
nxt_string("") },
{ nxt_string("Array.prototype.slice(1,2)"),
nxt_string("") },
{ nxt_string("Array.prototype.pop()"),
nxt_string("undefined") },
{ nxt_string("Array.prototype.shift()"),
nxt_string("undefined") },
{ nxt_string("[0,1,2,3,4].slice(1,4)"),
nxt_string("1,2,3") },
{ nxt_string("[0,1,2,3,4].slice(6,7)"),
nxt_string("") },
{ nxt_string("var a = [1,2,3,4,5], b = a.slice(3);"
"b[0] +' '+ b[1] +' '+ b[2]"),
nxt_string("4 5 undefined") },
{ nxt_string("var a = [1,2]; a.pop() +' '+ a.length +' '+ a"),
nxt_string("2 1 1") },
{ nxt_string("var a = [1,2], len = a.push(3); len +' '+ a.pop() +' '+ a"),
nxt_string("3 3 1,2") },
{ nxt_string("var a = [1,2], len = a.push(3,4,5);"
"len +' '+ a.pop() +' '+ a"),
nxt_string("5 5 1,2,3,4") },
{ nxt_string("var a = [1,2,3]; a.shift() +' '+ a[0] +' '+ a.length"),
nxt_string("1 2 2") },
{ nxt_string("var a = [1,2], len = a.unshift(3);"
"len +' '+ a +' '+ a.shift()"),
nxt_string("3 3,1,2 3") },
{ nxt_string("var a = [1,2], len = a.unshift(3,4,5);"
"len +' '+ a +' '+ a.shift()"),
nxt_string("5 3,4,5,1,2 3") },
{ nxt_string("var a = []; a.splice()"),
nxt_string("") },
{ nxt_string("[].splice(0,5,0)"),
nxt_string("") },
{ nxt_string("[1,2,3,4,5].splice(-2,3,0)"),
nxt_string("4,5") },
{ nxt_string("[].__proto__.splice(0,1,0)"),
nxt_string("") },
{ nxt_string("var a = [];"
"a.splice(9,0,1,2).join(':') + '|' + a"),
nxt_string("|1,2") },
{ nxt_string("var a = [0,1,2,3,4,5,6,7];"
"a.splice(3).join(':') + '|' + a"),
nxt_string("3:4:5:6:7|0,1,2") },
{ nxt_string("var a = [0,1,2,3,4,5,6,7];"
"a.splice(3, 2).join(':') + '|' + a"),
nxt_string("3:4|0,1,2,5,6,7") },
{ nxt_string("var a = [0,1,2,3,4,5,6,7];"
"a.splice(3, 2, 8, 9, 10, 11 ).join(':') + '|' + a"),
nxt_string("3:4|0,1,2,8,9,10,11,5,6,7") },
{ nxt_string("var a = []; a.reverse()"),
nxt_string("") },
{ nxt_string("var a = [1]; a.reverse()"),
nxt_string("1") },
{ nxt_string("var a = [1,2]; a.reverse()"),
nxt_string("2,1") },
{ nxt_string("var a = [1,2,3]; a.reverse()"),
nxt_string("3,2,1") },
{ nxt_string("var a = [1,2,3,4]; a.reverse()"),
nxt_string("4,3,2,1") },
{ nxt_string("var a = [1,2,3,4]; a.indexOf()"),
nxt_string("-1") },
{ nxt_string("var a = [1,2,3,4]; a.indexOf(5)"),
nxt_string("-1") },
{ nxt_string("var a = [1,2,3,4]; a.indexOf(4, 3)"),
nxt_string("3") },
{ nxt_string("var a = [1,2,3,4]; a.indexOf(4, 4)"),
nxt_string("-1") },
{ nxt_string("var a = [1,2,3,4,3,4]; a.indexOf(3, '2')"),
nxt_string("2") },
{ nxt_string("var a = [1,2,3,4,3,4]; a.indexOf(4, -1)"),
nxt_string("5") },
{ nxt_string("var a = [1,2,3,4,3,4]; a.indexOf(3, -10)"),
nxt_string("2") },
{ nxt_string("[].indexOf.bind(0)(0, 0)"),
nxt_string("-1") },
{ nxt_string("[].lastIndexOf(1, -1)"),
nxt_string("-1") },
{ nxt_string("var a = [1,2,3,4]; a.lastIndexOf()"),
nxt_string("-1") },
{ nxt_string("var a = [1,2,3,4]; a.lastIndexOf(5)"),
nxt_string("-1") },
{ nxt_string("var a = [1,2,3,4,3,4]; a.lastIndexOf(1, 0)"),
nxt_string("0") },
{ nxt_string("var a = [1,2,3,4,3,4]; a.lastIndexOf(3, '2')"),
nxt_string("2") },
{ nxt_string("var a = [1,2,3,4,3,4]; a.lastIndexOf(1, 6)"),
nxt_string("0") },
{ nxt_string("var a = [1,2,3,4,3,4]; a.lastIndexOf(2, 6)"),
nxt_string("1") },
{ nxt_string("var a = [1,2,3,4,3,4]; a.lastIndexOf(4, -1)"),
nxt_string("5") },
{ nxt_string("var a = [1,2,3,4,3,4]; a.lastIndexOf(4, -6)"),
nxt_string("-1") },
{ nxt_string("var a = [1,2,3,4,3,4]; a.lastIndexOf(3, -10)"),
nxt_string("-1") },
{ nxt_string("[1,2,3,4].includes()"),
nxt_string("false") },
{ nxt_string("[1,2,3,4].includes(5)"),
nxt_string("false") },
{ nxt_string("[1,2,3,4].includes(4, 3)"),
nxt_string("true") },
{ nxt_string("[1,2,3,4].includes(4, 4)"),
nxt_string("false") },
{ nxt_string("[1,2,3,4,3,4].includes(3, '2')"),
nxt_string("true") },
{ nxt_string("[1,2,3,4,3,4].includes(4, -1)"),
nxt_string("true") },
{ nxt_string("[1,2,3,4,3,4].includes(3, -10)"),
nxt_string("true") },
{ nxt_string("[1,2,3,NaN,3,4].includes(NaN)"),
nxt_string("true") },
{ nxt_string("[1,2,3,4,5].includes(NaN)"),
nxt_string("false") },
{ nxt_string("[].includes.bind(0)(0, 0)"),
nxt_string("false") },
{ nxt_string("var a = []; var s = { sum: 0 };"
"a.forEach(function(v, i, a) { this.sum += v }, s); s.sum"),
nxt_string("0") },
{ nxt_string("var a = new Array(3); var s = { sum: 0 };"
"a.forEach(function(v, i, a) { this.sum += v }, s); s.sum"),
nxt_string("0") },