| 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 2430 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2441 v8::Local<v8::FunctionTemplate> foo = v8::FunctionTemplate::New(isolate); | 2441 v8::Local<v8::FunctionTemplate> foo = v8::FunctionTemplate::New(isolate); |
| 2442 v8::Local<v8::Name> name = v8::Symbol::New(isolate); | 2442 v8::Local<v8::Name> name = v8::Symbol::New(isolate); |
| 2443 CHECK(!name.IsEmpty()); | 2443 CHECK(!name.IsEmpty()); |
| 2444 foo->PrototypeTemplate()->Set(name, v8::FunctionTemplate::New(isolate)); | 2444 foo->PrototypeTemplate()->Set(name, v8::FunctionTemplate::New(isolate)); |
| 2445 v8::Local<v8::Object> new_instance = foo->InstanceTemplate()->NewInstance(); | 2445 v8::Local<v8::Object> new_instance = foo->InstanceTemplate()->NewInstance(); |
| 2446 CHECK(!new_instance.IsEmpty()); | 2446 CHECK(!new_instance.IsEmpty()); |
| 2447 CHECK(new_instance->Has(name)); | 2447 CHECK(new_instance->Has(name)); |
| 2448 } | 2448 } |
| 2449 | 2449 |
| 2450 | 2450 |
| 2451 THREADED_TEST(PrivateProperties) { |
| 2452 LocalContext env; |
| 2453 v8::Isolate* isolate = env->GetIsolate(); |
| 2454 v8::HandleScope scope(isolate); |
| 2455 |
| 2456 v8::Local<v8::Object> obj = v8::Object::New(isolate); |
| 2457 v8::Local<v8::Private> priv1 = v8::Private::New(isolate); |
| 2458 v8::Local<v8::Private> priv2 = |
| 2459 v8::Private::New(isolate, v8_str("my-private")); |
| 2460 |
| 2461 CcTest::heap()->CollectAllGarbage(); |
| 2462 |
| 2463 CHECK(priv2->Name()->Equals(v8::String::NewFromUtf8(isolate, "my-private"))); |
| 2464 |
| 2465 // Make sure delete of a non-existent private symbol property works. |
| 2466 obj->DeletePrivate(env.local(), priv1).FromJust(); |
| 2467 CHECK(!obj->HasPrivate(env.local(), priv1).FromJust()); |
| 2468 |
| 2469 CHECK(obj->SetPrivate(env.local(), priv1, v8::Integer::New(isolate, 1503)) |
| 2470 .FromJust()); |
| 2471 CHECK(obj->HasPrivate(env.local(), priv1).FromJust()); |
| 2472 CHECK_EQ(1503, |
| 2473 obj->GetPrivate(env.local(), priv1).ToLocalChecked()->Int32Value()); |
| 2474 CHECK(obj->SetPrivate(env.local(), priv1, v8::Integer::New(isolate, 2002)) |
| 2475 .FromJust()); |
| 2476 CHECK(obj->HasPrivate(env.local(), priv1).FromJust()); |
| 2477 CHECK_EQ(2002, |
| 2478 obj->GetPrivate(env.local(), priv1).ToLocalChecked()->Int32Value()); |
| 2479 |
| 2480 CHECK_EQ(0u, obj->GetOwnPropertyNames()->Length()); |
| 2481 unsigned num_props = obj->GetPropertyNames()->Length(); |
| 2482 CHECK(obj->Set(v8::String::NewFromUtf8(isolate, "bla"), |
| 2483 v8::Integer::New(isolate, 20))); |
| 2484 CHECK_EQ(1u, obj->GetOwnPropertyNames()->Length()); |
| 2485 CHECK_EQ(num_props + 1, obj->GetPropertyNames()->Length()); |
| 2486 |
| 2487 CcTest::heap()->CollectAllGarbage(); |
| 2488 |
| 2489 // Add another property and delete it afterwards to force the object in |
| 2490 // slow case. |
| 2491 CHECK(obj->SetPrivate(env.local(), priv2, v8::Integer::New(isolate, 2008)) |
| 2492 .FromJust()); |
| 2493 CHECK_EQ(2002, |
| 2494 obj->GetPrivate(env.local(), priv1).ToLocalChecked()->Int32Value()); |
| 2495 CHECK_EQ(2008, |
| 2496 obj->GetPrivate(env.local(), priv2).ToLocalChecked()->Int32Value()); |
| 2497 CHECK_EQ(2002, |
| 2498 obj->GetPrivate(env.local(), priv1).ToLocalChecked()->Int32Value()); |
| 2499 CHECK_EQ(1u, obj->GetOwnPropertyNames()->Length()); |
| 2500 |
| 2501 CHECK(obj->HasPrivate(env.local(), priv1).FromJust()); |
| 2502 CHECK(obj->HasPrivate(env.local(), priv2).FromJust()); |
| 2503 CHECK(obj->DeletePrivate(env.local(), priv2).FromJust()); |
| 2504 CHECK(obj->HasPrivate(env.local(), priv1).FromJust()); |
| 2505 CHECK(!obj->HasPrivate(env.local(), priv2).FromJust()); |
| 2506 CHECK_EQ(2002, |
| 2507 obj->GetPrivate(env.local(), priv1).ToLocalChecked()->Int32Value()); |
| 2508 CHECK_EQ(1u, obj->GetOwnPropertyNames()->Length()); |
| 2509 |
| 2510 // Private properties are not inherited (for the time being). |
| 2511 v8::Local<v8::Object> child = v8::Object::New(isolate); |
| 2512 child->SetPrototype(obj); |
| 2513 CHECK(!child->HasPrivate(env.local(), priv1).FromJust()); |
| 2514 CHECK_EQ(0u, child->GetOwnPropertyNames()->Length()); |
| 2515 } |
| 2516 |
| 2517 |
| 2451 THREADED_TEST(GlobalSymbols) { | 2518 THREADED_TEST(GlobalSymbols) { |
| 2452 LocalContext env; | 2519 LocalContext env; |
| 2453 v8::Isolate* isolate = env->GetIsolate(); | 2520 v8::Isolate* isolate = env->GetIsolate(); |
| 2454 v8::HandleScope scope(isolate); | 2521 v8::HandleScope scope(isolate); |
| 2455 | 2522 |
| 2456 v8::Local<String> name = v8_str("my-symbol"); | 2523 v8::Local<String> name = v8_str("my-symbol"); |
| 2457 v8::Local<v8::Symbol> glob = v8::Symbol::For(isolate, name); | 2524 v8::Local<v8::Symbol> glob = v8::Symbol::For(isolate, name); |
| 2458 v8::Local<v8::Symbol> glob2 = v8::Symbol::For(isolate, name); | 2525 v8::Local<v8::Symbol> glob2 = v8::Symbol::For(isolate, name); |
| 2459 CHECK(glob2->SameValue(glob)); | 2526 CHECK(glob2->SameValue(glob)); |
| 2460 | 2527 |
| (...skipping 28 matching lines...) Expand all Loading... |
| 2489 CHECK(value->SameValue(symbol)); | 2556 CHECK(value->SameValue(symbol)); |
| 2490 } | 2557 } |
| 2491 | 2558 |
| 2492 | 2559 |
| 2493 THREADED_TEST(WellKnownSymbols) { | 2560 THREADED_TEST(WellKnownSymbols) { |
| 2494 CheckWellKnownSymbol(v8::Symbol::GetIterator, "Symbol.iterator"); | 2561 CheckWellKnownSymbol(v8::Symbol::GetIterator, "Symbol.iterator"); |
| 2495 CheckWellKnownSymbol(v8::Symbol::GetUnscopables, "Symbol.unscopables"); | 2562 CheckWellKnownSymbol(v8::Symbol::GetUnscopables, "Symbol.unscopables"); |
| 2496 } | 2563 } |
| 2497 | 2564 |
| 2498 | 2565 |
| 2566 THREADED_TEST(GlobalPrivates) { |
| 2567 i::FLAG_allow_natives_syntax = true; |
| 2568 LocalContext env; |
| 2569 v8::Isolate* isolate = env->GetIsolate(); |
| 2570 v8::HandleScope scope(isolate); |
| 2571 |
| 2572 v8::Local<String> name = v8_str("my-private"); |
| 2573 v8::Local<v8::Private> glob = v8::Private::ForApi(isolate, name); |
| 2574 v8::Local<v8::Object> obj = v8::Object::New(isolate); |
| 2575 CHECK(obj->SetPrivate(env.local(), glob, v8::Integer::New(isolate, 3)) |
| 2576 .FromJust()); |
| 2577 |
| 2578 v8::Local<v8::Private> glob2 = v8::Private::ForApi(isolate, name); |
| 2579 CHECK(obj->HasPrivate(env.local(), glob2).FromJust()); |
| 2580 |
| 2581 v8::Local<v8::Private> priv = v8::Private::New(isolate, name); |
| 2582 CHECK(!obj->HasPrivate(env.local(), priv).FromJust()); |
| 2583 |
| 2584 CompileRun("var intern = %CreatePrivateSymbol('my-private')"); |
| 2585 v8::Local<Value> intern = env->Global()->Get(v8_str("intern")); |
| 2586 CHECK(!obj->Has(intern)); |
| 2587 } |
| 2588 |
| 2589 |
| 2499 class ScopedArrayBufferContents { | 2590 class ScopedArrayBufferContents { |
| 2500 public: | 2591 public: |
| 2501 explicit ScopedArrayBufferContents(const v8::ArrayBuffer::Contents& contents) | 2592 explicit ScopedArrayBufferContents(const v8::ArrayBuffer::Contents& contents) |
| 2502 : contents_(contents) {} | 2593 : contents_(contents) {} |
| 2503 ~ScopedArrayBufferContents() { free(contents_.Data()); } | 2594 ~ScopedArrayBufferContents() { free(contents_.Data()); } |
| 2504 void* Data() const { return contents_.Data(); } | 2595 void* Data() const { return contents_.Data(); } |
| 2505 size_t ByteLength() const { return contents_.ByteLength(); } | 2596 size_t ByteLength() const { return contents_.ByteLength(); } |
| 2506 | 2597 |
| 2507 private: | 2598 private: |
| 2508 const v8::ArrayBuffer::Contents contents_; | 2599 const v8::ArrayBuffer::Contents contents_; |
| (...skipping 399 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2908 CHECK_EQ(0xDD, result->Int32Value()); | 2999 CHECK_EQ(0xDD, result->Int32Value()); |
| 2909 } | 3000 } |
| 2910 | 3001 |
| 2911 | 3002 |
| 2912 THREADED_TEST(HiddenProperties) { | 3003 THREADED_TEST(HiddenProperties) { |
| 2913 LocalContext env; | 3004 LocalContext env; |
| 2914 v8::Isolate* isolate = env->GetIsolate(); | 3005 v8::Isolate* isolate = env->GetIsolate(); |
| 2915 v8::HandleScope scope(isolate); | 3006 v8::HandleScope scope(isolate); |
| 2916 | 3007 |
| 2917 v8::Local<v8::Object> obj = v8::Object::New(env->GetIsolate()); | 3008 v8::Local<v8::Object> obj = v8::Object::New(env->GetIsolate()); |
| 2918 v8::Local<v8::String> key = v8_str("api-test::hidden-key"); | 3009 v8::Local<v8::Private> key = |
| 3010 v8::Private::ForApi(isolate, v8_str("api-test::hidden-key")); |
| 2919 v8::Local<v8::String> empty = v8_str(""); | 3011 v8::Local<v8::String> empty = v8_str(""); |
| 2920 v8::Local<v8::String> prop_name = v8_str("prop_name"); | 3012 v8::Local<v8::String> prop_name = v8_str("prop_name"); |
| 2921 | 3013 |
| 2922 CcTest::heap()->CollectAllGarbage(); | 3014 CcTest::heap()->CollectAllGarbage(); |
| 2923 | 3015 |
| 2924 // Make sure delete of a non-existent hidden value works | 3016 // Make sure delete of a non-existent hidden value works |
| 2925 CHECK(obj->DeleteHiddenValue(key)); | 3017 obj->DeletePrivate(env.local(), key).FromJust(); |
| 2926 | 3018 |
| 2927 CHECK(obj->SetHiddenValue(key, v8::Integer::New(isolate, 1503))); | 3019 CHECK(obj->SetPrivate(env.local(), key, v8::Integer::New(isolate, 1503)) |
| 2928 CHECK_EQ(1503, obj->GetHiddenValue(key)->Int32Value()); | 3020 .FromJust()); |
| 2929 CHECK(obj->SetHiddenValue(key, v8::Integer::New(isolate, 2002))); | 3021 CHECK_EQ(1503, |
| 2930 CHECK_EQ(2002, obj->GetHiddenValue(key)->Int32Value()); | 3022 obj->GetPrivate(env.local(), key).ToLocalChecked()->Int32Value()); |
| 3023 CHECK(obj->SetPrivate(env.local(), key, v8::Integer::New(isolate, 2002)) |
| 3024 .FromJust()); |
| 3025 CHECK_EQ(2002, |
| 3026 obj->GetPrivate(env.local(), key).ToLocalChecked()->Int32Value()); |
| 2931 | 3027 |
| 2932 CcTest::heap()->CollectAllGarbage(); | 3028 CcTest::heap()->CollectAllGarbage(); |
| 2933 | 3029 |
| 2934 // Make sure we do not find the hidden property. | 3030 // Make sure we do not find the hidden property. |
| 2935 CHECK(!obj->Has(empty)); | 3031 CHECK(!obj->Has(empty)); |
| 2936 CHECK_EQ(2002, obj->GetHiddenValue(key)->Int32Value()); | 3032 CHECK_EQ(2002, |
| 3033 obj->GetPrivate(env.local(), key).ToLocalChecked()->Int32Value()); |
| 2937 CHECK(obj->Get(empty)->IsUndefined()); | 3034 CHECK(obj->Get(empty)->IsUndefined()); |
| 2938 CHECK_EQ(2002, obj->GetHiddenValue(key)->Int32Value()); | 3035 CHECK_EQ(2002, |
| 3036 obj->GetPrivate(env.local(), key).ToLocalChecked()->Int32Value()); |
| 2939 CHECK(obj->Set(empty, v8::Integer::New(isolate, 2003))); | 3037 CHECK(obj->Set(empty, v8::Integer::New(isolate, 2003))); |
| 2940 CHECK_EQ(2002, obj->GetHiddenValue(key)->Int32Value()); | 3038 CHECK_EQ(2002, |
| 3039 obj->GetPrivate(env.local(), key).ToLocalChecked()->Int32Value()); |
| 2941 CHECK_EQ(2003, obj->Get(empty)->Int32Value()); | 3040 CHECK_EQ(2003, obj->Get(empty)->Int32Value()); |
| 2942 | 3041 |
| 2943 CcTest::heap()->CollectAllGarbage(); | 3042 CcTest::heap()->CollectAllGarbage(); |
| 2944 | 3043 |
| 2945 // Add another property and delete it afterwards to force the object in | 3044 // Add another property and delete it afterwards to force the object in |
| 2946 // slow case. | 3045 // slow case. |
| 2947 CHECK(obj->Set(prop_name, v8::Integer::New(isolate, 2008))); | 3046 CHECK(obj->Set(prop_name, v8::Integer::New(isolate, 2008))); |
| 2948 CHECK_EQ(2002, obj->GetHiddenValue(key)->Int32Value()); | 3047 CHECK_EQ(2002, |
| 3048 obj->GetPrivate(env.local(), key).ToLocalChecked()->Int32Value()); |
| 2949 CHECK_EQ(2008, obj->Get(prop_name)->Int32Value()); | 3049 CHECK_EQ(2008, obj->Get(prop_name)->Int32Value()); |
| 2950 CHECK_EQ(2002, obj->GetHiddenValue(key)->Int32Value()); | 3050 CHECK_EQ(2002, |
| 3051 obj->GetPrivate(env.local(), key).ToLocalChecked()->Int32Value()); |
| 2951 CHECK(obj->Delete(prop_name)); | 3052 CHECK(obj->Delete(prop_name)); |
| 2952 CHECK_EQ(2002, obj->GetHiddenValue(key)->Int32Value()); | 3053 CHECK_EQ(2002, |
| 3054 obj->GetPrivate(env.local(), key).ToLocalChecked()->Int32Value()); |
| 2953 | 3055 |
| 2954 CcTest::heap()->CollectAllGarbage(); | 3056 CcTest::heap()->CollectAllGarbage(); |
| 2955 | 3057 |
| 2956 CHECK(obj->SetHiddenValue(key, Handle<Value>())); | 3058 CHECK(obj->SetPrivate(env.local(), key, v8::Integer::New(isolate, 2002)) |
| 2957 CHECK(obj->GetHiddenValue(key).IsEmpty()); | 3059 .FromJust()); |
| 2958 | 3060 CHECK(obj->DeletePrivate(env.local(), key).FromJust()); |
| 2959 CHECK(obj->SetHiddenValue(key, v8::Integer::New(isolate, 2002))); | 3061 CHECK(!obj->HasPrivate(env.local(), key).FromJust()); |
| 2960 CHECK(obj->DeleteHiddenValue(key)); | |
| 2961 CHECK(obj->GetHiddenValue(key).IsEmpty()); | |
| 2962 } | 3062 } |
| 2963 | 3063 |
| 2964 | 3064 |
| 2965 THREADED_TEST(Regress97784) { | 3065 THREADED_TEST(Regress97784) { |
| 2966 // Regression test for crbug.com/97784 | 3066 // Regression test for crbug.com/97784 |
| 2967 // Messing with the Object.prototype should not have effect on | 3067 // Messing with the Object.prototype should not have effect on |
| 2968 // hidden properties. | 3068 // hidden properties. |
| 2969 LocalContext env; | 3069 LocalContext env; |
| 2970 v8::HandleScope scope(env->GetIsolate()); | 3070 v8::HandleScope scope(env->GetIsolate()); |
| 2971 | 3071 |
| 2972 v8::Local<v8::Object> obj = v8::Object::New(env->GetIsolate()); | 3072 v8::Local<v8::Object> obj = v8::Object::New(env->GetIsolate()); |
| 2973 v8::Local<v8::String> key = v8_str("hidden"); | 3073 v8::Local<v8::Private> key = |
| 3074 v8::Private::New(env->GetIsolate(), v8_str("hidden")); |
| 2974 | 3075 |
| 2975 CompileRun( | 3076 CompileRun( |
| 2976 "set_called = false;" | 3077 "set_called = false;" |
| 2977 "Object.defineProperty(" | 3078 "Object.defineProperty(" |
| 2978 " Object.prototype," | 3079 " Object.prototype," |
| 2979 " 'hidden'," | 3080 " 'hidden'," |
| 2980 " {get: function() { return 45; }," | 3081 " {get: function() { return 45; }," |
| 2981 " set: function() { set_called = true; }})"); | 3082 " set: function() { set_called = true; }})"); |
| 2982 | 3083 |
| 2983 CHECK(obj->GetHiddenValue(key).IsEmpty()); | 3084 CHECK(!obj->HasPrivate(env.local(), key).FromJust()); |
| 2984 // Make sure that the getter and setter from Object.prototype is not invoked. | 3085 // Make sure that the getter and setter from Object.prototype is not invoked. |
| 2985 // If it did we would have full access to the hidden properties in | 3086 // If it did we would have full access to the hidden properties in |
| 2986 // the accessor. | 3087 // the accessor. |
| 2987 CHECK(obj->SetHiddenValue(key, v8::Integer::New(env->GetIsolate(), 42))); | 3088 CHECK( |
| 3089 obj->SetPrivate(env.local(), key, v8::Integer::New(env->GetIsolate(), 42)) |
| 3090 .FromJust()); |
| 2988 ExpectFalse("set_called"); | 3091 ExpectFalse("set_called"); |
| 2989 CHECK_EQ(42, obj->GetHiddenValue(key)->Int32Value()); | 3092 CHECK_EQ(42, |
| 3093 obj->GetPrivate(env.local(), key).ToLocalChecked()->Int32Value()); |
| 2990 } | 3094 } |
| 2991 | 3095 |
| 2992 | 3096 |
| 2993 THREADED_TEST(External) { | 3097 THREADED_TEST(External) { |
| 2994 v8::HandleScope scope(CcTest::isolate()); | 3098 v8::HandleScope scope(CcTest::isolate()); |
| 2995 int x = 3; | 3099 int x = 3; |
| 2996 Local<v8::External> ext = v8::External::New(CcTest::isolate(), &x); | 3100 Local<v8::External> ext = v8::External::New(CcTest::isolate(), &x); |
| 2997 LocalContext env; | 3101 LocalContext env; |
| 2998 env->Global()->Set(v8_str("ext"), ext); | 3102 env->Global()->Set(v8_str("ext"), ext); |
| 2999 Local<Value> reext_obj = CompileRun("this.ext"); | 3103 Local<Value> reext_obj = CompileRun("this.ext"); |
| (...skipping 1072 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4072 // clear out the message listener | 4176 // clear out the message listener |
| 4073 v8::V8::RemoveMessageListeners(check_message_1); | 4177 v8::V8::RemoveMessageListeners(check_message_1); |
| 4074 } | 4178 } |
| 4075 | 4179 |
| 4076 | 4180 |
| 4077 static void check_message_2(v8::Handle<v8::Message> message, | 4181 static void check_message_2(v8::Handle<v8::Message> message, |
| 4078 v8::Handle<Value> data) { | 4182 v8::Handle<Value> data) { |
| 4079 LocalContext context; | 4183 LocalContext context; |
| 4080 CHECK(data->IsObject()); | 4184 CHECK(data->IsObject()); |
| 4081 v8::Local<v8::Value> hidden_property = | 4185 v8::Local<v8::Value> hidden_property = |
| 4082 v8::Object::Cast(*data)->GetHiddenValue(v8_str("hidden key")); | 4186 v8::Object::Cast(*data) |
| 4187 ->GetPrivate( |
| 4188 context.local(), |
| 4189 v8::Private::ForApi(CcTest::isolate(), v8_str("hidden key"))) |
| 4190 .ToLocalChecked(); |
| 4083 CHECK(v8_str("hidden value")->Equals(hidden_property)); | 4191 CHECK(v8_str("hidden value")->Equals(hidden_property)); |
| 4084 CHECK(!message->IsSharedCrossOrigin()); | 4192 CHECK(!message->IsSharedCrossOrigin()); |
| 4085 message_received = true; | 4193 message_received = true; |
| 4086 } | 4194 } |
| 4087 | 4195 |
| 4088 | 4196 |
| 4089 TEST(MessageHandler2) { | 4197 TEST(MessageHandler2) { |
| 4090 message_received = false; | 4198 message_received = false; |
| 4091 v8::HandleScope scope(CcTest::isolate()); | 4199 v8::HandleScope scope(CcTest::isolate()); |
| 4092 CHECK(!message_received); | 4200 CHECK(!message_received); |
| 4093 v8::V8::AddMessageListener(check_message_2); | 4201 v8::V8::AddMessageListener(check_message_2); |
| 4094 LocalContext context; | 4202 LocalContext context; |
| 4095 v8::Local<v8::Value> error = v8::Exception::Error(v8_str("custom error")); | 4203 v8::Local<v8::Value> error = v8::Exception::Error(v8_str("custom error")); |
| 4096 v8::Object::Cast(*error) | 4204 v8::Object::Cast(*error) |
| 4097 ->SetHiddenValue(v8_str("hidden key"), v8_str("hidden value")); | 4205 ->SetPrivate(context.local(), |
| 4206 v8::Private::ForApi(CcTest::isolate(), v8_str("hidden key")), |
| 4207 v8_str("hidden value")) |
| 4208 .FromJust(); |
| 4098 context->Global()->Set(v8_str("error"), error); | 4209 context->Global()->Set(v8_str("error"), error); |
| 4099 CompileRun("throw error;"); | 4210 CompileRun("throw error;"); |
| 4100 CHECK(message_received); | 4211 CHECK(message_received); |
| 4101 // clear out the message listener | 4212 // clear out the message listener |
| 4102 v8::V8::RemoveMessageListeners(check_message_2); | 4213 v8::V8::RemoveMessageListeners(check_message_2); |
| 4103 } | 4214 } |
| 4104 | 4215 |
| 4105 | 4216 |
| 4106 static void check_message_3(v8::Handle<v8::Message> message, | 4217 static void check_message_3(v8::Handle<v8::Message> message, |
| 4107 v8::Handle<Value> data) { | 4218 v8::Handle<Value> data) { |
| (...skipping 5373 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 9481 // Inherit from t1 and mark prototype as hidden. | 9592 // Inherit from t1 and mark prototype as hidden. |
| 9482 t2->Inherit(t1); | 9593 t2->Inherit(t1); |
| 9483 t2->InstanceTemplate()->Set(v8_str("mine"), v8_num(4)); | 9594 t2->InstanceTemplate()->Set(v8_str("mine"), v8_num(4)); |
| 9484 | 9595 |
| 9485 Local<v8::Object> o2 = t2->GetFunction()->NewInstance(); | 9596 Local<v8::Object> o2 = t2->GetFunction()->NewInstance(); |
| 9486 CHECK(o2->SetPrototype(o1)); | 9597 CHECK(o2->SetPrototype(o1)); |
| 9487 | 9598 |
| 9488 v8::Local<v8::Symbol> sym = | 9599 v8::Local<v8::Symbol> sym = |
| 9489 v8::Symbol::New(context->GetIsolate(), v8_str("s1")); | 9600 v8::Symbol::New(context->GetIsolate(), v8_str("s1")); |
| 9490 o1->Set(sym, v8_num(3)); | 9601 o1->Set(sym, v8_num(3)); |
| 9491 o1->SetHiddenValue( | 9602 o1->SetPrivate(context.local(), |
| 9492 v8_str("h1"), v8::Integer::New(context->GetIsolate(), 2013)); | 9603 v8::Private::New(context->GetIsolate(), v8_str("h1")), |
| 9604 v8::Integer::New(context->GetIsolate(), 2013)) |
| 9605 .FromJust(); |
| 9493 | 9606 |
| 9494 // Call the runtime version of GetOwnPropertyNames() on | 9607 // Call the runtime version of GetOwnPropertyNames() on |
| 9495 // the natively created object through JavaScript. | 9608 // the natively created object through JavaScript. |
| 9496 context->Global()->Set(v8_str("obj"), o2); | 9609 context->Global()->Set(v8_str("obj"), o2); |
| 9497 context->Global()->Set(v8_str("sym"), sym); | 9610 context->Global()->Set(v8_str("sym"), sym); |
| 9498 // PROPERTY_ATTRIBUTES_NONE = 0 | 9611 // PROPERTY_ATTRIBUTES_NONE = 0 |
| 9499 CompileRun("var names = %GetOwnPropertyNames(obj, 0);"); | 9612 CompileRun("var names = %GetOwnPropertyNames(obj, 0);"); |
| 9500 | 9613 |
| 9501 ExpectInt32("names.length", 7); | 9614 ExpectInt32("names.length", 7); |
| 9502 ExpectTrue("names.indexOf(\"foo\") >= 0"); | 9615 ExpectTrue("names.indexOf(\"foo\") >= 0"); |
| (...skipping 9491 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 18994 } | 19107 } |
| 18995 | 19108 |
| 18996 | 19109 |
| 18997 THREADED_TEST(Regress157124) { | 19110 THREADED_TEST(Regress157124) { |
| 18998 LocalContext context; | 19111 LocalContext context; |
| 18999 v8::Isolate* isolate = context->GetIsolate(); | 19112 v8::Isolate* isolate = context->GetIsolate(); |
| 19000 v8::HandleScope scope(isolate); | 19113 v8::HandleScope scope(isolate); |
| 19001 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate); | 19114 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate); |
| 19002 Local<Object> obj = templ->NewInstance(); | 19115 Local<Object> obj = templ->NewInstance(); |
| 19003 obj->GetIdentityHash(); | 19116 obj->GetIdentityHash(); |
| 19004 obj->DeleteHiddenValue(v8_str("Bug")); | 19117 obj->DeletePrivate(context.local(), |
| 19118 v8::Private::ForApi(isolate, v8_str("Bug"))) |
| 19119 .FromJust(); |
| 19005 } | 19120 } |
| 19006 | 19121 |
| 19007 | 19122 |
| 19008 THREADED_TEST(Regress2535) { | 19123 THREADED_TEST(Regress2535) { |
| 19009 LocalContext context; | 19124 LocalContext context; |
| 19010 v8::HandleScope scope(context->GetIsolate()); | 19125 v8::HandleScope scope(context->GetIsolate()); |
| 19011 Local<Value> set_value = CompileRun("new Set();"); | 19126 Local<Value> set_value = CompileRun("new Set();"); |
| 19012 Local<Object> set_object(Local<Object>::Cast(set_value)); | 19127 Local<Object> set_object(Local<Object>::Cast(set_value)); |
| 19013 CHECK_EQ(0, set_object->InternalFieldCount()); | 19128 CHECK_EQ(0, set_object->InternalFieldCount()); |
| 19014 Local<Value> map_value = CompileRun("new Map();"); | 19129 Local<Value> map_value = CompileRun("new Map();"); |
| 19015 Local<Object> map_object(Local<Object>::Cast(map_value)); | 19130 Local<Object> map_object(Local<Object>::Cast(map_value)); |
| 19016 CHECK_EQ(0, map_object->InternalFieldCount()); | 19131 CHECK_EQ(0, map_object->InternalFieldCount()); |
| 19017 } | 19132 } |
| 19018 | 19133 |
| 19019 | 19134 |
| 19020 THREADED_TEST(Regress2746) { | 19135 THREADED_TEST(Regress2746) { |
| 19021 LocalContext context; | 19136 LocalContext context; |
| 19022 v8::Isolate* isolate = context->GetIsolate(); | 19137 v8::Isolate* isolate = context->GetIsolate(); |
| 19023 v8::HandleScope scope(isolate); | 19138 v8::HandleScope scope(isolate); |
| 19024 Local<Object> obj = Object::New(isolate); | 19139 Local<Object> obj = Object::New(isolate); |
| 19025 Local<String> key = String::NewFromUtf8(context->GetIsolate(), "key"); | 19140 Local<v8::Private> key = v8::Private::New(isolate, v8_str("key")); |
| 19026 obj->SetHiddenValue(key, v8::Undefined(isolate)); | 19141 CHECK( |
| 19027 Local<Value> value = obj->GetHiddenValue(key); | 19142 obj->SetPrivate(context.local(), key, v8::Undefined(isolate)).FromJust()); |
| 19143 Local<Value> value = obj->GetPrivate(context.local(), key).ToLocalChecked(); |
| 19028 CHECK(!value.IsEmpty()); | 19144 CHECK(!value.IsEmpty()); |
| 19029 CHECK(value->IsUndefined()); | 19145 CHECK(value->IsUndefined()); |
| 19030 } | 19146 } |
| 19031 | 19147 |
| 19032 | 19148 |
| 19033 THREADED_TEST(Regress260106) { | 19149 THREADED_TEST(Regress260106) { |
| 19034 LocalContext context; | 19150 LocalContext context; |
| 19035 v8::Isolate* isolate = context->GetIsolate(); | 19151 v8::Isolate* isolate = context->GetIsolate(); |
| 19036 v8::HandleScope scope(isolate); | 19152 v8::HandleScope scope(isolate); |
| 19037 Local<FunctionTemplate> templ = FunctionTemplate::New(isolate, | 19153 Local<FunctionTemplate> templ = FunctionTemplate::New(isolate, |
| (...skipping 1474 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 20512 v8::ObjectTemplate::New(isolate); | 20628 v8::ObjectTemplate::New(isolate); |
| 20513 object_template->SetAccessCheckCallback(AccessCounter); | 20629 object_template->SetAccessCheckCallback(AccessCounter); |
| 20514 | 20630 |
| 20515 v8::Handle<Context> context = Context::New(isolate); | 20631 v8::Handle<Context> context = Context::New(isolate); |
| 20516 v8::Context::Scope context_scope(context); | 20632 v8::Context::Scope context_scope(context); |
| 20517 | 20633 |
| 20518 v8::Handle<v8::Object> obj = object_template->NewInstance(); | 20634 v8::Handle<v8::Object> obj = object_template->NewInstance(); |
| 20519 obj->Set(v8_str("key"), v8_str("value")); | 20635 obj->Set(v8_str("key"), v8_str("value")); |
| 20520 obj->Delete(v8_str("key")); | 20636 obj->Delete(v8_str("key")); |
| 20521 | 20637 |
| 20522 obj->SetHiddenValue(v8_str("hidden key 2"), v8_str("hidden value 2")); | 20638 obj->SetPrivate(context, v8::Private::New(isolate, v8_str("hidden key 2")), |
| 20639 v8_str("hidden value 2")) |
| 20640 .FromJust(); |
| 20523 } | 20641 } |
| 20524 | 20642 |
| 20525 | 20643 |
| 20526 TEST(Regress411793) { | 20644 TEST(Regress411793) { |
| 20527 v8::Isolate* isolate = CcTest::isolate(); | 20645 v8::Isolate* isolate = CcTest::isolate(); |
| 20528 v8::HandleScope handle_scope(isolate); | 20646 v8::HandleScope handle_scope(isolate); |
| 20529 v8::Handle<v8::ObjectTemplate> object_template = | 20647 v8::Handle<v8::ObjectTemplate> object_template = |
| 20530 v8::ObjectTemplate::New(isolate); | 20648 v8::ObjectTemplate::New(isolate); |
| 20531 object_template->SetAccessCheckCallback(AccessCounter); | 20649 object_template->SetAccessCheckCallback(AccessCounter); |
| 20532 | 20650 |
| (...skipping 1423 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 21956 env2->Global()->Set(v8_str("obj2"), object2); | 22074 env2->Global()->Set(v8_str("obj2"), object2); |
| 21957 ExpectString("typeof obj2.values", "function"); | 22075 ExpectString("typeof obj2.values", "function"); |
| 21958 CHECK_NE(*object->Get(v8_str("values")), *object2->Get(v8_str("values"))); | 22076 CHECK_NE(*object->Get(v8_str("values")), *object2->Get(v8_str("values"))); |
| 21959 | 22077 |
| 21960 auto values2 = Local<Function>::Cast(object2->Get(v8_str("values"))); | 22078 auto values2 = Local<Function>::Cast(object2->Get(v8_str("values"))); |
| 21961 auto fn2 = i::Handle<i::JSFunction>::cast(v8::Utils::OpenHandle(*values2)); | 22079 auto fn2 = i::Handle<i::JSFunction>::cast(v8::Utils::OpenHandle(*values2)); |
| 21962 auto ctx2 = v8::Utils::OpenHandle(*env2.local()); | 22080 auto ctx2 = v8::Utils::OpenHandle(*env2.local()); |
| 21963 CHECK_EQ(fn2->GetCreationContext(), *ctx2); | 22081 CHECK_EQ(fn2->GetCreationContext(), *ctx2); |
| 21964 } | 22082 } |
| 21965 } | 22083 } |
| OLD | NEW |