| Index: test/cctest/test-api.cc
|
| diff --git a/test/cctest/test-api.cc b/test/cctest/test-api.cc
|
| index a60ea574fb7eb51b5044371896e5b8f19cbf10c4..10a92c38eaee1ad21a66840db4d1a802200310df 100644
|
| --- a/test/cctest/test-api.cc
|
| +++ b/test/cctest/test-api.cc
|
| @@ -6433,6 +6433,45 @@ THREADED_TEST(InterceptorCallICFastApi_SimpleSignature_Miss2) {
|
| CHECK_GE(interceptor_call_count, 50);
|
| }
|
|
|
| +THREADED_TEST(InterceptorCallICFastApi_SimpleSignature_Miss3) {
|
| + int interceptor_call_count = 0;
|
| + 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);
|
| + v8::Handle<v8::ObjectTemplate> templ = fun_templ->InstanceTemplate();
|
| + templ->SetNamedPropertyHandler(InterceptorCallICFastApi,
|
| + NULL, NULL, NULL, NULL,
|
| + v8::External::Wrap(&interceptor_call_count));
|
| + LocalContext context;
|
| + v8::Handle<v8::Function> fun = fun_templ->GetFunction();
|
| + GenerateSomeGarbage();
|
| + context->Global()->Set(v8_str("o"), fun->NewInstance());
|
| + v8::TryCatch try_catch;
|
| + v8::Handle<Value> value = 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 = 333;"
|
| + " }"
|
| + "}");
|
| + CHECK(try_catch.HasCaught());
|
| + CHECK_EQ(v8_str("TypeError: Object 333 has no method 'method'"),
|
| + try_catch.Exception()->ToString());
|
| + CHECK_EQ(42, context->Global()->Get(v8_str("saved_result"))->Int32Value());
|
| + CHECK_GE(interceptor_call_count, 50);
|
| +}
|
| +
|
| THREADED_TEST(InterceptorCallICFastApi_SimpleSignature_TypeError) {
|
| int interceptor_call_count = 0;
|
| v8::HandleScope scope;
|
| @@ -6521,7 +6560,7 @@ THREADED_TEST(CallICFastApi_SimpleSignature) {
|
| CHECK_EQ(42, context->Global()->Get(v8_str("result"))->Int32Value());
|
| }
|
|
|
| -THREADED_TEST(CallICFastApi_SimpleSignature_Miss) {
|
| +THREADED_TEST(CallICFastApi_SimpleSignature_Miss1) {
|
| v8::HandleScope scope;
|
| v8::Handle<v8::FunctionTemplate> fun_templ = v8::FunctionTemplate::New();
|
| v8::Handle<v8::FunctionTemplate> method_templ =
|
| @@ -6552,6 +6591,40 @@ THREADED_TEST(CallICFastApi_SimpleSignature_Miss) {
|
| CHECK_EQ(42, context->Global()->Get(v8_str("saved_result"))->Int32Value());
|
| }
|
|
|
| +THREADED_TEST(CallICFastApi_SimpleSignature_Miss2) {
|
| + 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);
|
| + v8::Handle<v8::ObjectTemplate> templ = fun_templ->InstanceTemplate();
|
| + LocalContext context;
|
| + v8::Handle<v8::Function> fun = fun_templ->GetFunction();
|
| + GenerateSomeGarbage();
|
| + context->Global()->Set(v8_str("o"), fun->NewInstance());
|
| + v8::TryCatch try_catch;
|
| + v8::Handle<Value> value = 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 = 333;"
|
| + " }"
|
| + "}");
|
| + CHECK(try_catch.HasCaught());
|
| + CHECK_EQ(v8_str("TypeError: Object 333 has no method 'method'"),
|
| + try_catch.Exception()->ToString());
|
| + CHECK_EQ(42, context->Global()->Get(v8_str("saved_result"))->Int32Value());
|
| +}
|
| +
|
|
|
| static int interceptor_call_count = 0;
|
|
|
|
|