OLD | NEW |
1 // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 #ifndef RUNTIME_VM_DART_API_IMPL_H_ | 5 #ifndef RUNTIME_VM_DART_API_IMPL_H_ |
6 #define RUNTIME_VM_DART_API_IMPL_H_ | 6 #define RUNTIME_VM_DART_API_IMPL_H_ |
7 | 7 |
8 #include "vm/allocation.h" | 8 #include "vm/allocation.h" |
9 #include "vm/native_arguments.h" | 9 #include "vm/native_arguments.h" |
10 #include "vm/object.h" | 10 #include "vm/object.h" |
11 #include "vm/safepoint.h" | 11 #include "vm/safepoint.h" |
12 | 12 |
13 namespace dart { | 13 namespace dart { |
14 | 14 |
15 class ApiLocalScope; | 15 class ApiLocalScope; |
16 class ApiState; | 16 class ApiState; |
17 class FinalizablePersistentHandle; | 17 class FinalizablePersistentHandle; |
18 class LocalHandle; | 18 class LocalHandle; |
19 class PersistentHandle; | 19 class PersistentHandle; |
20 class ReusableObjectHandleScope; | 20 class ReusableObjectHandleScope; |
21 | 21 |
22 const char* CanonicalFunction(const char* func); | 22 const char* CanonicalFunction(const char* func); |
23 | 23 |
24 #define CURRENT_FUNC CanonicalFunction(__FUNCTION__) | 24 #define CURRENT_FUNC CanonicalFunction(__FUNCTION__) |
25 | 25 |
26 // Checks that the current isolate is not NULL. | 26 // Checks that the current isolate is not NULL. |
27 #define CHECK_ISOLATE(isolate) \ | 27 #define CHECK_ISOLATE(isolate) \ |
28 do { \ | 28 do { \ |
29 if ((isolate) == NULL) { \ | 29 if ((isolate) == NULL) { \ |
30 FATAL1("%s expects there to be a current isolate. Did you " \ | 30 FATAL1( \ |
31 "forget to call Dart_CreateIsolate or Dart_EnterIsolate?", \ | 31 "%s expects there to be a current isolate. Did you " \ |
32 CURRENT_FUNC); \ | 32 "forget to call Dart_CreateIsolate or Dart_EnterIsolate?", \ |
| 33 CURRENT_FUNC); \ |
33 } \ | 34 } \ |
34 } while (0) | 35 } while (0) |
35 | 36 |
36 // Checks that the current isolate is NULL. | 37 // Checks that the current isolate is NULL. |
37 #define CHECK_NO_ISOLATE(isolate) \ | 38 #define CHECK_NO_ISOLATE(isolate) \ |
38 do { \ | 39 do { \ |
39 if ((isolate) != NULL) { \ | 40 if ((isolate) != NULL) { \ |
40 FATAL1("%s expects there to be no current isolate. Did you " \ | 41 FATAL1( \ |
41 "forget to call Dart_ExitIsolate?", CURRENT_FUNC); \ | 42 "%s expects there to be no current isolate. Did you " \ |
| 43 "forget to call Dart_ExitIsolate?", \ |
| 44 CURRENT_FUNC); \ |
42 } \ | 45 } \ |
43 } while (0) | 46 } while (0) |
44 | 47 |
45 // Checks that the current isolate is not NULL and that it has an API scope. | 48 // Checks that the current isolate is not NULL and that it has an API scope. |
46 #define CHECK_API_SCOPE(thread) \ | 49 #define CHECK_API_SCOPE(thread) \ |
47 do { \ | 50 do { \ |
48 Thread* tmpT = (thread); \ | 51 Thread* tmpT = (thread); \ |
49 Isolate* tmpI = tmpT->isolate(); \ | 52 Isolate* tmpI = tmpT->isolate(); \ |
50 CHECK_ISOLATE(tmpI); \ | 53 CHECK_ISOLATE(tmpI); \ |
51 if (tmpT->api_top_scope() == NULL) { \ | 54 if (tmpT->api_top_scope() == NULL) { \ |
52 FATAL1("%s expects to find a current scope. Did you forget to call " \ | 55 FATAL1( \ |
53 "Dart_EnterScope?", CURRENT_FUNC); \ | 56 "%s expects to find a current scope. Did you forget to call " \ |
| 57 "Dart_EnterScope?", \ |
| 58 CURRENT_FUNC); \ |
54 } \ | 59 } \ |
55 } while (0); \ | 60 } while (0); |
56 | 61 |
57 #define DARTSCOPE(thread) \ | 62 #define DARTSCOPE(thread) \ |
58 Thread* T = (thread); \ | 63 Thread* T = (thread); \ |
59 CHECK_API_SCOPE(T); \ | 64 CHECK_API_SCOPE(T); \ |
60 TransitionNativeToVM transition(T); \ | 65 TransitionNativeToVM transition(T); \ |
61 HANDLESCOPE(T); | 66 HANDLESCOPE(T); |
62 | 67 |
63 | 68 |
64 #define RETURN_TYPE_ERROR(zone, dart_handle, type) \ | 69 #define RETURN_TYPE_ERROR(zone, dart_handle, type) \ |
65 do { \ | 70 do { \ |
(...skipping 28 matching lines...) Expand all Loading... |
94 | 99 |
95 | 100 |
96 class Api : AllStatic { | 101 class Api : AllStatic { |
97 public: | 102 public: |
98 // Create on the stack to provide a new throw-safe api scope. | 103 // Create on the stack to provide a new throw-safe api scope. |
99 class Scope : public StackResource { | 104 class Scope : public StackResource { |
100 public: | 105 public: |
101 explicit Scope(Thread* thread) : StackResource(thread) { | 106 explicit Scope(Thread* thread) : StackResource(thread) { |
102 Dart_EnterScope(); | 107 Dart_EnterScope(); |
103 } | 108 } |
104 ~Scope() { | 109 ~Scope() { Dart_ExitScope(); } |
105 Dart_ExitScope(); | |
106 } | |
107 | 110 |
108 private: | 111 private: |
109 DISALLOW_COPY_AND_ASSIGN(Scope); | 112 DISALLOW_COPY_AND_ASSIGN(Scope); |
110 }; | 113 }; |
111 | 114 |
112 // Creates a new local handle. | 115 // Creates a new local handle. |
113 static Dart_Handle NewHandle(Thread* thread, RawObject* raw); | 116 static Dart_Handle NewHandle(Thread* thread, RawObject* raw); |
114 | 117 |
115 // Unwraps the raw object from the handle. | 118 // Unwraps the raw object from the handle. |
116 static RawObject* UnwrapHandle(Dart_Handle object); | 119 static RawObject* UnwrapHandle(Dart_Handle object); |
117 | 120 |
118 // Unwraps a raw Type from the handle. The handle will be null if | 121 // Unwraps a raw Type from the handle. The handle will be null if |
119 // the object was not of the requested Type. | 122 // the object was not of the requested Type. |
120 #define DECLARE_UNWRAP(Type) \ | 123 #define DECLARE_UNWRAP(Type) \ |
121 static const Type& Unwrap##Type##Handle(Zone* zone, \ | 124 static const Type& Unwrap##Type##Handle(Zone* zone, Dart_Handle object); |
122 Dart_Handle object); | |
123 CLASS_LIST_FOR_HANDLES(DECLARE_UNWRAP) | 125 CLASS_LIST_FOR_HANDLES(DECLARE_UNWRAP) |
124 #undef DECLARE_UNWRAP | 126 #undef DECLARE_UNWRAP |
125 | 127 |
126 // Unwraps the raw object from the handle using a reused handle. | 128 // Unwraps the raw object from the handle using a reused handle. |
127 static const String& UnwrapStringHandle( | 129 static const String& UnwrapStringHandle( |
128 const ReusableObjectHandleScope& reused, Dart_Handle object); | 130 const ReusableObjectHandleScope& reused, |
| 131 Dart_Handle object); |
129 static const Instance& UnwrapInstanceHandle( | 132 static const Instance& UnwrapInstanceHandle( |
130 const ReusableObjectHandleScope& reused, Dart_Handle object); | 133 const ReusableObjectHandleScope& reused, |
| 134 Dart_Handle object); |
131 | 135 |
132 // Returns an Error handle if isolate is in an inconsistent state | 136 // Returns an Error handle if isolate is in an inconsistent state |
133 // or there was an error while finalizing classes. | 137 // or there was an error while finalizing classes. |
134 // Returns a Success handle when no error condition exists. | 138 // Returns a Success handle when no error condition exists. |
135 static Dart_Handle CheckAndFinalizePendingClasses(Thread *thread); | 139 static Dart_Handle CheckAndFinalizePendingClasses(Thread* thread); |
136 | 140 |
137 // Casts the internal Isolate* type to the external Dart_Isolate type. | 141 // Casts the internal Isolate* type to the external Dart_Isolate type. |
138 static Dart_Isolate CastIsolate(Isolate* isolate); | 142 static Dart_Isolate CastIsolate(Isolate* isolate); |
139 | 143 |
140 // Gets the handle used to designate successful return. | 144 // Gets the handle used to designate successful return. |
141 static Dart_Handle Success() { return Api::True(); } | 145 static Dart_Handle Success() { return Api::True(); } |
142 | 146 |
143 // Sets up the acquired error object after initializing an Isolate. This | 147 // Sets up the acquired error object after initializing an Isolate. This |
144 // object is pre-created because we will not be able to allocate this | 148 // object is pre-created because we will not be able to allocate this |
145 // object when the error actually occurs. When the error occurs there will | 149 // object when the error actually occurs. When the error occurs there will |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
180 if (!raw->IsHeapObject()) { | 184 if (!raw->IsHeapObject()) { |
181 return kSmiCid; | 185 return kSmiCid; |
182 } | 186 } |
183 return raw->GetClassId(); | 187 return raw->GetClassId(); |
184 } | 188 } |
185 | 189 |
186 // Generates a handle used to designate an error return. | 190 // Generates a handle used to designate an error return. |
187 static Dart_Handle NewError(const char* format, ...) PRINTF_ATTRIBUTE(1, 2); | 191 static Dart_Handle NewError(const char* format, ...) PRINTF_ATTRIBUTE(1, 2); |
188 | 192 |
189 // Gets a handle to Null. | 193 // Gets a handle to Null. |
190 static Dart_Handle Null() { | 194 static Dart_Handle Null() { return null_handle_; } |
191 return null_handle_; | |
192 } | |
193 | 195 |
194 // Gets a handle to True. | 196 // Gets a handle to True. |
195 static Dart_Handle True() { | 197 static Dart_Handle True() { return true_handle_; } |
196 return true_handle_; | |
197 } | |
198 | 198 |
199 // Gets a handle to False. | 199 // Gets a handle to False. |
200 static Dart_Handle False() { | 200 static Dart_Handle False() { return false_handle_; } |
201 return false_handle_; | |
202 } | |
203 | 201 |
204 // Gets a handle to EmptyString. | 202 // Gets a handle to EmptyString. |
205 static Dart_Handle EmptyString() { | 203 static Dart_Handle EmptyString() { return empty_string_handle_; } |
206 return empty_string_handle_; | |
207 } | |
208 | 204 |
209 // Retrieves the top ApiLocalScope. | 205 // Retrieves the top ApiLocalScope. |
210 static ApiLocalScope* TopScope(Thread* thread); | 206 static ApiLocalScope* TopScope(Thread* thread); |
211 | 207 |
212 // Performs one-time initialization needed by the API. | 208 // Performs one-time initialization needed by the API. |
213 static void InitOnce(); | 209 static void InitOnce(); |
214 | 210 |
215 // Allocates handles for objects in the VM isolate. | 211 // Allocates handles for objects in the VM isolate. |
216 static void InitHandles(); | 212 static void InitHandles(); |
217 | 213 |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
272 static ThreadLocalKey api_native_key_; | 268 static ThreadLocalKey api_native_key_; |
273 static Dart_Handle true_handle_; | 269 static Dart_Handle true_handle_; |
274 static Dart_Handle false_handle_; | 270 static Dart_Handle false_handle_; |
275 static Dart_Handle null_handle_; | 271 static Dart_Handle null_handle_; |
276 static Dart_Handle empty_string_handle_; | 272 static Dart_Handle empty_string_handle_; |
277 | 273 |
278 friend class ApiNativeScope; | 274 friend class ApiNativeScope; |
279 }; | 275 }; |
280 | 276 |
281 // Start a scope in which no Dart API call backs are allowed. | 277 // Start a scope in which no Dart API call backs are allowed. |
282 #define START_NO_CALLBACK_SCOPE(thread) \ | 278 #define START_NO_CALLBACK_SCOPE(thread) thread->IncrementNoCallbackScopeDepth() |
283 thread->IncrementNoCallbackScopeDepth() | |
284 | 279 |
285 // End a no Dart API call backs Scope. | 280 // End a no Dart API call backs Scope. |
286 #define END_NO_CALLBACK_SCOPE(thread) \ | 281 #define END_NO_CALLBACK_SCOPE(thread) thread->DecrementNoCallbackScopeDepth() |
287 thread->DecrementNoCallbackScopeDepth() | |
288 | 282 |
289 #define CHECK_CALLBACK_STATE(thread) \ | 283 #define CHECK_CALLBACK_STATE(thread) \ |
290 if (thread->no_callback_scope_depth() != 0) { \ | 284 if (thread->no_callback_scope_depth() != 0) { \ |
291 return reinterpret_cast<Dart_Handle>( \ | 285 return reinterpret_cast<Dart_Handle>( \ |
292 Api::AcquiredError(thread->isolate())); \ | 286 Api::AcquiredError(thread->isolate())); \ |
293 } \ | 287 } |
294 | 288 |
295 #define CHECK_COMPILATION_ALLOWED(isolate) \ | 289 #define CHECK_COMPILATION_ALLOWED(isolate) \ |
296 if (!isolate->compilation_allowed()) { \ | 290 if (!isolate->compilation_allowed()) { \ |
297 return Api::NewError("%s: Cannot load after Dart_Precompile", \ | 291 return Api::NewError("%s: Cannot load after Dart_Precompile", \ |
298 CURRENT_FUNC); \ | 292 CURRENT_FUNC); \ |
299 } \ | 293 } |
300 | 294 |
301 #define ASSERT_CALLBACK_STATE(thread) \ | 295 #define ASSERT_CALLBACK_STATE(thread) \ |
302 ASSERT(thread->no_callback_scope_depth() == 0) | 296 ASSERT(thread->no_callback_scope_depth() == 0) |
303 | 297 |
304 } // namespace dart. | 298 } // namespace dart. |
305 | 299 |
306 #endif // RUNTIME_VM_DART_API_IMPL_H_ | 300 #endif // RUNTIME_VM_DART_API_IMPL_H_ |
OLD | NEW |