Index: vm/dart_api_impl.h |
=================================================================== |
--- vm/dart_api_impl.h (revision 17884) |
+++ vm/dart_api_impl.h (working copy) |
@@ -52,11 +52,6 @@ |
} \ |
} while (0) |
-#define DARTSCOPE_NOCHECKS(isolate) \ |
- Isolate* __temp_isolate__ = (isolate); \ |
- ASSERT(__temp_isolate__ != NULL); \ |
- HANDLESCOPE(__temp_isolate__); |
- |
#define DARTSCOPE(isolate) \ |
Isolate* __temp_isolate__ = (isolate); \ |
CHECK_ISOLATE_SCOPE(__temp_isolate__); \ |
@@ -109,6 +104,16 @@ |
// Gets the handle used to designate successful return. |
static Dart_Handle Success(Isolate* isolate); |
+ // Sets up the callback error object after initializing an Isolate. This |
+ // object is pre-created because we will not be able to allocate this |
+ // object when the error actually occurs. When the error occurs there will |
+ // be outstanding acquires to internal data pointers making it unsafe to |
+ // allocate objects on the dart heap. |
+ static void SetupCallbackError(Isolate* isolate); |
+ |
+ // Gets the handle which holds the pre-created callback error object. |
+ static Dart_Handle CallbackError(Isolate* isolate); |
+ |
// Returns true if the handle holds a Smi. |
static bool IsSmi(Dart_Handle handle) { |
// TODO(turnidge): Assumes RawObject* is at offset zero. Fix. |
@@ -175,6 +180,19 @@ |
DISALLOW_COPY_AND_ASSIGN(IsolateSaver); |
}; |
+// Start a scope in which no Dart API call backs are allowed. |
+#define START_NO_CALLBACK_SCOPE(isolate) \ |
+ isolate->IncrementNoCallbackScopeDepth() |
+ |
+// End a no Dart API call backs Scope. |
+#define END_NO_CALLBACK_SCOPE(isolate) \ |
+ isolate->DecrementNoCallbackScopeDepth() |
+ |
+#define CHECK_CALLBACK_STATE(isolate) \ |
+ if (isolate->no_callback_scope_depth() != 0) { \ |
+ return reinterpret_cast<Dart_Handle>(Api::CallbackError(isolate)); \ |
+ } \ |
+ |
} // namespace dart. |
#endif // VM_DART_API_IMPL_H_ |