Index: test/cctest/test-api.cc |
diff --git a/test/cctest/test-api.cc b/test/cctest/test-api.cc |
index a51d3012a5a8f3c1929d122f9288bb95d2236e2c..0f33dedfcfa51bcc11f64a029cb1305e8a080967 100644 |
--- a/test/cctest/test-api.cc |
+++ b/test/cctest/test-api.cc |
@@ -8063,12 +8063,8 @@ THREADED_TEST(ShadowObject) { |
Local<ObjectTemplate> proto = t->PrototypeTemplate(); |
Local<ObjectTemplate> instance = t->InstanceTemplate(); |
- // Only allow calls of f on instances of t. |
- Local<v8::Signature> signature = v8::Signature::New(t); |
proto->Set(v8_str("f"), |
- v8::FunctionTemplate::New(ShadowFunctionCallback, |
- Local<Value>(), |
- signature)); |
+ v8::FunctionTemplate::New(ShadowFunctionCallback, Local<Value>())); |
proto->Set(v8_str("x"), v8_num(12)); |
instance->SetAccessor(v8_str("y"), ShadowYGetter, ShadowYSetter); |
@@ -9933,6 +9929,7 @@ THREADED_TEST(InterceptorCallICFastApi_SimpleSignature) { |
v8::Signature::New(fun_templ)); |
v8::Handle<v8::ObjectTemplate> proto_templ = fun_templ->PrototypeTemplate(); |
proto_templ->Set(v8_str("method"), method_templ); |
+ fun_templ->SetHiddenPrototype(true); |
v8::Handle<v8::ObjectTemplate> templ = fun_templ->InstanceTemplate(); |
templ->SetNamedPropertyHandler(InterceptorCallICFastApi, |
NULL, NULL, NULL, NULL, |
@@ -9963,6 +9960,7 @@ THREADED_TEST(InterceptorCallICFastApi_SimpleSignature_Miss1) { |
v8::Signature::New(fun_templ)); |
v8::Handle<v8::ObjectTemplate> proto_templ = fun_templ->PrototypeTemplate(); |
proto_templ->Set(v8_str("method"), method_templ); |
+ fun_templ->SetHiddenPrototype(true); |
v8::Handle<v8::ObjectTemplate> templ = fun_templ->InstanceTemplate(); |
templ->SetNamedPropertyHandler(InterceptorCallICFastApi, |
NULL, NULL, NULL, NULL, |
@@ -9999,6 +9997,7 @@ THREADED_TEST(InterceptorCallICFastApi_SimpleSignature_Miss2) { |
v8::Signature::New(fun_templ)); |
v8::Handle<v8::ObjectTemplate> proto_templ = fun_templ->PrototypeTemplate(); |
proto_templ->Set(v8_str("method"), method_templ); |
+ fun_templ->SetHiddenPrototype(true); |
v8::Handle<v8::ObjectTemplate> templ = fun_templ->InstanceTemplate(); |
templ->SetNamedPropertyHandler(InterceptorCallICFastApi, |
NULL, NULL, NULL, NULL, |
@@ -10035,6 +10034,7 @@ THREADED_TEST(InterceptorCallICFastApi_SimpleSignature_Miss3) { |
v8::Signature::New(fun_templ)); |
v8::Handle<v8::ObjectTemplate> proto_templ = fun_templ->PrototypeTemplate(); |
proto_templ->Set(v8_str("method"), method_templ); |
+ fun_templ->SetHiddenPrototype(true); |
v8::Handle<v8::ObjectTemplate> templ = fun_templ->InstanceTemplate(); |
templ->SetNamedPropertyHandler(InterceptorCallICFastApi, |
NULL, NULL, NULL, NULL, |
@@ -10074,6 +10074,7 @@ THREADED_TEST(InterceptorCallICFastApi_SimpleSignature_TypeError) { |
v8::Signature::New(fun_templ)); |
v8::Handle<v8::ObjectTemplate> proto_templ = fun_templ->PrototypeTemplate(); |
proto_templ->Set(v8_str("method"), method_templ); |
+ fun_templ->SetHiddenPrototype(true); |
v8::Handle<v8::ObjectTemplate> templ = fun_templ->InstanceTemplate(); |
templ->SetNamedPropertyHandler(InterceptorCallICFastApi, |
NULL, NULL, NULL, NULL, |
@@ -10136,6 +10137,7 @@ THREADED_TEST(CallICFastApi_SimpleSignature) { |
v8::Signature::New(fun_templ)); |
v8::Handle<v8::ObjectTemplate> proto_templ = fun_templ->PrototypeTemplate(); |
proto_templ->Set(v8_str("method"), method_templ); |
+ fun_templ->SetHiddenPrototype(true); |
v8::Handle<v8::ObjectTemplate> templ(fun_templ->InstanceTemplate()); |
CHECK(!templ.IsEmpty()); |
LocalContext context; |
@@ -10163,6 +10165,7 @@ THREADED_TEST(CallICFastApi_SimpleSignature_Miss1) { |
v8::Signature::New(fun_templ)); |
v8::Handle<v8::ObjectTemplate> proto_templ = fun_templ->PrototypeTemplate(); |
proto_templ->Set(v8_str("method"), method_templ); |
+ fun_templ->SetHiddenPrototype(true); |
v8::Handle<v8::ObjectTemplate> templ(fun_templ->InstanceTemplate()); |
CHECK(!templ.IsEmpty()); |
LocalContext context; |
@@ -10195,6 +10198,7 @@ THREADED_TEST(CallICFastApi_SimpleSignature_Miss2) { |
v8::Signature::New(fun_templ)); |
v8::Handle<v8::ObjectTemplate> proto_templ = fun_templ->PrototypeTemplate(); |
proto_templ->Set(v8_str("method"), method_templ); |
+ fun_templ->SetHiddenPrototype(true); |
v8::Handle<v8::ObjectTemplate> templ(fun_templ->InstanceTemplate()); |
CHECK(!templ.IsEmpty()); |
LocalContext context; |
@@ -10221,6 +10225,42 @@ THREADED_TEST(CallICFastApi_SimpleSignature_Miss2) { |
CHECK_EQ(42, context->Global()->Get(v8_str("saved_result"))->Int32Value()); |
} |
+THREADED_TEST(CallICFastApi_SimpleSignature_TypeError) { |
+ v8::HandleScope scope; |
+ v8::Handle<v8::FunctionTemplate> fun_templ = v8::FunctionTemplate::New(); |
+ v8::Handle<v8::FunctionTemplate> method_templ = |
+ v8::FunctionTemplate::New(FastApiCallback_SimpleSignature, |
+ v8_str("method_data"), |
+ v8::Signature::New(fun_templ)); |
+ v8::Handle<v8::ObjectTemplate> proto_templ = fun_templ->PrototypeTemplate(); |
+ proto_templ->Set(v8_str("method"), method_templ); |
+ fun_templ->SetHiddenPrototype(true); |
+ v8::Handle<v8::ObjectTemplate> templ(fun_templ->InstanceTemplate()); |
+ CHECK(!templ.IsEmpty()); |
+ LocalContext context; |
+ v8::Handle<v8::Function> fun = fun_templ->GetFunction(); |
+ GenerateSomeGarbage(); |
+ context->Global()->Set(v8_str("o"), fun->NewInstance()); |
+ v8::TryCatch try_catch; |
+ CompileRun( |
+ "o.foo = 17;" |
+ "var receiver = {};" |
+ "receiver.__proto__ = o;" |
+ "var result = 0;" |
+ "var saved_result = 0;" |
+ "for (var i = 0; i < 100; i++) {" |
+ " result = receiver.method(41);" |
+ " if (i == 50) {" |
+ " saved_result = result;" |
+ " receiver = Object.create(receiver);" |
+ " }" |
+ "}"); |
+ CHECK(try_catch.HasCaught()); |
+ CHECK_EQ(v8_str("TypeError: Illegal invocation"), |
+ try_catch.Exception()->ToString()); |
+ CHECK_EQ(42, context->Global()->Get(v8_str("saved_result"))->Int32Value()); |
+} |
+ |
v8::Handle<Value> keyed_call_ic_function; |