OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
4 // met: | 4 // met: |
5 // | 5 // |
6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
(...skipping 206 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
217 CHECK(env->GetIsolate() == v8::Isolate::GetCurrent()); | 217 CHECK(env->GetIsolate() == v8::Isolate::GetCurrent()); |
218 env->Enter(); | 218 env->Enter(); |
219 CHECK(env->InContext()); | 219 CHECK(env->InContext()); |
220 CHECK(env->GetIsolate() == v8::Isolate::GetCurrent()); | 220 CHECK(env->GetIsolate() == v8::Isolate::GetCurrent()); |
221 env->Exit(); | 221 env->Exit(); |
222 CHECK(!env->InContext()); | 222 CHECK(!env->InContext()); |
223 CHECK(env->GetIsolate() == v8::Isolate::GetCurrent()); | 223 CHECK(env->GetIsolate() == v8::Isolate::GetCurrent()); |
224 } | 224 } |
225 | 225 |
226 | 226 |
| 227 static void TestSignature(const char* loop_js, Local<Value> receiver) { |
| 228 i::ScopedVector<char> source(200); |
| 229 i::OS::SNPrintF(source, |
| 230 "for (var i = 0; i < 10; i++) {" |
| 231 " %s" |
| 232 "}", |
| 233 loop_js); |
| 234 signature_callback_count = 0; |
| 235 signature_expected_receiver = receiver; |
| 236 bool expected_to_throw = receiver.IsEmpty(); |
| 237 v8::TryCatch try_catch; |
| 238 CompileRun(source.start()); |
| 239 CHECK_EQ(expected_to_throw, try_catch.HasCaught()); |
| 240 if (!expected_to_throw) { |
| 241 CHECK_EQ(10, signature_callback_count); |
| 242 } else { |
| 243 CHECK_EQ(v8_str("TypeError: Illegal invocation"), |
| 244 try_catch.Exception()->ToString()); |
| 245 } |
| 246 } |
| 247 |
| 248 |
227 THREADED_TEST(ReceiverSignature) { | 249 THREADED_TEST(ReceiverSignature) { |
228 LocalContext env; | 250 LocalContext env; |
229 v8::HandleScope scope(env->GetIsolate()); | 251 v8::HandleScope scope(env->GetIsolate()); |
| 252 // Setup templates. |
230 v8::Handle<v8::FunctionTemplate> fun = v8::FunctionTemplate::New(); | 253 v8::Handle<v8::FunctionTemplate> fun = v8::FunctionTemplate::New(); |
231 v8::Handle<v8::Signature> sig = v8::Signature::New(fun); | 254 v8::Handle<v8::Signature> sig = v8::Signature::New(fun); |
232 fun->PrototypeTemplate()->Set( | 255 v8::Handle<v8::FunctionTemplate> callback_sig = |
233 v8_str("m"), | 256 v8::FunctionTemplate::New( |
234 v8::FunctionTemplate::New(IncrementingSignatureCallback, | 257 IncrementingSignatureCallback, Local<Value>(), sig); |
235 v8::Handle<Value>(), | 258 v8::Handle<v8::FunctionTemplate> callback = |
236 sig)); | 259 v8::FunctionTemplate::New(IncrementingSignatureCallback); |
237 fun->PrototypeTemplate()->SetAccessorProperty( | |
238 v8_str("n"), | |
239 v8::FunctionTemplate::New(IncrementingSignatureCallback, | |
240 v8::Handle<Value>(), | |
241 sig)); | |
242 env->Global()->Set(v8_str("Fun"), fun->GetFunction()); | |
243 Local<Value> fun_instance = fun->InstanceTemplate()->NewInstance(); | |
244 env->Global()->Set(v8_str("fun_instance"), fun_instance); | |
245 signature_callback_count = 0; | |
246 int expected_count = 0; | |
247 signature_expected_receiver = fun_instance; | |
248 CompileRun( | |
249 "var o = fun_instance;" | |
250 "var key_n = 'n';" | |
251 "for (var i = 0; i < 10; i++) o.m();" | |
252 "for (var i = 0; i < 10; i++) o.n;" | |
253 "for (var i = 0; i < 10; i++) o[key_n];"); | |
254 expected_count += 30; | |
255 CHECK_EQ(expected_count, signature_callback_count); | |
256 v8::Handle<v8::FunctionTemplate> sub_fun = v8::FunctionTemplate::New(); | 260 v8::Handle<v8::FunctionTemplate> sub_fun = v8::FunctionTemplate::New(); |
257 sub_fun->Inherit(fun); | 261 sub_fun->Inherit(fun); |
258 fun_instance = sub_fun->InstanceTemplate()->NewInstance(); | 262 v8::Handle<v8::FunctionTemplate> unrel_fun = v8::FunctionTemplate::New(); |
| 263 // Install properties. |
| 264 v8::Handle<v8::ObjectTemplate> fun_proto = fun->PrototypeTemplate(); |
| 265 fun_proto->Set(v8_str("prop_sig"), callback_sig); |
| 266 fun_proto->Set(v8_str("prop"), callback); |
| 267 fun_proto->SetAccessorProperty( |
| 268 v8_str("accessor_sig"), callback_sig, callback_sig); |
| 269 fun_proto->SetAccessorProperty(v8_str("accessor"), callback, callback); |
| 270 // Instantiate templates. |
| 271 Local<Value> fun_instance = fun->InstanceTemplate()->NewInstance(); |
| 272 Local<Value> sub_fun_instance = sub_fun->InstanceTemplate()->NewInstance(); |
| 273 // Setup global variables. |
| 274 env->Global()->Set(v8_str("Fun"), fun->GetFunction()); |
| 275 env->Global()->Set(v8_str("UnrelFun"), unrel_fun->GetFunction()); |
259 env->Global()->Set(v8_str("fun_instance"), fun_instance); | 276 env->Global()->Set(v8_str("fun_instance"), fun_instance); |
260 signature_expected_receiver = fun_instance; | 277 env->Global()->Set(v8_str("sub_fun_instance"), sub_fun_instance); |
261 CompileRun( | 278 CompileRun( |
262 "var o = fun_instance;" | 279 "var accessor_sig_key = 'accessor_sig';" |
263 "var key_n = 'n';" | 280 "var accessor_key = 'accessor';" |
264 "for (var i = 0; i < 10; i++) o.m();" | 281 "var prop_sig_key = 'prop_sig';" |
265 "for (var i = 0; i < 10; i++) o.n;" | 282 "var prop_key = 'prop';" |
266 "for (var i = 0; i < 10; i++) o[key_n];"); | 283 "" |
267 expected_count += 30; | 284 "function copy_props(obj) {" |
268 CHECK_EQ(expected_count, signature_callback_count); | 285 " var keys = [accessor_sig_key, accessor_key, prop_sig_key, prop_key];" |
269 v8::TryCatch try_catch; | 286 " var source = Fun.prototype;" |
270 CompileRun( | 287 " for (var i in keys) {" |
271 "var o = { };" | 288 " var key = keys[i];" |
272 "o.m = Fun.prototype.m;" | 289 " var desc = Object.getOwnPropertyDescriptor(source, key);" |
273 "o.m();"); | 290 " Object.defineProperty(obj, key, desc);" |
274 CHECK_EQ(expected_count, signature_callback_count); | 291 " }" |
275 CHECK(try_catch.HasCaught()); | 292 "}" |
276 CompileRun( | 293 "" |
277 "var o = { };" | 294 "var obj = {};" |
278 "o.n = Fun.prototype.n;" | 295 "copy_props(obj);" |
279 "o.n;"); | 296 "var unrel = new UnrelFun();" |
280 CHECK_EQ(expected_count, signature_callback_count); | 297 "copy_props(unrel);"); |
281 CHECK(try_catch.HasCaught()); | 298 // Test with and without ICs |
282 try_catch.Reset(); | 299 const char* test_objects[] = { |
283 v8::Handle<v8::FunctionTemplate> unrel_fun = v8::FunctionTemplate::New(); | 300 "fun_instance", "sub_fun_instance", "obj", "unrel" }; |
284 sub_fun->Inherit(fun); | 301 unsigned bad_signature_start_offset = 2; |
285 env->Global()->Set(v8_str("UnrelFun"), unrel_fun->GetFunction()); | 302 for (unsigned i = 0; i < ARRAY_SIZE(test_objects); i++) { |
286 CompileRun( | 303 i::ScopedVector<char> source(200); |
287 "var o = new UnrelFun();" | 304 i::OS::SNPrintF( |
288 "o.m = Fun.prototype.m;" | 305 source, "var test_object = %s; test_object", test_objects[i]); |
289 "o.m();"); | 306 Local<Value> test_object = CompileRun(source.start()); |
290 CHECK_EQ(expected_count, signature_callback_count); | 307 TestSignature("test_object.prop();", test_object); |
291 CHECK(try_catch.HasCaught()); | 308 TestSignature("test_object.accessor;", test_object); |
292 try_catch.Reset(); | 309 TestSignature("test_object[accessor_key];", test_object); |
293 CompileRun( | 310 TestSignature("test_object.accessor = 1;", test_object); |
294 "var o = new UnrelFun();" | 311 TestSignature("test_object[accessor_key] = 1;", test_object); |
295 "o.n = Fun.prototype.n;" | 312 if (i >= bad_signature_start_offset) test_object = Local<Value>(); |
296 "o.n;"); | 313 TestSignature("test_object.prop_sig();", test_object); |
297 CHECK_EQ(expected_count, signature_callback_count); | 314 TestSignature("test_object.accessor_sig;", test_object); |
298 CHECK(try_catch.HasCaught()); | 315 TestSignature("test_object[accessor_sig_key];", test_object); |
| 316 TestSignature("test_object.accessor_sig = 1;", test_object); |
| 317 TestSignature("test_object[accessor_sig_key] = 1;", test_object); |
| 318 } |
299 } | 319 } |
300 | 320 |
301 | 321 |
302 THREADED_TEST(ArgumentSignature) { | 322 THREADED_TEST(ArgumentSignature) { |
303 LocalContext env; | 323 LocalContext env; |
304 v8::HandleScope scope(env->GetIsolate()); | 324 v8::HandleScope scope(env->GetIsolate()); |
305 v8::Handle<v8::FunctionTemplate> cons = v8::FunctionTemplate::New(); | 325 v8::Handle<v8::FunctionTemplate> cons = v8::FunctionTemplate::New(); |
306 cons->SetClassName(v8_str("Cons")); | 326 cons->SetClassName(v8_str("Cons")); |
307 v8::Handle<v8::Signature> sig = | 327 v8::Handle<v8::Signature> sig = |
308 v8::Signature::New(v8::Handle<v8::FunctionTemplate>(), 1, &cons); | 328 v8::Signature::New(v8::Handle<v8::FunctionTemplate>(), 1, &cons); |
(...skipping 20156 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
20465 "setAge(100);" | 20485 "setAge(100);" |
20466 "setAge(101);" | 20486 "setAge(101);" |
20467 "setAge(102);" | 20487 "setAge(102);" |
20468 "%OptimizeFunctionOnNextCall(setAge);" | 20488 "%OptimizeFunctionOnNextCall(setAge);" |
20469 "setAge(103);"); | 20489 "setAge(103);"); |
20470 ExpectInt32("obj.age", 100000); | 20490 ExpectInt32("obj.age", 100000); |
20471 ExpectInt32("obj.interceptor_age", 103); | 20491 ExpectInt32("obj.interceptor_age", 103); |
20472 } | 20492 } |
20473 | 20493 |
20474 #endif // V8_OS_POSIX | 20494 #endif // V8_OS_POSIX |
OLD | NEW |