Index: test/cctest/test-api.cc |
diff --git a/test/cctest/test-api.cc b/test/cctest/test-api.cc |
index f9880bdaee4b75e2b1b9659a59d9e2bda4e95ca4..b4d157a703f2fcf594990b8b8d693e7efbdfbb65 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); |
@@ -9773,7 +9769,7 @@ static v8::Handle<Value> FastApiCallback_SimpleSignature( |
ApiTestFuzzer::Fuzz(); |
v8::Isolate* isolate = v8::Isolate::GetCurrent(); |
CHECK_EQ(isolate, args.GetIsolate()); |
- CHECK_EQ(args.This()->GetPrototype(), args.Holder()); |
+ CHECK_EQ(args.This(), args.Holder()); |
CHECK(args.Data()->Equals(v8_str("method_data"))); |
// Note, we're using HasRealNamedProperty instead of Has to avoid |
// invoking the interceptor again. |
@@ -9923,6 +9919,7 @@ THREADED_TEST(InterceptorCallICFastApi_TrivialSignature) { |
CHECK_EQ(100, interceptor_call_count); |
} |
+ |
THREADED_TEST(InterceptorCallICFastApi_SimpleSignature) { |
int interceptor_call_count = 0; |
v8::HandleScope scope; |
@@ -9943,8 +9940,7 @@ THREADED_TEST(InterceptorCallICFastApi_SimpleSignature) { |
context->Global()->Set(v8_str("o"), fun->NewInstance()); |
CompileRun( |
"o.foo = 17;" |
- "var receiver = {};" |
- "receiver.__proto__ = o;" |
+ "var receiver = o;" |
rossberg
2012/11/20 11:00:09
Nit: if you want, remove 'receiver' altogether.
|
"var result = 0;" |
"for (var i = 0; i < 100; i++) {" |
" result = receiver.method(41);" |
@@ -9953,6 +9949,7 @@ THREADED_TEST(InterceptorCallICFastApi_SimpleSignature) { |
CHECK_EQ(100, interceptor_call_count); |
} |
+ |
THREADED_TEST(InterceptorCallICFastApi_SimpleSignature_Miss1) { |
int interceptor_call_count = 0; |
v8::HandleScope scope; |
@@ -9973,8 +9970,7 @@ THREADED_TEST(InterceptorCallICFastApi_SimpleSignature_Miss1) { |
context->Global()->Set(v8_str("o"), fun->NewInstance()); |
CompileRun( |
"o.foo = 17;" |
- "var receiver = {};" |
- "receiver.__proto__ = o;" |
+ "var receiver = o;" |
"var result = 0;" |
"var saved_result = 0;" |
"for (var i = 0; i < 100; i++) {" |
@@ -9989,6 +9985,7 @@ THREADED_TEST(InterceptorCallICFastApi_SimpleSignature_Miss1) { |
CHECK_GE(interceptor_call_count, 50); |
} |
+ |
THREADED_TEST(InterceptorCallICFastApi_SimpleSignature_Miss2) { |
int interceptor_call_count = 0; |
v8::HandleScope scope; |
@@ -10007,25 +10004,30 @@ THREADED_TEST(InterceptorCallICFastApi_SimpleSignature_Miss2) { |
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 receiver = 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;" |
- " o.method = function(x) { return x - 1 };" |
+ " result = 0;" |
+ " receiver = 333;" |
" }" |
"}"); |
- CHECK_EQ(40, context->Global()->Get(v8_str("result"))->Int32Value()); |
+ CHECK(try_catch.HasCaught()); |
+ CHECK_EQ(v8_str("TypeError: Object 333 has no method 'method'"), |
+ try_catch.Exception()->ToString()); |
+ CHECK_EQ(0, context->Global()->Get(v8_str("result"))->Int32Value()); |
CHECK_EQ(42, context->Global()->Get(v8_str("saved_result"))->Int32Value()); |
CHECK_GE(interceptor_call_count, 50); |
} |
-THREADED_TEST(InterceptorCallICFastApi_SimpleSignature_Miss3) { |
+ |
+THREADED_TEST(InterceptorCallICFastApi_SimpleSignature_TypeError1) { |
int interceptor_call_count = 0; |
v8::HandleScope scope; |
v8::Handle<v8::FunctionTemplate> fun_templ = v8::FunctionTemplate::New(); |
@@ -10046,25 +10048,27 @@ THREADED_TEST(InterceptorCallICFastApi_SimpleSignature_Miss3) { |
v8::TryCatch try_catch; |
CompileRun( |
"o.foo = 17;" |
- "var receiver = {};" |
- "receiver.__proto__ = o;" |
+ "var receiver = 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;" |
+ " result = 0;" |
+ " receiver = {};" |
+ " receiver.__proto__ = o;" |
" }" |
+ " result = receiver.method(41);" |
"}"); |
CHECK(try_catch.HasCaught()); |
- CHECK_EQ(v8_str("TypeError: Object 333 has no method 'method'"), |
+ CHECK_EQ(v8_str("TypeError: Illegal invocation"), |
try_catch.Exception()->ToString()); |
+ CHECK_EQ(0, context->Global()->Get(v8_str("result"))->Int32Value()); |
CHECK_EQ(42, context->Global()->Get(v8_str("saved_result"))->Int32Value()); |
CHECK_GE(interceptor_call_count, 50); |
} |
-THREADED_TEST(InterceptorCallICFastApi_SimpleSignature_TypeError) { |
+ |
+THREADED_TEST(InterceptorCallICFastApi_SimpleSignature_TypeError2) { |
int interceptor_call_count = 0; |
v8::HandleScope scope; |
v8::Handle<v8::FunctionTemplate> fun_templ = v8::FunctionTemplate::New(); |
@@ -10085,24 +10089,26 @@ THREADED_TEST(InterceptorCallICFastApi_SimpleSignature_TypeError) { |
v8::TryCatch try_catch; |
CompileRun( |
"o.foo = 17;" |
- "var receiver = {};" |
- "receiver.__proto__ = o;" |
+ "var receiver = 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;" |
+ " result = 0;" |
" receiver = {method: receiver.method};" |
" }" |
"}"); |
CHECK(try_catch.HasCaught()); |
CHECK_EQ(v8_str("TypeError: Illegal invocation"), |
try_catch.Exception()->ToString()); |
+ CHECK_EQ(0, context->Global()->Get(v8_str("result"))->Int32Value()); |
CHECK_EQ(42, context->Global()->Get(v8_str("saved_result"))->Int32Value()); |
CHECK_GE(interceptor_call_count, 50); |
} |
+ |
THREADED_TEST(CallICFastApi_TrivialSignature) { |
v8::HandleScope scope; |
v8::Handle<v8::FunctionTemplate> fun_templ = v8::FunctionTemplate::New(); |
@@ -10127,6 +10133,7 @@ THREADED_TEST(CallICFastApi_TrivialSignature) { |
CHECK_EQ(42, context->Global()->Get(v8_str("result"))->Int32Value()); |
} |
+ |
THREADED_TEST(CallICFastApi_SimpleSignature) { |
v8::HandleScope scope; |
v8::Handle<v8::FunctionTemplate> fun_templ = v8::FunctionTemplate::New(); |
@@ -10144,8 +10151,7 @@ THREADED_TEST(CallICFastApi_SimpleSignature) { |
context->Global()->Set(v8_str("o"), fun->NewInstance()); |
CompileRun( |
"o.foo = 17;" |
- "var receiver = {};" |
- "receiver.__proto__ = o;" |
+ "var receiver = o;" |
rossberg
2012/11/20 11:00:09
Ditto.
|
"var result = 0;" |
"for (var i = 0; i < 100; i++) {" |
" result = receiver.method(41);" |
@@ -10154,6 +10160,7 @@ THREADED_TEST(CallICFastApi_SimpleSignature) { |
CHECK_EQ(42, context->Global()->Get(v8_str("result"))->Int32Value()); |
} |
+ |
THREADED_TEST(CallICFastApi_SimpleSignature_Miss1) { |
v8::HandleScope scope; |
v8::Handle<v8::FunctionTemplate> fun_templ = v8::FunctionTemplate::New(); |
@@ -10171,8 +10178,7 @@ THREADED_TEST(CallICFastApi_SimpleSignature_Miss1) { |
context->Global()->Set(v8_str("o"), fun->NewInstance()); |
CompileRun( |
"o.foo = 17;" |
- "var receiver = {};" |
- "receiver.__proto__ = o;" |
+ "var receiver = o;" |
"var result = 0;" |
"var saved_result = 0;" |
"for (var i = 0; i < 100; i++) {" |
@@ -10186,6 +10192,7 @@ THREADED_TEST(CallICFastApi_SimpleSignature_Miss1) { |
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(); |
@@ -10204,20 +10211,59 @@ THREADED_TEST(CallICFastApi_SimpleSignature_Miss2) { |
v8::TryCatch try_catch; |
CompileRun( |
"o.foo = 17;" |
- "var receiver = {};" |
- "receiver.__proto__ = o;" |
+ "var receiver = 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;" |
+ " result = 0;" |
" receiver = 333;" |
" }" |
"}"); |
CHECK(try_catch.HasCaught()); |
CHECK_EQ(v8_str("TypeError: Object 333 has no method 'method'"), |
try_catch.Exception()->ToString()); |
+ CHECK_EQ(0, context->Global()->Get(v8_str("result"))->Int32Value()); |
+ 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); |
+ 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 = 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;" |
+ " result = 0;" |
+ " receiver = {};" |
+ " receiver.__proto__ = o;" |
+ " }" |
+ "}"); |
+ CHECK(try_catch.HasCaught()); |
+ CHECK_EQ(v8_str("TypeError: Illegal invocation"), |
+ try_catch.Exception()->ToString()); |
+ CHECK_EQ(0, context->Global()->Get(v8_str("result"))->Int32Value()); |
CHECK_EQ(42, context->Global()->Get(v8_str("saved_result"))->Int32Value()); |
} |