Index: vm/dart_api_impl.cc |
=================================================================== |
--- vm/dart_api_impl.cc (revision 17884) |
+++ vm/dart_api_impl.cc (working copy) |
@@ -192,7 +192,8 @@ |
Dart_Handle Api::NewError(const char* format, ...) { |
Isolate* isolate = Isolate::Current(); |
- DARTSCOPE_NOCHECKS(isolate); |
+ DARTSCOPE(isolate); |
+ CHECK_CALLBACK_STATE(isolate); |
va_list args; |
va_start(args, format); |
@@ -210,6 +211,23 @@ |
} |
+void Api::SetupCallbackError(Isolate* isolate) { |
+ ASSERT(isolate != NULL); |
+ ApiState* state = isolate->api_state(); |
+ ASSERT(state != NULL); |
+ state->SetupCallbackError(); |
+} |
+ |
+ |
+Dart_Handle Api::CallbackError(Isolate* isolate) { |
+ ASSERT(isolate != NULL); |
+ ApiState* state = isolate->api_state(); |
+ ASSERT(state != NULL); |
+ PersistentHandle* callback_error_handle = state->CallbackError(); |
+ return reinterpret_cast<Dart_Handle>(callback_error_handle); |
+} |
+ |
+ |
Dart_Handle Api::Null(Isolate* isolate) { |
ASSERT(isolate != NULL); |
ApiState* state = isolate->api_state(); |
@@ -396,6 +414,7 @@ |
DART_EXPORT Dart_Handle Dart_Error(const char* format, ...) { |
Isolate* isolate = Isolate::Current(); |
DARTSCOPE(isolate); |
+ CHECK_CALLBACK_STATE(isolate); |
va_list args; |
va_start(args, format); |
@@ -418,6 +437,7 @@ |
DART_EXPORT Dart_Handle Dart_NewApiError(const char* format, ...) { |
Isolate* isolate = Isolate::Current(); |
DARTSCOPE(isolate); |
+ CHECK_CALLBACK_STATE(isolate); |
va_list args; |
va_start(args, format); |
@@ -438,6 +458,8 @@ |
DART_EXPORT Dart_Handle Dart_NewUnhandledExceptionError(Dart_Handle exception) { |
Isolate* isolate = Isolate::Current(); |
DARTSCOPE(isolate); |
+ CHECK_CALLBACK_STATE(isolate); |
+ |
const Instance& obj = Api::UnwrapInstanceHandle(isolate, exception); |
if (obj.IsNull()) { |
RETURN_TYPE_ERROR(isolate, exception, Instance); |
@@ -501,9 +523,11 @@ |
if (obj.IsString()) { |
return Api::NewHandle(isolate, obj.raw()); |
} else if (obj.IsInstance()) { |
+ CHECK_CALLBACK_STATE(isolate); |
const Instance& receiver = Instance::Cast(obj); |
return Api::NewHandle(isolate, DartLibraryCalls::ToString(receiver)); |
} else { |
+ CHECK_CALLBACK_STATE(isolate); |
// This is a VM internal object. Call the C++ method of printing. |
return Api::NewHandle(isolate, String::New(obj.ToCString())); |
} |
@@ -520,8 +544,7 @@ |
DART_EXPORT Dart_Handle Dart_NewPersistentHandle(Dart_Handle object) { |
Isolate* isolate = Isolate::Current(); |
- CHECK_ISOLATE(isolate); |
- DARTSCOPE_NOCHECKS(isolate); |
+ DARTSCOPE(isolate); |
ApiState* state = isolate->api_state(); |
ASSERT(state != NULL); |
const Object& old_ref = Object::Handle(isolate, Api::UnwrapHandle(object)); |
@@ -550,8 +573,7 @@ |
void* peer, |
Dart_WeakPersistentHandleFinalizer callback) { |
Isolate* isolate = Isolate::Current(); |
- CHECK_ISOLATE(isolate); |
- DARTSCOPE_NOCHECKS(isolate); |
+ DARTSCOPE(isolate); |
ApiState* state = isolate->api_state(); |
ASSERT(state != NULL); |
return AllocateFinalizableHandle(isolate, |
@@ -567,8 +589,7 @@ |
void* peer, |
Dart_WeakPersistentHandleFinalizer callback) { |
Isolate* isolate = Isolate::Current(); |
- CHECK_ISOLATE(isolate); |
- DARTSCOPE_NOCHECKS(isolate); |
+ DARTSCOPE(isolate); |
ApiState* state = isolate->api_state(); |
ASSERT(state != NULL); |
return AllocateFinalizableHandle(isolate, |
@@ -810,7 +831,7 @@ |
free(isolate_name); |
{ |
StackZone zone(isolate); |
- DARTSCOPE_NOCHECKS(isolate); |
+ HANDLESCOPE(isolate); |
const Error& error_obj = |
Error::Handle(isolate, |
Dart::InitializeIsolate(snapshot, callback_data)); |
@@ -964,6 +985,7 @@ |
Isolate* isolate = Isolate::Current(); |
DARTSCOPE(isolate); |
+ CHECK_CALLBACK_STATE(isolate); |
Monitor monitor; |
MonitorLocker ml(&monitor); |
{ |
@@ -1046,8 +1068,7 @@ |
DART_EXPORT bool Dart_Post(Dart_Port port_id, Dart_Handle handle) { |
Isolate* isolate = Isolate::Current(); |
- CHECK_ISOLATE(isolate); |
- DARTSCOPE_NOCHECKS(isolate); |
+ DARTSCOPE(isolate); |
const Object& object = Object::Handle(isolate, Api::UnwrapHandle(handle)); |
uint8_t* data = NULL; |
MessageWriter writer(&data, &allocator); |
@@ -1093,6 +1114,7 @@ |
DART_EXPORT Dart_Handle Dart_NewSendPort(Dart_Port port_id) { |
Isolate* isolate = Isolate::Current(); |
DARTSCOPE(isolate); |
+ CHECK_CALLBACK_STATE(isolate); |
return Api::NewHandle(isolate, DartLibraryCalls::NewSendPort(port_id)); |
} |
@@ -1100,6 +1122,8 @@ |
DART_EXPORT Dart_Handle Dart_GetReceivePort(Dart_Port port_id) { |
Isolate* isolate = Isolate::Current(); |
DARTSCOPE(isolate); |
+ CHECK_CALLBACK_STATE(isolate); |
+ |
Library& isolate_lib = Library::Handle(isolate, Library::IsolateLibrary()); |
ASSERT(!isolate_lib.IsNull()); |
const String& class_name = String::Handle( |
@@ -1191,6 +1215,7 @@ |
bool* value) { |
Isolate* isolate = Isolate::Current(); |
DARTSCOPE(isolate); |
+ CHECK_CALLBACK_STATE(isolate); |
const Instance& expected = |
Instance::CheckedHandle(isolate, Api::UnwrapHandle(obj1)); |
const Instance& actual = |
@@ -1235,6 +1260,7 @@ |
return Api::NewError("%s", msg); |
} |
if (obj.IsInstance()) { |
+ CHECK_CALLBACK_STATE(isolate); |
const Type& type = Type::Handle(isolate, |
Type::NewNonParameterizedType(cls)); |
Error& malformed_type_error = Error::Handle(isolate); |
@@ -1299,7 +1325,7 @@ |
return Api::Success(isolate); |
} |
// Slow path for Mints and Bigints. |
- DARTSCOPE_NOCHECKS(isolate); |
+ DARTSCOPE(isolate); |
const Integer& int_obj = Api::UnwrapIntegerHandle(isolate, integer); |
if (int_obj.IsNull()) { |
RETURN_TYPE_ERROR(isolate, integer, Integer); |
@@ -1320,7 +1346,7 @@ |
return Api::Success(isolate); |
} |
// Slow path for Mints and Bigints. |
- DARTSCOPE_NOCHECKS(isolate); |
+ DARTSCOPE(isolate); |
const Integer& int_obj = Api::UnwrapIntegerHandle(isolate, integer); |
if (int_obj.IsNull()) { |
RETURN_TYPE_ERROR(isolate, integer, Integer); |
@@ -1344,7 +1370,8 @@ |
return Api::NewHandle(isolate, Smi::New(static_cast<intptr_t>(value))); |
} |
// Slow path for Mints and Bigints. |
- DARTSCOPE_NOCHECKS(isolate); |
+ DARTSCOPE(isolate); |
+ CHECK_CALLBACK_STATE(isolate); |
return Api::NewHandle(isolate, Integer::New(value)); |
} |
@@ -1352,6 +1379,7 @@ |
DART_EXPORT Dart_Handle Dart_NewIntegerFromHexCString(const char* str) { |
Isolate* isolate = Isolate::Current(); |
DARTSCOPE(isolate); |
+ CHECK_CALLBACK_STATE(isolate); |
const String& str_obj = String::Handle(isolate, String::New(str)); |
return Api::NewHandle(isolate, Integer::New(str_obj)); |
} |
@@ -1367,7 +1395,7 @@ |
return Api::Success(isolate); |
} |
// Slow path for Mints and Bigints. |
- DARTSCOPE_NOCHECKS(isolate); |
+ DARTSCOPE(isolate); |
const Integer& int_obj = Api::UnwrapIntegerHandle(isolate, integer); |
if (int_obj.IsNull()) { |
RETURN_TYPE_ERROR(isolate, integer, Integer); |
@@ -1401,7 +1429,7 @@ |
} |
} |
// Slow path for Mints and Bigints. |
- DARTSCOPE_NOCHECKS(isolate); |
+ DARTSCOPE(isolate); |
const Integer& int_obj = Api::UnwrapIntegerHandle(isolate, integer); |
if (int_obj.IsNull()) { |
RETURN_TYPE_ERROR(isolate, integer, Integer); |
@@ -1500,6 +1528,7 @@ |
DART_EXPORT Dart_Handle Dart_NewDouble(double value) { |
Isolate* isolate = Isolate::Current(); |
DARTSCOPE(isolate); |
+ CHECK_CALLBACK_STATE(isolate); |
return Api::NewHandle(isolate, Double::New(value)); |
} |
@@ -1548,6 +1577,7 @@ |
if (str == NULL) { |
RETURN_NULL_ERROR(str); |
} |
+ CHECK_CALLBACK_STATE(isolate); |
return Api::NewHandle(isolate, String::New(str)); |
} |
@@ -1564,6 +1594,7 @@ |
return Api::NewError("%s expects argument 'str' to be valid UTF-8.", |
CURRENT_FUNC); |
} |
+ CHECK_CALLBACK_STATE(isolate); |
return Api::NewHandle(isolate, String::FromUTF8(utf8_array, length)); |
} |
@@ -1576,6 +1607,7 @@ |
RETURN_NULL_ERROR(utf16_array); |
} |
CHECK_LENGTH(length, String::kMaxElements); |
+ CHECK_CALLBACK_STATE(isolate); |
return Api::NewHandle(isolate, String::FromUTF16(utf16_array, length)); |
} |
@@ -1588,6 +1620,7 @@ |
RETURN_NULL_ERROR(utf32_array); |
} |
CHECK_LENGTH(length, String::kMaxElements); |
+ CHECK_CALLBACK_STATE(isolate); |
return Api::NewHandle(isolate, String::FromUTF32(utf32_array, length)); |
} |
@@ -1630,6 +1663,7 @@ |
RETURN_NULL_ERROR(latin1_array); |
} |
CHECK_LENGTH(length, String::kMaxElements); |
+ CHECK_CALLBACK_STATE(isolate); |
return Api::NewHandle(isolate, |
String::NewExternal(latin1_array, length, peer, cback)); |
} |
@@ -1645,6 +1679,7 @@ |
RETURN_NULL_ERROR(utf16_array); |
} |
CHECK_LENGTH(length, String::kMaxElements); |
+ CHECK_CALLBACK_STATE(isolate); |
return Api::NewHandle(isolate, |
String::NewExternal(utf16_array, length, peer, cback)); |
} |
@@ -1853,6 +1888,7 @@ |
Isolate* isolate = Isolate::Current(); |
DARTSCOPE(isolate); |
CHECK_LENGTH(length, Array::kMaxElements); |
+ CHECK_CALLBACK_STATE(isolate); |
return Api::NewHandle(isolate, Array::New(length)); |
} |
@@ -1881,6 +1917,8 @@ |
if (obj.IsGrowableObjectArray()) { |
GET_LIST_LENGTH(isolate, GrowableObjectArray, obj, len); |
} |
+ CHECK_CALLBACK_STATE(isolate); |
+ |
// Now check and handle a dart object that implements the List interface. |
const Instance& instance = |
Instance::Handle(isolate, GetListInstance(isolate, obj)); |
@@ -1948,6 +1986,8 @@ |
} else if (obj.IsError()) { |
return list; |
} else { |
+ CHECK_CALLBACK_STATE(isolate); |
+ |
// Check and handle a dart object that implements the List interface. |
const Instance& instance = |
Instance::Handle(isolate, GetListInstance(isolate, obj)); |
@@ -1998,6 +2038,8 @@ |
} else if (obj.IsError()) { |
return list; |
} else { |
+ CHECK_CALLBACK_STATE(isolate); |
+ |
// Check and handle a dart object that implements the List interface. |
const Instance& instance = |
Instance::Handle(isolate, GetListInstance(isolate, obj)); |
@@ -2084,6 +2126,8 @@ |
} else if (obj.IsError()) { |
return list; |
} else { |
+ CHECK_CALLBACK_STATE(isolate); |
+ |
// Check and handle a dart object that implements the List interface. |
const Instance& instance = |
Instance::Handle(isolate, GetListInstance(isolate, obj)); |
@@ -2171,6 +2215,8 @@ |
} else if (obj.IsError()) { |
return list; |
} else { |
+ CHECK_CALLBACK_STATE(isolate); |
+ |
// Check and handle a dart object that implements the List interface. |
const Instance& instance = |
Instance::Handle(isolate, GetListInstance(isolate, obj)); |
@@ -2223,6 +2269,7 @@ |
Isolate* isolate = Isolate::Current(); |
DARTSCOPE(isolate); |
CHECK_LENGTH(length, Uint8Array::kMaxElements); |
+ CHECK_CALLBACK_STATE(isolate); |
return Api::NewHandle(isolate, Uint8Array::New(length)); |
} |
@@ -2237,6 +2284,7 @@ |
RETURN_NULL_ERROR(data); |
} |
CHECK_LENGTH(length, ExternalUint8Array::kMaxElements); |
+ CHECK_CALLBACK_STATE(isolate); |
return Api::NewHandle( |
isolate, ExternalUint8Array::New(data, length, peer, callback)); |
} |
@@ -2253,6 +2301,7 @@ |
RETURN_NULL_ERROR(data); |
} |
CHECK_LENGTH(length, ExternalUint8ClampedArray::kMaxElements); |
+ CHECK_CALLBACK_STATE(isolate); |
return Api::NewHandle( |
isolate, ExternalUint8ClampedArray::New(data, length, peer, callback)); |
} |
@@ -2292,182 +2341,46 @@ |
} |
-template<typename T> |
-Dart_Handle ByteArrayGetAt(T* value, Dart_Handle array, intptr_t offset) { |
+DART_EXPORT Dart_Handle Dart_ScalarListAcquireData(Dart_Handle array, |
+ Dart_Scalar_Type* type, |
+ void** data, |
+ intptr_t* len) { |
Isolate* isolate = Isolate::Current(); |
- CHECK_ISOLATE(isolate); |
- const ByteArray& array_obj = Api::UnwrapByteArrayHandle(isolate, array); |
- if (array_obj.IsNull()) { |
- RETURN_TYPE_ERROR(isolate, array, ByteArray); |
+ DARTSCOPE(isolate); |
+ if (!RawObject::IsByteArrayClassId(Api::ClassId(array))) { |
+ RETURN_TYPE_ERROR(isolate, array, 'scalar list'); |
} |
- intptr_t length = sizeof(T); |
- if (!Utils::RangeCheck(offset, length, array_obj.ByteLength())) { |
- return Api::NewError("Invalid index passed in to get byte array element"); |
+ if (type == NULL) { |
+ RETURN_NULL_ERROR(type); |
} |
- uint8_t* dst = reinterpret_cast<uint8_t*>(value); |
- ByteArray::Copy(dst, array_obj, offset, length); |
+ if (data == NULL) { |
+ RETURN_NULL_ERROR(data); |
+ } |
+ if (len == NULL) { |
+ RETURN_NULL_ERROR(len); |
+ } |
+ isolate->IncrementNoGCScopeDepth(); |
+ START_NO_CALLBACK_SCOPE(isolate); |
+ |
+ UNIMPLEMENTED(); |
return Api::Success(isolate); |
} |
-template<typename T> |
-Dart_Handle ByteArraySetAt(Dart_Handle array, intptr_t offset, T value) { |
+DART_EXPORT Dart_Handle Dart_ScalarListReleaseData(Dart_Handle array) { |
Isolate* isolate = Isolate::Current(); |
- CHECK_ISOLATE(isolate); |
- const ByteArray& array_obj = Api::UnwrapByteArrayHandle(isolate, array); |
- if (array_obj.IsNull()) { |
- RETURN_TYPE_ERROR(isolate, array, ByteArray); |
+ DARTSCOPE(isolate); |
+ if (!RawObject::IsByteArrayClassId(Api::ClassId(array))) { |
+ RETURN_TYPE_ERROR(isolate, array, 'scalar list'); |
} |
- intptr_t length = sizeof(T); |
- if (!Utils::RangeCheck(offset, length, array_obj.ByteLength())) { |
- return Api::NewError("Invalid index passed in to get byte array element"); |
- } |
- const uint8_t* src = reinterpret_cast<uint8_t*>(&value); |
- ByteArray::Copy(array_obj, offset, src, length); |
+ |
+ UNIMPLEMENTED(); |
+ isolate->DecrementNoGCScopeDepth(); |
+ END_NO_CALLBACK_SCOPE(isolate); |
return Api::Success(isolate); |
} |
-DART_EXPORT Dart_Handle Dart_ByteArrayGetInt8At(Dart_Handle array, |
- intptr_t byte_offset, |
- int8_t* value) { |
- return ByteArrayGetAt(value, array, byte_offset); |
-} |
- |
- |
-DART_EXPORT Dart_Handle Dart_ByteArraySetInt8At(Dart_Handle array, |
- intptr_t byte_offset, |
- int8_t value) { |
- return ByteArraySetAt(array, byte_offset, value); |
-} |
- |
- |
-DART_EXPORT Dart_Handle Dart_ByteArrayGetUint8At(Dart_Handle array, |
- intptr_t byte_offset, |
- uint8_t* value) { |
- return ByteArrayGetAt(value, array, byte_offset); |
-} |
- |
- |
-DART_EXPORT Dart_Handle Dart_ByteArraySetUint8At(Dart_Handle array, |
- intptr_t byte_offset, |
- uint8_t value) { |
- return ByteArraySetAt(array, byte_offset, value); |
-} |
- |
- |
-DART_EXPORT Dart_Handle Dart_ByteArrayGetInt16At(Dart_Handle array, |
- intptr_t byte_offset, |
- int16_t* value) { |
- return ByteArrayGetAt(value, array, byte_offset); |
-} |
- |
- |
-DART_EXPORT Dart_Handle Dart_ByteArraySetInt16At(Dart_Handle array, |
- intptr_t byte_offset, |
- int16_t value) { |
- return ByteArraySetAt(array, byte_offset, value); |
-} |
- |
- |
-DART_EXPORT Dart_Handle Dart_ByteArrayGetUint16At(Dart_Handle array, |
- intptr_t byte_offset, |
- uint16_t* value) { |
- return ByteArrayGetAt(value, array, byte_offset); |
-} |
- |
- |
-DART_EXPORT Dart_Handle Dart_ByteArraySetUint16At(Dart_Handle array, |
- intptr_t byte_offset, |
- uint16_t value) { |
- return ByteArraySetAt(array, byte_offset, value); |
-} |
- |
- |
-DART_EXPORT Dart_Handle Dart_ByteArrayGetInt32At(Dart_Handle array, |
- intptr_t byte_offset, |
- int32_t* value) { |
- return ByteArrayGetAt(value, array, byte_offset); |
-} |
- |
- |
-DART_EXPORT Dart_Handle Dart_ByteArraySetInt32At(Dart_Handle array, |
- intptr_t byte_offset, |
- int32_t value) { |
- return ByteArraySetAt(array, byte_offset, value); |
-} |
- |
- |
-DART_EXPORT Dart_Handle Dart_ByteArrayGetUint32At(Dart_Handle array, |
- intptr_t byte_offset, |
- uint32_t* value) { |
- return ByteArrayGetAt(value, array, byte_offset); |
-} |
- |
- |
-DART_EXPORT Dart_Handle Dart_ByteArraySetUint32At(Dart_Handle array, |
- intptr_t byte_offset, |
- uint32_t value) { |
- return ByteArraySetAt(array, byte_offset, value); |
-} |
- |
- |
-DART_EXPORT Dart_Handle Dart_ByteArrayGetInt64At(Dart_Handle array, |
- intptr_t byte_offset, |
- int64_t* value) { |
- return ByteArrayGetAt(value, array, byte_offset); |
-} |
- |
- |
-DART_EXPORT Dart_Handle Dart_ByteArraySetInt64At(Dart_Handle array, |
- intptr_t byte_offset, |
- int64_t value) { |
- return ByteArraySetAt(array, byte_offset, value); |
-} |
- |
- |
-DART_EXPORT Dart_Handle Dart_ByteArrayGetUint64At(Dart_Handle array, |
- intptr_t byte_offset, |
- uint64_t* value) { |
- return ByteArrayGetAt(value, array, byte_offset); |
-} |
- |
- |
-DART_EXPORT Dart_Handle Dart_ByteArraySetUint64At(Dart_Handle array, |
- intptr_t byte_offset, |
- uint64_t value) { |
- return ByteArraySetAt(array, byte_offset, value); |
-} |
- |
- |
-DART_EXPORT Dart_Handle Dart_ByteArrayGetFloat32At(Dart_Handle array, |
- intptr_t byte_offset, |
- float* value) { |
- return ByteArrayGetAt(value, array, byte_offset); |
-} |
- |
- |
-DART_EXPORT Dart_Handle Dart_ByteArraySetFloat32At(Dart_Handle array, |
- intptr_t byte_offset, |
- float value) { |
- return ByteArraySetAt(array, byte_offset, value); |
-} |
- |
- |
-DART_EXPORT Dart_Handle Dart_ByteArrayGetFloat64At(Dart_Handle array, |
- intptr_t byte_offset, |
- double* value) { |
- return ByteArrayGetAt(value, array, byte_offset); |
-} |
- |
- |
-DART_EXPORT Dart_Handle Dart_ByteArraySetFloat64At(Dart_Handle array, |
- intptr_t byte_offset, |
- double value) { |
- return ByteArraySetAt(array, byte_offset, value); |
-} |
- |
- |
// --- Closures --- |
@@ -2501,6 +2414,7 @@ |
Dart_Handle* arguments) { |
Isolate* isolate = Isolate::Current(); |
DARTSCOPE(isolate); |
+ CHECK_CALLBACK_STATE(isolate); |
const Instance& closure_obj = Api::UnwrapInstanceHandle(isolate, closure); |
if (closure_obj.IsNull() || !closure_obj.IsCallable(NULL, NULL)) { |
RETURN_TYPE_ERROR(isolate, closure, Instance); |
@@ -3349,6 +3263,7 @@ |
Dart_Handle* arguments) { |
Isolate* isolate = Isolate::Current(); |
DARTSCOPE(isolate); |
+ CHECK_CALLBACK_STATE(isolate); |
Object& result = Object::Handle(isolate); |
if (number_of_arguments < 0) { |
@@ -3363,6 +3278,7 @@ |
if (cls.IsNull()) { |
RETURN_TYPE_ERROR(isolate, clazz, Class); |
} |
+ |
String& base_constructor_name = String::Handle(); |
base_constructor_name = cls.Name(); |
@@ -3449,6 +3365,7 @@ |
Dart_Handle* arguments) { |
Isolate* isolate = Isolate::Current(); |
DARTSCOPE(isolate); |
+ CHECK_CALLBACK_STATE(isolate); |
const String& function_name = Api::UnwrapStringHandle(isolate, name); |
if (function_name.IsNull()) { |
@@ -3592,6 +3509,7 @@ |
DART_EXPORT Dart_Handle Dart_GetField(Dart_Handle container, Dart_Handle name) { |
Isolate* isolate = Isolate::Current(); |
DARTSCOPE(isolate); |
+ CHECK_CALLBACK_STATE(isolate); |
const String& field_name = Api::UnwrapStringHandle(isolate, name); |
if (field_name.IsNull()) { |
@@ -3706,6 +3624,7 @@ |
Dart_Handle value) { |
Isolate* isolate = Isolate::Current(); |
DARTSCOPE(isolate); |
+ CHECK_CALLBACK_STATE(isolate); |
const String& field_name = Api::UnwrapStringHandle(isolate, name); |
if (field_name.IsNull()) { |
@@ -3859,6 +3778,7 @@ |
return Api::NewError( |
"Negative field_count passed to Dart_CreateNativeWrapperClass"); |
} |
+ CHECK_CALLBACK_STATE(isolate); |
String& cls_symbol = String::Handle(isolate, Symbols::New(cls_name)); |
const Class& cls = Class::Handle( |
@@ -3929,6 +3849,7 @@ |
DART_EXPORT Dart_Handle Dart_ThrowException(Dart_Handle exception) { |
Isolate* isolate = Isolate::Current(); |
CHECK_ISOLATE(isolate); |
+ CHECK_CALLBACK_STATE(isolate); |
{ |
const Instance& excp = Api::UnwrapInstanceHandle(isolate, exception); |
if (excp.IsNull()) { |
@@ -3940,6 +3861,7 @@ |
// throw an exception here. |
return Api::NewError("No Dart frames on stack, cannot throw exception"); |
} |
+ |
// Unwind all the API scopes till the exit frame before throwing an |
// exception. |
ApiState* state = isolate->api_state(); |
@@ -3961,6 +3883,7 @@ |
Dart_Handle stacktrace) { |
Isolate* isolate = Isolate::Current(); |
CHECK_ISOLATE(isolate); |
+ CHECK_CALLBACK_STATE(isolate); |
{ |
const Instance& excp = Api::UnwrapInstanceHandle(isolate, exception); |
if (excp.IsNull()) { |
@@ -3976,6 +3899,7 @@ |
// throw an exception here. |
return Api::NewError("No Dart frames on stack, cannot throw exception"); |
} |
+ |
// Unwind all the API scopes till the exit frame before throwing an |
// exception. |
ApiState* state = isolate->api_state(); |
@@ -4092,6 +4016,8 @@ |
return Api::NewError("%s: A script has already been loaded from '%s'.", |
CURRENT_FUNC, library_url.ToCString()); |
} |
+ CHECK_CALLBACK_STATE(isolate); |
+ |
library = Library::New(url_str); |
library.set_debuggable(true); |
library.Register(); |
@@ -4135,6 +4061,7 @@ |
return Api::NewError("%s: argument 'col_offset' must be positive number", |
CURRENT_FUNC); |
} |
+ CHECK_CALLBACK_STATE(isolate); |
library = Library::New(url_str); |
library.set_debuggable(true); |
@@ -4169,6 +4096,8 @@ |
return Api::NewError("%s: A script has already been loaded from '%s'.", |
CURRENT_FUNC, library_url.ToCString()); |
} |
+ CHECK_CALLBACK_STATE(isolate); |
+ |
SnapshotReader reader(snapshot->content(), |
snapshot->length(), |
snapshot->kind(), |
@@ -4213,6 +4142,7 @@ |
if (msg != NULL) { |
return Api::NewError("%s", msg); |
} |
+ CHECK_CALLBACK_STATE(isolate); |
CompileAll(isolate, &result); |
return result; |
} |
@@ -4336,6 +4266,8 @@ |
if (source_str.IsNull()) { |
RETURN_TYPE_ERROR(isolate, source, String); |
} |
+ CHECK_CALLBACK_STATE(isolate); |
+ |
Library& library = Library::Handle(isolate, Library::LookupLibrary(url_str)); |
if (library.IsNull()) { |
library = Library::New(url_str); |
@@ -4388,6 +4320,8 @@ |
if (prefix_vm.IsNull()) { |
RETURN_TYPE_ERROR(isolate, prefix, String); |
} |
+ CHECK_CALLBACK_STATE(isolate); |
+ |
const String& prefix_symbol = |
String::Handle(isolate, Symbols::New(prefix_vm)); |
const Namespace& import_ns = Namespace::Handle( |
@@ -4426,6 +4360,8 @@ |
if (source_str.IsNull()) { |
RETURN_TYPE_ERROR(isolate, source, String); |
} |
+ CHECK_CALLBACK_STATE(isolate); |
+ |
const Script& script = Script::Handle( |
isolate, Script::New(url_str, source_str, RawScript::kSourceTag)); |
Dart_Handle result; |
@@ -4452,6 +4388,8 @@ |
if (source_str.IsNull()) { |
RETURN_TYPE_ERROR(isolate, patch_source, String); |
} |
+ CHECK_CALLBACK_STATE(isolate); |
+ |
const Script& script = Script::Handle( |
isolate, Script::New(url_str, source_str, RawScript::kPatchTag)); |
Dart_Handle result; |