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 2863 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2874 CHECK(v8_str("x")->Equals(result_array->Get(1))); | 2874 CHECK(v8_str("x")->Equals(result_array->Get(1))); |
2875 | 2875 |
2876 result = CompileRun("Object.getOwnPropertySymbols(object)"); | 2876 result = CompileRun("Object.getOwnPropertySymbols(object)"); |
2877 CHECK(result->IsArray()); | 2877 CHECK(result->IsArray()); |
2878 result_array = v8::Handle<v8::Array>::Cast(result); | 2878 result_array = v8::Handle<v8::Array>::Cast(result); |
2879 CHECK_EQ(1u, result_array->Length()); | 2879 CHECK_EQ(1u, result_array->Length()); |
2880 CHECK(result_array->Get(0)->Equals(v8::Symbol::GetIterator(isolate))); | 2880 CHECK(result_array->Get(0)->Equals(v8::Symbol::GetIterator(isolate))); |
2881 } | 2881 } |
2882 | 2882 |
2883 | 2883 |
| 2884 static void IndexedPropertyEnumeratorException( |
| 2885 const v8::PropertyCallbackInfo<v8::Array>& info) { |
| 2886 info.GetIsolate()->ThrowException(v8_num(42)); |
| 2887 } |
| 2888 |
| 2889 |
| 2890 THREADED_TEST(GetOwnPropertyNamesWithIndexedInterceptorExceptions_regress4026) { |
| 2891 v8::Isolate* isolate = CcTest::isolate(); |
| 2892 v8::HandleScope handle_scope(isolate); |
| 2893 v8::Handle<v8::ObjectTemplate> obj_template = |
| 2894 v8::ObjectTemplate::New(isolate); |
| 2895 |
| 2896 obj_template->Set(v8_str("7"), v8::Integer::New(CcTest::isolate(), 7)); |
| 2897 obj_template->Set(v8_str("x"), v8::Integer::New(CcTest::isolate(), 42)); |
| 2898 // First just try a failing indexed interceptor. |
| 2899 obj_template->SetHandler(v8::IndexedPropertyHandlerConfiguration( |
| 2900 NULL, NULL, NULL, NULL, IndexedPropertyEnumeratorException)); |
| 2901 |
| 2902 LocalContext context; |
| 2903 v8::Handle<v8::Object> global = context->Global(); |
| 2904 global->Set(v8_str("object"), obj_template->NewInstance()); |
| 2905 v8::Handle<v8::Value> result = CompileRun( |
| 2906 "var result = []; " |
| 2907 "try { " |
| 2908 " for (var k in object) result .push(k);" |
| 2909 "} catch (e) {" |
| 2910 " result = e" |
| 2911 "}" |
| 2912 "result "); |
| 2913 CHECK(!result->IsArray()); |
| 2914 CHECK(v8_num(42)->Equals(result)); |
| 2915 |
| 2916 result = CompileRun( |
| 2917 "var result = [];" |
| 2918 "try { " |
| 2919 " result = Object.keys(object);" |
| 2920 "} catch (e) {" |
| 2921 " result = e;" |
| 2922 "}" |
| 2923 "result"); |
| 2924 CHECK(!result->IsArray()); |
| 2925 CHECK(v8_num(42)->Equals(result)); |
| 2926 } |
| 2927 |
| 2928 |
| 2929 static void NamedPropertyEnumeratorException( |
| 2930 const v8::PropertyCallbackInfo<v8::Array>& info) { |
| 2931 info.GetIsolate()->ThrowException(v8_num(43)); |
| 2932 } |
| 2933 |
| 2934 |
| 2935 THREADED_TEST(GetOwnPropertyNamesWithNamedInterceptorExceptions_regress4026) { |
| 2936 v8::Isolate* isolate = CcTest::isolate(); |
| 2937 v8::HandleScope handle_scope(isolate); |
| 2938 v8::Handle<v8::ObjectTemplate> obj_template = |
| 2939 v8::ObjectTemplate::New(isolate); |
| 2940 |
| 2941 obj_template->Set(v8_str("7"), v8::Integer::New(CcTest::isolate(), 7)); |
| 2942 obj_template->Set(v8_str("x"), v8::Integer::New(CcTest::isolate(), 42)); |
| 2943 // First just try a failing indexed interceptor. |
| 2944 obj_template->SetHandler(v8::NamedPropertyHandlerConfiguration( |
| 2945 NULL, NULL, NULL, NULL, NamedPropertyEnumeratorException)); |
| 2946 |
| 2947 LocalContext context; |
| 2948 v8::Handle<v8::Object> global = context->Global(); |
| 2949 global->Set(v8_str("object"), obj_template->NewInstance()); |
| 2950 |
| 2951 v8::Handle<v8::Value> result = CompileRun( |
| 2952 "var result = []; " |
| 2953 "try { " |
| 2954 " for (var k in object) result.push(k);" |
| 2955 "} catch (e) {" |
| 2956 " result = e" |
| 2957 "}" |
| 2958 "result"); |
| 2959 CHECK(!result->IsArray()); |
| 2960 CHECK(v8_num(43)->Equals(result)); |
| 2961 |
| 2962 result = CompileRun( |
| 2963 "var result = [];" |
| 2964 "try { " |
| 2965 " result = Object.keys(object);" |
| 2966 "} catch (e) {" |
| 2967 " result = e;" |
| 2968 "}" |
| 2969 "result"); |
| 2970 CHECK(!result->IsArray()); |
| 2971 CHECK(v8_num(43)->Equals(result)); |
| 2972 } |
| 2973 |
2884 namespace { | 2974 namespace { |
2885 | 2975 |
2886 template <typename T> | 2976 template <typename T> |
2887 Local<Object> BuildWrappedObject(v8::Isolate* isolate, T* data) { | 2977 Local<Object> BuildWrappedObject(v8::Isolate* isolate, T* data) { |
2888 auto templ = v8::ObjectTemplate::New(isolate); | 2978 auto templ = v8::ObjectTemplate::New(isolate); |
2889 templ->SetInternalFieldCount(1); | 2979 templ->SetInternalFieldCount(1); |
2890 auto instance = templ->NewInstance(); | 2980 auto instance = templ->NewInstance(); |
2891 instance->SetAlignedPointerInInternalField(0, data); | 2981 instance->SetAlignedPointerInInternalField(0, data); |
2892 return instance; | 2982 return instance; |
2893 } | 2983 } |
(...skipping 387 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3281 "var obj = intercepted_1;" | 3371 "var obj = intercepted_1;" |
3282 "obj.x = 4;" | 3372 "obj.x = 4;" |
3283 "eval('obj.x');" | 3373 "eval('obj.x');" |
3284 "eval('obj.x');" | 3374 "eval('obj.x');" |
3285 "eval('obj.x');" | 3375 "eval('obj.x');" |
3286 "obj = intercepted_2;" | 3376 "obj = intercepted_2;" |
3287 "obj.x = 9;" | 3377 "obj.x = 9;" |
3288 "eval('obj.x');", | 3378 "eval('obj.x');", |
3289 9); | 3379 9); |
3290 } | 3380 } |
OLD | NEW |