Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(10)

Side by Side Diff: test/cctest/test-api.cc

Issue 12729023: first step to remove unsafe handles (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: issue with debug build Created 7 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « test/cctest/test-alloc.cc ('k') | test/cctest/test-assembler-arm.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 14 matching lines...) Expand all
25 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 25 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 26 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 27
28 #include <limits.h> 28 #include <limits.h>
29 29
30 #ifndef WIN32 30 #ifndef WIN32
31 #include <signal.h> // kill 31 #include <signal.h> // kill
32 #include <unistd.h> // getpid 32 #include <unistd.h> // getpid
33 #endif // WIN32 33 #endif // WIN32
34 34
35 // TODO(dcarney): remove
36 #define V8_ALLOW_ACCESS_TO_RAW_HANDLE_CONSTRUCTOR
37 #define V8_ALLOW_ACCESS_TO_PERSISTENT_IMPLICIT
38 #define V8_ALLOW_ACCESS_TO_PERSISTENT_ARROW
39
35 #include "v8.h" 40 #include "v8.h"
36 41
37 #include "api.h" 42 #include "api.h"
38 #include "isolate.h" 43 #include "isolate.h"
39 #include "compilation-cache.h" 44 #include "compilation-cache.h"
40 #include "execution.h" 45 #include "execution.h"
41 #include "objects.h" 46 #include "objects.h"
42 #include "snapshot.h" 47 #include "snapshot.h"
43 #include "platform.h" 48 #include "platform.h"
44 #include "utils.h" 49 #include "utils.h"
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after
155 const char* c_source = "1 + 2 + 3"; 160 const char* c_source = "1 + 2 + 3";
156 Local<String> source = String::New(c_source); 161 Local<String> source = String::New(c_source);
157 Local<Script> script = Script::Compile(source); 162 Local<Script> script = Script::Compile(source);
158 CHECK_EQ(6, script->Run()->Int32Value()); 163 CHECK_EQ(6, script->Run()->Int32Value());
159 164
160 local_env->Exit(); 165 local_env->Exit();
161 } 166 }
162 167
163 168
164 THREADED_TEST(IsolateOfContext) { 169 THREADED_TEST(IsolateOfContext) {
165 v8::Persistent<Context> env = Context::New(); 170 v8::HandleScope scope(v8::Isolate::GetCurrent());
166 v8::HandleScope scope(env->GetIsolate()); 171 v8::Handle<Context> env = Context::New(v8::Isolate::GetCurrent());
167 172
168 CHECK(!env->InContext()); 173 CHECK(!env->InContext());
169 CHECK(env->GetIsolate() == v8::Isolate::GetCurrent()); 174 CHECK(env->GetIsolate() == v8::Isolate::GetCurrent());
170 env->Enter(); 175 env->Enter();
171 CHECK(env->InContext()); 176 CHECK(env->InContext());
172 CHECK(env->GetIsolate() == v8::Isolate::GetCurrent()); 177 CHECK(env->GetIsolate() == v8::Isolate::GetCurrent());
173 env->Exit(); 178 env->Exit();
174 CHECK(!env->InContext()); 179 CHECK(!env->InContext());
175 CHECK(env->GetIsolate() == v8::Isolate::GetCurrent()); 180 CHECK(env->GetIsolate() == v8::Isolate::GetCurrent());
176
177 env.Dispose(env->GetIsolate());
178 } 181 }
179 182
180 183
181 THREADED_TEST(ReceiverSignature) { 184 THREADED_TEST(ReceiverSignature) {
182 LocalContext env; 185 LocalContext env;
183 v8::HandleScope scope(env->GetIsolate()); 186 v8::HandleScope scope(env->GetIsolate());
184 v8::Handle<v8::FunctionTemplate> fun = v8::FunctionTemplate::New(); 187 v8::Handle<v8::FunctionTemplate> fun = v8::FunctionTemplate::New();
185 v8::Handle<v8::Signature> sig = v8::Signature::New(fun); 188 v8::Handle<v8::Signature> sig = v8::Signature::New(fun);
186 fun->PrototypeTemplate()->Set( 189 fun->PrototypeTemplate()->Set(
187 v8_str("m"), 190 v8_str("m"),
(...skipping 2124 matching lines...) Expand 10 before | Expand all | Expand 10 after
2312 CHECK_EQ(0xCC, my_data[1]); 2315 CHECK_EQ(0xCC, my_data[1]);
2313 my_data[0] = 0xCC; 2316 my_data[0] = 0xCC;
2314 my_data[1] = 0x11; 2317 my_data[1] = 0x11;
2315 result = CompileRun("u8_b[0] + u8_b[1]"); 2318 result = CompileRun("u8_b[0] + u8_b[1]");
2316 CHECK_EQ(0xDD, result->Int32Value()); 2319 CHECK_EQ(0xDD, result->Int32Value());
2317 2320
2318 delete[] my_data; 2321 delete[] my_data;
2319 } 2322 }
2320 2323
2321 2324
2325
2326
2327
2322 THREADED_TEST(HiddenProperties) { 2328 THREADED_TEST(HiddenProperties) {
2323 LocalContext env; 2329 LocalContext env;
2324 v8::HandleScope scope(env->GetIsolate()); 2330 v8::HandleScope scope(env->GetIsolate());
2325 2331
2326 v8::Local<v8::Object> obj = v8::Object::New(); 2332 v8::Local<v8::Object> obj = v8::Object::New();
2327 v8::Local<v8::String> key = v8_str("api-test::hidden-key"); 2333 v8::Local<v8::String> key = v8_str("api-test::hidden-key");
2328 v8::Local<v8::String> empty = v8_str(""); 2334 v8::Local<v8::String> empty = v8_str("");
2329 v8::Local<v8::String> prop_name = v8_str("prop_name"); 2335 v8::Local<v8::String> prop_name = v8_str("prop_name");
2330 2336
2331 HEAP->CollectAllGarbage(i::Heap::kNoGCFlags); 2337 HEAP->CollectAllGarbage(i::Heap::kNoGCFlags);
(...skipping 207 matching lines...) Expand 10 before | Expand all | Expand 10 after
2539 g2s2 = Persistent<Object>::New(iso, Object::New()); 2545 g2s2 = Persistent<Object>::New(iso, Object::New());
2540 g2c1 = Persistent<Object>::New(iso, Object::New()); 2546 g2c1 = Persistent<Object>::New(iso, Object::New());
2541 g2s1.MakeWeak(iso, reinterpret_cast<void*>(&counter), &WeakPointerCallback); 2547 g2s1.MakeWeak(iso, reinterpret_cast<void*>(&counter), &WeakPointerCallback);
2542 g2s2.MakeWeak(iso, reinterpret_cast<void*>(&counter), &WeakPointerCallback); 2548 g2s2.MakeWeak(iso, reinterpret_cast<void*>(&counter), &WeakPointerCallback);
2543 g2c1.MakeWeak(iso, reinterpret_cast<void*>(&counter), &WeakPointerCallback); 2549 g2c1.MakeWeak(iso, reinterpret_cast<void*>(&counter), &WeakPointerCallback);
2544 } 2550 }
2545 2551
2546 Persistent<Object> root = Persistent<Object>::New(iso, g1s1); // make a root. 2552 Persistent<Object> root = Persistent<Object>::New(iso, g1s1); // make a root.
2547 2553
2548 // Connect group 1 and 2, make a cycle. 2554 // Connect group 1 and 2, make a cycle.
2549 CHECK(g1s2->Set(0, g2s2)); 2555 CHECK(g1s2->Set(0, Handle<Object>(*g2s2)));
2550 CHECK(g2s1->Set(0, g1s1)); 2556 CHECK(g2s1->Set(0, Handle<Object>(*g1s1)));
2551 2557
2552 { 2558 {
2553 Persistent<Value> g1_objects[] = { g1s1, g1s2 }; 2559 Persistent<Value> g1_objects[] = { g1s1, g1s2 };
2554 Persistent<Value> g1_children[] = { g1c1 }; 2560 Persistent<Value> g1_children[] = { g1c1 };
2555 Persistent<Value> g2_objects[] = { g2s1, g2s2 }; 2561 Persistent<Value> g2_objects[] = { g2s1, g2s2 };
2556 Persistent<Value> g2_children[] = { g2c1 }; 2562 Persistent<Value> g2_children[] = { g2c1 };
2557 V8::AddObjectGroup(g1_objects, 2); 2563 V8::AddObjectGroup(g1_objects, 2);
2558 V8::AddImplicitReferences(g1s1, g1_children, 1); 2564 V8::AddImplicitReferences(g1s1, g1_children, 1);
2559 V8::AddObjectGroup(g2_objects, 2); 2565 V8::AddObjectGroup(g2_objects, 2);
2560 V8::AddImplicitReferences(g2s1, g2_children, 1); 2566 V8::AddImplicitReferences(g2s1, g2_children, 1);
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
2625 g2s2 = Persistent<Object>::New(iso, Object::New()); 2631 g2s2 = Persistent<Object>::New(iso, Object::New());
2626 g2c1 = Persistent<Object>::New(iso, Object::New()); 2632 g2c1 = Persistent<Object>::New(iso, Object::New());
2627 g2s1.MakeWeak(iso, reinterpret_cast<void*>(&counter), &WeakPointerCallback); 2633 g2s1.MakeWeak(iso, reinterpret_cast<void*>(&counter), &WeakPointerCallback);
2628 g2s2.MakeWeak(iso, reinterpret_cast<void*>(&counter), &WeakPointerCallback); 2634 g2s2.MakeWeak(iso, reinterpret_cast<void*>(&counter), &WeakPointerCallback);
2629 g2c1.MakeWeak(iso, reinterpret_cast<void*>(&counter), &WeakPointerCallback); 2635 g2c1.MakeWeak(iso, reinterpret_cast<void*>(&counter), &WeakPointerCallback);
2630 } 2636 }
2631 2637
2632 Persistent<Object> root = Persistent<Object>::New(iso, g1s1); // make a root. 2638 Persistent<Object> root = Persistent<Object>::New(iso, g1s1); // make a root.
2633 2639
2634 // Connect group 1 and 2, make a cycle. 2640 // Connect group 1 and 2, make a cycle.
2635 CHECK(g1s2->Set(0, g2s2)); 2641 CHECK(g1s2->Set(0, Local<Value>(*g2s2)));
2636 CHECK(g2s1->Set(0, g1s1)); 2642 CHECK(g2s1->Set(0, Local<Value>(*g1s1)));
2637 2643
2638 { 2644 {
2639 UniqueId id1(reinterpret_cast<intptr_t>(*g1s1)); 2645 UniqueId id1(reinterpret_cast<intptr_t>(*g1s1));
2640 UniqueId id2(reinterpret_cast<intptr_t>(*g2s2)); 2646 UniqueId id2(reinterpret_cast<intptr_t>(*g2s2));
2641 iso->SetObjectGroupId(g1s1, id1); 2647 iso->SetObjectGroupId(g1s1, id1);
2642 iso->SetObjectGroupId(g1s2, id1); 2648 iso->SetObjectGroupId(g1s2, id1);
2643 iso->SetReferenceFromGroup(id1, g1c1); 2649 iso->SetReferenceFromGroup(id1, g1c1);
2644 iso->SetObjectGroupId(g2s1, id2); 2650 iso->SetObjectGroupId(g2s1, id2);
2645 iso->SetObjectGroupId(g2s2, id2); 2651 iso->SetObjectGroupId(g2s2, id2);
2646 iso->SetReferenceFromGroup(id2, g2c1); 2652 iso->SetReferenceFromGroup(id2, g2c1);
(...skipping 300 matching lines...) Expand 10 before | Expand all | Expand 10 after
2947 g1s1.MarkPartiallyDependent(iso); 2953 g1s1.MarkPartiallyDependent(iso);
2948 g1s2.MarkPartiallyDependent(iso); 2954 g1s2.MarkPartiallyDependent(iso);
2949 g2s1.MarkPartiallyDependent(iso); 2955 g2s1.MarkPartiallyDependent(iso);
2950 g2s2.MarkPartiallyDependent(iso); 2956 g2s2.MarkPartiallyDependent(iso);
2951 g3s1.MarkPartiallyDependent(iso); 2957 g3s1.MarkPartiallyDependent(iso);
2952 g3s2.MarkPartiallyDependent(iso); 2958 g3s2.MarkPartiallyDependent(iso);
2953 Persistent<Value> g1_objects[] = { g1s1, g1s2 }; 2959 Persistent<Value> g1_objects[] = { g1s1, g1s2 };
2954 Persistent<Value> g2_objects[] = { g2s1, g2s2 }; 2960 Persistent<Value> g2_objects[] = { g2s1, g2s2 };
2955 Persistent<Value> g3_objects[] = { g3s1, g3s2 }; 2961 Persistent<Value> g3_objects[] = { g3s1, g3s2 };
2956 V8::AddObjectGroup(g1_objects, 2); 2962 V8::AddObjectGroup(g1_objects, 2);
2957 g1s1->Set(v8_str("x"), g2s1); 2963 g1s1->Set(v8_str("x"), Handle<Object>(*g2s1));
2958 V8::AddObjectGroup(g2_objects, 2); 2964 V8::AddObjectGroup(g2_objects, 2);
2959 g2s1->Set(v8_str("x"), g3s1); 2965 g2s1->Set(v8_str("x"), Handle<Object>(*g3s1));
2960 V8::AddObjectGroup(g3_objects, 2); 2966 V8::AddObjectGroup(g3_objects, 2);
2961 g3s1->Set(v8_str("x"), g1s1); 2967 g3s1->Set(v8_str("x"), Handle<Object>(*g1s1));
2962 } 2968 }
2963 2969
2964 HEAP->CollectGarbage(i::NEW_SPACE); 2970 HEAP->CollectGarbage(i::NEW_SPACE);
2965 2971
2966 // All objects should be alive. 2972 // All objects should be alive.
2967 CHECK_EQ(0, counter.NumberOfWeakCalls()); 2973 CHECK_EQ(0, counter.NumberOfWeakCalls());
2968 2974
2969 // Weaken the root. 2975 // Weaken the root.
2970 root.MakeWeak(iso, reinterpret_cast<void*>(&counter), &WeakPointerCallback); 2976 root.MakeWeak(iso, reinterpret_cast<void*>(&counter), &WeakPointerCallback);
2971 root.MarkPartiallyDependent(iso); 2977 root.MarkPartiallyDependent(iso);
2972 2978
2973 v8::Isolate* isolate = v8::Isolate::GetCurrent(); 2979 v8::Isolate* isolate = v8::Isolate::GetCurrent();
2974 // Groups are deleted, rebuild groups. 2980 // Groups are deleted, rebuild groups.
2975 { 2981 {
2976 g1s1.MarkPartiallyDependent(isolate); 2982 g1s1.MarkPartiallyDependent(isolate);
2977 g1s2.MarkPartiallyDependent(isolate); 2983 g1s2.MarkPartiallyDependent(isolate);
2978 g2s1.MarkPartiallyDependent(isolate); 2984 g2s1.MarkPartiallyDependent(isolate);
2979 g2s2.MarkPartiallyDependent(isolate); 2985 g2s2.MarkPartiallyDependent(isolate);
2980 g3s1.MarkPartiallyDependent(isolate); 2986 g3s1.MarkPartiallyDependent(isolate);
2981 g3s2.MarkPartiallyDependent(isolate); 2987 g3s2.MarkPartiallyDependent(isolate);
2982 Persistent<Value> g1_objects[] = { g1s1, g1s2 }; 2988 Persistent<Value> g1_objects[] = { g1s1, g1s2 };
2983 Persistent<Value> g2_objects[] = { g2s1, g2s2 }; 2989 Persistent<Value> g2_objects[] = { g2s1, g2s2 };
2984 Persistent<Value> g3_objects[] = { g3s1, g3s2 }; 2990 Persistent<Value> g3_objects[] = { g3s1, g3s2 };
2985 V8::AddObjectGroup(g1_objects, 2); 2991 V8::AddObjectGroup(g1_objects, 2);
2986 g1s1->Set(v8_str("x"), g2s1); 2992 g1s1->Set(v8_str("x"), Handle<Object>(*g2s1));
2987 V8::AddObjectGroup(g2_objects, 2); 2993 V8::AddObjectGroup(g2_objects, 2);
2988 g2s1->Set(v8_str("x"), g3s1); 2994 g2s1->Set(v8_str("x"), Handle<Object>(*g3s1));
2989 V8::AddObjectGroup(g3_objects, 2); 2995 V8::AddObjectGroup(g3_objects, 2);
2990 g3s1->Set(v8_str("x"), g1s1); 2996 g3s1->Set(v8_str("x"), Handle<Object>(*g1s1));
2991 } 2997 }
2992 2998
2993 HEAP->CollectGarbage(i::NEW_SPACE); 2999 HEAP->CollectGarbage(i::NEW_SPACE);
2994 3000
2995 // All objects should be gone. 7 global handles in total. 3001 // All objects should be gone. 7 global handles in total.
2996 CHECK_EQ(7, counter.NumberOfWeakCalls()); 3002 CHECK_EQ(7, counter.NumberOfWeakCalls());
2997 } 3003 }
2998 3004
2999 3005
3000 // TODO(mstarzinger): This should be a THREADED_TEST but causes failures 3006 // TODO(mstarzinger): This should be a THREADED_TEST but causes failures
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
3042 // groups. 3048 // groups.
3043 { 3049 {
3044 g1s1.MarkPartiallyDependent(iso); 3050 g1s1.MarkPartiallyDependent(iso);
3045 g1s2.MarkPartiallyDependent(iso); 3051 g1s2.MarkPartiallyDependent(iso);
3046 g2s1.MarkPartiallyDependent(iso); 3052 g2s1.MarkPartiallyDependent(iso);
3047 g2s2.MarkPartiallyDependent(iso); 3053 g2s2.MarkPartiallyDependent(iso);
3048 g3s1.MarkPartiallyDependent(iso); 3054 g3s1.MarkPartiallyDependent(iso);
3049 g3s2.MarkPartiallyDependent(iso); 3055 g3s2.MarkPartiallyDependent(iso);
3050 iso->SetObjectGroupId(g1s1, UniqueId(1)); 3056 iso->SetObjectGroupId(g1s1, UniqueId(1));
3051 iso->SetObjectGroupId(g1s2, UniqueId(1)); 3057 iso->SetObjectGroupId(g1s2, UniqueId(1));
3052 g1s1->Set(v8_str("x"), g2s1); 3058 g1s1->Set(v8_str("x"), Local<Value>(*g2s1));
3053 iso->SetObjectGroupId(g2s1, UniqueId(2)); 3059 iso->SetObjectGroupId(g2s1, UniqueId(2));
3054 iso->SetObjectGroupId(g2s2, UniqueId(2)); 3060 iso->SetObjectGroupId(g2s2, UniqueId(2));
3055 g2s1->Set(v8_str("x"), g3s1); 3061 g2s1->Set(v8_str("x"), Local<Value>(*g3s1));
3056 iso->SetObjectGroupId(g3s1, UniqueId(3)); 3062 iso->SetObjectGroupId(g3s1, UniqueId(3));
3057 iso->SetObjectGroupId(g3s2, UniqueId(3)); 3063 iso->SetObjectGroupId(g3s2, UniqueId(3));
3058 g3s1->Set(v8_str("x"), g1s1); 3064 g3s1->Set(v8_str("x"), Local<Value>(*g1s1));
3059 } 3065 }
3060 3066
3061 v8::internal::Heap* heap = reinterpret_cast<v8::internal::Isolate*>( 3067 v8::internal::Heap* heap = reinterpret_cast<v8::internal::Isolate*>(
3062 iso)->heap(); 3068 iso)->heap();
3063 heap->CollectGarbage(i::NEW_SPACE); 3069 heap->CollectGarbage(i::NEW_SPACE);
3064 3070
3065 // All objects should be alive. 3071 // All objects should be alive.
3066 CHECK_EQ(0, counter.NumberOfWeakCalls()); 3072 CHECK_EQ(0, counter.NumberOfWeakCalls());
3067 3073
3068 // Weaken the root. 3074 // Weaken the root.
3069 root.MakeWeak(iso, reinterpret_cast<void*>(&counter), &WeakPointerCallback); 3075 root.MakeWeak(iso, reinterpret_cast<void*>(&counter), &WeakPointerCallback);
3070 root.MarkPartiallyDependent(iso); 3076 root.MarkPartiallyDependent(iso);
3071 3077
3072 v8::Isolate* isolate = v8::Isolate::GetCurrent(); 3078 v8::Isolate* isolate = v8::Isolate::GetCurrent();
3073 // Groups are deleted, rebuild groups. 3079 // Groups are deleted, rebuild groups.
3074 { 3080 {
3075 g1s1.MarkPartiallyDependent(isolate); 3081 g1s1.MarkPartiallyDependent(isolate);
3076 g1s2.MarkPartiallyDependent(isolate); 3082 g1s2.MarkPartiallyDependent(isolate);
3077 g2s1.MarkPartiallyDependent(isolate); 3083 g2s1.MarkPartiallyDependent(isolate);
3078 g2s2.MarkPartiallyDependent(isolate); 3084 g2s2.MarkPartiallyDependent(isolate);
3079 g3s1.MarkPartiallyDependent(isolate); 3085 g3s1.MarkPartiallyDependent(isolate);
3080 g3s2.MarkPartiallyDependent(isolate); 3086 g3s2.MarkPartiallyDependent(isolate);
3081 iso->SetObjectGroupId(g1s1, UniqueId(1)); 3087 iso->SetObjectGroupId(g1s1, UniqueId(1));
3082 iso->SetObjectGroupId(g1s2, UniqueId(1)); 3088 iso->SetObjectGroupId(g1s2, UniqueId(1));
3083 g1s1->Set(v8_str("x"), g2s1); 3089 g1s1->Set(v8_str("x"), Local<Value>(*g2s1));
3084 iso->SetObjectGroupId(g2s1, UniqueId(2)); 3090 iso->SetObjectGroupId(g2s1, UniqueId(2));
3085 iso->SetObjectGroupId(g2s2, UniqueId(2)); 3091 iso->SetObjectGroupId(g2s2, UniqueId(2));
3086 g2s1->Set(v8_str("x"), g3s1); 3092 g2s1->Set(v8_str("x"), Local<Value>(*g3s1));
3087 iso->SetObjectGroupId(g3s1, UniqueId(3)); 3093 iso->SetObjectGroupId(g3s1, UniqueId(3));
3088 iso->SetObjectGroupId(g3s2, UniqueId(3)); 3094 iso->SetObjectGroupId(g3s2, UniqueId(3));
3089 g3s1->Set(v8_str("x"), g1s1); 3095 g3s1->Set(v8_str("x"), Local<Value>(*g1s1));
3090 } 3096 }
3091 3097
3092 heap->CollectGarbage(i::NEW_SPACE); 3098 heap->CollectGarbage(i::NEW_SPACE);
3093 3099
3094 // All objects should be gone. 7 global handles in total. 3100 // All objects should be gone. 7 global handles in total.
3095 CHECK_EQ(7, counter.NumberOfWeakCalls()); 3101 CHECK_EQ(7, counter.NumberOfWeakCalls());
3096 } 3102 }
3097 3103
3098 3104
3099 THREADED_TEST(ScriptException) { 3105 THREADED_TEST(ScriptException) {
(...skipping 1433 matching lines...) Expand 10 before | Expand all | Expand 10 after
4533 THREADED_TEST(SimplePropertyWrite) { 4539 THREADED_TEST(SimplePropertyWrite) {
4534 v8::HandleScope scope(v8::Isolate::GetCurrent()); 4540 v8::HandleScope scope(v8::Isolate::GetCurrent());
4535 Local<ObjectTemplate> templ = ObjectTemplate::New(); 4541 Local<ObjectTemplate> templ = ObjectTemplate::New();
4536 templ->SetAccessor(v8_str("x"), GetXValue, SetXValue, v8_str("donut")); 4542 templ->SetAccessor(v8_str("x"), GetXValue, SetXValue, v8_str("donut"));
4537 LocalContext context; 4543 LocalContext context;
4538 context->Global()->Set(v8_str("obj"), templ->NewInstance()); 4544 context->Global()->Set(v8_str("obj"), templ->NewInstance());
4539 Local<Script> script = Script::Compile(v8_str("obj.x = 4")); 4545 Local<Script> script = Script::Compile(v8_str("obj.x = 4"));
4540 for (int i = 0; i < 10; i++) { 4546 for (int i = 0; i < 10; i++) {
4541 CHECK(xValue.IsEmpty()); 4547 CHECK(xValue.IsEmpty());
4542 script->Run(); 4548 script->Run();
4543 CHECK_EQ(v8_num(4), xValue); 4549 CHECK_EQ(v8_num(4), Handle<Value>(*xValue));
4544 xValue.Dispose(context->GetIsolate()); 4550 xValue.Dispose(context->GetIsolate());
4545 xValue = v8::Persistent<Value>(); 4551 xValue = v8::Persistent<Value>();
4546 } 4552 }
4547 } 4553 }
4548 4554
4549 4555
4550 THREADED_TEST(SetterOnly) { 4556 THREADED_TEST(SetterOnly) {
4551 v8::HandleScope scope(v8::Isolate::GetCurrent()); 4557 v8::HandleScope scope(v8::Isolate::GetCurrent());
4552 Local<ObjectTemplate> templ = ObjectTemplate::New(); 4558 Local<ObjectTemplate> templ = ObjectTemplate::New();
4553 templ->SetAccessor(v8_str("x"), NULL, SetXValue, v8_str("donut")); 4559 templ->SetAccessor(v8_str("x"), NULL, SetXValue, v8_str("donut"));
4554 LocalContext context; 4560 LocalContext context;
4555 context->Global()->Set(v8_str("obj"), templ->NewInstance()); 4561 context->Global()->Set(v8_str("obj"), templ->NewInstance());
4556 Local<Script> script = Script::Compile(v8_str("obj.x = 4; obj.x")); 4562 Local<Script> script = Script::Compile(v8_str("obj.x = 4; obj.x"));
4557 for (int i = 0; i < 10; i++) { 4563 for (int i = 0; i < 10; i++) {
4558 CHECK(xValue.IsEmpty()); 4564 CHECK(xValue.IsEmpty());
4559 script->Run(); 4565 script->Run();
4560 CHECK_EQ(v8_num(4), xValue); 4566 CHECK_EQ(v8_num(4), Handle<Value>(*xValue));
4561 xValue.Dispose(context->GetIsolate()); 4567 xValue.Dispose(context->GetIsolate());
4562 xValue = v8::Persistent<Value>(); 4568 xValue = v8::Persistent<Value>();
4563 } 4569 }
4564 } 4570 }
4565 4571
4566 4572
4567 THREADED_TEST(NoAccessors) { 4573 THREADED_TEST(NoAccessors) {
4568 v8::HandleScope scope(v8::Isolate::GetCurrent()); 4574 v8::HandleScope scope(v8::Isolate::GetCurrent());
4569 Local<ObjectTemplate> templ = ObjectTemplate::New(); 4575 Local<ObjectTemplate> templ = ObjectTemplate::New();
4570 templ->SetAccessor(v8_str("x"), NULL, NULL, v8_str("donut")); 4576 templ->SetAccessor(v8_str("x"), NULL, NULL, v8_str("donut"));
(...skipping 870 matching lines...) Expand 10 before | Expand all | Expand 10 after
5441 return v8::Undefined(); 5447 return v8::Undefined();
5442 } 5448 }
5443 5449
5444 5450
5445 THREADED_TEST(GlobalObjectTemplate) { 5451 THREADED_TEST(GlobalObjectTemplate) {
5446 v8::HandleScope handle_scope(v8::Isolate::GetCurrent()); 5452 v8::HandleScope handle_scope(v8::Isolate::GetCurrent());
5447 Local<ObjectTemplate> global_template = ObjectTemplate::New(); 5453 Local<ObjectTemplate> global_template = ObjectTemplate::New();
5448 global_template->Set(v8_str("JSNI_Log"), 5454 global_template->Set(v8_str("JSNI_Log"),
5449 v8::FunctionTemplate::New(HandleLogDelegator)); 5455 v8::FunctionTemplate::New(HandleLogDelegator));
5450 v8::Persistent<Context> context = Context::New(0, global_template); 5456 v8::Persistent<Context> context = Context::New(0, global_template);
5451 Context::Scope context_scope(context); 5457 Context::Scope context_scope(v8::Isolate::GetCurrent(), context);
5452 Script::Compile(v8_str("JSNI_Log('LOG')"))->Run(); 5458 Script::Compile(v8_str("JSNI_Log('LOG')"))->Run();
5453 context.Dispose(context->GetIsolate()); 5459 context.Dispose(context->GetIsolate());
5454 } 5460 }
5455 5461
5456 5462
5457 static const char* kSimpleExtensionSource = 5463 static const char* kSimpleExtensionSource =
5458 "function Foo() {" 5464 "function Foo() {"
5459 " return 4;" 5465 " return 4;"
5460 "}"; 5466 "}";
5461 5467
5462 5468
5463 THREADED_TEST(SimpleExtensions) { 5469 THREADED_TEST(SimpleExtensions) {
5464 v8::HandleScope handle_scope(v8::Isolate::GetCurrent()); 5470 v8::HandleScope handle_scope(v8::Isolate::GetCurrent());
5465 v8::RegisterExtension(new Extension("simpletest", kSimpleExtensionSource)); 5471 v8::RegisterExtension(new Extension("simpletest", kSimpleExtensionSource));
5466 const char* extension_names[] = { "simpletest" }; 5472 const char* extension_names[] = { "simpletest" };
5467 v8::ExtensionConfiguration extensions(1, extension_names); 5473 v8::ExtensionConfiguration extensions(1, extension_names);
5468 v8::Handle<Context> context = Context::New(&extensions); 5474 v8::Handle<Context> context =
5475 Context::New(v8::Isolate::GetCurrent(), &extensions);
5469 Context::Scope lock(context); 5476 Context::Scope lock(context);
5470 v8::Handle<Value> result = Script::Compile(v8_str("Foo()"))->Run(); 5477 v8::Handle<Value> result = Script::Compile(v8_str("Foo()"))->Run();
5471 CHECK_EQ(result, v8::Integer::New(4)); 5478 CHECK_EQ(result, v8::Integer::New(4));
5472 } 5479 }
5473 5480
5474 5481
5475 THREADED_TEST(NullExtensions) { 5482 THREADED_TEST(NullExtensions) {
5476 v8::HandleScope handle_scope(v8::Isolate::GetCurrent()); 5483 v8::HandleScope handle_scope(v8::Isolate::GetCurrent());
5477 v8::RegisterExtension(new Extension("nulltest", NULL)); 5484 v8::RegisterExtension(new Extension("nulltest", NULL));
5478 const char* extension_names[] = { "nulltest" }; 5485 const char* extension_names[] = { "nulltest" };
5479 v8::ExtensionConfiguration extensions(1, extension_names); 5486 v8::ExtensionConfiguration extensions(1, extension_names);
5480 v8::Handle<Context> context = Context::New(&extensions); 5487 v8::Handle<Context> context =
5488 Context::New(v8::Isolate::GetCurrent(), &extensions);
5481 Context::Scope lock(context); 5489 Context::Scope lock(context);
5482 v8::Handle<Value> result = Script::Compile(v8_str("1+3"))->Run(); 5490 v8::Handle<Value> result = Script::Compile(v8_str("1+3"))->Run();
5483 CHECK_EQ(result, v8::Integer::New(4)); 5491 CHECK_EQ(result, v8::Integer::New(4));
5484 } 5492 }
5485 5493
5486 5494
5487 static const char* kEmbeddedExtensionSource = 5495 static const char* kEmbeddedExtensionSource =
5488 "function Ret54321(){return 54321;}~~@@$" 5496 "function Ret54321(){return 54321;}~~@@$"
5489 "$%% THIS IS A SERIES OF NON-NULL-TERMINATED STRINGS."; 5497 "$%% THIS IS A SERIES OF NON-NULL-TERMINATED STRINGS.";
5490 static const int kEmbeddedExtensionSourceValidLen = 34; 5498 static const int kEmbeddedExtensionSourceValidLen = 34;
5491 5499
5492 5500
5493 THREADED_TEST(ExtensionMissingSourceLength) { 5501 THREADED_TEST(ExtensionMissingSourceLength) {
5494 v8::HandleScope handle_scope(v8::Isolate::GetCurrent()); 5502 v8::HandleScope handle_scope(v8::Isolate::GetCurrent());
5495 v8::RegisterExtension(new Extension("srclentest_fail", 5503 v8::RegisterExtension(new Extension("srclentest_fail",
5496 kEmbeddedExtensionSource)); 5504 kEmbeddedExtensionSource));
5497 const char* extension_names[] = { "srclentest_fail" }; 5505 const char* extension_names[] = { "srclentest_fail" };
5498 v8::ExtensionConfiguration extensions(1, extension_names); 5506 v8::ExtensionConfiguration extensions(1, extension_names);
5499 v8::Handle<Context> context = Context::New(&extensions); 5507 v8::Handle<Context> context =
5508 Context::New(v8::Isolate::GetCurrent(), &extensions);
5500 CHECK_EQ(0, *context); 5509 CHECK_EQ(0, *context);
5501 } 5510 }
5502 5511
5503 5512
5504 THREADED_TEST(ExtensionWithSourceLength) { 5513 THREADED_TEST(ExtensionWithSourceLength) {
5505 for (int source_len = kEmbeddedExtensionSourceValidLen - 1; 5514 for (int source_len = kEmbeddedExtensionSourceValidLen - 1;
5506 source_len <= kEmbeddedExtensionSourceValidLen + 1; ++source_len) { 5515 source_len <= kEmbeddedExtensionSourceValidLen + 1; ++source_len) {
5507 v8::HandleScope handle_scope(v8::Isolate::GetCurrent()); 5516 v8::HandleScope handle_scope(v8::Isolate::GetCurrent());
5508 i::ScopedVector<char> extension_name(32); 5517 i::ScopedVector<char> extension_name(32);
5509 i::OS::SNPrintF(extension_name, "ext #%d", source_len); 5518 i::OS::SNPrintF(extension_name, "ext #%d", source_len);
5510 v8::RegisterExtension(new Extension(extension_name.start(), 5519 v8::RegisterExtension(new Extension(extension_name.start(),
5511 kEmbeddedExtensionSource, 0, 0, 5520 kEmbeddedExtensionSource, 0, 0,
5512 source_len)); 5521 source_len));
5513 const char* extension_names[1] = { extension_name.start() }; 5522 const char* extension_names[1] = { extension_name.start() };
5514 v8::ExtensionConfiguration extensions(1, extension_names); 5523 v8::ExtensionConfiguration extensions(1, extension_names);
5515 v8::Handle<Context> context = Context::New(&extensions); 5524 v8::Handle<Context> context =
5525 Context::New(v8::Isolate::GetCurrent(), &extensions);
5516 if (source_len == kEmbeddedExtensionSourceValidLen) { 5526 if (source_len == kEmbeddedExtensionSourceValidLen) {
5517 Context::Scope lock(context); 5527 Context::Scope lock(context);
5518 v8::Handle<Value> result = Script::Compile(v8_str("Ret54321()"))->Run(); 5528 v8::Handle<Value> result = Script::Compile(v8_str("Ret54321()"))->Run();
5519 CHECK_EQ(v8::Integer::New(54321), result); 5529 CHECK_EQ(v8::Integer::New(54321), result);
5520 } else { 5530 } else {
5521 // Anything but exactly the right length should fail to compile. 5531 // Anything but exactly the right length should fail to compile.
5522 CHECK_EQ(0, *context); 5532 CHECK_EQ(0, *context);
5523 } 5533 }
5524 } 5534 }
5525 } 5535 }
(...skipping 15 matching lines...) Expand all
5541 " this.UseEval2 = e;" 5551 " this.UseEval2 = e;"
5542 "})()"; 5552 "})()";
5543 5553
5544 5554
5545 THREADED_TEST(UseEvalFromExtension) { 5555 THREADED_TEST(UseEvalFromExtension) {
5546 v8::HandleScope handle_scope(v8::Isolate::GetCurrent()); 5556 v8::HandleScope handle_scope(v8::Isolate::GetCurrent());
5547 v8::RegisterExtension(new Extension("evaltest1", kEvalExtensionSource1)); 5557 v8::RegisterExtension(new Extension("evaltest1", kEvalExtensionSource1));
5548 v8::RegisterExtension(new Extension("evaltest2", kEvalExtensionSource2)); 5558 v8::RegisterExtension(new Extension("evaltest2", kEvalExtensionSource2));
5549 const char* extension_names[] = { "evaltest1", "evaltest2" }; 5559 const char* extension_names[] = { "evaltest1", "evaltest2" };
5550 v8::ExtensionConfiguration extensions(2, extension_names); 5560 v8::ExtensionConfiguration extensions(2, extension_names);
5551 v8::Handle<Context> context = Context::New(&extensions); 5561 v8::Handle<Context> context =
5562 Context::New(v8::Isolate::GetCurrent(), &extensions);
5552 Context::Scope lock(context); 5563 Context::Scope lock(context);
5553 v8::Handle<Value> result = Script::Compile(v8_str("UseEval1()"))->Run(); 5564 v8::Handle<Value> result = Script::Compile(v8_str("UseEval1()"))->Run();
5554 CHECK_EQ(result, v8::Integer::New(42)); 5565 CHECK_EQ(result, v8::Integer::New(42));
5555 result = Script::Compile(v8_str("UseEval2()"))->Run(); 5566 result = Script::Compile(v8_str("UseEval2()"))->Run();
5556 CHECK_EQ(result, v8::Integer::New(42)); 5567 CHECK_EQ(result, v8::Integer::New(42));
5557 } 5568 }
5558 5569
5559 5570
5560 static const char* kWithExtensionSource1 = 5571 static const char* kWithExtensionSource1 =
5561 "function UseWith1() {" 5572 "function UseWith1() {"
(...skipping 12 matching lines...) Expand all
5574 " this.UseWith2 = e;" 5585 " this.UseWith2 = e;"
5575 "})()"; 5586 "})()";
5576 5587
5577 5588
5578 THREADED_TEST(UseWithFromExtension) { 5589 THREADED_TEST(UseWithFromExtension) {
5579 v8::HandleScope handle_scope(v8::Isolate::GetCurrent()); 5590 v8::HandleScope handle_scope(v8::Isolate::GetCurrent());
5580 v8::RegisterExtension(new Extension("withtest1", kWithExtensionSource1)); 5591 v8::RegisterExtension(new Extension("withtest1", kWithExtensionSource1));
5581 v8::RegisterExtension(new Extension("withtest2", kWithExtensionSource2)); 5592 v8::RegisterExtension(new Extension("withtest2", kWithExtensionSource2));
5582 const char* extension_names[] = { "withtest1", "withtest2" }; 5593 const char* extension_names[] = { "withtest1", "withtest2" };
5583 v8::ExtensionConfiguration extensions(2, extension_names); 5594 v8::ExtensionConfiguration extensions(2, extension_names);
5584 v8::Handle<Context> context = Context::New(&extensions); 5595 v8::Handle<Context> context =
5596 Context::New(v8::Isolate::GetCurrent(), &extensions);
5585 Context::Scope lock(context); 5597 Context::Scope lock(context);
5586 v8::Handle<Value> result = Script::Compile(v8_str("UseWith1()"))->Run(); 5598 v8::Handle<Value> result = Script::Compile(v8_str("UseWith1()"))->Run();
5587 CHECK_EQ(result, v8::Integer::New(87)); 5599 CHECK_EQ(result, v8::Integer::New(87));
5588 result = Script::Compile(v8_str("UseWith2()"))->Run(); 5600 result = Script::Compile(v8_str("UseWith2()"))->Run();
5589 CHECK_EQ(result, v8::Integer::New(87)); 5601 CHECK_EQ(result, v8::Integer::New(87));
5590 } 5602 }
5591 5603
5592 5604
5593 THREADED_TEST(AutoExtensions) { 5605 THREADED_TEST(AutoExtensions) {
5594 v8::HandleScope handle_scope(v8::Isolate::GetCurrent()); 5606 v8::HandleScope handle_scope(v8::Isolate::GetCurrent());
5595 Extension* extension = new Extension("autotest", kSimpleExtensionSource); 5607 Extension* extension = new Extension("autotest", kSimpleExtensionSource);
5596 extension->set_auto_enable(true); 5608 extension->set_auto_enable(true);
5597 v8::RegisterExtension(extension); 5609 v8::RegisterExtension(extension);
5598 v8::Handle<Context> context = Context::New(); 5610 v8::Handle<Context> context =
5611 Context::New(v8::Isolate::GetCurrent());
5599 Context::Scope lock(context); 5612 Context::Scope lock(context);
5600 v8::Handle<Value> result = Script::Compile(v8_str("Foo()"))->Run(); 5613 v8::Handle<Value> result = Script::Compile(v8_str("Foo()"))->Run();
5601 CHECK_EQ(result, v8::Integer::New(4)); 5614 CHECK_EQ(result, v8::Integer::New(4));
5602 } 5615 }
5603 5616
5604 5617
5605 static const char* kSyntaxErrorInExtensionSource = 5618 static const char* kSyntaxErrorInExtensionSource =
5606 "["; 5619 "[";
5607 5620
5608 5621
5609 // Test that a syntax error in an extension does not cause a fatal 5622 // Test that a syntax error in an extension does not cause a fatal
5610 // error but results in an empty context. 5623 // error but results in an empty context.
5611 THREADED_TEST(SyntaxErrorExtensions) { 5624 THREADED_TEST(SyntaxErrorExtensions) {
5612 v8::HandleScope handle_scope(v8::Isolate::GetCurrent()); 5625 v8::HandleScope handle_scope(v8::Isolate::GetCurrent());
5613 v8::RegisterExtension(new Extension("syntaxerror", 5626 v8::RegisterExtension(new Extension("syntaxerror",
5614 kSyntaxErrorInExtensionSource)); 5627 kSyntaxErrorInExtensionSource));
5615 const char* extension_names[] = { "syntaxerror" }; 5628 const char* extension_names[] = { "syntaxerror" };
5616 v8::ExtensionConfiguration extensions(1, extension_names); 5629 v8::ExtensionConfiguration extensions(1, extension_names);
5617 v8::Handle<Context> context = Context::New(&extensions); 5630 v8::Handle<Context> context =
5631 Context::New(v8::Isolate::GetCurrent(), &extensions);
5618 CHECK(context.IsEmpty()); 5632 CHECK(context.IsEmpty());
5619 } 5633 }
5620 5634
5621 5635
5622 static const char* kExceptionInExtensionSource = 5636 static const char* kExceptionInExtensionSource =
5623 "throw 42"; 5637 "throw 42";
5624 5638
5625 5639
5626 // Test that an exception when installing an extension does not cause 5640 // Test that an exception when installing an extension does not cause
5627 // a fatal error but results in an empty context. 5641 // a fatal error but results in an empty context.
5628 THREADED_TEST(ExceptionExtensions) { 5642 THREADED_TEST(ExceptionExtensions) {
5629 v8::HandleScope handle_scope(v8::Isolate::GetCurrent()); 5643 v8::HandleScope handle_scope(v8::Isolate::GetCurrent());
5630 v8::RegisterExtension(new Extension("exception", 5644 v8::RegisterExtension(new Extension("exception",
5631 kExceptionInExtensionSource)); 5645 kExceptionInExtensionSource));
5632 const char* extension_names[] = { "exception" }; 5646 const char* extension_names[] = { "exception" };
5633 v8::ExtensionConfiguration extensions(1, extension_names); 5647 v8::ExtensionConfiguration extensions(1, extension_names);
5634 v8::Handle<Context> context = Context::New(&extensions); 5648 v8::Handle<Context> context =
5649 Context::New(v8::Isolate::GetCurrent(), &extensions);
5635 CHECK(context.IsEmpty()); 5650 CHECK(context.IsEmpty());
5636 } 5651 }
5637 5652
5638 5653
5639 static const char* kNativeCallInExtensionSource = 5654 static const char* kNativeCallInExtensionSource =
5640 "function call_runtime_last_index_of(x) {" 5655 "function call_runtime_last_index_of(x) {"
5641 " return %StringLastIndexOf(x, 'bob', 10);" 5656 " return %StringLastIndexOf(x, 'bob', 10);"
5642 "}"; 5657 "}";
5643 5658
5644 5659
5645 static const char* kNativeCallTest = 5660 static const char* kNativeCallTest =
5646 "call_runtime_last_index_of('bobbobboellebobboellebobbob');"; 5661 "call_runtime_last_index_of('bobbobboellebobboellebobbob');";
5647 5662
5648 // Test that a native runtime calls are supported in extensions. 5663 // Test that a native runtime calls are supported in extensions.
5649 THREADED_TEST(NativeCallInExtensions) { 5664 THREADED_TEST(NativeCallInExtensions) {
5650 v8::HandleScope handle_scope(v8::Isolate::GetCurrent()); 5665 v8::HandleScope handle_scope(v8::Isolate::GetCurrent());
5651 v8::RegisterExtension(new Extension("nativecall", 5666 v8::RegisterExtension(new Extension("nativecall",
5652 kNativeCallInExtensionSource)); 5667 kNativeCallInExtensionSource));
5653 const char* extension_names[] = { "nativecall" }; 5668 const char* extension_names[] = { "nativecall" };
5654 v8::ExtensionConfiguration extensions(1, extension_names); 5669 v8::ExtensionConfiguration extensions(1, extension_names);
5655 v8::Handle<Context> context = Context::New(&extensions); 5670 v8::Handle<Context> context =
5671 Context::New(v8::Isolate::GetCurrent(), &extensions);
5656 Context::Scope lock(context); 5672 Context::Scope lock(context);
5657 v8::Handle<Value> result = Script::Compile(v8_str(kNativeCallTest))->Run(); 5673 v8::Handle<Value> result = Script::Compile(v8_str(kNativeCallTest))->Run();
5658 CHECK_EQ(result, v8::Integer::New(3)); 5674 CHECK_EQ(result, v8::Integer::New(3));
5659 } 5675 }
5660 5676
5661 5677
5662 class NativeFunctionExtension : public Extension { 5678 class NativeFunctionExtension : public Extension {
5663 public: 5679 public:
5664 NativeFunctionExtension(const char* name, 5680 NativeFunctionExtension(const char* name,
5665 const char* source, 5681 const char* source,
(...skipping 15 matching lines...) Expand all
5681 }; 5697 };
5682 5698
5683 5699
5684 THREADED_TEST(NativeFunctionDeclaration) { 5700 THREADED_TEST(NativeFunctionDeclaration) {
5685 v8::HandleScope handle_scope(v8::Isolate::GetCurrent()); 5701 v8::HandleScope handle_scope(v8::Isolate::GetCurrent());
5686 const char* name = "nativedecl"; 5702 const char* name = "nativedecl";
5687 v8::RegisterExtension(new NativeFunctionExtension(name, 5703 v8::RegisterExtension(new NativeFunctionExtension(name,
5688 "native function foo();")); 5704 "native function foo();"));
5689 const char* extension_names[] = { name }; 5705 const char* extension_names[] = { name };
5690 v8::ExtensionConfiguration extensions(1, extension_names); 5706 v8::ExtensionConfiguration extensions(1, extension_names);
5691 v8::Handle<Context> context = Context::New(&extensions); 5707 v8::Handle<Context> context =
5708 Context::New(v8::Isolate::GetCurrent(), &extensions);
5692 Context::Scope lock(context); 5709 Context::Scope lock(context);
5693 v8::Handle<Value> result = Script::Compile(v8_str("foo(42);"))->Run(); 5710 v8::Handle<Value> result = Script::Compile(v8_str("foo(42);"))->Run();
5694 CHECK_EQ(result, v8::Integer::New(42)); 5711 CHECK_EQ(result, v8::Integer::New(42));
5695 } 5712 }
5696 5713
5697 5714
5698 THREADED_TEST(NativeFunctionDeclarationError) { 5715 THREADED_TEST(NativeFunctionDeclarationError) {
5699 v8::HandleScope handle_scope(v8::Isolate::GetCurrent()); 5716 v8::HandleScope handle_scope(v8::Isolate::GetCurrent());
5700 const char* name = "nativedeclerr"; 5717 const char* name = "nativedeclerr";
5701 // Syntax error in extension code. 5718 // Syntax error in extension code.
5702 v8::RegisterExtension(new NativeFunctionExtension(name, 5719 v8::RegisterExtension(new NativeFunctionExtension(name,
5703 "native\nfunction foo();")); 5720 "native\nfunction foo();"));
5704 const char* extension_names[] = { name }; 5721 const char* extension_names[] = { name };
5705 v8::ExtensionConfiguration extensions(1, extension_names); 5722 v8::ExtensionConfiguration extensions(1, extension_names);
5706 v8::Handle<Context> context(Context::New(&extensions)); 5723 v8::Handle<Context> context =
5724 Context::New(v8::Isolate::GetCurrent(), &extensions);
5707 CHECK(context.IsEmpty()); 5725 CHECK(context.IsEmpty());
5708 } 5726 }
5709 5727
5710 5728
5711 THREADED_TEST(NativeFunctionDeclarationErrorEscape) { 5729 THREADED_TEST(NativeFunctionDeclarationErrorEscape) {
5712 v8::HandleScope handle_scope(v8::Isolate::GetCurrent()); 5730 v8::HandleScope handle_scope(v8::Isolate::GetCurrent());
5713 const char* name = "nativedeclerresc"; 5731 const char* name = "nativedeclerresc";
5714 // Syntax error in extension code - escape code in "native" means that 5732 // Syntax error in extension code - escape code in "native" means that
5715 // it's not treated as a keyword. 5733 // it's not treated as a keyword.
5716 v8::RegisterExtension(new NativeFunctionExtension( 5734 v8::RegisterExtension(new NativeFunctionExtension(
5717 name, 5735 name,
5718 "nativ\\u0065 function foo();")); 5736 "nativ\\u0065 function foo();"));
5719 const char* extension_names[] = { name }; 5737 const char* extension_names[] = { name };
5720 v8::ExtensionConfiguration extensions(1, extension_names); 5738 v8::ExtensionConfiguration extensions(1, extension_names);
5721 v8::Handle<Context> context(Context::New(&extensions)); 5739 v8::Handle<Context> context =
5740 Context::New(v8::Isolate::GetCurrent(), &extensions);
5722 CHECK(context.IsEmpty()); 5741 CHECK(context.IsEmpty());
5723 } 5742 }
5724 5743
5725 5744
5726 static void CheckDependencies(const char* name, const char* expected) { 5745 static void CheckDependencies(const char* name, const char* expected) {
5727 v8::HandleScope handle_scope(v8::Isolate::GetCurrent()); 5746 v8::HandleScope handle_scope(v8::Isolate::GetCurrent());
5728 v8::ExtensionConfiguration config(1, &name); 5747 v8::ExtensionConfiguration config(1, &name);
5729 LocalContext context(&config); 5748 LocalContext context(&config);
5730 CHECK_EQ(String::New(expected), context->Global()->Get(v8_str("loaded"))); 5749 CHECK_EQ(String::New(expected), context->Global()->Get(v8_str("loaded")));
5731 } 5750 }
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after
5851 // tests that the fatal error handler gets called. This renders V8 5870 // tests that the fatal error handler gets called. This renders V8
5852 // unusable and therefore this test cannot be run in parallel. 5871 // unusable and therefore this test cannot be run in parallel.
5853 TEST(ErrorReporting) { 5872 TEST(ErrorReporting) {
5854 v8::V8::SetFatalErrorHandler(StoringErrorCallback); 5873 v8::V8::SetFatalErrorHandler(StoringErrorCallback);
5855 static const char* aDeps[] = { "B" }; 5874 static const char* aDeps[] = { "B" };
5856 v8::RegisterExtension(new Extension("A", "", 1, aDeps)); 5875 v8::RegisterExtension(new Extension("A", "", 1, aDeps));
5857 static const char* bDeps[] = { "A" }; 5876 static const char* bDeps[] = { "A" };
5858 v8::RegisterExtension(new Extension("B", "", 1, bDeps)); 5877 v8::RegisterExtension(new Extension("B", "", 1, bDeps));
5859 last_location = NULL; 5878 last_location = NULL;
5860 v8::ExtensionConfiguration config(1, bDeps); 5879 v8::ExtensionConfiguration config(1, bDeps);
5861 v8::Handle<Context> context = Context::New(&config); 5880 v8::Handle<Context> context =
5881 Context::New(v8::Isolate::GetCurrent(), &config);
5862 CHECK(context.IsEmpty()); 5882 CHECK(context.IsEmpty());
5863 CHECK_NE(last_location, NULL); 5883 CHECK_NE(last_location, NULL);
5864 } 5884 }
5865 5885
5866 5886
5867 static const char* js_code_causing_huge_string_flattening = 5887 static const char* js_code_causing_huge_string_flattening =
5868 "var str = 'X';" 5888 "var str = 'X';"
5869 "for (var i = 0; i < 30; i++) {" 5889 "for (var i = 0; i < 30; i++) {"
5870 " str = str + str;" 5890 " str = str + str;"
5871 "}" 5891 "}"
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after
5967 5987
5968 THREADED_TEST(WeakReference) { 5988 THREADED_TEST(WeakReference) {
5969 v8::HandleScope handle_scope(v8::Isolate::GetCurrent()); 5989 v8::HandleScope handle_scope(v8::Isolate::GetCurrent());
5970 v8::Handle<v8::ObjectTemplate> templ= v8::ObjectTemplate::New(); 5990 v8::Handle<v8::ObjectTemplate> templ= v8::ObjectTemplate::New();
5971 Whammy* whammy = new Whammy(v8::Isolate::GetCurrent()); 5991 Whammy* whammy = new Whammy(v8::Isolate::GetCurrent());
5972 templ->SetNamedPropertyHandler(WhammyPropertyGetter, 5992 templ->SetNamedPropertyHandler(WhammyPropertyGetter,
5973 0, 0, 0, 0, 5993 0, 0, 0, 0,
5974 v8::External::New(whammy)); 5994 v8::External::New(whammy));
5975 const char* extension_list[] = { "v8/gc" }; 5995 const char* extension_list[] = { "v8/gc" };
5976 v8::ExtensionConfiguration extensions(1, extension_list); 5996 v8::ExtensionConfiguration extensions(1, extension_list);
5977 v8::Persistent<Context> context = Context::New(&extensions); 5997 v8::Handle<Context> context =
5998 Context::New(v8::Isolate::GetCurrent(), &extensions);
5978 Context::Scope context_scope(context); 5999 Context::Scope context_scope(context);
5979 6000
5980 v8::Handle<v8::Object> interceptor = templ->NewInstance(); 6001 v8::Handle<v8::Object> interceptor = templ->NewInstance();
5981 context->Global()->Set(v8_str("whammy"), interceptor); 6002 context->Global()->Set(v8_str("whammy"), interceptor);
5982 const char* code = 6003 const char* code =
5983 "var last;" 6004 "var last;"
5984 "for (var i = 0; i < 10000; i++) {" 6005 "for (var i = 0; i < 10000; i++) {"
5985 " var obj = whammy.length;" 6006 " var obj = whammy.length;"
5986 " if (last) last.next = obj;" 6007 " if (last) last.next = obj;"
5987 " last = obj;" 6008 " last = obj;"
5988 "}" 6009 "}"
5989 "gc();" 6010 "gc();"
5990 "4"; 6011 "4";
5991 v8::Handle<Value> result = CompileRun(code); 6012 v8::Handle<Value> result = CompileRun(code);
5992 CHECK_EQ(4.0, result->NumberValue()); 6013 CHECK_EQ(4.0, result->NumberValue());
5993 delete whammy; 6014 delete whammy;
5994 context.Dispose(context->GetIsolate());
5995 } 6015 }
5996 6016
5997 6017
5998 static void DisposeAndSetFlag(v8::Isolate* isolate, 6018 static void DisposeAndSetFlag(v8::Isolate* isolate,
5999 v8::Persistent<v8::Value> obj, 6019 v8::Persistent<v8::Value> obj,
6000 void* data) { 6020 void* data) {
6001 obj.Dispose(isolate); 6021 obj.Dispose(isolate);
6002 obj.Clear(); 6022 obj.Clear();
6003 *(reinterpret_cast<bool*>(data)) = true; 6023 *(reinterpret_cast<bool*>(data)) = true;
6004 } 6024 }
6005 6025
6006 6026
6007 THREADED_TEST(IndependentWeakHandle) { 6027 THREADED_TEST(IndependentWeakHandle) {
6008 v8::Persistent<Context> context = Context::New(); 6028 v8::Isolate* iso = v8::Isolate::GetCurrent();
6009 v8::Isolate* iso = context->GetIsolate(); 6029 v8::HandleScope scope(iso);
6030 v8::Handle<Context> context = Context::New(iso);
6010 Context::Scope context_scope(context); 6031 Context::Scope context_scope(context);
6011 6032
6012 v8::Persistent<v8::Object> object_a, object_b; 6033 v8::Persistent<v8::Object> object_a, object_b;
6013 6034
6014 { 6035 {
6015 v8::HandleScope handle_scope(iso); 6036 v8::HandleScope handle_scope(iso);
6016 object_a = v8::Persistent<v8::Object>::New(iso, v8::Object::New()); 6037 object_a = v8::Persistent<v8::Object>::New(iso, v8::Object::New());
6017 object_b = v8::Persistent<v8::Object>::New(iso, v8::Object::New()); 6038 object_b = v8::Persistent<v8::Object>::New(iso, v8::Object::New());
6018 } 6039 }
6019 6040
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
6055 v8::Persistent<v8::Value> obj, 6076 v8::Persistent<v8::Value> obj,
6056 void* data) { 6077 void* data) {
6057 obj.Dispose(isolate); 6078 obj.Dispose(isolate);
6058 obj.Clear(); 6079 obj.Clear();
6059 *(reinterpret_cast<bool*>(data)) = true; 6080 *(reinterpret_cast<bool*>(data)) = true;
6060 InvokeMarkSweep(); 6081 InvokeMarkSweep();
6061 } 6082 }
6062 6083
6063 6084
6064 THREADED_TEST(GCFromWeakCallbacks) { 6085 THREADED_TEST(GCFromWeakCallbacks) {
6065 v8::Persistent<Context> context = Context::New(); 6086 v8::Isolate* isolate = v8::Isolate::GetCurrent();
6066 v8::Isolate* isolate = context->GetIsolate(); 6087 v8::HandleScope scope(isolate);
6088 v8::Handle<Context> context = Context::New(isolate);
6067 Context::Scope context_scope(context); 6089 Context::Scope context_scope(context);
6068 6090
6069 static const int kNumberOfGCTypes = 2; 6091 static const int kNumberOfGCTypes = 2;
6070 v8::NearDeathCallback gc_forcing_callback[kNumberOfGCTypes] = 6092 v8::NearDeathCallback gc_forcing_callback[kNumberOfGCTypes] =
6071 {&ForceScavenge, &ForceMarkSweep}; 6093 {&ForceScavenge, &ForceMarkSweep};
6072 6094
6073 typedef void (*GCInvoker)(); 6095 typedef void (*GCInvoker)();
6074 GCInvoker invoke_gc[kNumberOfGCTypes] = {&InvokeScavenge, &InvokeMarkSweep}; 6096 GCInvoker invoke_gc[kNumberOfGCTypes] = {&InvokeScavenge, &InvokeMarkSweep};
6075 6097
6076 for (int outer_gc = 0; outer_gc < kNumberOfGCTypes; outer_gc++) { 6098 for (int outer_gc = 0; outer_gc < kNumberOfGCTypes; outer_gc++) {
(...skipping 15 matching lines...) Expand all
6092 6114
6093 static void RevivingCallback(v8::Isolate* isolate, 6115 static void RevivingCallback(v8::Isolate* isolate,
6094 v8::Persistent<v8::Value> obj, 6116 v8::Persistent<v8::Value> obj,
6095 void* data) { 6117 void* data) {
6096 obj.ClearWeak(isolate); 6118 obj.ClearWeak(isolate);
6097 *(reinterpret_cast<bool*>(data)) = true; 6119 *(reinterpret_cast<bool*>(data)) = true;
6098 } 6120 }
6099 6121
6100 6122
6101 THREADED_TEST(IndependentHandleRevival) { 6123 THREADED_TEST(IndependentHandleRevival) {
6102 v8::Persistent<Context> context = Context::New(); 6124 v8::Isolate* isolate = v8::Isolate::GetCurrent();
6125 v8::HandleScope scope(isolate);
6126 v8::Handle<Context> context = Context::New(isolate);
6103 Context::Scope context_scope(context); 6127 Context::Scope context_scope(context);
6104 v8::Isolate* isolate = context->GetIsolate();
6105 6128
6106 v8::Persistent<v8::Object> object; 6129 v8::Persistent<v8::Object> object;
6107 { 6130 {
6108 v8::HandleScope handle_scope(isolate); 6131 v8::HandleScope handle_scope(isolate);
6109 object = v8::Persistent<v8::Object>::New(isolate, v8::Object::New()); 6132 object = v8::Persistent<v8::Object>::New(isolate, v8::Object::New());
6110 object->Set(v8_str("x"), v8::Integer::New(1)); 6133 object->Set(v8_str("x"), v8::Integer::New(1));
6111 v8::Local<String> y_str = v8_str("y"); 6134 v8::Local<String> y_str = v8_str("y");
6112 object->Set(y_str, y_str); 6135 object->Set(y_str, y_str);
6113 } 6136 }
6114 bool revived = false; 6137 bool revived = false;
(...skipping 1034 matching lines...) Expand 10 before | Expand all | Expand 10 after
7149 } 7172 }
7150 7173
7151 7174
7152 // SecurityHandler can't be run twice 7175 // SecurityHandler can't be run twice
7153 TEST(SecurityHandler) { 7176 TEST(SecurityHandler) {
7154 v8::HandleScope scope0(v8::Isolate::GetCurrent()); 7177 v8::HandleScope scope0(v8::Isolate::GetCurrent());
7155 v8::Handle<v8::ObjectTemplate> global_template = v8::ObjectTemplate::New(); 7178 v8::Handle<v8::ObjectTemplate> global_template = v8::ObjectTemplate::New();
7156 global_template->SetAccessCheckCallbacks(NamedSecurityTestCallback, 7179 global_template->SetAccessCheckCallbacks(NamedSecurityTestCallback,
7157 IndexedSecurityTestCallback); 7180 IndexedSecurityTestCallback);
7158 // Create an environment 7181 // Create an environment
7159 v8::Persistent<Context> context0 = 7182 v8::Handle<Context> context0 =
7160 Context::New(NULL, global_template); 7183 Context::New(v8::Isolate::GetCurrent(), NULL, global_template);
7161 context0->Enter(); 7184 context0->Enter();
7162 7185
7163 v8::Handle<v8::Object> global0 = context0->Global(); 7186 v8::Handle<v8::Object> global0 = context0->Global();
7164 v8::Handle<Script> script0 = v8_compile("foo = 111"); 7187 v8::Handle<Script> script0 = v8_compile("foo = 111");
7165 script0->Run(); 7188 script0->Run();
7166 global0->Set(v8_str("0"), v8_num(999)); 7189 global0->Set(v8_str("0"), v8_num(999));
7167 v8::Handle<Value> foo0 = global0->Get(v8_str("foo")); 7190 v8::Handle<Value> foo0 = global0->Get(v8_str("foo"));
7168 CHECK_EQ(111, foo0->Int32Value()); 7191 CHECK_EQ(111, foo0->Int32Value());
7169 v8::Handle<Value> z0 = global0->Get(v8_str("0")); 7192 v8::Handle<Value> z0 = global0->Get(v8_str("0"));
7170 CHECK_EQ(999, z0->Int32Value()); 7193 CHECK_EQ(999, z0->Int32Value());
7171 7194
7172 // Create another environment, should fail security checks. 7195 // Create another environment, should fail security checks.
7173 v8::HandleScope scope1(v8::Isolate::GetCurrent()); 7196 v8::HandleScope scope1(v8::Isolate::GetCurrent());
7174 7197
7175 v8::Persistent<Context> context1 = 7198 v8::Handle<Context> context1 =
7176 Context::New(NULL, global_template); 7199 Context::New(v8::Isolate::GetCurrent(), NULL, global_template);
7177 context1->Enter(); 7200 context1->Enter();
7178 7201
7179 v8::Handle<v8::Object> global1 = context1->Global(); 7202 v8::Handle<v8::Object> global1 = context1->Global();
7180 global1->Set(v8_str("othercontext"), global0); 7203 global1->Set(v8_str("othercontext"), global0);
7181 // This set will fail the security check. 7204 // This set will fail the security check.
7182 v8::Handle<Script> script1 = 7205 v8::Handle<Script> script1 =
7183 v8_compile("othercontext.foo = 222; othercontext[0] = 888;"); 7206 v8_compile("othercontext.foo = 222; othercontext[0] = 888;");
7184 script1->Run(); 7207 script1->Run();
7185 // This read will pass the security check. 7208 // This read will pass the security check.
7186 v8::Handle<Value> foo1 = global0->Get(v8_str("foo")); 7209 v8::Handle<Value> foo1 = global0->Get(v8_str("foo"));
(...skipping 11 matching lines...) Expand all
7198 v8::Handle<Script> script2 = 7221 v8::Handle<Script> script2 =
7199 v8_compile("othercontext.foo = 333; othercontext[0] = 888;"); 7222 v8_compile("othercontext.foo = 333; othercontext[0] = 888;");
7200 script2->Run(); 7223 script2->Run();
7201 v8::Handle<Value> foo2 = global0->Get(v8_str("foo")); 7224 v8::Handle<Value> foo2 = global0->Get(v8_str("foo"));
7202 CHECK_EQ(333, foo2->Int32Value()); 7225 CHECK_EQ(333, foo2->Int32Value());
7203 v8::Handle<Value> z2 = global0->Get(v8_str("0")); 7226 v8::Handle<Value> z2 = global0->Get(v8_str("0"));
7204 CHECK_EQ(888, z2->Int32Value()); 7227 CHECK_EQ(888, z2->Int32Value());
7205 } 7228 }
7206 7229
7207 context1->Exit(); 7230 context1->Exit();
7208 context1.Dispose(context1->GetIsolate());
7209
7210 context0->Exit(); 7231 context0->Exit();
7211 context0.Dispose(context0->GetIsolate());
7212 } 7232 }
7213 7233
7214 7234
7215 THREADED_TEST(SecurityChecks) { 7235 THREADED_TEST(SecurityChecks) {
7216 LocalContext env1; 7236 LocalContext env1;
7217 v8::HandleScope handle_scope(env1->GetIsolate()); 7237 v8::HandleScope handle_scope(env1->GetIsolate());
7218 v8::Persistent<Context> env2 = Context::New(); 7238 v8::Handle<Context> env2 = Context::New(env1->GetIsolate());
7219 7239
7220 Local<Value> foo = v8_str("foo"); 7240 Local<Value> foo = v8_str("foo");
7221 Local<Value> bar = v8_str("bar"); 7241 Local<Value> bar = v8_str("bar");
7222 7242
7223 // Set to the same domain. 7243 // Set to the same domain.
7224 env1->SetSecurityToken(foo); 7244 env1->SetSecurityToken(foo);
7225 7245
7226 // Create a function in env1. 7246 // Create a function in env1.
7227 Script::Compile(v8_str("spy=function(){return spy;}"))->Run(); 7247 Script::Compile(v8_str("spy=function(){return spy;}"))->Run();
7228 Local<Value> spy = env1->Global()->Get(v8_str("spy")); 7248 Local<Value> spy = env1->Global()->Get(v8_str("spy"));
(...skipping 15 matching lines...) Expand all
7244 7264
7245 { 7265 {
7246 env2->SetSecurityToken(bar); 7266 env2->SetSecurityToken(bar);
7247 Context::Scope scope_env2(env2); 7267 Context::Scope scope_env2(env2);
7248 7268
7249 // Call cross_domain_call, it should throw an exception 7269 // Call cross_domain_call, it should throw an exception
7250 v8::TryCatch try_catch; 7270 v8::TryCatch try_catch;
7251 Function::Cast(*spy2)->Call(env2->Global(), 0, NULL); 7271 Function::Cast(*spy2)->Call(env2->Global(), 0, NULL);
7252 CHECK(try_catch.HasCaught()); 7272 CHECK(try_catch.HasCaught());
7253 } 7273 }
7254
7255 env2.Dispose(env2->GetIsolate());
7256 } 7274 }
7257 7275
7258 7276
7259 // Regression test case for issue 1183439. 7277 // Regression test case for issue 1183439.
7260 THREADED_TEST(SecurityChecksForPrototypeChain) { 7278 THREADED_TEST(SecurityChecksForPrototypeChain) {
7261 LocalContext current; 7279 LocalContext current;
7262 v8::HandleScope scope(current->GetIsolate()); 7280 v8::HandleScope scope(current->GetIsolate());
7263 v8::Persistent<Context> other = Context::New(); 7281 v8::Handle<Context> other = Context::New(current->GetIsolate());
7264 7282
7265 // Change context to be able to get to the Object function in the 7283 // Change context to be able to get to the Object function in the
7266 // other context without hitting the security checks. 7284 // other context without hitting the security checks.
7267 v8::Local<Value> other_object; 7285 v8::Local<Value> other_object;
7268 { Context::Scope scope(other); 7286 { Context::Scope scope(other);
7269 other_object = other->Global()->Get(v8_str("Object")); 7287 other_object = other->Global()->Get(v8_str("Object"));
7270 other->Global()->Set(v8_num(42), v8_num(87)); 7288 other->Global()->Set(v8_num(42), v8_num(87));
7271 } 7289 }
7272 7290
7273 current->Global()->Set(v8_str("other"), other->Global()); 7291 current->Global()->Set(v8_str("other"), other->Global());
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
7314 // Try to read the properties from f and make sure that the access 7332 // Try to read the properties from f and make sure that the access
7315 // gets stopped by the security checks on the other global object. 7333 // gets stopped by the security checks on the other global object.
7316 Local<Script> access_f2 = v8_compile("f.foo"); 7334 Local<Script> access_f2 = v8_compile("f.foo");
7317 Local<Script> access_f3 = v8_compile("f[99]"); 7335 Local<Script> access_f3 = v8_compile("f[99]");
7318 for (int k = 0; k < 5; k++) { 7336 for (int k = 0; k < 5; k++) {
7319 CHECK(!access_f2->Run()->Equals(v8_num(100))); 7337 CHECK(!access_f2->Run()->Equals(v8_num(100)));
7320 CHECK(access_f2->Run()->IsUndefined()); 7338 CHECK(access_f2->Run()->IsUndefined());
7321 CHECK(!access_f3->Run()->Equals(v8_num(101))); 7339 CHECK(!access_f3->Run()->Equals(v8_num(101)));
7322 CHECK(access_f3->Run()->IsUndefined()); 7340 CHECK(access_f3->Run()->IsUndefined());
7323 } 7341 }
7324 other.Dispose(other->GetIsolate());
7325 } 7342 }
7326 7343
7327 7344
7328 THREADED_TEST(CrossDomainDelete) { 7345 THREADED_TEST(CrossDomainDelete) {
7329 LocalContext env1; 7346 LocalContext env1;
7330 v8::HandleScope handle_scope(env1->GetIsolate()); 7347 v8::HandleScope handle_scope(env1->GetIsolate());
7331 v8::Persistent<Context> env2 = Context::New(); 7348 v8::Handle<Context> env2 = Context::New(env1->GetIsolate());
7332 7349
7333 Local<Value> foo = v8_str("foo"); 7350 Local<Value> foo = v8_str("foo");
7334 Local<Value> bar = v8_str("bar"); 7351 Local<Value> bar = v8_str("bar");
7335 7352
7336 // Set to the same domain. 7353 // Set to the same domain.
7337 env1->SetSecurityToken(foo); 7354 env1->SetSecurityToken(foo);
7338 env2->SetSecurityToken(foo); 7355 env2->SetSecurityToken(foo);
7339 7356
7340 env1->Global()->Set(v8_str("prop"), v8_num(3)); 7357 env1->Global()->Set(v8_str("prop"), v8_num(3));
7341 env2->Global()->Set(v8_str("env1"), env1->Global()); 7358 env2->Global()->Set(v8_str("env1"), env1->Global());
7342 7359
7343 // Change env2 to a different domain and delete env1.prop. 7360 // Change env2 to a different domain and delete env1.prop.
7344 env2->SetSecurityToken(bar); 7361 env2->SetSecurityToken(bar);
7345 { 7362 {
7346 Context::Scope scope_env2(env2); 7363 Context::Scope scope_env2(env2);
7347 Local<Value> result = 7364 Local<Value> result =
7348 Script::Compile(v8_str("delete env1.prop"))->Run(); 7365 Script::Compile(v8_str("delete env1.prop"))->Run();
7349 CHECK(result->IsFalse()); 7366 CHECK(result->IsFalse());
7350 } 7367 }
7351 7368
7352 // Check that env1.prop still exists. 7369 // Check that env1.prop still exists.
7353 Local<Value> v = env1->Global()->Get(v8_str("prop")); 7370 Local<Value> v = env1->Global()->Get(v8_str("prop"));
7354 CHECK(v->IsNumber()); 7371 CHECK(v->IsNumber());
7355 CHECK_EQ(3, v->Int32Value()); 7372 CHECK_EQ(3, v->Int32Value());
7356
7357 env2.Dispose(env2->GetIsolate());
7358 } 7373 }
7359 7374
7360 7375
7361 THREADED_TEST(CrossDomainIsPropertyEnumerable) { 7376 THREADED_TEST(CrossDomainIsPropertyEnumerable) {
7362 LocalContext env1; 7377 LocalContext env1;
7363 v8::HandleScope handle_scope(env1->GetIsolate()); 7378 v8::HandleScope handle_scope(env1->GetIsolate());
7364 v8::Persistent<Context> env2 = Context::New(); 7379 v8::Handle<Context> env2 = Context::New(env1->GetIsolate());
7365 7380
7366 Local<Value> foo = v8_str("foo"); 7381 Local<Value> foo = v8_str("foo");
7367 Local<Value> bar = v8_str("bar"); 7382 Local<Value> bar = v8_str("bar");
7368 7383
7369 // Set to the same domain. 7384 // Set to the same domain.
7370 env1->SetSecurityToken(foo); 7385 env1->SetSecurityToken(foo);
7371 env2->SetSecurityToken(foo); 7386 env2->SetSecurityToken(foo);
7372 7387
7373 env1->Global()->Set(v8_str("prop"), v8_num(3)); 7388 env1->Global()->Set(v8_str("prop"), v8_num(3));
7374 env2->Global()->Set(v8_str("env1"), env1->Global()); 7389 env2->Global()->Set(v8_str("env1"), env1->Global());
7375 7390
7376 // env1.prop is enumerable in env2. 7391 // env1.prop is enumerable in env2.
7377 Local<String> test = v8_str("propertyIsEnumerable.call(env1, 'prop')"); 7392 Local<String> test = v8_str("propertyIsEnumerable.call(env1, 'prop')");
7378 { 7393 {
7379 Context::Scope scope_env2(env2); 7394 Context::Scope scope_env2(env2);
7380 Local<Value> result = Script::Compile(test)->Run(); 7395 Local<Value> result = Script::Compile(test)->Run();
7381 CHECK(result->IsTrue()); 7396 CHECK(result->IsTrue());
7382 } 7397 }
7383 7398
7384 // Change env2 to a different domain and test again. 7399 // Change env2 to a different domain and test again.
7385 env2->SetSecurityToken(bar); 7400 env2->SetSecurityToken(bar);
7386 { 7401 {
7387 Context::Scope scope_env2(env2); 7402 Context::Scope scope_env2(env2);
7388 Local<Value> result = Script::Compile(test)->Run(); 7403 Local<Value> result = Script::Compile(test)->Run();
7389 CHECK(result->IsFalse()); 7404 CHECK(result->IsFalse());
7390 } 7405 }
7391
7392 env2.Dispose(env2->GetIsolate());
7393 } 7406 }
7394 7407
7395 7408
7396 THREADED_TEST(CrossDomainForIn) { 7409 THREADED_TEST(CrossDomainForIn) {
7397 LocalContext env1; 7410 LocalContext env1;
7398 v8::HandleScope handle_scope(env1->GetIsolate()); 7411 v8::HandleScope handle_scope(env1->GetIsolate());
7399 v8::Persistent<Context> env2 = Context::New(); 7412 v8::Handle<Context> env2 = Context::New(env1->GetIsolate());
7400 7413
7401 Local<Value> foo = v8_str("foo"); 7414 Local<Value> foo = v8_str("foo");
7402 Local<Value> bar = v8_str("bar"); 7415 Local<Value> bar = v8_str("bar");
7403 7416
7404 // Set to the same domain. 7417 // Set to the same domain.
7405 env1->SetSecurityToken(foo); 7418 env1->SetSecurityToken(foo);
7406 env2->SetSecurityToken(foo); 7419 env2->SetSecurityToken(foo);
7407 7420
7408 env1->Global()->Set(v8_str("prop"), v8_num(3)); 7421 env1->Global()->Set(v8_str("prop"), v8_num(3));
7409 env2->Global()->Set(v8_str("env1"), env1->Global()); 7422 env2->Global()->Set(v8_str("env1"), env1->Global());
7410 7423
7411 // Change env2 to a different domain and set env1's global object 7424 // Change env2 to a different domain and set env1's global object
7412 // as the __proto__ of an object in env2 and enumerate properties 7425 // as the __proto__ of an object in env2 and enumerate properties
7413 // in for-in. It shouldn't enumerate properties on env1's global 7426 // in for-in. It shouldn't enumerate properties on env1's global
7414 // object. 7427 // object.
7415 env2->SetSecurityToken(bar); 7428 env2->SetSecurityToken(bar);
7416 { 7429 {
7417 Context::Scope scope_env2(env2); 7430 Context::Scope scope_env2(env2);
7418 Local<Value> result = 7431 Local<Value> result =
7419 CompileRun("(function(){var obj = {'__proto__':env1};" 7432 CompileRun("(function(){var obj = {'__proto__':env1};"
7420 "for (var p in obj)" 7433 "for (var p in obj)"
7421 " if (p == 'prop') return false;" 7434 " if (p == 'prop') return false;"
7422 "return true;})()"); 7435 "return true;})()");
7423 CHECK(result->IsTrue()); 7436 CHECK(result->IsTrue());
7424 } 7437 }
7425 env2.Dispose(env2->GetIsolate());
7426 } 7438 }
7427 7439
7428 7440
7429 TEST(ContextDetachGlobal) { 7441 TEST(ContextDetachGlobal) {
7430 LocalContext env1; 7442 LocalContext env1;
7431 v8::HandleScope handle_scope(env1->GetIsolate()); 7443 v8::HandleScope handle_scope(env1->GetIsolate());
7432 v8::Persistent<Context> env2 = Context::New(); 7444 v8::Handle<Context> env2 = Context::New(env1->GetIsolate());
7433 7445
7434 Local<v8::Object> global1 = env1->Global(); 7446 Local<v8::Object> global1 = env1->Global();
7435 7447
7436 Local<Value> foo = v8_str("foo"); 7448 Local<Value> foo = v8_str("foo");
7437 7449
7438 // Set to the same domain. 7450 // Set to the same domain.
7439 env1->SetSecurityToken(foo); 7451 env1->SetSecurityToken(foo);
7440 env2->SetSecurityToken(foo); 7452 env2->SetSecurityToken(foo);
7441 7453
7442 // Enter env2 7454 // Enter env2
7443 env2->Enter(); 7455 env2->Enter();
7444 7456
7445 // Create a function in env2 and add a reference to it in env1. 7457 // Create a function in env2 and add a reference to it in env1.
7446 Local<v8::Object> global2 = env2->Global(); 7458 Local<v8::Object> global2 = env2->Global();
7447 global2->Set(v8_str("prop"), v8::Integer::New(1)); 7459 global2->Set(v8_str("prop"), v8::Integer::New(1));
7448 CompileRun("function getProp() {return prop;}"); 7460 CompileRun("function getProp() {return prop;}");
7449 7461
7450 env1->Global()->Set(v8_str("getProp"), 7462 env1->Global()->Set(v8_str("getProp"),
7451 global2->Get(v8_str("getProp"))); 7463 global2->Get(v8_str("getProp")));
7452 7464
7453 // Detach env2's global, and reuse the global object of env2 7465 // Detach env2's global, and reuse the global object of env2
7454 env2->Exit(); 7466 env2->Exit();
7455 env2->DetachGlobal(); 7467 env2->DetachGlobal();
7456 // env2 has a new global object. 7468 // env2 has a new global object.
7457 CHECK(!env2->Global()->Equals(global2)); 7469 CHECK(!env2->Global()->Equals(global2));
7458 7470
7459 v8::Persistent<Context> env3 = 7471 v8::Handle<Context> env3 = Context::New(env1->GetIsolate(),
7460 Context::New(0, v8::Handle<v8::ObjectTemplate>(), global2); 7472 0,
7473 v8::Handle<v8::ObjectTemplate>(),
7474 global2);
7461 env3->SetSecurityToken(v8_str("bar")); 7475 env3->SetSecurityToken(v8_str("bar"));
7462 env3->Enter(); 7476 env3->Enter();
7463 7477
7464 Local<v8::Object> global3 = env3->Global(); 7478 Local<v8::Object> global3 = env3->Global();
7465 CHECK_EQ(global2, global3); 7479 CHECK_EQ(global2, global3);
7466 CHECK(global3->Get(v8_str("prop"))->IsUndefined()); 7480 CHECK(global3->Get(v8_str("prop"))->IsUndefined());
7467 CHECK(global3->Get(v8_str("getProp"))->IsUndefined()); 7481 CHECK(global3->Get(v8_str("getProp"))->IsUndefined());
7468 global3->Set(v8_str("prop"), v8::Integer::New(-1)); 7482 global3->Set(v8_str("prop"), v8::Integer::New(-1));
7469 global3->Set(v8_str("prop2"), v8::Integer::New(2)); 7483 global3->Set(v8_str("prop2"), v8::Integer::New(2));
7470 env3->Exit(); 7484 env3->Exit();
7471 7485
7472 // Call getProp in env1, and it should return the value 1 7486 // Call getProp in env1, and it should return the value 1
7473 { 7487 {
7474 Local<Value> get_prop = global1->Get(v8_str("getProp")); 7488 Local<Value> get_prop = global1->Get(v8_str("getProp"));
7475 CHECK(get_prop->IsFunction()); 7489 CHECK(get_prop->IsFunction());
7476 v8::TryCatch try_catch; 7490 v8::TryCatch try_catch;
7477 Local<Value> r = Function::Cast(*get_prop)->Call(global1, 0, NULL); 7491 Local<Value> r = Function::Cast(*get_prop)->Call(global1, 0, NULL);
7478 CHECK(!try_catch.HasCaught()); 7492 CHECK(!try_catch.HasCaught());
7479 CHECK_EQ(1, r->Int32Value()); 7493 CHECK_EQ(1, r->Int32Value());
7480 } 7494 }
7481 7495
7482 // Check that env3 is not accessible from env1 7496 // Check that env3 is not accessible from env1
7483 { 7497 {
7484 Local<Value> r = global3->Get(v8_str("prop2")); 7498 Local<Value> r = global3->Get(v8_str("prop2"));
7485 CHECK(r->IsUndefined()); 7499 CHECK(r->IsUndefined());
7486 } 7500 }
7487
7488 env2.Dispose(env2->GetIsolate());
7489 env3.Dispose(env3->GetIsolate());
7490 } 7501 }
7491 7502
7492 7503
7493 TEST(DetachAndReattachGlobal) { 7504 TEST(DetachAndReattachGlobal) {
7494 LocalContext env1; 7505 LocalContext env1;
7495 v8::HandleScope scope(env1->GetIsolate()); 7506 v8::HandleScope scope(env1->GetIsolate());
7496 7507
7497 // Create second environment. 7508 // Create second environment.
7498 v8::Persistent<Context> env2 = Context::New(); 7509 v8::Handle<Context> env2 = Context::New(env1->GetIsolate());
7499 7510
7500 Local<Value> foo = v8_str("foo"); 7511 Local<Value> foo = v8_str("foo");
7501 7512
7502 // Set same security token for env1 and env2. 7513 // Set same security token for env1 and env2.
7503 env1->SetSecurityToken(foo); 7514 env1->SetSecurityToken(foo);
7504 env2->SetSecurityToken(foo); 7515 env2->SetSecurityToken(foo);
7505 7516
7506 // Create a property on the global object in env2. 7517 // Create a property on the global object in env2.
7507 { 7518 {
7508 v8::Context::Scope scope(env2); 7519 v8::Context::Scope scope(env2);
(...skipping 11 matching lines...) Expand all
7520 // Hold on to global from env2 and detach global from env2. 7531 // Hold on to global from env2 and detach global from env2.
7521 Local<v8::Object> global2 = env2->Global(); 7532 Local<v8::Object> global2 = env2->Global();
7522 env2->DetachGlobal(); 7533 env2->DetachGlobal();
7523 7534
7524 // Check that the global has been detached. No other.p property can 7535 // Check that the global has been detached. No other.p property can
7525 // be found. 7536 // be found.
7526 result = CompileRun("other.p"); 7537 result = CompileRun("other.p");
7527 CHECK(result->IsUndefined()); 7538 CHECK(result->IsUndefined());
7528 7539
7529 // Reuse global2 for env3. 7540 // Reuse global2 for env3.
7530 v8::Persistent<Context> env3 = 7541 v8::Handle<Context> env3 = Context::New(env1->GetIsolate(),
7531 Context::New(0, v8::Handle<v8::ObjectTemplate>(), global2); 7542 0,
7543 v8::Handle<v8::ObjectTemplate>(),
7544 global2);
7532 CHECK_EQ(global2, env3->Global()); 7545 CHECK_EQ(global2, env3->Global());
7533 7546
7534 // Start by using the same security token for env3 as for env1 and env2. 7547 // Start by using the same security token for env3 as for env1 and env2.
7535 env3->SetSecurityToken(foo); 7548 env3->SetSecurityToken(foo);
7536 7549
7537 // Create a property on the global object in env3. 7550 // Create a property on the global object in env3.
7538 { 7551 {
7539 v8::Context::Scope scope(env3); 7552 v8::Context::Scope scope(env3);
7540 env3->Global()->Set(v8_str("p"), v8::Integer::New(24)); 7553 env3->Global()->Set(v8_str("p"), v8::Integer::New(24));
7541 } 7554 }
(...skipping 14 matching lines...) Expand all
7556 7569
7557 // Detach the global for env3 and reattach it to env2. 7570 // Detach the global for env3 and reattach it to env2.
7558 env3->DetachGlobal(); 7571 env3->DetachGlobal();
7559 env2->ReattachGlobal(global2); 7572 env2->ReattachGlobal(global2);
7560 7573
7561 // Check that we have access to other.p again in env1. |other| is now 7574 // Check that we have access to other.p again in env1. |other| is now
7562 // the global object for env2 which has the same security token as env1. 7575 // the global object for env2 which has the same security token as env1.
7563 result = CompileRun("other.p"); 7576 result = CompileRun("other.p");
7564 CHECK(result->IsInt32()); 7577 CHECK(result->IsInt32());
7565 CHECK_EQ(42, result->Int32Value()); 7578 CHECK_EQ(42, result->Int32Value());
7566
7567 env2.Dispose(env2->GetIsolate());
7568 env3.Dispose(env3->GetIsolate());
7569 } 7579 }
7570 7580
7571 7581
7572 static bool allowed_access_type[v8::ACCESS_KEYS + 1] = { false }; 7582 static bool allowed_access_type[v8::ACCESS_KEYS + 1] = { false };
7573 static bool NamedAccessBlocker(Local<v8::Object> global, 7583 static bool NamedAccessBlocker(Local<v8::Object> global,
7574 Local<Value> name, 7584 Local<Value> name,
7575 v8::AccessType type, 7585 v8::AccessType type,
7576 Local<Value> data) { 7586 Local<Value> data) {
7577 return Context::GetCurrent()->Global()->Equals(global) || 7587 return Context::GetCurrent()->Global()->Equals(global) ||
7578 allowed_access_type[type]; 7588 allowed_access_type[type];
(...skipping 2048 matching lines...) Expand 10 before | Expand all | Expand 10 after
9627 9637
9628 9638
9629 // Below go several tests which verify that JITing for various 9639 // Below go several tests which verify that JITing for various
9630 // configurations of interceptor and explicit fields works fine 9640 // configurations of interceptor and explicit fields works fine
9631 // (those cases are special cased to get better performance). 9641 // (those cases are special cased to get better performance).
9632 9642
9633 static v8::Handle<Value> InterceptorLoadXICGetter(Local<String> name, 9643 static v8::Handle<Value> InterceptorLoadXICGetter(Local<String> name,
9634 const AccessorInfo& info) { 9644 const AccessorInfo& info) {
9635 ApiTestFuzzer::Fuzz(); 9645 ApiTestFuzzer::Fuzz();
9636 return v8_str("x")->Equals(name) 9646 return v8_str("x")->Equals(name)
9637 ? v8::Integer::New(42) : v8::Handle<v8::Value>(); 9647 ? v8::Handle<v8::Value>(v8::Integer::New(42)) : v8::Handle<v8::Value>();
9638 } 9648 }
9639 9649
9640 9650
9641 THREADED_TEST(InterceptorLoadICWithFieldOnHolder) { 9651 THREADED_TEST(InterceptorLoadICWithFieldOnHolder) {
9642 CheckInterceptorLoadIC(InterceptorLoadXICGetter, 9652 CheckInterceptorLoadIC(InterceptorLoadXICGetter,
9643 "var result = 0;" 9653 "var result = 0;"
9644 "o.y = 239;" 9654 "o.y = 239;"
9645 "for (var i = 0; i < 1000; i++) {" 9655 "for (var i = 0; i < 1000; i++) {"
9646 " result = o.y;" 9656 " result = o.y;"
9647 "}", 9657 "}",
(...skipping 2997 matching lines...) Expand 10 before | Expand all | Expand 10 after
12645 v8::HandleScope handle_scope(v8::Isolate::GetCurrent()); 12655 v8::HandleScope handle_scope(v8::Isolate::GetCurrent());
12646 12656
12647 // Create an environment with access check to the global object disabled by 12657 // Create an environment with access check to the global object disabled by
12648 // default. 12658 // default.
12649 v8::Handle<v8::ObjectTemplate> global_template = v8::ObjectTemplate::New(); 12659 v8::Handle<v8::ObjectTemplate> global_template = v8::ObjectTemplate::New();
12650 global_template->SetAccessCheckCallbacks(NamedGetAccessBlocker, 12660 global_template->SetAccessCheckCallbacks(NamedGetAccessBlocker,
12651 IndexedGetAccessBlocker, 12661 IndexedGetAccessBlocker,
12652 v8::Handle<v8::Value>(), 12662 v8::Handle<v8::Value>(),
12653 false); 12663 false);
12654 v8::Persistent<Context> context = Context::New(NULL, global_template); 12664 v8::Persistent<Context> context = Context::New(NULL, global_template);
12655 Context::Scope context_scope(context); 12665 Context::Scope context_scope(v8::Isolate::GetCurrent(), context);
12656 12666
12657 // Set up a property and a number of functions. 12667 // Set up a property and a number of functions.
12658 context->Global()->Set(v8_str("a"), v8_num(1)); 12668 context->Global()->Set(v8_str("a"), v8_num(1));
12659 CompileRun("function f1() {return a;}" 12669 CompileRun("function f1() {return a;}"
12660 "function f2() {return a;}" 12670 "function f2() {return a;}"
12661 "function g1() {return h();}" 12671 "function g1() {return h();}"
12662 "function g2() {return h();}" 12672 "function g2() {return h();}"
12663 "function h() {return 1;}"); 12673 "function h() {return 1;}");
12664 Local<Function> f1 = 12674 Local<Function> f1 =
12665 Local<Function>::Cast(context->Global()->Get(v8_str("f1"))); 12675 Local<Function>::Cast(context->Global()->Get(v8_str("f1")));
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
12726 12736
12727 // Create an environment with access check to the global object disabled by 12737 // Create an environment with access check to the global object disabled by
12728 // default. When the registered access checker will block access to properties 12738 // default. When the registered access checker will block access to properties
12729 // a and h. 12739 // a and h.
12730 v8::Handle<v8::ObjectTemplate> global_template = v8::ObjectTemplate::New(); 12740 v8::Handle<v8::ObjectTemplate> global_template = v8::ObjectTemplate::New();
12731 global_template->SetAccessCheckCallbacks(NamedGetAccessBlockAandH, 12741 global_template->SetAccessCheckCallbacks(NamedGetAccessBlockAandH,
12732 IndexedGetAccessBlocker, 12742 IndexedGetAccessBlocker,
12733 v8::Handle<v8::Value>(), 12743 v8::Handle<v8::Value>(),
12734 false); 12744 false);
12735 v8::Persistent<Context> context = Context::New(NULL, global_template); 12745 v8::Persistent<Context> context = Context::New(NULL, global_template);
12736 Context::Scope context_scope(context); 12746 Context::Scope context_scope(v8::Isolate::GetCurrent(), context);
12737 12747
12738 // Set up a property and a number of functions. 12748 // Set up a property and a number of functions.
12739 context->Global()->Set(v8_str("a"), v8_num(1)); 12749 context->Global()->Set(v8_str("a"), v8_num(1));
12740 static const char* source = "function f1() {return a;}" 12750 static const char* source = "function f1() {return a;}"
12741 "function f2() {return a;}" 12751 "function f2() {return a;}"
12742 "function g1() {return h();}" 12752 "function g1() {return h();}"
12743 "function g2() {return h();}" 12753 "function g2() {return h();}"
12744 "function h() {return 1;}"; 12754 "function h() {return 1;}";
12745 12755
12746 CompileRun(source); 12756 CompileRun(source);
(...skipping 4098 matching lines...) Expand 10 before | Expand all | Expand 10 after
16845 CHECK_NE(last_message, NULL); 16855 CHECK_NE(last_message, NULL);
16846 } 16856 }
16847 16857
16848 TEST(RunTwoIsolatesOnSingleThread) { 16858 TEST(RunTwoIsolatesOnSingleThread) {
16849 // Run isolate 1. 16859 // Run isolate 1.
16850 v8::Isolate* isolate1 = v8::Isolate::New(); 16860 v8::Isolate* isolate1 = v8::Isolate::New();
16851 isolate1->Enter(); 16861 isolate1->Enter();
16852 v8::Persistent<v8::Context> context1 = v8::Context::New(); 16862 v8::Persistent<v8::Context> context1 = v8::Context::New();
16853 16863
16854 { 16864 {
16855 v8::Context::Scope cscope(context1);
16856 v8::HandleScope scope(isolate1); 16865 v8::HandleScope scope(isolate1);
16866 v8::Context::Scope cscope(isolate1, context1);
16857 // Run something in new isolate. 16867 // Run something in new isolate.
16858 CompileRun("var foo = 'isolate 1';"); 16868 CompileRun("var foo = 'isolate 1';");
16859 ExpectString("function f() { return foo; }; f()", "isolate 1"); 16869 ExpectString("function f() { return foo; }; f()", "isolate 1");
16860 } 16870 }
16861 16871
16862 // Run isolate 2. 16872 // Run isolate 2.
16863 v8::Isolate* isolate2 = v8::Isolate::New(); 16873 v8::Isolate* isolate2 = v8::Isolate::New();
16864 v8::Persistent<v8::Context> context2; 16874 v8::Persistent<v8::Context> context2;
16865 16875
16866 { 16876 {
16867 v8::Isolate::Scope iscope(isolate2); 16877 v8::Isolate::Scope iscope(isolate2);
16868 context2 = v8::Context::New(); 16878 context2 = v8::Context::New();
16869 v8::Context::Scope cscope(context2);
16870 v8::HandleScope scope(isolate2); 16879 v8::HandleScope scope(isolate2);
16880 v8::Context::Scope cscope(isolate2, context2);
16871 16881
16872 // Run something in new isolate. 16882 // Run something in new isolate.
16873 CompileRun("var foo = 'isolate 2';"); 16883 CompileRun("var foo = 'isolate 2';");
16874 ExpectString("function f() { return foo; }; f()", "isolate 2"); 16884 ExpectString("function f() { return foo; }; f()", "isolate 2");
16875 } 16885 }
16876 16886
16877 { 16887 {
16878 v8::Context::Scope cscope(context1);
16879 v8::HandleScope scope(isolate1); 16888 v8::HandleScope scope(isolate1);
16889 v8::Context::Scope cscope(isolate1, context1);
16880 // Now again in isolate 1 16890 // Now again in isolate 1
16881 ExpectString("function f() { return foo; }; f()", "isolate 1"); 16891 ExpectString("function f() { return foo; }; f()", "isolate 1");
16882 } 16892 }
16883 16893
16884 isolate1->Exit(); 16894 isolate1->Exit();
16885 16895
16886 // Run some stuff in default isolate. 16896 // Run some stuff in default isolate.
16887 v8::Persistent<v8::Context> context_default = v8::Context::New(); 16897 v8::Persistent<v8::Context> context_default = v8::Context::New();
16888 16898
16889 { 16899 {
16890 v8::Context::Scope cscope(context_default);
16891 v8::HandleScope scope(v8::Isolate::GetCurrent()); 16900 v8::HandleScope scope(v8::Isolate::GetCurrent());
16901 v8::Context::Scope cscope(v8::Isolate::GetCurrent(), context_default);
16892 // Variables in other isolates should be not available, verify there 16902 // Variables in other isolates should be not available, verify there
16893 // is an exception. 16903 // is an exception.
16894 ExpectTrue("function f() {" 16904 ExpectTrue("function f() {"
16895 " try {" 16905 " try {"
16896 " foo;" 16906 " foo;"
16897 " return false;" 16907 " return false;"
16898 " } catch(e) {" 16908 " } catch(e) {"
16899 " return true;" 16909 " return true;"
16900 " }" 16910 " }"
16901 "};" 16911 "};"
16902 "var isDefaultIsolate = true;" 16912 "var isDefaultIsolate = true;"
16903 "f()"); 16913 "f()");
16904 } 16914 }
16905 16915
16906 isolate1->Enter(); 16916 isolate1->Enter();
16907 16917
16908 { 16918 {
16909 v8::Isolate::Scope iscope(isolate2); 16919 v8::Isolate::Scope iscope(isolate2);
16910 v8::Context::Scope cscope(context2);
16911 v8::HandleScope scope(v8::Isolate::GetCurrent()); 16920 v8::HandleScope scope(v8::Isolate::GetCurrent());
16921 v8::Context::Scope cscope(isolate2, context2);
16912 ExpectString("function f() { return foo; }; f()", "isolate 2"); 16922 ExpectString("function f() { return foo; }; f()", "isolate 2");
16913 } 16923 }
16914 16924
16915 { 16925 {
16916 v8::Context::Scope cscope(context1);
16917 v8::HandleScope scope(v8::Isolate::GetCurrent()); 16926 v8::HandleScope scope(v8::Isolate::GetCurrent());
16927 v8::Context::Scope cscope(v8::Isolate::GetCurrent(), context1);
16918 ExpectString("function f() { return foo; }; f()", "isolate 1"); 16928 ExpectString("function f() { return foo; }; f()", "isolate 1");
16919 } 16929 }
16920 16930
16921 { 16931 {
16922 v8::Isolate::Scope iscope(isolate2); 16932 v8::Isolate::Scope iscope(isolate2);
16923 context2.Dispose(context2->GetIsolate()); 16933 context2.Dispose(context2->GetIsolate());
16924 } 16934 }
16925 16935
16926 context1.Dispose(context1->GetIsolate()); 16936 context1.Dispose(context1->GetIsolate());
16927 isolate1->Exit(); 16937 isolate1->Exit();
16928 16938
16929 v8::V8::SetFatalErrorHandler(StoringErrorCallback); 16939 v8::V8::SetFatalErrorHandler(StoringErrorCallback);
16930 last_location = last_message = NULL; 16940 last_location = last_message = NULL;
16931 16941
16932 isolate1->Dispose(); 16942 isolate1->Dispose();
16933 CHECK_EQ(last_location, NULL); 16943 CHECK_EQ(last_location, NULL);
16934 CHECK_EQ(last_message, NULL); 16944 CHECK_EQ(last_message, NULL);
16935 16945
16936 isolate2->Dispose(); 16946 isolate2->Dispose();
16937 CHECK_EQ(last_location, NULL); 16947 CHECK_EQ(last_location, NULL);
16938 CHECK_EQ(last_message, NULL); 16948 CHECK_EQ(last_message, NULL);
16939 16949
16940 // Check that default isolate still runs. 16950 // Check that default isolate still runs.
16941 { 16951 {
16942 v8::Context::Scope cscope(context_default);
16943 v8::HandleScope scope(v8::Isolate::GetCurrent()); 16952 v8::HandleScope scope(v8::Isolate::GetCurrent());
16953 v8::Context::Scope cscope(v8::Isolate::GetCurrent(), context_default);
16944 ExpectTrue("function f() { return isDefaultIsolate; }; f()"); 16954 ExpectTrue("function f() { return isDefaultIsolate; }; f()");
16945 } 16955 }
16946 } 16956 }
16947 16957
16948 static int CalcFibonacci(v8::Isolate* isolate, int limit) { 16958 static int CalcFibonacci(v8::Isolate* isolate, int limit) {
16949 v8::Isolate::Scope isolate_scope(isolate); 16959 v8::Isolate::Scope isolate_scope(isolate);
16950 v8::HandleScope scope(isolate); 16960 v8::HandleScope scope(isolate);
16951 LocalContext context; 16961 LocalContext context;
16952 i::ScopedVector<char> code(1024); 16962 i::ScopedVector<char> code(1024);
16953 i::OS::SNPrintF(code, "function fib(n) {" 16963 i::OS::SNPrintF(code, "function fib(n) {"
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
17008 isolate2->Dispose(); 17018 isolate2->Dispose();
17009 } 17019 }
17010 17020
17011 TEST(IsolateDifferentContexts) { 17021 TEST(IsolateDifferentContexts) {
17012 v8::Isolate* isolate = v8::Isolate::New(); 17022 v8::Isolate* isolate = v8::Isolate::New();
17013 Persistent<v8::Context> context; 17023 Persistent<v8::Context> context;
17014 { 17024 {
17015 v8::Isolate::Scope isolate_scope(isolate); 17025 v8::Isolate::Scope isolate_scope(isolate);
17016 v8::HandleScope handle_scope(isolate); 17026 v8::HandleScope handle_scope(isolate);
17017 context = v8::Context::New(); 17027 context = v8::Context::New();
17018 v8::Context::Scope context_scope(context); 17028 v8::Context::Scope context_scope(isolate, context);
17019 Local<Value> v = CompileRun("2"); 17029 Local<Value> v = CompileRun("2");
17020 CHECK(v->IsNumber()); 17030 CHECK(v->IsNumber());
17021 CHECK_EQ(2, static_cast<int>(v->NumberValue())); 17031 CHECK_EQ(2, static_cast<int>(v->NumberValue()));
17022 } 17032 }
17023 { 17033 {
17024 v8::Isolate::Scope isolate_scope(isolate); 17034 v8::Isolate::Scope isolate_scope(isolate);
17025 v8::HandleScope handle_scope(isolate); 17035 v8::HandleScope handle_scope(isolate);
17026 context = v8::Context::New(); 17036 context = v8::Context::New();
17027 v8::Context::Scope context_scope(context); 17037 v8::Context::Scope context_scope(isolate, context);
17028 Local<Value> v = CompileRun("22"); 17038 Local<Value> v = CompileRun("22");
17029 CHECK(v->IsNumber()); 17039 CHECK(v->IsNumber());
17030 CHECK_EQ(22, static_cast<int>(v->NumberValue())); 17040 CHECK_EQ(22, static_cast<int>(v->NumberValue()));
17031 } 17041 }
17032 isolate->Dispose(); 17042 isolate->Dispose();
17033 } 17043 }
17034 17044
17035 class InitDefaultIsolateThread : public v8::internal::Thread { 17045 class InitDefaultIsolateThread : public v8::internal::Thread {
17036 public: 17046 public:
17037 enum TestCase { 17047 enum TestCase {
(...skipping 254 matching lines...) Expand 10 before | Expand all | Expand 10 after
17292 explicit Visitor42(v8::Persistent<v8::Object> object) 17302 explicit Visitor42(v8::Persistent<v8::Object> object)
17293 : counter_(0), object_(object) { } 17303 : counter_(0), object_(object) { }
17294 17304
17295 virtual void VisitPersistentHandle(Persistent<Value> value, 17305 virtual void VisitPersistentHandle(Persistent<Value> value,
17296 uint16_t class_id) { 17306 uint16_t class_id) {
17297 if (class_id == 42) { 17307 if (class_id == 42) {
17298 CHECK(value->IsObject()); 17308 CHECK(value->IsObject());
17299 v8::Persistent<v8::Object> visited = 17309 v8::Persistent<v8::Object> visited =
17300 v8::Persistent<v8::Object>::Cast(value); 17310 v8::Persistent<v8::Object>::Cast(value);
17301 CHECK_EQ(42, visited.WrapperClassId(v8::Isolate::GetCurrent())); 17311 CHECK_EQ(42, visited.WrapperClassId(v8::Isolate::GetCurrent()));
17302 CHECK_EQ(object_, visited); 17312 CHECK_EQ(Handle<Value>(*object_), Handle<Value>(*visited));
17303 ++counter_; 17313 ++counter_;
17304 } 17314 }
17305 } 17315 }
17306 17316
17307 int counter_; 17317 int counter_;
17308 v8::Persistent<v8::Object> object_; 17318 v8::Persistent<v8::Object> object_;
17309 }; 17319 };
17310 17320
17311 17321
17312 TEST(PersistentHandleVisitor) { 17322 TEST(PersistentHandleVisitor) {
(...skipping 194 matching lines...) Expand 10 before | Expand all | Expand 10 after
17507 } 17517 }
17508 17518
17509 17519
17510 static void CheckContextId(v8::Handle<Object> object, int expected) { 17520 static void CheckContextId(v8::Handle<Object> object, int expected) {
17511 CHECK_EQ(expected, object->Get(v8_str("context_id"))->Int32Value()); 17521 CHECK_EQ(expected, object->Get(v8_str("context_id"))->Int32Value());
17512 } 17522 }
17513 17523
17514 17524
17515 THREADED_TEST(CreationContext) { 17525 THREADED_TEST(CreationContext) {
17516 HandleScope handle_scope(v8::Isolate::GetCurrent()); 17526 HandleScope handle_scope(v8::Isolate::GetCurrent());
17517 Persistent<Context> context1 = Context::New(); 17527 Handle<Context> context1 = Context::New(v8::Isolate::GetCurrent());
17518 InstallContextId(context1, 1); 17528 InstallContextId(context1, 1);
17519 Persistent<Context> context2 = Context::New(); 17529 Handle<Context> context2 = Context::New(v8::Isolate::GetCurrent());
17520 InstallContextId(context2, 2); 17530 InstallContextId(context2, 2);
17521 Persistent<Context> context3 = Context::New(); 17531 Handle<Context> context3 = Context::New(v8::Isolate::GetCurrent());
17522 InstallContextId(context3, 3); 17532 InstallContextId(context3, 3);
17523 17533
17524 Local<v8::FunctionTemplate> tmpl = v8::FunctionTemplate::New(); 17534 Local<v8::FunctionTemplate> tmpl = v8::FunctionTemplate::New();
17525 17535
17526 Local<Object> object1; 17536 Local<Object> object1;
17527 Local<Function> func1; 17537 Local<Function> func1;
17528 { 17538 {
17529 Context::Scope scope(context1); 17539 Context::Scope scope(context1);
17530 object1 = Object::New(); 17540 object1 = Object::New();
17531 func1 = tmpl->GetFunction(); 17541 func1 = tmpl->GetFunction();
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
17585 CheckContextId(func1, 1); 17595 CheckContextId(func1, 1);
17586 CHECK(instance1->CreationContext() == context1); 17596 CHECK(instance1->CreationContext() == context1);
17587 CheckContextId(instance1, 1); 17597 CheckContextId(instance1, 1);
17588 CHECK(object2->CreationContext() == context2); 17598 CHECK(object2->CreationContext() == context2);
17589 CheckContextId(object2, 2); 17599 CheckContextId(object2, 2);
17590 CHECK(func2->CreationContext() == context2); 17600 CHECK(func2->CreationContext() == context2);
17591 CheckContextId(func2, 2); 17601 CheckContextId(func2, 2);
17592 CHECK(instance2->CreationContext() == context2); 17602 CHECK(instance2->CreationContext() == context2);
17593 CheckContextId(instance2, 2); 17603 CheckContextId(instance2, 2);
17594 } 17604 }
17595
17596 context1.Dispose(context1->GetIsolate());
17597 context2.Dispose(context2->GetIsolate());
17598 context3.Dispose(context3->GetIsolate());
17599 } 17605 }
17600 17606
17601 17607
17602 THREADED_TEST(CreationContextOfJsFunction) { 17608 THREADED_TEST(CreationContextOfJsFunction) {
17603 HandleScope handle_scope(v8::Isolate::GetCurrent()); 17609 HandleScope handle_scope(v8::Isolate::GetCurrent());
17604 Persistent<Context> context = Context::New(); 17610 Handle<Context> context = Context::New(v8::Isolate::GetCurrent());
17605 InstallContextId(context, 1); 17611 InstallContextId(context, 1);
17606 17612
17607 Local<Object> function; 17613 Local<Object> function;
17608 { 17614 {
17609 Context::Scope scope(context); 17615 Context::Scope scope(context);
17610 function = CompileRun("function foo() {}; foo").As<Object>(); 17616 function = CompileRun("function foo() {}; foo").As<Object>();
17611 } 17617 }
17612 17618
17613 CHECK(function->CreationContext() == context); 17619 CHECK(function->CreationContext() == context);
17614 CheckContextId(function, 1); 17620 CheckContextId(function, 1);
17615
17616 context.Dispose(context->GetIsolate());
17617 } 17621 }
17618 17622
17619 17623
17620 Handle<Value> HasOwnPropertyIndexedPropertyGetter(uint32_t index, 17624 Handle<Value> HasOwnPropertyIndexedPropertyGetter(uint32_t index,
17621 const AccessorInfo& info) { 17625 const AccessorInfo& info) {
17622 if (index == 42) return v8_str("yes"); 17626 if (index == 42) return v8_str("yes");
17623 return Handle<v8::Integer>(); 17627 return Handle<v8::Integer>();
17624 } 17628 }
17625 17629
17626 17630
(...skipping 1230 matching lines...) Expand 10 before | Expand all | Expand 10 after
18857 i::Semaphore* sem_; 18861 i::Semaphore* sem_;
18858 volatile int sem_value_; 18862 volatile int sem_value_;
18859 }; 18863 };
18860 18864
18861 18865
18862 THREADED_TEST(SemaphoreInterruption) { 18866 THREADED_TEST(SemaphoreInterruption) {
18863 ThreadInterruptTest().RunTest(); 18867 ThreadInterruptTest().RunTest();
18864 } 18868 }
18865 18869
18866 #endif // WIN32 18870 #endif // WIN32
OLDNEW
« no previous file with comments | « test/cctest/test-alloc.cc ('k') | test/cctest/test-assembler-arm.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698