Index: test/cctest/test-api.cc |
diff --git a/test/cctest/test-api.cc b/test/cctest/test-api.cc |
index 3a6ebc803d4068e097d01e484aa33d3453c32e85..869199c5dd9be8f58929342067f4b81ca02b5d6f 100644 |
--- a/test/cctest/test-api.cc |
+++ b/test/cctest/test-api.cc |
@@ -16638,6 +16638,52 @@ |
CHECK(last_message); |
} |
isolate->Dispose(); |
+} |
+ |
+ |
+static void BreakArrayGuarantees(const char* script) { |
+ v8::Isolate* isolate1 = v8::Isolate::New(); |
+ isolate1->Enter(); |
+ v8::Persistent<v8::Context> context1; |
+ { |
+ v8::HandleScope scope(isolate1); |
+ context1.Reset(isolate1, Context::New(isolate1)); |
+ } |
+ |
+ { |
+ v8::HandleScope scope(isolate1); |
+ v8::Local<v8::Context> context = |
+ v8::Local<v8::Context>::New(isolate1, context1); |
+ v8::Context::Scope context_scope(context); |
+ v8::internal::Isolate* i_isolate = |
+ reinterpret_cast<v8::internal::Isolate*>(isolate1); |
+ CHECK_EQ(true, i_isolate->IsFastArrayConstructorPrototypeChainIntact()); |
+ // Run something in new isolate. |
+ CompileRun(script); |
+ CHECK_EQ(false, i_isolate->IsFastArrayConstructorPrototypeChainIntact()); |
+ } |
+ isolate1->Exit(); |
+ isolate1->Dispose(); |
+} |
+ |
+ |
+TEST(VerifyArrayPrototypeGuarantees) { |
+ // Break fast array hole handling by element changes. |
+ BreakArrayGuarantees("[].__proto__[1] = 3;"); |
+ BreakArrayGuarantees("Object.prototype[3] = 'three';"); |
+ BreakArrayGuarantees("Array.prototype.push(1);"); |
+ BreakArrayGuarantees("Array.prototype.unshift(1);"); |
+ // Break fast array hole handling by prototype structure changes. |
+ BreakArrayGuarantees("[].__proto__.__proto__ = { funny: true };"); |
+ // By sending elements to dictionary mode. |
+ BreakArrayGuarantees("Object.freeze(Array.prototype);"); |
+ BreakArrayGuarantees("Object.freeze(Object.prototype);"); |
+ BreakArrayGuarantees( |
+ "Object.defineProperty(Array.prototype, 0, {" |
+ " get: function() { return 3; }});"); |
+ BreakArrayGuarantees( |
+ "Object.defineProperty(Object.prototype, 0, {" |
+ " get: function() { return 3; }});"); |
} |