OLD | NEW |
1 // Copyright 2015 the V8 project authors. All rights reserved. | 1 // Copyright 2015 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include <stdlib.h> | 5 #include <stdlib.h> |
6 | 6 |
7 #include "test/cctest/test-api.h" | 7 #include "test/cctest/test-api.h" |
8 | 8 |
9 #include "include/v8-util.h" | 9 #include "include/v8-util.h" |
10 #include "src/api.h" | 10 #include "src/api.h" |
(...skipping 989 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1000 | 1000 |
1001 // Indexed and named deleter. | 1001 // Indexed and named deleter. |
1002 CompileRun("delete obj[0]"); | 1002 CompileRun("delete obj[0]"); |
1003 CompileRun("delete obj.x"); | 1003 CompileRun("delete obj.x"); |
1004 | 1004 |
1005 // Enumerators. | 1005 // Enumerators. |
1006 CompileRun("for (var p in obj) ;"); | 1006 CompileRun("for (var p in obj) ;"); |
1007 } | 1007 } |
1008 | 1008 |
1009 | 1009 |
| 1010 bool is_bootstrapping = true; |
1010 static void PrePropertyHandlerGet( | 1011 static void PrePropertyHandlerGet( |
1011 Local<Name> key, const v8::PropertyCallbackInfo<v8::Value>& info) { | 1012 Local<Name> key, const v8::PropertyCallbackInfo<v8::Value>& info) { |
1012 ApiTestFuzzer::Fuzz(); | 1013 ApiTestFuzzer::Fuzz(); |
1013 if (v8_str("pre")->Equals(key)) { | 1014 if (!is_bootstrapping && v8_str("pre")->Equals(key)) { |
1014 info.GetReturnValue().Set(v8_str("PrePropertyHandler: pre")); | 1015 info.GetReturnValue().Set(v8_str("PrePropertyHandler: pre")); |
1015 } | 1016 } |
1016 } | 1017 } |
1017 | 1018 |
1018 | 1019 |
1019 static void PrePropertyHandlerQuery( | 1020 static void PrePropertyHandlerQuery( |
1020 Local<Name> key, const v8::PropertyCallbackInfo<v8::Integer>& info) { | 1021 Local<Name> key, const v8::PropertyCallbackInfo<v8::Integer>& info) { |
1021 if (v8_str("pre")->Equals(key)) { | 1022 if (!is_bootstrapping && v8_str("pre")->Equals(key)) { |
1022 info.GetReturnValue().Set(static_cast<int32_t>(v8::None)); | 1023 info.GetReturnValue().Set(static_cast<int32_t>(v8::None)); |
1023 } | 1024 } |
1024 } | 1025 } |
1025 | 1026 |
1026 | 1027 |
1027 THREADED_TEST(PrePropertyHandler) { | 1028 THREADED_TEST(PrePropertyHandler) { |
1028 v8::Isolate* isolate = CcTest::isolate(); | 1029 v8::Isolate* isolate = CcTest::isolate(); |
1029 v8::HandleScope scope(isolate); | 1030 v8::HandleScope scope(isolate); |
1030 v8::Handle<v8::FunctionTemplate> desc = v8::FunctionTemplate::New(isolate); | 1031 v8::Handle<v8::FunctionTemplate> desc = v8::FunctionTemplate::New(isolate); |
1031 desc->InstanceTemplate()->SetHandler(v8::NamedPropertyHandlerConfiguration( | 1032 desc->InstanceTemplate()->SetHandler(v8::NamedPropertyHandlerConfiguration( |
1032 PrePropertyHandlerGet, 0, PrePropertyHandlerQuery)); | 1033 PrePropertyHandlerGet, 0, PrePropertyHandlerQuery)); |
| 1034 is_bootstrapping = true; |
1033 LocalContext env(NULL, desc->InstanceTemplate()); | 1035 LocalContext env(NULL, desc->InstanceTemplate()); |
| 1036 is_bootstrapping = false; |
1034 CompileRun("var pre = 'Object: pre'; var on = 'Object: on';"); | 1037 CompileRun("var pre = 'Object: pre'; var on = 'Object: on';"); |
1035 v8::Handle<Value> result_pre = CompileRun("pre"); | 1038 v8::Handle<Value> result_pre = CompileRun("pre"); |
1036 CHECK(v8_str("PrePropertyHandler: pre")->Equals(result_pre)); | 1039 CHECK(v8_str("PrePropertyHandler: pre")->Equals(result_pre)); |
1037 v8::Handle<Value> result_on = CompileRun("on"); | 1040 v8::Handle<Value> result_on = CompileRun("on"); |
1038 CHECK(v8_str("Object: on")->Equals(result_on)); | 1041 CHECK(v8_str("Object: on")->Equals(result_on)); |
1039 v8::Handle<Value> result_post = CompileRun("post"); | 1042 v8::Handle<Value> result_post = CompileRun("post"); |
1040 CHECK(result_post.IsEmpty()); | 1043 CHECK(result_post.IsEmpty()); |
1041 } | 1044 } |
1042 | 1045 |
1043 | 1046 |
(...skipping 1497 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2541 | 2544 |
2542 // This test should hit load and call ICs for the interceptor case. | 2545 // This test should hit load and call ICs for the interceptor case. |
2543 // Once in a while, the interceptor will reply that a property was not | 2546 // Once in a while, the interceptor will reply that a property was not |
2544 // found in which case we should get a reference error. | 2547 // found in which case we should get a reference error. |
2545 THREADED_TEST(InterceptorICReferenceErrors) { | 2548 THREADED_TEST(InterceptorICReferenceErrors) { |
2546 v8::Isolate* isolate = CcTest::isolate(); | 2549 v8::Isolate* isolate = CcTest::isolate(); |
2547 v8::HandleScope scope(isolate); | 2550 v8::HandleScope scope(isolate); |
2548 v8::Handle<v8::ObjectTemplate> templ = ObjectTemplate::New(isolate); | 2551 v8::Handle<v8::ObjectTemplate> templ = ObjectTemplate::New(isolate); |
2549 templ->SetHandler( | 2552 templ->SetHandler( |
2550 v8::NamedPropertyHandlerConfiguration(InterceptorICRefErrorGetter)); | 2553 v8::NamedPropertyHandlerConfiguration(InterceptorICRefErrorGetter)); |
| 2554 interceptor_call_count = -100000; // Generous limit for bootstrapping. |
2551 LocalContext context(0, templ, v8::Handle<Value>()); | 2555 LocalContext context(0, templ, v8::Handle<Value>()); |
| 2556 interceptor_call_count = 0; |
2552 call_ic_function2 = v8_compile("function h(x) { return x; }; h")->Run(); | 2557 call_ic_function2 = v8_compile("function h(x) { return x; }; h")->Run(); |
2553 v8::Handle<Value> value = CompileRun( | 2558 v8::Handle<Value> value = CompileRun( |
2554 "function f() {" | 2559 "function f() {" |
2555 " for (var i = 0; i < 1000; i++) {" | 2560 " for (var i = 0; i < 1000; i++) {" |
2556 " try { x; } catch(e) { return true; }" | 2561 " try { x; } catch(e) { return true; }" |
2557 " }" | 2562 " }" |
2558 " return false;" | 2563 " return false;" |
2559 "};" | 2564 "};" |
2560 "f();"); | 2565 "f();"); |
2561 CHECK_EQ(true, value->BooleanValue()); | 2566 CHECK_EQ(true, value->BooleanValue()); |
(...skipping 25 matching lines...) Expand all Loading... |
2587 } | 2592 } |
2588 | 2593 |
2589 | 2594 |
2590 // Test interceptor load/call IC where the interceptor throws an | 2595 // Test interceptor load/call IC where the interceptor throws an |
2591 // exception once in a while. | 2596 // exception once in a while. |
2592 THREADED_TEST(InterceptorICGetterExceptions) { | 2597 THREADED_TEST(InterceptorICGetterExceptions) { |
2593 interceptor_ic_exception_get_count = 0; | 2598 interceptor_ic_exception_get_count = 0; |
2594 v8::Isolate* isolate = CcTest::isolate(); | 2599 v8::Isolate* isolate = CcTest::isolate(); |
2595 v8::HandleScope scope(isolate); | 2600 v8::HandleScope scope(isolate); |
2596 v8::Handle<v8::ObjectTemplate> templ = ObjectTemplate::New(isolate); | 2601 v8::Handle<v8::ObjectTemplate> templ = ObjectTemplate::New(isolate); |
| 2602 // Generous limit for bootstrapping. |
| 2603 interceptor_ic_exception_get_count = -100000; |
2597 templ->SetHandler( | 2604 templ->SetHandler( |
2598 v8::NamedPropertyHandlerConfiguration(InterceptorICExceptionGetter)); | 2605 v8::NamedPropertyHandlerConfiguration(InterceptorICExceptionGetter)); |
2599 LocalContext context(0, templ, v8::Handle<Value>()); | 2606 LocalContext context(0, templ, v8::Handle<Value>()); |
| 2607 interceptor_ic_exception_get_count = 0; |
2600 call_ic_function3 = v8_compile("function h(x) { return x; }; h")->Run(); | 2608 call_ic_function3 = v8_compile("function h(x) { return x; }; h")->Run(); |
2601 v8::Handle<Value> value = CompileRun( | 2609 v8::Handle<Value> value = CompileRun( |
2602 "function f() {" | 2610 "function f() {" |
2603 " for (var i = 0; i < 100; i++) {" | 2611 " for (var i = 0; i < 100; i++) {" |
2604 " try { x; } catch(e) { return true; }" | 2612 " try { x; } catch(e) { return true; }" |
2605 " }" | 2613 " }" |
2606 " return false;" | 2614 " return false;" |
2607 "};" | 2615 "};" |
2608 "f();"); | 2616 "f();"); |
2609 CHECK_EQ(true, value->BooleanValue()); | 2617 CHECK_EQ(true, value->BooleanValue()); |
(...skipping 696 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3306 "var obj = intercepted_1;" | 3314 "var obj = intercepted_1;" |
3307 "obj.x = 4;" | 3315 "obj.x = 4;" |
3308 "eval('obj.x');" | 3316 "eval('obj.x');" |
3309 "eval('obj.x');" | 3317 "eval('obj.x');" |
3310 "eval('obj.x');" | 3318 "eval('obj.x');" |
3311 "obj = intercepted_2;" | 3319 "obj = intercepted_2;" |
3312 "obj.x = 9;" | 3320 "obj.x = 9;" |
3313 "eval('obj.x');", | 3321 "eval('obj.x');", |
3314 9); | 3322 9); |
3315 } | 3323 } |
OLD | NEW |