Remove hidden prototype for builtin functions.

This is a deliberate non-conformity introduced more than 2 years ago to
be compatible with JSC. The current state is that all other browsers
perform ES5 conform in that regard.

R=erik.corry@gmail.com
BUG=chromium:1717,chromium:39662
TEST=test262/15.2.3.6-4-6??,mjsunit/undeletable-functions

Review URL: http://codereview.chromium.org/8566009

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@9993 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
parent daecf27a
......@@ -1385,7 +1385,7 @@ function SetUpArray() {
// set their names.
// Manipulate the length of some of the functions to meet
// expectations set by ECMA-262 or Mozilla.
InstallFunctionsOnHiddenPrototype($Array.prototype, DONT_ENUM, $Array(
InstallFunctions($Array.prototype, DONT_ENUM, $Array(
"toString", getFunction("toString", ArrayToString),
"toLocaleString", getFunction("toLocaleString", ArrayToLocaleString),
"join", getFunction("join", ArrayJoin),
......
......@@ -175,14 +175,14 @@ function WeakMapDelete(key) {
%SetProperty($Map.prototype, "constructor", $Map, DONT_ENUM);
// Set up the non-enumerable functions on the Set prototype object.
InstallFunctionsOnHiddenPrototype($Set.prototype, DONT_ENUM, $Array(
InstallFunctions($Set.prototype, DONT_ENUM, $Array(
"add", SetAdd,
"has", SetHas,
"delete", SetDelete
));
// Set up the non-enumerable functions on the Map prototype object.
InstallFunctionsOnHiddenPrototype($Map.prototype, DONT_ENUM, $Array(
InstallFunctions($Map.prototype, DONT_ENUM, $Array(
"get", MapGet,
"set", MapSet,
"has", MapHas,
......@@ -196,7 +196,7 @@ function WeakMapDelete(key) {
%SetProperty($WeakMap.prototype, "constructor", $WeakMap, DONT_ENUM);
// Set up the non-enumerable functions on the WeakMap prototype object.
InstallFunctionsOnHiddenPrototype($WeakMap.prototype, DONT_ENUM, $Array(
InstallFunctions($WeakMap.prototype, DONT_ENUM, $Array(
"get", WeakMapGet,
"set", WeakMapSet,
"has", WeakMapHas,
......
......@@ -1062,7 +1062,7 @@ function SetUpDate() {
// Set up non-enumerable functions of the Date prototype object and
// set their names.
InstallFunctionsOnHiddenPrototype($Date.prototype, DONT_ENUM, $Array(
InstallFunctions($Date.prototype, DONT_ENUM, $Array(
"toString", DateToString,
"toDateString", DateToDateString,
"toTimeString", DateToTimeString,
......
......@@ -239,7 +239,7 @@ function SetUpMath() {
// Set up non-enumerable functions of the Math object and
// set their names.
InstallFunctionsOnHiddenPrototype($Math, DONT_ENUM, $Array(
InstallFunctions($Math, DONT_ENUM, $Array(
"random", MathRandom,
"abs", MathAbs,
"acos", MathAcos,
......
......@@ -883,49 +883,6 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_IsInPrototypeChain) {
}
// Inserts an object as the hidden prototype of another object.
RUNTIME_FUNCTION(MaybeObject*, Runtime_SetHiddenPrototype) {
NoHandleAllocation ha;
ASSERT(args.length() == 2);
CONVERT_CHECKED(JSObject, jsobject, args[0]);
CONVERT_CHECKED(JSObject, proto, args[1]);
// Sanity checks. The old prototype (that we are replacing) could
// theoretically be null, but if it is not null then check that we
// didn't already install a hidden prototype here.
RUNTIME_ASSERT(!jsobject->GetPrototype()->IsHeapObject() ||
!HeapObject::cast(jsobject->GetPrototype())->map()->is_hidden_prototype());
RUNTIME_ASSERT(!proto->map()->is_hidden_prototype());
// Allocate up front before we start altering state in case we get a GC.
Object* map_or_failure;
{ MaybeObject* maybe_map_or_failure = proto->map()->CopyDropTransitions();
if (!maybe_map_or_failure->ToObject(&map_or_failure)) {
return maybe_map_or_failure;
}
}
Map* new_proto_map = Map::cast(map_or_failure);
{ MaybeObject* maybe_map_or_failure = jsobject->map()->CopyDropTransitions();
if (!maybe_map_or_failure->ToObject(&map_or_failure)) {
return maybe_map_or_failure;
}
}
Map* new_map = Map::cast(map_or_failure);
// Set proto's prototype to be the old prototype of the object.
new_proto_map->set_prototype(jsobject->GetPrototype());
proto->set_map(new_proto_map);
new_proto_map->set_is_hidden_prototype();
// Set the object's prototype to proto.
new_map->set_prototype(proto);
jsobject->set_map(new_map);
return isolate->heap()->undefined_value();
}
RUNTIME_FUNCTION(MaybeObject*, Runtime_IsConstructCall) {
NoHandleAllocation ha;
ASSERT(args.length() == 0);
......
......@@ -69,7 +69,6 @@ namespace internal {
\
F(GetPrototype, 1, 1) \
F(IsInPrototypeChain, 2, 1) \
F(SetHiddenPrototype, 2, 1) \
\
F(IsConstructCall, 0, 1) \
\
......@@ -144,7 +143,7 @@ namespace internal {
F(StringAdd, 2, 1) \
F(StringBuilderConcat, 3, 1) \
F(StringBuilderJoin, 3, 1) \
F(SparseJoinWithSeparator, 3, 1) \
F(SparseJoinWithSeparator, 3, 1) \
\
/* Bit operations */ \
F(NumberOr, 2, 1) \
......
......@@ -957,7 +957,7 @@ function SetUpString() {
// Set up the non-enumerable functions on the String prototype object.
InstallFunctionsOnHiddenPrototype($String.prototype, DONT_ENUM, $Array(
InstallFunctions($String.prototype, DONT_ENUM, $Array(
"valueOf", StringValueOf,
"toString", StringToString,
"charAt", StringCharAt,
......
......@@ -60,18 +60,6 @@ function InstallFunctions(object, attributes, functions) {
%ToFastProperties(object);
}
// Emulates JSC by installing functions on a hidden prototype that
// lies above the current object/prototype. This lets you override
// functions on String.prototype etc. and then restore the old function
// with delete. See http://code.google.com/p/chromium/issues/detail?id=1717
function InstallFunctionsOnHiddenPrototype(object, attributes, functions) {
%CheckIsBootstrapping();
var hidden_prototype = new $Object();
%SetHiddenPrototype(object, hidden_prototype);
InstallFunctions(hidden_prototype, attributes, functions);
}
// Prevents changes to the prototype of a built-infunction.
// The "prototype" property of the function object is made non-configurable,
// and the prototype object is made non-extensible. The latter prevents
......
......@@ -7453,6 +7453,60 @@ THREADED_TEST(SetPrototype) {
}
// Getting property names of an object with a prototype chain that
// triggers dictionary elements in GetLocalPropertyNames() shouldn't
// crash the runtime.
THREADED_TEST(Regress91517) {
i::FLAG_allow_natives_syntax = true;
v8::HandleScope handle_scope;
LocalContext context;
Local<v8::FunctionTemplate> t1 = v8::FunctionTemplate::New();
t1->SetHiddenPrototype(true);
t1->InstanceTemplate()->Set(v8_str("foo"), v8_num(1));
Local<v8::FunctionTemplate> t2 = v8::FunctionTemplate::New();
t2->SetHiddenPrototype(true);
t2->InstanceTemplate()->Set(v8_str("fuz1"), v8_num(2));
t2->InstanceTemplate()->Set(v8_str("objects"), v8::Object::New());
t2->InstanceTemplate()->Set(v8_str("fuz2"), v8_num(2));
Local<v8::FunctionTemplate> t3 = v8::FunctionTemplate::New();
t3->SetHiddenPrototype(true);
t3->InstanceTemplate()->Set(v8_str("boo"), v8_num(3));
Local<v8::FunctionTemplate> t4 = v8::FunctionTemplate::New();
t4->InstanceTemplate()->Set(v8_str("baz"), v8_num(4));
// Force dictionary-based properties.
i::ScopedVector<char> name_buf(1024);
for (int i = 1; i <= 1000; i++) {
i::OS::SNPrintF(name_buf, "sdf%d", i);
t2->InstanceTemplate()->Set(v8_str(name_buf.start()), v8_num(2));
}
Local<v8::Object> o1 = t1->GetFunction()->NewInstance();
Local<v8::Object> o2 = t2->GetFunction()->NewInstance();
Local<v8::Object> o3 = t3->GetFunction()->NewInstance();
Local<v8::Object> o4 = t4->GetFunction()->NewInstance();
// Create prototype chain of hidden prototypes.
CHECK(o4->SetPrototype(o3));
CHECK(o3->SetPrototype(o2));
CHECK(o2->SetPrototype(o1));
// Call the runtime version of GetLocalPropertyNames() on the natively
// created object through JavaScript.
context->Global()->Set(v8_str("obj"), o4);
CompileRun("var names = %GetLocalPropertyNames(obj);");
ExpectInt32("names.length", 1006);
ExpectTrue("names.indexOf(\"baz\") >= 0");
ExpectTrue("names.indexOf(\"boo\") >= 0");
ExpectTrue("names.indexOf(\"foo\") >= 0");
ExpectTrue("names.indexOf(\"fuz1\") >= 0");
ExpectTrue("names.indexOf(\"fuz2\") >= 0");
ExpectFalse("names[1005] == undefined");
}
THREADED_TEST(FunctionReadOnlyPrototype) {
v8::HandleScope handle_scope;
LocalContext context;
......
// Copyright 2011 the V8 project authors. All rights reserved.
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
// * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following
// disclaimer in the documentation and/or other materials provided
// with the distribution.
// * Neither the name of Google Inc. nor the names of its
// contributors may be used to endorse or promote products derived
// from this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
// Getting property names of an object with a prototype chain that
// triggers dictionary elements in GetLocalPropertyNames() shouldn't
// crash the runtime
// Flags: --allow-natives-syntax
function Object1() {
this.foo = 1;
}
function Object2() {
this.fuz = 2;
this.objects = new Object();
this.fuz1 = 2;
this.fuz2 = 2;
this.fuz3 = 2;
this.fuz4 = 2;
this.fuz5 = 2;
this.fuz6 = 2;
this.fuz7 = 2;
this.fuz8 = 2;
this.fuz9 = 2;
this.fuz10 = 2;
this.fuz11 = 2;
this.fuz12 = 2;
this.fuz13 = 2;
this.fuz14 = 2;
this.fuz15 = 2;
this.fuz16 = 2;
this.fuz17 = 2;
// Force dictionary-based properties
for (x=1;x<1000;x++) {
this["sdf" + x] = 2;
}
}
function Object3() {
this.boo = 3;
}
function Object4() {
this.baz = 4;
}
obj1 = new Object1();
obj2 = new Object2();
obj3 = new Object3();
obj4 = new Object4();
%SetHiddenPrototype(obj4, obj3);
%SetHiddenPrototype(obj3, obj2);
%SetHiddenPrototype(obj2, obj1);
function contains(a, obj) {
for(var i = 0; i < a.length; i++) {
if(a[i] === obj){
return true;
}
}
return false;
}
names = %GetLocalPropertyNames(obj4);
assertEquals(1021, names.length);
assertTrue(contains(names, "baz"));
assertTrue(contains(names, "boo"));
assertTrue(contains(names, "foo"));
assertTrue(contains(names, "fuz"));
assertTrue(contains(names, "fuz1"));
assertTrue(contains(names, "fuz2"));
assertTrue(contains(names, "fuz3"));
assertTrue(contains(names, "fuz4"));
assertTrue(contains(names, "fuz5"));
assertTrue(contains(names, "fuz6"));
assertTrue(contains(names, "fuz7"));
assertTrue(contains(names, "fuz8"));
assertTrue(contains(names, "fuz9"));
assertTrue(contains(names, "fuz10"));
assertTrue(contains(names, "fuz11"));
assertTrue(contains(names, "fuz12"));
assertTrue(contains(names, "fuz13"));
assertTrue(contains(names, "fuz14"));
assertTrue(contains(names, "fuz15"));
assertTrue(contains(names, "fuz16"));
assertTrue(contains(names, "fuz17"));
assertFalse(names[1020] == undefined);
......@@ -25,11 +25,8 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
// Test that we match JSC in making some functions undeletable.
// See http://code.google.com/p/chromium/issues/detail?id=1717
// The functions on these prototypes are not just undeletable. It is
// possible to override them with new definitions, then get the old
// version back by deleting the new definition.
// Test that we match ECMAScript in making most builtin functions
// deletable and only specific ones undeletable or read-only.
var array;
......@@ -37,7 +34,7 @@ array = [
"toString", "toLocaleString", "join", "pop", "push", "concat", "reverse",
"shift", "unshift", "slice", "splice", "sort", "filter", "forEach", "some",
"every", "map", "indexOf", "lastIndexOf", "reduce", "reduceRight"];
CheckJSCSemantics(Array.prototype, array, "Array prototype");
CheckEcmaSemantics(Array.prototype, array, "Array prototype");
var old_Array_prototype = Array.prototype;
var new_Array_prototype = {};
......@@ -57,12 +54,12 @@ array = [
"setUTCMinutes", "setHours", "setUTCHours", "setDate", "setUTCDate",
"setMonth", "setUTCMonth", "setFullYear", "setUTCFullYear", "toGMTString",
"toUTCString", "getYear", "setYear", "toISOString", "toJSON"];
CheckJSCSemantics(Date.prototype, array, "Date prototype");
CheckEcmaSemantics(Date.prototype, array, "Date prototype");
array = [
"random", "abs", "acos", "asin", "atan", "ceil", "cos", "exp", "floor", "log",
"round", "sin", "sqrt", "tan", "atan2", "pow", "max", "min"];
CheckJSCSemantics(Math, array, "Math1");
CheckEcmaSemantics(Math, array, "Math1");
CheckEcmaSemantics(Date, ["UTC", "parse", "now"], "Date");
......@@ -114,7 +111,7 @@ array = [
"toUpperCase", "toLocaleUpperCase", "link", "anchor", "fontcolor", "fontsize",
"big", "blink", "bold", "fixed", "italics", "small", "strike", "sub", "sup",
"toJSON", "toString", "valueOf"];
CheckJSCSemantics(String.prototype, array, "String prototype");
CheckEcmaSemantics(String.prototype, array, "String prototype");
CheckEcmaSemantics(String, ["fromCharCode"], "String");
......@@ -126,14 +123,6 @@ function CheckEcmaSemantics(type, props, name) {
}
function CheckJSCSemantics(type, props, name) {
print(name);
for (var i = 0; i < props.length; i++) {
CheckNotDeletable(type, props[i]);
}
}
function CheckDontDelete(type, props, name) {
print(name);
for (var i = 0; i < props.length; i++) {
......@@ -156,21 +145,6 @@ function CheckDeletable(type, prop) {
}
function CheckNotDeletable(type, prop) {
var old = type[prop];
if (!type[prop]) return;
assertTrue(type.hasOwnProperty(prop), "inherited: " + prop);
var deleted = delete type[prop];
assertTrue(deleted, "delete operator returned false: " + prop);
assertTrue(type.hasOwnProperty(prop), "not there after delete: " + prop);
type[prop] = "foo";
assertEquals("foo", type[prop], "not overwritable: " + prop);
deleted = delete type[prop];
assertTrue(deleted, "delete operator returned false 2nd time: " + prop);
assertEquals(old.toString(), type[prop].toString(), "delete didn't restore the old value: " + prop);
}
function CheckDontDeleteAttr(type, prop) {
var old = type[prop];
if (!type[prop]) return;
......
......@@ -208,53 +208,6 @@ S15.3_A3_T1: FAIL
# Invalid test case (recent change adding var changes semantics)
S15.3_A3_T3: FAIL
# These tests fail because we had to add bugs to be compatible with JSC. See
# http://code.google.com/p/chromium/issues/detail?id=1717
S15.5.4.1_A1_T2: FAIL_OK
S15.5.4_A1: FAIL_OK
S15.5.4_A3: FAIL_OK
S15.9.5.10_A1_T2: FAIL_OK
S15.9.5.11_A1_T2: FAIL_OK
S15.9.5.12_A1_T2: FAIL_OK
S15.9.5.13_A1_T2: FAIL_OK
S15.9.5.14_A1_T2: FAIL_OK
S15.9.5.15_A1_T2: FAIL_OK
S15.9.5.16_A1_T2: FAIL_OK
S15.9.5.17_A1_T2: FAIL_OK
S15.9.5.18_A1_T2: FAIL_OK
S15.9.5.19_A1_T2: FAIL_OK
S15.9.5.20_A1_T2: FAIL_OK
S15.9.5.21_A1_T2: FAIL_OK
S15.9.5.22_A1_T2: FAIL_OK
S15.9.5.23_A1_T2: FAIL_OK
S15.9.5.24_A1_T2: FAIL_OK
S15.9.5.25_A1_T2: FAIL_OK
S15.9.5.26_A1_T2: FAIL_OK
S15.9.5.27_A1_T2: FAIL_OK
S15.9.5.28_A1_T2: FAIL_OK
S15.9.5.29_A1_T2: FAIL_OK
S15.9.5.2_A1_T2: FAIL_OK
S15.9.5.30_A1_T2: FAIL_OK
S15.9.5.31_A1_T2: FAIL_OK
S15.9.5.32_A1_T2: FAIL_OK
S15.9.5.33_A1_T2: FAIL_OK
S15.9.5.34_A1_T2: FAIL_OK
S15.9.5.35_A1_T2: FAIL_OK
S15.9.5.36_A1_T2: FAIL_OK
S15.9.5.37_A1_T2: FAIL_OK
S15.9.5.38_A1_T2: FAIL_OK
S15.9.5.39_A1_T2: FAIL_OK
S15.9.5.3_A1_T2: FAIL_OK
S15.9.5.40_A1_T2: FAIL_OK
S15.9.5.41_A1_T2: FAIL_OK
S15.9.5.42_A1_T2: FAIL_OK
S15.9.5.4_A1_T2: FAIL_OK
S15.9.5.5_A1_T2: FAIL_OK
S15.9.5.6_A1_T2: FAIL_OK
S15.9.5.7_A1_T2: FAIL_OK
S15.9.5.8_A1_T2: FAIL_OK
S15.9.5.9_A1_T2: FAIL_OK
[ $arch == arm ]
# BUG(3251225): Tests that timeout with --nocrankshaft.
......
......@@ -115,18 +115,6 @@ S15.3.3.1_A4: FAIL
15.2.3.6-4-410: FAIL
15.2.3.6-4-415: FAIL
15.2.3.6-4-420: FAIL
15.2.3.6-4-612: FAIL
15.2.3.6-4-613: FAIL
15.2.3.6-4-614: FAIL
15.2.3.6-4-615: FAIL
15.2.3.6-4-616: FAIL
15.2.3.6-4-617: FAIL
15.2.3.6-4-618: FAIL
15.2.3.6-4-619: FAIL
15.2.3.6-4-620: FAIL
15.2.3.6-4-621: FAIL
15.2.3.6-4-623: FAIL
15.2.3.6-4-624: FAIL
15.2.3.7-6-a-112: FAIL
15.2.3.7-6-a-113: FAIL
15.2.3.7-6-a-122: FAIL
......@@ -359,53 +347,6 @@ S15.3.4.2_A1_T1: FAIL_OK
S8.5_A2.2: PASS, FAIL if $system == linux, FAIL if $system == macos
S8.5_A2.1: PASS, FAIL if $system == linux, FAIL if $system == macos
# These tests fail because we had to add bugs to be compatible with JSC. See
# http://code.google.com/p/chromium/issues/detail?id=1717
S15.5.4.1_A1_T2: FAIL_OK
S15.5.4_A1: FAIL_OK
S15.5.4_A3: FAIL_OK
S15.9.5.10_A1_T2: FAIL_OK
S15.9.5.11_A1_T2: FAIL_OK
S15.9.5.12_A1_T2: FAIL_OK
S15.9.5.13_A1_T2: FAIL_OK
S15.9.5.14_A1_T2: FAIL_OK
S15.9.5.15_A1_T2: FAIL_OK
S15.9.5.16_A1_T2: FAIL_OK
S15.9.5.17_A1_T2: FAIL_OK
S15.9.5.18_A1_T2: FAIL_OK
S15.9.5.19_A1_T2: FAIL_OK
S15.9.5.20_A1_T2: FAIL_OK
S15.9.5.21_A1_T2: FAIL_OK
S15.9.5.22_A1_T2: FAIL_OK
S15.9.5.23_A1_T2: FAIL_OK
S15.9.5.24_A1_T2: FAIL_OK
S15.9.5.25_A1_T2: FAIL_OK
S15.9.5.26_A1_T2: FAIL_OK
S15.9.5.27_A1_T2: FAIL_OK
S15.9.5.28_A1_T2: FAIL_OK
S15.9.5.29_A1_T2: FAIL_OK
S15.9.5.2_A1_T2: FAIL_OK
S15.9.5.30_A1_T2: FAIL_OK
S15.9.5.31_A1_T2: FAIL_OK
S15.9.5.32_A1_T2: FAIL_OK
S15.9.5.33_A1_T2: FAIL_OK
S15.9.5.34_A1_T2: FAIL_OK
S15.9.5.35_A1_T2: FAIL_OK
S15.9.5.36_A1_T2: FAIL_OK
S15.9.5.37_A1_T2: FAIL_OK
S15.9.5.38_A1_T2: FAIL_OK
S15.9.5.39_A1_T2: FAIL_OK
S15.9.5.3_A1_T2: FAIL_OK
S15.9.5.40_A1_T2: FAIL_OK
S15.9.5.41_A1_T2: FAIL_OK
S15.9.5.42_A1_T2: FAIL_OK
S15.9.5.4_A1_T2: FAIL_OK
S15.9.5.5_A1_T2: FAIL_OK
S15.9.5.6_A1_T2: FAIL_OK
S15.9.5.7_A1_T2: FAIL_OK
S15.9.5.8_A1_T2: FAIL_OK
S15.9.5.9_A1_T2: FAIL_OK
############################# ES3 TESTS ################################
# These tests check for ES3 semantics, and differ from ES5.
# When we follow ES5 semantics, it's ok to fail the test.
......@@ -474,31 +415,6 @@ S15.4.4.3_A2_T1: FAIL_OK
# prototype has a property with the same name and [[Writable]] set to
# false(Function.prototype.bind)
15.2.3.6-4-420: FAIL
# Bug? ES5 Attributes - all attributes in Array.prototype.indexOf are correct
15.2.3.6-4-612: FAIL
# Bug? ES5 Attributes - all attributes in Object.lastIndexOf are correct
15.2.3.6-4-613: FAIL
# Bug? ES5 Attributes - all attributes in Array.prototype.every are correct
15.2.3.6-4-614: FAIL
# Bug? ES5 Attributes - all attributes in Array.prototype.some are correct
15.2.3.6-4-615: FAIL
# Bug? ES5 Attributes - all attributes in Array.prototype.forEach are correct
15.2.3.6-4-616: FAIL
# Bug? ES5 Attributes - all attributes in Array.prototype.map are correct
15.2.3.6-4-617: FAIL
# Bug? ES5 Attributes - all attributes in Array.prototype.filter are correct
15.2.3.6-4-618: FAIL
# Bug? ES5 Attributes - all attributes in Array.prototype.reduce are correct
15.2.3.6-4-619: FAIL
# Bug? ES5 Attributes - all attributes in Array.prototype.reduceRight are
# correct
15.2.3.6-4-620: FAIL
# Bug? ES5 Attributes - all attributes in String.prototype.trim are correct
15.2.3.6-4-621: FAIL
# Bug? ES5 Attributes - all attributes in Date.prototype.toISOString are correct
15.2.3.6-4-623: FAIL
# Bug? ES5 Attributes - all attributes in Date.prototype.toJSON are correct
15.2.3.6-4-624: FAIL
############################ SKIPPED TESTS #############################
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment