| 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 #include "include/dart_api.h" | 5 #include "include/dart_api.h" |
| 6 | 6 |
| 7 #include "vm/bigint_operations.h" | 7 #include "vm/bigint_operations.h" |
| 8 #include "vm/class_finalizer.h" | 8 #include "vm/class_finalizer.h" |
| 9 #include "vm/compiler.h" | 9 #include "vm/compiler.h" |
| 10 #include "vm/dart.h" | 10 #include "vm/dart.h" |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 48 } else if (tmp.IsApiError()) { \ | 48 } else if (tmp.IsApiError()) { \ |
| 49 return dart_handle; \ | 49 return dart_handle; \ |
| 50 } else { \ | 50 } else { \ |
| 51 return Api::Error("%s expects argument '%s' to be of type %s.", \ | 51 return Api::Error("%s expects argument '%s' to be of type %s.", \ |
| 52 CURRENT_FUNC, #dart_handle, #Type); \ | 52 CURRENT_FUNC, #dart_handle, #Type); \ |
| 53 } \ | 53 } \ |
| 54 } while (0) | 54 } while (0) |
| 55 | 55 |
| 56 | 56 |
| 57 DART_EXPORT bool Dart_IsError(const Dart_Handle& handle) { | 57 DART_EXPORT bool Dart_IsError(const Dart_Handle& handle) { |
| 58 ASSERT(Isolate::Current() != NULL); | 58 DARTSCOPE(Isolate::Current()); |
| 59 Zone zone; // Setup a VM zone as we are creating some handles. | |
| 60 HandleScope scope; // Setup a VM handle scope. | |
| 61 const Object& obj = Object::Handle(Api::UnwrapHandle(handle)); | 59 const Object& obj = Object::Handle(Api::UnwrapHandle(handle)); |
| 62 return obj.IsApiError(); | 60 return obj.IsApiError(); |
| 63 } | 61 } |
| 64 | 62 |
| 65 | 63 |
| 66 DART_EXPORT bool Dart_ErrorHasException(Dart_Handle handle) { | 64 DART_EXPORT bool Dart_ErrorHasException(Dart_Handle handle) { |
| 67 Zone zone; // Setup a VM zone as we are creating some handles. | 65 DARTSCOPE(Isolate::Current()); |
| 68 HandleScope scope; // Setup a VM handle scope. | |
| 69 const Object& obj = Object::Handle(Api::UnwrapHandle(handle)); | 66 const Object& obj = Object::Handle(Api::UnwrapHandle(handle)); |
| 70 if (obj.IsApiError()) { | 67 if (obj.IsApiError()) { |
| 71 const ApiError& error = ApiError::CheckedHandle(obj.raw()); | 68 const ApiError& error = ApiError::CheckedHandle(obj.raw()); |
| 72 const Object& data = Object::Handle(error.data()); | 69 const Object& data = Object::Handle(error.data()); |
| 73 return data.IsUnhandledException(); | 70 return data.IsUnhandledException(); |
| 74 } | 71 } |
| 75 return false; | 72 return false; |
| 76 } | 73 } |
| 77 | 74 |
| 78 | 75 |
| 79 DART_EXPORT Dart_Handle Dart_ErrorGetException(Dart_Handle handle) { | 76 DART_EXPORT Dart_Handle Dart_ErrorGetException(Dart_Handle handle) { |
| 80 Zone zone; // Setup a VM zone as we are creating some handles. | 77 DARTSCOPE(Isolate::Current()); |
| 81 HandleScope scope; // Setup a VM handle scope. | |
| 82 const Object& obj = Object::Handle(Api::UnwrapHandle(handle)); | 78 const Object& obj = Object::Handle(Api::UnwrapHandle(handle)); |
| 83 if (obj.IsApiError()) { | 79 if (obj.IsApiError()) { |
| 84 const ApiError& error = ApiError::CheckedHandle(obj.raw()); | 80 const ApiError& error = ApiError::CheckedHandle(obj.raw()); |
| 85 const Object& data = Object::Handle(error.data()); | 81 const Object& data = Object::Handle(error.data()); |
| 86 if (data.IsUnhandledException()) { | 82 if (data.IsUnhandledException()) { |
| 87 const UnhandledException& unhandled = UnhandledException::Handle( | 83 const UnhandledException& unhandled = UnhandledException::Handle( |
| 88 reinterpret_cast<RawUnhandledException*>(data.raw())); | 84 reinterpret_cast<RawUnhandledException*>(data.raw())); |
| 89 const Object& exception = Object::Handle(unhandled.exception()); | 85 const Object& exception = Object::Handle(unhandled.exception()); |
| 90 return Api::NewLocalHandle(exception); | 86 return Api::NewLocalHandle(exception); |
| 91 } else { | 87 } else { |
| 92 return Api::Error("This error is not an unhandled exception error."); | 88 return Api::Error("This error is not an unhandled exception error."); |
| 93 } | 89 } |
| 94 } else { | 90 } else { |
| 95 return Api::Error("Can only get exceptions from error handles."); | 91 return Api::Error("Can only get exceptions from error handles."); |
| 96 } | 92 } |
| 97 } | 93 } |
| 98 | 94 |
| 99 | 95 |
| 100 DART_EXPORT Dart_Handle Dart_ErrorGetStacktrace(Dart_Handle handle) { | 96 DART_EXPORT Dart_Handle Dart_ErrorGetStacktrace(Dart_Handle handle) { |
| 101 Zone zone; // Setup a VM zone as we are creating some handles. | 97 DARTSCOPE(Isolate::Current()); |
| 102 HandleScope scope; // Setup a VM handle scope. | |
| 103 const Object& obj = Object::Handle(Api::UnwrapHandle(handle)); | 98 const Object& obj = Object::Handle(Api::UnwrapHandle(handle)); |
| 104 if (obj.IsApiError()) { | 99 if (obj.IsApiError()) { |
| 105 ApiError& failure = ApiError::Handle(); | 100 ApiError& failure = ApiError::Handle(); |
| 106 failure ^= obj.raw(); | 101 failure ^= obj.raw(); |
| 107 const Object& data = Object::Handle(failure.data()); | 102 const Object& data = Object::Handle(failure.data()); |
| 108 if (data.IsUnhandledException()) { | 103 if (data.IsUnhandledException()) { |
| 109 const UnhandledException& unhandled = UnhandledException::Handle( | 104 const UnhandledException& unhandled = UnhandledException::Handle( |
| 110 reinterpret_cast<RawUnhandledException*>(data.raw())); | 105 reinterpret_cast<RawUnhandledException*>(data.raw())); |
| 111 const Object& stacktrace = Object::Handle(unhandled.stacktrace()); | 106 const Object& stacktrace = Object::Handle(unhandled.stacktrace()); |
| 112 return Api::NewLocalHandle(stacktrace); | 107 return Api::NewLocalHandle(stacktrace); |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 151 int len = (strlen(exc_str) + strlen(stack_str) + strlen(format) | 146 int len = (strlen(exc_str) + strlen(stack_str) + strlen(format) |
| 152 - 4 // Two '%s' | 147 - 4 // Two '%s' |
| 153 + 1); // '\0' | 148 + 1); // '\0' |
| 154 char* buffer = reinterpret_cast<char*>(Api::Allocate(len)); | 149 char* buffer = reinterpret_cast<char*>(Api::Allocate(len)); |
| 155 OS::SNPrint(buffer, len, format, exc_str, stack_str); | 150 OS::SNPrint(buffer, len, format, exc_str, stack_str); |
| 156 return buffer; | 151 return buffer; |
| 157 } | 152 } |
| 158 | 153 |
| 159 | 154 |
| 160 DART_EXPORT const char* Dart_GetError(const Dart_Handle& handle) { | 155 DART_EXPORT const char* Dart_GetError(const Dart_Handle& handle) { |
| 161 ASSERT(Isolate::Current() != NULL); | 156 DARTSCOPE(Isolate::Current()); |
| 162 Zone zone; // Setup a VM zone as we are creating some handles. | 157 |
| 163 HandleScope scope; // Setup a VM handle scope. | |
| 164 const Object& obj = Object::Handle(Api::UnwrapHandle(handle)); | 158 const Object& obj = Object::Handle(Api::UnwrapHandle(handle)); |
| 165 if (!obj.IsApiError()) { | 159 if (!obj.IsApiError()) { |
| 166 return ""; | 160 return ""; |
| 167 } | 161 } |
| 168 ApiError& failure = ApiError::Handle(); | 162 ApiError& failure = ApiError::Handle(); |
| 169 failure ^= obj.raw(); | 163 failure ^= obj.raw(); |
| 170 const Object& data = Object::Handle(failure.data()); | 164 const Object& data = Object::Handle(failure.data()); |
| 171 if (data.IsString()) { | 165 if (data.IsString()) { |
| 172 // Simple error message. | 166 // Simple error message. |
| 173 String& message = String::Handle(); | 167 String& message = String::Handle(); |
| (...skipping 11 matching lines...) Expand all Loading... |
| 185 | 179 |
| 186 } else { | 180 } else { |
| 187 return "<Internal error in Dart_GetError: malformed error handle>"; | 181 return "<Internal error in Dart_GetError: malformed error handle>"; |
| 188 } | 182 } |
| 189 } | 183 } |
| 190 | 184 |
| 191 | 185 |
| 192 // TODO(turnidge): This clonse Api::Error. I need to use va_copy to | 186 // TODO(turnidge): This clonse Api::Error. I need to use va_copy to |
| 193 // fix this but not sure if it available on all of our builds. | 187 // fix this but not sure if it available on all of our builds. |
| 194 DART_EXPORT Dart_Handle Dart_Error(const char* format, ...) { | 188 DART_EXPORT Dart_Handle Dart_Error(const char* format, ...) { |
| 195 Zone zone; // Setup a VM zone as we are creating some handles. | 189 DARTSCOPE(Isolate::Current()); |
| 196 HandleScope scope; // Setup a VM handle scope. | |
| 197 | 190 |
| 198 va_list args; | 191 va_list args; |
| 199 va_start(args, format); | 192 va_start(args, format); |
| 200 intptr_t len = OS::VSNPrint(NULL, 0, format, args); | 193 intptr_t len = OS::VSNPrint(NULL, 0, format, args); |
| 201 va_end(args); | 194 va_end(args); |
| 202 | 195 |
| 203 char* buffer = reinterpret_cast<char*>(zone.Allocate(len + 1)); | 196 char* buffer = reinterpret_cast<char*>(zone.Allocate(len + 1)); |
| 204 va_list args2; | 197 va_list args2; |
| 205 va_start(args2, format); | 198 va_start(args2, format); |
| 206 OS::VSNPrint(buffer, (len + 1), format, args2); | 199 OS::VSNPrint(buffer, (len + 1), format, args2); |
| (...skipping 20 matching lines...) Expand all Loading... |
| 227 LongJump* base = isolate->long_jump_base(); | 220 LongJump* base = isolate->long_jump_base(); |
| 228 LongJump jump; | 221 LongJump jump; |
| 229 isolate->set_long_jump_base(&jump); | 222 isolate->set_long_jump_base(&jump); |
| 230 if (setjmp(*jump.Set()) == 0) { | 223 if (setjmp(*jump.Set()) == 0) { |
| 231 Dart::InitializeIsolate(snapshot, data); | 224 Dart::InitializeIsolate(snapshot, data); |
| 232 START_TIMER(time_total_runtime); | 225 START_TIMER(time_total_runtime); |
| 233 isolate->set_long_jump_base(base); | 226 isolate->set_long_jump_base(base); |
| 234 return reinterpret_cast<Dart_Isolate>(isolate); | 227 return reinterpret_cast<Dart_Isolate>(isolate); |
| 235 } else { | 228 } else { |
| 236 { | 229 { |
| 237 Zone zone; // Setup a VM zone as we are creating some handles. | 230 DARTSCOPE(isolate); |
| 238 HandleScope scope; // Setup a VM handle scope. | |
| 239 const String& error = | 231 const String& error = |
| 240 String::Handle(Isolate::Current()->object_store()->sticky_error()); | 232 String::Handle(isolate->object_store()->sticky_error()); |
| 241 // TODO(asiva): Need to return this as a error. | 233 // TODO(asiva): Need to return this as a error. |
| 242 OS::PrintErr(error.ToCString()); | 234 OS::PrintErr(error.ToCString()); |
| 243 } | 235 } |
| 244 Dart::ShutdownIsolate(); | 236 Dart::ShutdownIsolate(); |
| 245 } | 237 } |
| 246 return reinterpret_cast<Dart_Isolate>(NULL); | 238 return reinterpret_cast<Dart_Isolate>(NULL); |
| 247 } | 239 } |
| 248 | 240 |
| 249 | 241 |
| 250 DART_EXPORT void Dart_ShutdownIsolate() { | 242 DART_EXPORT void Dart_ShutdownIsolate() { |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 304 SnapshotReader reader(snapshot, isolate->heap(), isolate->object_store()); | 296 SnapshotReader reader(snapshot, isolate->heap(), isolate->object_store()); |
| 305 Instance& instance = Instance::Handle(); | 297 Instance& instance = Instance::Handle(); |
| 306 instance ^= reader.ReadObject(); | 298 instance ^= reader.ReadObject(); |
| 307 return instance.raw(); | 299 return instance.raw(); |
| 308 } | 300 } |
| 309 | 301 |
| 310 | 302 |
| 311 DART_EXPORT Dart_Handle Dart_HandleMessage(Dart_Port dest_port, | 303 DART_EXPORT Dart_Handle Dart_HandleMessage(Dart_Port dest_port, |
| 312 Dart_Port reply_port, | 304 Dart_Port reply_port, |
| 313 Dart_Message dart_message) { | 305 Dart_Message dart_message) { |
| 314 Zone zone; // Setup a VM zone as we are creating some handles. | 306 DARTSCOPE(Isolate::Current()); |
| 315 HandleScope scope; // Setup a VM handle scope. | 307 |
| 316 const Instance& msg = Instance::Handle(DeserializeMessage(dart_message)); | 308 const Instance& msg = Instance::Handle(DeserializeMessage(dart_message)); |
| 317 const String& class_name = | 309 const String& class_name = |
| 318 String::Handle(String::NewSymbol("ReceivePortImpl")); | 310 String::Handle(String::NewSymbol("ReceivePortImpl")); |
| 319 const String& function_name = | 311 const String& function_name = |
| 320 String::Handle(String::NewSymbol("handleMessage_")); | 312 String::Handle(String::NewSymbol("handleMessage_")); |
| 321 const int kNumArguments = 3; | 313 const int kNumArguments = 3; |
| 322 const Array& kNoArgumentNames = Array::Handle(); | 314 const Array& kNoArgumentNames = Array::Handle(); |
| 323 const Function& function = Function::Handle( | 315 const Function& function = Function::Handle( |
| 324 Resolver::ResolveStatic(Library::Handle(Library::CoreLibrary()), | 316 Resolver::ResolveStatic(Library::Handle(Library::CoreLibrary()), |
| 325 class_name, | 317 class_name, |
| 326 function_name, | 318 function_name, |
| 327 kNumArguments, | 319 kNumArguments, |
| 328 kNoArgumentNames, | 320 kNoArgumentNames, |
| 329 Resolver::kIsQualified)); | 321 Resolver::kIsQualified)); |
| 330 GrowableArray<const Object*> arguments(kNumArguments); | 322 GrowableArray<const Object*> arguments(kNumArguments); |
| 331 arguments.Add(&Integer::Handle(Integer::New(dest_port))); | 323 arguments.Add(&Integer::Handle(Integer::New(dest_port))); |
| 332 arguments.Add(&Integer::Handle(Integer::New(reply_port))); | 324 arguments.Add(&Integer::Handle(Integer::New(reply_port))); |
| 333 arguments.Add(&msg); | 325 arguments.Add(&msg); |
| 334 const Object& result = Object::Handle( | 326 const Object& result = Object::Handle( |
| 335 DartEntry::InvokeStatic(function, arguments, kNoArgumentNames)); | 327 DartEntry::InvokeStatic(function, arguments, kNoArgumentNames)); |
| 336 if (result.IsUnhandledException()) { | 328 if (result.IsUnhandledException()) { |
| 337 return Api::ErrorFromException(result); | 329 return Api::ErrorFromException(result); |
| 338 } | 330 } |
| 339 ASSERT(result.IsNull()); | 331 ASSERT(result.IsNull()); |
| 340 return Api::Success(); | 332 return Api::Success(); |
| 341 } | 333 } |
| 342 | 334 |
| 343 | 335 |
| 344 DART_EXPORT Dart_Handle Dart_RunLoop() { | 336 DART_EXPORT Dart_Handle Dart_RunLoop() { |
| 345 Zone zone; // Setup a VM zone as we are creating some handles. | 337 Isolate* isolate = Isolate::Current(); |
| 346 HandleScope scope; // Setup a VM handle scope. | 338 DARTSCOPE(isolate); |
| 347 | 339 |
| 348 Isolate* isolate = Isolate::Current(); | |
| 349 LongJump* base = isolate->long_jump_base(); | 340 LongJump* base = isolate->long_jump_base(); |
| 350 LongJump jump; | 341 LongJump jump; |
| 351 Dart_Handle result; | 342 Dart_Handle result; |
| 352 isolate->set_long_jump_base(&jump); | 343 isolate->set_long_jump_base(&jump); |
| 353 if (setjmp(*jump.Set()) == 0) { | 344 if (setjmp(*jump.Set()) == 0) { |
| 354 isolate->StandardRunLoop(); | 345 isolate->StandardRunLoop(); |
| 355 result = Api::Success(); | 346 result = Api::Success(); |
| 356 } else { | 347 } else { |
| 357 SetupErrorResult(&result); | 348 SetupErrorResult(&result); |
| 358 } | 349 } |
| 359 isolate->set_long_jump_base(base); | 350 isolate->set_long_jump_base(base); |
| 360 return result; | 351 return result; |
| 361 } | 352 } |
| 362 | 353 |
| 363 | 354 |
| 364 // NOTE: Need to pass 'result' as a parameter here in order to avoid | 355 // NOTE: Need to pass 'result' as a parameter here in order to avoid |
| 365 // warning: variable 'result' might be clobbered by 'longjmp' or 'vfork' | 356 // warning: variable 'result' might be clobbered by 'longjmp' or 'vfork' |
| 366 // which shows up because of the use of setjmp. | 357 // which shows up because of the use of setjmp. |
| 367 static void CompileSource(const Library& lib, | 358 static void CompileSource(Isolate* isolate, |
| 359 const Library& lib, |
| 368 const String& url, | 360 const String& url, |
| 369 const String& source, | 361 const String& source, |
| 370 RawScript::Kind kind, | 362 RawScript::Kind kind, |
| 371 Dart_Handle* result) { | 363 Dart_Handle* result) { |
| 372 const Script& script = Script::Handle(Script::New(url, source, kind)); | 364 const Script& script = Script::Handle(Script::New(url, source, kind)); |
| 373 Isolate* isolate = Isolate::Current(); | |
| 374 ASSERT(isolate != NULL); | 365 ASSERT(isolate != NULL); |
| 375 LongJump* base = isolate->long_jump_base(); | 366 LongJump* base = isolate->long_jump_base(); |
| 376 LongJump jump; | 367 LongJump jump; |
| 377 isolate->set_long_jump_base(&jump); | 368 isolate->set_long_jump_base(&jump); |
| 378 if (setjmp(*jump.Set()) == 0) { | 369 if (setjmp(*jump.Set()) == 0) { |
| 379 Compiler::Compile(lib, script); | 370 Compiler::Compile(lib, script); |
| 380 *result = Api::NewLocalHandle(lib); | 371 *result = Api::NewLocalHandle(lib); |
| 381 } else { | 372 } else { |
| 382 SetupErrorResult(result); | 373 SetupErrorResult(result); |
| 383 } | 374 } |
| 384 isolate->set_long_jump_base(base); | 375 isolate->set_long_jump_base(base); |
| 385 } | 376 } |
| 386 | 377 |
| 387 | 378 |
| 388 DART_EXPORT Dart_Handle Dart_LoadScript(Dart_Handle url, | 379 DART_EXPORT Dart_Handle Dart_LoadScript(Dart_Handle url, |
| 389 Dart_Handle source, | 380 Dart_Handle source, |
| 390 Dart_LibraryTagHandler handler) { | 381 Dart_LibraryTagHandler handler) { |
| 391 Isolate* isolate = Isolate::Current(); | 382 Isolate* isolate = Isolate::Current(); |
| 392 ASSERT(isolate != NULL); | 383 DARTSCOPE(isolate); |
| 393 Zone zone; // Setup a VM zone as we are creating some handles. | |
| 394 HandleScope scope; // Setup a VM handle scope. | |
| 395 TIMERSCOPE(time_script_loading); | 384 TIMERSCOPE(time_script_loading); |
| 396 const String& url_str = String::CheckedHandle(Api::UnwrapHandle(url)); | 385 const String& url_str = String::CheckedHandle(Api::UnwrapHandle(url)); |
| 397 const String& source_str = String::CheckedHandle(Api::UnwrapHandle(source)); | 386 const String& source_str = String::CheckedHandle(Api::UnwrapHandle(source)); |
| 398 Library& library = Library::Handle(isolate->object_store()->root_library()); | 387 Library& library = Library::Handle(isolate->object_store()->root_library()); |
| 399 if (!library.IsNull()) { | 388 if (!library.IsNull()) { |
| 400 return Api::Error("Script already loaded"); | 389 return Api::Error("Script already loaded"); |
| 401 } | 390 } |
| 402 isolate->set_library_tag_handler(handler); | 391 isolate->set_library_tag_handler(handler); |
| 403 library = Library::New(url_str); | 392 library = Library::New(url_str); |
| 404 library.Register(); | 393 library.Register(); |
| 405 isolate->object_store()->set_root_library(library); | 394 isolate->object_store()->set_root_library(library); |
| 406 Dart_Handle result; | 395 Dart_Handle result; |
| 407 CompileSource(library, url_str, source_str, RawScript::kScript, &result); | 396 CompileSource(isolate, |
| 397 library, |
| 398 url_str, |
| 399 source_str, |
| 400 RawScript::kScript, |
| 401 &result); |
| 408 return result; | 402 return result; |
| 409 } | 403 } |
| 410 | 404 |
| 411 | 405 |
| 412 DEFINE_FLAG(bool, compile_all, false, "Eagerly compile all code."); | 406 DEFINE_FLAG(bool, compile_all, false, "Eagerly compile all code."); |
| 413 | 407 |
| 414 static void CompileAll(Dart_Handle* result) { | 408 static void CompileAll(Isolate* isolate, Dart_Handle* result) { |
| 415 *result = Api::Success(); | 409 *result = Api::Success(); |
| 416 if (FLAG_compile_all) { | 410 if (FLAG_compile_all) { |
| 417 Isolate* isolate = Isolate::Current(); | |
| 418 ASSERT(isolate != NULL); | 411 ASSERT(isolate != NULL); |
| 419 LongJump* base = isolate->long_jump_base(); | 412 LongJump* base = isolate->long_jump_base(); |
| 420 LongJump jump; | 413 LongJump jump; |
| 421 isolate->set_long_jump_base(&jump); | 414 isolate->set_long_jump_base(&jump); |
| 422 if (setjmp(*jump.Set()) == 0) { | 415 if (setjmp(*jump.Set()) == 0) { |
| 423 Library::CompileAll(); | 416 Library::CompileAll(); |
| 424 } else { | 417 } else { |
| 425 SetupErrorResult(result); | 418 SetupErrorResult(result); |
| 426 } | 419 } |
| 427 isolate->set_long_jump_base(base); | 420 isolate->set_long_jump_base(base); |
| 428 } | 421 } |
| 429 } | 422 } |
| 430 | 423 |
| 431 | 424 |
| 432 // Return error if isolate is in an inconsistent state. | 425 // Return error if isolate is in an inconsistent state. |
| 433 // Return NULL when no error condition exists. | 426 // Return NULL when no error condition exists. |
| 434 static const char* CheckIsolateState() { | 427 static const char* CheckIsolateState(Isolate* isolate) { |
| 435 if (!ClassFinalizer::FinalizePendingClasses()) { | 428 if (!ClassFinalizer::FinalizePendingClasses()) { |
| 436 // Make a copy of the error message as the original message string | 429 // Make a copy of the error message as the original message string |
| 437 // may get deallocated when we return back from the Dart API call. | 430 // may get deallocated when we return back from the Dart API call. |
| 438 const String& err = | 431 const String& err = |
| 439 String::Handle(Isolate::Current()->object_store()->sticky_error()); | 432 String::Handle(isolate->object_store()->sticky_error()); |
| 440 const char* errmsg = err.ToCString(); | 433 const char* errmsg = err.ToCString(); |
| 441 intptr_t errlen = strlen(errmsg) + 1; | 434 intptr_t errlen = strlen(errmsg) + 1; |
| 442 char* msg = reinterpret_cast<char*>(Api::Allocate(errlen)); | 435 char* msg = reinterpret_cast<char*>(Api::Allocate(errlen)); |
| 443 OS::SNPrint(msg, errlen, "%s", errmsg); | 436 OS::SNPrint(msg, errlen, "%s", errmsg); |
| 444 return msg; | 437 return msg; |
| 445 } | 438 } |
| 446 return NULL; | 439 return NULL; |
| 447 } | 440 } |
| 448 | 441 |
| 449 | 442 |
| 450 DART_EXPORT Dart_Handle Dart_CompileAll() { | 443 DART_EXPORT Dart_Handle Dart_CompileAll() { |
| 451 Zone zone; // Setup a VM zone as we are creating some handles. | 444 Isolate* isolate = Isolate::Current(); |
| 452 HandleScope scope; // Setup a VM handle scope. | 445 DARTSCOPE(isolate); |
| 453 Dart_Handle result; | 446 Dart_Handle result; |
| 454 const char* msg = CheckIsolateState(); | 447 const char* msg = CheckIsolateState(isolate); |
| 455 if (msg != NULL) { | 448 if (msg != NULL) { |
| 456 return Api::Error(msg); | 449 return Api::Error(msg); |
| 457 } | 450 } |
| 458 CompileAll(&result); | 451 CompileAll(isolate, &result); |
| 459 return result; | 452 return result; |
| 460 } | 453 } |
| 461 | 454 |
| 462 | 455 |
| 463 DART_EXPORT bool Dart_IsLibrary(Dart_Handle object) { | 456 DART_EXPORT bool Dart_IsLibrary(Dart_Handle object) { |
| 464 Zone zone; // Setup a VM zone as we are creating some handles. | 457 DARTSCOPE(Isolate::Current()); |
| 465 HandleScope scope; // Setup a VM handle scope. | |
| 466 const Object& obj = Object::Handle(Api::UnwrapHandle(object)); | 458 const Object& obj = Object::Handle(Api::UnwrapHandle(object)); |
| 467 return obj.IsLibrary(); | 459 return obj.IsLibrary(); |
| 468 } | 460 } |
| 469 | 461 |
| 470 | 462 |
| 471 DART_EXPORT Dart_Handle Dart_LibraryUrl(Dart_Handle library) { | 463 DART_EXPORT Dart_Handle Dart_LibraryUrl(Dart_Handle library) { |
| 472 Zone zone; // Setup a VM zone as we are creating some handles. | 464 DARTSCOPE(Isolate::Current()); |
| 473 HandleScope scope; // Setup a VM handle scope. | |
| 474 const Library& lib = Library::CheckedHandle(Api::UnwrapHandle(library)); | 465 const Library& lib = Library::CheckedHandle(Api::UnwrapHandle(library)); |
| 475 if (lib.IsNull()) { | 466 if (lib.IsNull()) { |
| 476 return Api::Error("Null library"); | 467 return Api::Error("Null library"); |
| 477 } | 468 } |
| 478 const String& url = String::Handle(lib.url()); | 469 const String& url = String::Handle(lib.url()); |
| 479 ASSERT(!url.IsNull()); | 470 ASSERT(!url.IsNull()); |
| 480 return Api::NewLocalHandle(url); | 471 return Api::NewLocalHandle(url); |
| 481 } | 472 } |
| 482 | 473 |
| 483 | 474 |
| 484 DART_EXPORT Dart_Handle Dart_LibraryImportLibrary(Dart_Handle library_in, | 475 DART_EXPORT Dart_Handle Dart_LibraryImportLibrary(Dart_Handle library_in, |
| 485 Dart_Handle import_in) { | 476 Dart_Handle import_in) { |
| 486 Zone zone; // Setup a VM zone as we are creating some handles. | 477 DARTSCOPE(Isolate::Current()); |
| 487 HandleScope scope; // Setup a VM handle scope. | |
| 488 const Library& library = | 478 const Library& library = |
| 489 Library::CheckedHandle(Api::UnwrapHandle(library_in)); | 479 Library::CheckedHandle(Api::UnwrapHandle(library_in)); |
| 490 if (library.IsNull()) { | 480 if (library.IsNull()) { |
| 491 return Api::Error("Null library"); | 481 return Api::Error("Null library"); |
| 492 } | 482 } |
| 493 const Library& import = | 483 const Library& import = |
| 494 Library::CheckedHandle(Api::UnwrapHandle(import_in)); | 484 Library::CheckedHandle(Api::UnwrapHandle(import_in)); |
| 495 library.AddImport(import); | 485 library.AddImport(import); |
| 496 return Api::Success(); | 486 return Api::Success(); |
| 497 } | 487 } |
| 498 | 488 |
| 499 | 489 |
| 500 DART_EXPORT Dart_Handle Dart_LookupLibrary(Dart_Handle url) { | 490 DART_EXPORT Dart_Handle Dart_LookupLibrary(Dart_Handle url) { |
| 501 Zone zone; // Setup a VM zone as we are creating some handles. | 491 DARTSCOPE(Isolate::Current()); |
| 502 HandleScope scope; // Setup a VM handle scope. | |
| 503 String& url_str = String::Handle(); | 492 String& url_str = String::Handle(); |
| 504 UNWRAP_NONNULL(url, url_str, String); | 493 UNWRAP_NONNULL(url, url_str, String); |
| 505 const Library& library = Library::Handle(Library::LookupLibrary(url_str)); | 494 const Library& library = Library::Handle(Library::LookupLibrary(url_str)); |
| 506 if (library.IsNull()) { | 495 if (library.IsNull()) { |
| 507 return Api::Error("%s: library '%s' not found.", | 496 return Api::Error("%s: library '%s' not found.", |
| 508 CURRENT_FUNC, url_str.ToCString()); | 497 CURRENT_FUNC, url_str.ToCString()); |
| 509 } else { | 498 } else { |
| 510 return Api::NewLocalHandle(library); | 499 return Api::NewLocalHandle(library); |
| 511 } | 500 } |
| 512 } | 501 } |
| 513 | 502 |
| 514 | 503 |
| 515 DART_EXPORT Dart_Handle Dart_LoadLibrary(Dart_Handle url, Dart_Handle source) { | 504 DART_EXPORT Dart_Handle Dart_LoadLibrary(Dart_Handle url, Dart_Handle source) { |
| 516 Zone zone; // Setup a VM zone as we are creating some handles. | 505 Isolate* isolate = Isolate::Current(); |
| 517 HandleScope scope; // Setup a VM handle scope. | 506 DARTSCOPE(isolate); |
| 518 const String& url_str = String::CheckedHandle(Api::UnwrapHandle(url)); | 507 const String& url_str = String::CheckedHandle(Api::UnwrapHandle(url)); |
| 519 const String& source_str = String::CheckedHandle(Api::UnwrapHandle(source)); | 508 const String& source_str = String::CheckedHandle(Api::UnwrapHandle(source)); |
| 520 Library& library = Library::Handle(Library::LookupLibrary(url_str)); | 509 Library& library = Library::Handle(Library::LookupLibrary(url_str)); |
| 521 if (library.IsNull()) { | 510 if (library.IsNull()) { |
| 522 library = Library::New(url_str); | 511 library = Library::New(url_str); |
| 523 library.Register(); | 512 library.Register(); |
| 524 } | 513 } |
| 525 Dart_Handle result; | 514 Dart_Handle result; |
| 526 CompileSource(library, url_str, source_str, RawScript::kLibrary, &result); | 515 CompileSource(isolate, |
| 516 library, |
| 517 url_str, |
| 518 source_str, |
| 519 RawScript::kLibrary, |
| 520 &result); |
| 527 return result; | 521 return result; |
| 528 } | 522 } |
| 529 | 523 |
| 530 | 524 |
| 531 DART_EXPORT Dart_Handle Dart_LoadSource(Dart_Handle library_in, | 525 DART_EXPORT Dart_Handle Dart_LoadSource(Dart_Handle library_in, |
| 532 Dart_Handle url_in, | 526 Dart_Handle url_in, |
| 533 Dart_Handle source_in) { | 527 Dart_Handle source_in) { |
| 534 Zone zone; // Setup a VM zone as we are creating some handles. | 528 Isolate* isolate = Isolate::Current(); |
| 535 HandleScope scope; // Setup a VM handle scope. | 529 DARTSCOPE(isolate); |
| 536 const String& url = String::CheckedHandle(Api::UnwrapHandle(url_in)); | 530 const String& url = String::CheckedHandle(Api::UnwrapHandle(url_in)); |
| 537 const String& source = String::CheckedHandle(Api::UnwrapHandle(source_in)); | 531 const String& source = String::CheckedHandle(Api::UnwrapHandle(source_in)); |
| 538 const Library& library = | 532 const Library& library = |
| 539 Library::CheckedHandle(Api::UnwrapHandle(library_in)); | 533 Library::CheckedHandle(Api::UnwrapHandle(library_in)); |
| 540 Dart_Handle result; | 534 Dart_Handle result; |
| 541 CompileSource(library, url, source, RawScript::kSource, &result); | 535 CompileSource(isolate, library, url, source, RawScript::kSource, &result); |
| 542 return result; | 536 return result; |
| 543 } | 537 } |
| 544 | 538 |
| 545 | 539 |
| 546 DART_EXPORT Dart_Handle Dart_SetNativeResolver( | 540 DART_EXPORT Dart_Handle Dart_SetNativeResolver( |
| 547 Dart_Handle library, | 541 Dart_Handle library, |
| 548 Dart_NativeEntryResolver resolver) { | 542 Dart_NativeEntryResolver resolver) { |
| 549 Zone zone; // Setup a VM zone as we are creating some handles. | 543 DARTSCOPE(Isolate::Current()); |
| 550 HandleScope scope; // Setup a VM handle scope. | |
| 551 const Library& lib = Library::CheckedHandle(Api::UnwrapHandle(library)); | 544 const Library& lib = Library::CheckedHandle(Api::UnwrapHandle(library)); |
| 552 if (lib.IsNull()) { | 545 if (lib.IsNull()) { |
| 553 return Api::Error("Invalid parameter, Unknown library specified"); | 546 return Api::Error("Invalid parameter, Unknown library specified"); |
| 554 } | 547 } |
| 555 lib.set_native_entry_resolver(resolver); | 548 lib.set_native_entry_resolver(resolver); |
| 556 return Api::Success(); | 549 return Api::Success(); |
| 557 } | 550 } |
| 558 | 551 |
| 559 | 552 |
| 560 DART_EXPORT Dart_Handle Dart_ToString(Dart_Handle object) { | 553 DART_EXPORT Dart_Handle Dart_ToString(Dart_Handle object) { |
| 561 Zone zone; // Setup a VM zone as we are creating some handles. | 554 DARTSCOPE(Isolate::Current()); |
| 562 HandleScope scope; // Setup a VM handle scope. | |
| 563 const Object& obj = Object::Handle(Api::UnwrapHandle(object)); | 555 const Object& obj = Object::Handle(Api::UnwrapHandle(object)); |
| 564 Object& result = Object::Handle(); | 556 Object& result = Object::Handle(); |
| 565 if (obj.IsString()) { | 557 if (obj.IsString()) { |
| 566 result = obj.raw(); | 558 result = obj.raw(); |
| 567 } else if (obj.IsInstance()) { | 559 } else if (obj.IsInstance()) { |
| 568 Instance& receiver = Instance::Handle(); | 560 Instance& receiver = Instance::Handle(); |
| 569 receiver ^= obj.raw(); | 561 receiver ^= obj.raw(); |
| 570 result = DartLibraryCalls::ToString(receiver); | 562 result = DartLibraryCalls::ToString(receiver); |
| 571 if (result.IsUnhandledException()) { | 563 if (result.IsUnhandledException()) { |
| 572 return Api::ErrorFromException(result); | 564 return Api::ErrorFromException(result); |
| 573 } | 565 } |
| 574 } else { | 566 } else { |
| 575 // This is a VM internal object. Call the C++ method of printing. | 567 // This is a VM internal object. Call the C++ method of printing. |
| 576 result = String::New(obj.ToCString()); | 568 result = String::New(obj.ToCString()); |
| 577 } | 569 } |
| 578 return Api::NewLocalHandle(result); | 570 return Api::NewLocalHandle(result); |
| 579 } | 571 } |
| 580 | 572 |
| 581 | 573 |
| 582 DART_EXPORT Dart_Handle Dart_Null() { | 574 DART_EXPORT Dart_Handle Dart_Null() { |
| 583 return Api::Null(); | 575 return Api::Null(); |
| 584 } | 576 } |
| 585 | 577 |
| 586 | 578 |
| 587 DART_EXPORT bool Dart_IsNull(Dart_Handle object) { | 579 DART_EXPORT bool Dart_IsNull(Dart_Handle object) { |
| 588 Zone zone; // Setup a VM zone as we are creating some handles. | 580 DARTSCOPE(Isolate::Current()); |
| 589 HandleScope scope; // Setup a VM handle scope. | |
| 590 const Object& obj = Object::Handle(Api::UnwrapHandle(object)); | 581 const Object& obj = Object::Handle(Api::UnwrapHandle(object)); |
| 591 return obj.IsNull(); | 582 return obj.IsNull(); |
| 592 } | 583 } |
| 593 | 584 |
| 594 | 585 |
| 595 DART_EXPORT bool Dart_IsClosure(Dart_Handle object) { | 586 DART_EXPORT bool Dart_IsClosure(Dart_Handle object) { |
| 596 Zone zone; // Setup a VM zone as we are creating some handles. | 587 DARTSCOPE(Isolate::Current()); |
| 597 HandleScope scope; // Setup a VM handle scope. | |
| 598 const Object& obj = Object::Handle(Api::UnwrapHandle(object)); | 588 const Object& obj = Object::Handle(Api::UnwrapHandle(object)); |
| 599 return obj.IsClosure(); | 589 return obj.IsClosure(); |
| 600 } | 590 } |
| 601 | 591 |
| 602 | 592 |
| 603 DART_EXPORT int64_t Dart_ClosureSmrck(Dart_Handle object) { | 593 DART_EXPORT int64_t Dart_ClosureSmrck(Dart_Handle object) { |
| 604 Zone zone; | 594 DARTSCOPE(Isolate::Current()); |
| 605 HandleScope scope; | |
| 606 const Closure& obj = Closure::CheckedHandle(Api::UnwrapHandle(object)); | 595 const Closure& obj = Closure::CheckedHandle(Api::UnwrapHandle(object)); |
| 607 const Integer& smrck = Integer::Handle(obj.smrck()); | 596 const Integer& smrck = Integer::Handle(obj.smrck()); |
| 608 return smrck.IsNull() ? 0 : smrck.AsInt64Value(); | 597 return smrck.IsNull() ? 0 : smrck.AsInt64Value(); |
| 609 } | 598 } |
| 610 | 599 |
| 611 | 600 |
| 612 DART_EXPORT void Dart_ClosureSetSmrck(Dart_Handle object, int64_t value) { | 601 DART_EXPORT void Dart_ClosureSetSmrck(Dart_Handle object, int64_t value) { |
| 613 Zone zone; | 602 DARTSCOPE(Isolate::Current()); |
| 614 HandleScope scope; | |
| 615 const Closure& obj = Closure::CheckedHandle(Api::UnwrapHandle(object)); | 603 const Closure& obj = Closure::CheckedHandle(Api::UnwrapHandle(object)); |
| 616 const Integer& smrck = Integer::Handle(Integer::New(value)); | 604 const Integer& smrck = Integer::Handle(Integer::New(value)); |
| 617 obj.set_smrck(smrck); | 605 obj.set_smrck(smrck); |
| 618 } | 606 } |
| 619 | 607 |
| 620 | 608 |
| 621 DART_EXPORT Dart_Handle Dart_ObjectEquals(Dart_Handle obj1, Dart_Handle obj2, | 609 DART_EXPORT Dart_Handle Dart_ObjectEquals(Dart_Handle obj1, Dart_Handle obj2, |
| 622 bool* value) { | 610 bool* value) { |
| 623 Zone zone; // Setup a VM zone as we are creating some handles. | 611 DARTSCOPE(Isolate::Current()); |
| 624 HandleScope scope; // Setup a VM handle scope. | |
| 625 const Instance& expected = Instance::CheckedHandle(Api::UnwrapHandle(obj1)); | 612 const Instance& expected = Instance::CheckedHandle(Api::UnwrapHandle(obj1)); |
| 626 const Instance& actual = Instance::CheckedHandle(Api::UnwrapHandle(obj2)); | 613 const Instance& actual = Instance::CheckedHandle(Api::UnwrapHandle(obj2)); |
| 627 const Instance& result = | 614 const Instance& result = |
| 628 Instance::Handle(DartLibraryCalls::Equals(expected, actual)); | 615 Instance::Handle(DartLibraryCalls::Equals(expected, actual)); |
| 629 if (result.IsBool()) { | 616 if (result.IsBool()) { |
| 630 Bool& b = Bool::Handle(); | 617 Bool& b = Bool::Handle(); |
| 631 b ^= result.raw(); | 618 b ^= result.raw(); |
| 632 *value = b.value(); | 619 *value = b.value(); |
| 633 return Api::Success(); | 620 return Api::Success(); |
| 634 } else if (result.IsUnhandledException()) { | 621 } else if (result.IsUnhandledException()) { |
| 635 return Api::ErrorFromException(result); | 622 return Api::ErrorFromException(result); |
| 636 } else { | 623 } else { |
| 637 return Api::Error("Expected boolean result from =="); | 624 return Api::Error("Expected boolean result from =="); |
| 638 } | 625 } |
| 639 } | 626 } |
| 640 | 627 |
| 641 | 628 |
| 642 DART_EXPORT Dart_Handle Dart_IsSame(Dart_Handle obj1, Dart_Handle obj2, | 629 DART_EXPORT Dart_Handle Dart_IsSame(Dart_Handle obj1, Dart_Handle obj2, |
| 643 bool* value) { | 630 bool* value) { |
| 644 Zone zone; // Setup a VM zone as we are creating some handles. | 631 DARTSCOPE(Isolate::Current()); |
| 645 HandleScope scope; // Setup a VM handle scope. | |
| 646 const Object& expected = Object::Handle(Api::UnwrapHandle(obj1)); | 632 const Object& expected = Object::Handle(Api::UnwrapHandle(obj1)); |
| 647 const Object& actual = Object::Handle(Api::UnwrapHandle(obj2)); | 633 const Object& actual = Object::Handle(Api::UnwrapHandle(obj2)); |
| 648 *value = (expected.raw() == actual.raw()); | 634 *value = (expected.raw() == actual.raw()); |
| 649 return Api::Success(); | 635 return Api::Success(); |
| 650 } | 636 } |
| 651 | 637 |
| 652 | 638 |
| 653 DART_EXPORT Dart_Handle Dart_GetClass(Dart_Handle library, Dart_Handle name) { | 639 DART_EXPORT Dart_Handle Dart_GetClass(Dart_Handle library, Dart_Handle name) { |
| 654 Zone zone; // Setup a VM zone as we are creating some handles. | 640 DARTSCOPE(Isolate::Current()); |
| 655 HandleScope scope; // Setup a VM handle scope. | |
| 656 const Object& param = Object::Handle(Api::UnwrapHandle(name)); | 641 const Object& param = Object::Handle(Api::UnwrapHandle(name)); |
| 657 if (param.IsNull() || !param.IsString()) { | 642 if (param.IsNull() || !param.IsString()) { |
| 658 return Api::Error("Invalid class name specified"); | 643 return Api::Error("Invalid class name specified"); |
| 659 } | 644 } |
| 660 const Library& lib = Library::CheckedHandle(Api::UnwrapHandle(library)); | 645 const Library& lib = Library::CheckedHandle(Api::UnwrapHandle(library)); |
| 661 if (lib.IsNull()) { | 646 if (lib.IsNull()) { |
| 662 return Api::Error("Invalid parameter, Unknown library specified"); | 647 return Api::Error("Invalid parameter, Unknown library specified"); |
| 663 } | 648 } |
| 664 String& cls_name = String::Handle(); | 649 String& cls_name = String::Handle(); |
| 665 cls_name ^= param.raw(); | 650 cls_name ^= param.raw(); |
| 666 const Class& cls = Class::Handle(lib.LookupClass(cls_name)); | 651 const Class& cls = Class::Handle(lib.LookupClass(cls_name)); |
| 667 if (cls.IsNull()) { | 652 if (cls.IsNull()) { |
| 668 const String& lib_name = String::Handle(lib.name()); | 653 const String& lib_name = String::Handle(lib.name()); |
| 669 return Api::Error("Class '%s' not found in library '%s'.", | 654 return Api::Error("Class '%s' not found in library '%s'.", |
| 670 cls_name.ToCString(), lib_name.ToCString()); | 655 cls_name.ToCString(), lib_name.ToCString()); |
| 671 } | 656 } |
| 672 return Api::NewLocalHandle(cls); | 657 return Api::NewLocalHandle(cls); |
| 673 } | 658 } |
| 674 | 659 |
| 675 | 660 |
| 676 // TODO(iposva): This call actually implements IsInstanceOfClass. | 661 // TODO(iposva): This call actually implements IsInstanceOfClass. |
| 677 // Do we also need a real Dart_IsInstanceOf, which should take an instance | 662 // Do we also need a real Dart_IsInstanceOf, which should take an instance |
| 678 // rather than an object and a type rather than a class? | 663 // rather than an object and a type rather than a class? |
| 679 DART_EXPORT Dart_Handle Dart_ObjectIsType(Dart_Handle object, | 664 DART_EXPORT Dart_Handle Dart_ObjectIsType(Dart_Handle object, |
| 680 Dart_Handle clazz, | 665 Dart_Handle clazz, |
| 681 bool* value) { | 666 bool* value) { |
| 682 Zone zone; // Setup a VM zone as we are creating some handles. | 667 Isolate* isolate = Isolate::Current(); |
| 683 HandleScope scope; // Setup a VM handle scope. | 668 DARTSCOPE(isolate); |
| 684 const Class& cls = Class::CheckedHandle(Api::UnwrapHandle(clazz)); | 669 const Class& cls = Class::CheckedHandle(Api::UnwrapHandle(clazz)); |
| 685 if (cls.IsNull()) { | 670 if (cls.IsNull()) { |
| 686 return Api::Error("instanceof check against null class"); | 671 return Api::Error("instanceof check against null class"); |
| 687 } | 672 } |
| 688 const Object& obj = Object::Handle(Api::UnwrapHandle(object)); | 673 const Object& obj = Object::Handle(Api::UnwrapHandle(object)); |
| 689 Instance& instance = Instance::Handle(); | 674 Instance& instance = Instance::Handle(); |
| 690 instance ^= obj.raw(); | 675 instance ^= obj.raw(); |
| 691 // Finalize all classes. | 676 // Finalize all classes. |
| 692 const char* msg = CheckIsolateState(); | 677 const char* msg = CheckIsolateState(isolate); |
| 693 if (msg != NULL) { | 678 if (msg != NULL) { |
| 694 return Api::Error(msg); | 679 return Api::Error(msg); |
| 695 } | 680 } |
| 696 const Type& type = Type::Handle(Type::NewNonParameterizedType(cls)); | 681 const Type& type = Type::Handle(Type::NewNonParameterizedType(cls)); |
| 697 *value = instance.Is(type); | 682 *value = instance.Is(type); |
| 698 return Api::Success(); | 683 return Api::Success(); |
| 699 } | 684 } |
| 700 | 685 |
| 701 | 686 |
| 702 // TODO(iposva): The argument should be an instance. | 687 // TODO(iposva): The argument should be an instance. |
| 703 DART_EXPORT bool Dart_IsNumber(Dart_Handle object) { | 688 DART_EXPORT bool Dart_IsNumber(Dart_Handle object) { |
| 704 Zone zone; // Setup a VM zone as we are creating some handles. | 689 DARTSCOPE(Isolate::Current()); |
| 705 HandleScope scope; // Setup a VM handle scope. | |
| 706 const Object& obj = Object::Handle(Api::UnwrapHandle(object)); | 690 const Object& obj = Object::Handle(Api::UnwrapHandle(object)); |
| 707 return obj.IsNumber(); | 691 return obj.IsNumber(); |
| 708 } | 692 } |
| 709 | 693 |
| 710 | 694 |
| 711 DART_EXPORT bool Dart_IsInteger(Dart_Handle object) { | 695 DART_EXPORT bool Dart_IsInteger(Dart_Handle object) { |
| 712 Zone zone; // Setup a VM zone as we are creating some handles. | 696 DARTSCOPE(Isolate::Current()); |
| 713 HandleScope scope; // Setup a VM handle scope. | |
| 714 const Object& obj = Object::Handle(Api::UnwrapHandle(object)); | 697 const Object& obj = Object::Handle(Api::UnwrapHandle(object)); |
| 715 return obj.IsInteger(); | 698 return obj.IsInteger(); |
| 716 } | 699 } |
| 717 | 700 |
| 718 | 701 |
| 719 DART_EXPORT Dart_Handle Dart_NewInteger(int64_t value) { | 702 DART_EXPORT Dart_Handle Dart_NewInteger(int64_t value) { |
| 720 Zone zone; // Setup a VM zone as we are creating some handles. | 703 DARTSCOPE(Isolate::Current()); |
| 721 HandleScope scope; // Setup a VM handle scope. | |
| 722 const Integer& obj = Integer::Handle(Integer::New(value)); | 704 const Integer& obj = Integer::Handle(Integer::New(value)); |
| 723 return Api::NewLocalHandle(obj); | 705 return Api::NewLocalHandle(obj); |
| 724 } | 706 } |
| 725 | 707 |
| 726 | 708 |
| 727 DART_EXPORT Dart_Handle Dart_NewIntegerFromHexCString(const char* str) { | 709 DART_EXPORT Dart_Handle Dart_NewIntegerFromHexCString(const char* str) { |
| 728 Zone zone; // Setup a VM zone as we are creating some handles. | 710 DARTSCOPE(Isolate::Current()); |
| 729 HandleScope scope; // Setup a VM handle scope. | |
| 730 const String& str_obj = String::Handle(String::New(str)); | 711 const String& str_obj = String::Handle(String::New(str)); |
| 731 const Integer& obj = Integer::Handle(Integer::New(str_obj)); | 712 const Integer& obj = Integer::Handle(Integer::New(str_obj)); |
| 732 return Api::NewLocalHandle(obj); | 713 return Api::NewLocalHandle(obj); |
| 733 } | 714 } |
| 734 | 715 |
| 735 | 716 |
| 736 DART_EXPORT Dart_Handle Dart_IntegerValue(Dart_Handle integer, int64_t* value) { | 717 DART_EXPORT Dart_Handle Dart_IntegerValue(Dart_Handle integer, int64_t* value) { |
| 737 Zone zone; // Setup a VM zone as we are creating some handles. | 718 DARTSCOPE(Isolate::Current()); |
| 738 HandleScope scope; // Setup a VM handle scope. | |
| 739 const Object& obj = Object::Handle(Api::UnwrapHandle(integer)); | 719 const Object& obj = Object::Handle(Api::UnwrapHandle(integer)); |
| 740 if (obj.IsSmi() || obj.IsMint()) { | 720 if (obj.IsSmi() || obj.IsMint()) { |
| 741 Integer& integer = Integer::Handle(); | 721 Integer& integer = Integer::Handle(); |
| 742 integer ^= obj.raw(); | 722 integer ^= obj.raw(); |
| 743 *value = integer.AsInt64Value(); | 723 *value = integer.AsInt64Value(); |
| 744 return Api::Success(); | 724 return Api::Success(); |
| 745 } | 725 } |
| 746 if (obj.IsBigint()) { | 726 if (obj.IsBigint()) { |
| 747 Bigint& bigint = Bigint::Handle(); | 727 Bigint& bigint = Bigint::Handle(); |
| 748 bigint ^= obj.raw(); | 728 bigint ^= obj.raw(); |
| 749 if (BigintOperations::FitsIntoInt64(bigint)) { | 729 if (BigintOperations::FitsIntoInt64(bigint)) { |
| 750 *value = BigintOperations::ToInt64(bigint); | 730 *value = BigintOperations::ToInt64(bigint); |
| 751 return Api::Success(); | 731 return Api::Success(); |
| 752 } else { | 732 } else { |
| 753 return Api::Error("Integer too big to fit in int64_t"); | 733 return Api::Error("Integer too big to fit in int64_t"); |
| 754 } | 734 } |
| 755 } | 735 } |
| 756 return Api::Error("Object is not a Integer"); | 736 return Api::Error("Object is not a Integer"); |
| 757 } | 737 } |
| 758 | 738 |
| 759 | 739 |
| 760 DART_EXPORT Dart_Handle Dart_IntegerValueHexCString(Dart_Handle integer, | 740 DART_EXPORT Dart_Handle Dart_IntegerValueHexCString(Dart_Handle integer, |
| 761 const char** value) { | 741 const char** value) { |
| 762 Zone zone; // Setup a VM zone as we are creating some handles. | 742 DARTSCOPE(Isolate::Current()); |
| 763 HandleScope scope; // Setup a VM handle scope. | |
| 764 const Object& obj = Object::Handle(Api::UnwrapHandle(integer)); | 743 const Object& obj = Object::Handle(Api::UnwrapHandle(integer)); |
| 765 Bigint& bigint = Bigint::Handle(); | 744 Bigint& bigint = Bigint::Handle(); |
| 766 if (obj.IsSmi() || obj.IsMint()) { | 745 if (obj.IsSmi() || obj.IsMint()) { |
| 767 Integer& integer = Integer::Handle(); | 746 Integer& integer = Integer::Handle(); |
| 768 integer ^= obj.raw(); | 747 integer ^= obj.raw(); |
| 769 bigint ^= BigintOperations::NewFromInt64(integer.AsInt64Value()); | 748 bigint ^= BigintOperations::NewFromInt64(integer.AsInt64Value()); |
| 770 *value = BigintOperations::ToHexCString(bigint, &Api::Allocate); | 749 *value = BigintOperations::ToHexCString(bigint, &Api::Allocate); |
| 771 return Api::Success(); | 750 return Api::Success(); |
| 772 } | 751 } |
| 773 if (obj.IsBigint()) { | 752 if (obj.IsBigint()) { |
| 774 bigint ^= obj.raw(); | 753 bigint ^= obj.raw(); |
| 775 *value = BigintOperations::ToHexCString(bigint, &Api::Allocate); | 754 *value = BigintOperations::ToHexCString(bigint, &Api::Allocate); |
| 776 return Api::Success(); | 755 return Api::Success(); |
| 777 } | 756 } |
| 778 return Api::Error("Object is not a Integer"); | 757 return Api::Error("Object is not a Integer"); |
| 779 } | 758 } |
| 780 | 759 |
| 781 | 760 |
| 782 DART_EXPORT Dart_Handle Dart_IntegerFitsIntoInt64(Dart_Handle integer, | 761 DART_EXPORT Dart_Handle Dart_IntegerFitsIntoInt64(Dart_Handle integer, |
| 783 bool* fits) { | 762 bool* fits) { |
| 784 Zone zone; // Setup a VM zone as we are creating some handles. | 763 DARTSCOPE(Isolate::Current()); |
| 785 HandleScope scope; // Setup a VM handle scope. | |
| 786 const Object& obj = Object::Handle(Api::UnwrapHandle(integer)); | 764 const Object& obj = Object::Handle(Api::UnwrapHandle(integer)); |
| 787 if (obj.IsSmi() || obj.IsMint()) { | 765 if (obj.IsSmi() || obj.IsMint()) { |
| 788 *fits = true; | 766 *fits = true; |
| 789 return Api::Success(); | 767 return Api::Success(); |
| 790 } else if (obj.IsBigint()) { | 768 } else if (obj.IsBigint()) { |
| 791 #if defined(DEBUG) | 769 #if defined(DEBUG) |
| 792 Bigint& bigint = Bigint::Handle(); | 770 Bigint& bigint = Bigint::Handle(); |
| 793 bigint ^= obj.raw(); | 771 bigint ^= obj.raw(); |
| 794 ASSERT(!BigintOperations::FitsIntoInt64(bigint)); | 772 ASSERT(!BigintOperations::FitsIntoInt64(bigint)); |
| 795 #endif | 773 #endif |
| 796 *fits = false; | 774 *fits = false; |
| 797 return Api::Success(); | 775 return Api::Success(); |
| 798 } | 776 } |
| 799 return Api::Error("Object is not a Integer"); | 777 return Api::Error("Object is not a Integer"); |
| 800 } | 778 } |
| 801 | 779 |
| 802 | 780 |
| 803 DART_EXPORT Dart_Handle Dart_True() { | 781 DART_EXPORT Dart_Handle Dart_True() { |
| 804 return Api::True(); | 782 return Api::True(); |
| 805 } | 783 } |
| 806 | 784 |
| 807 | 785 |
| 808 DART_EXPORT Dart_Handle Dart_False() { | 786 DART_EXPORT Dart_Handle Dart_False() { |
| 809 return Api::False(); | 787 return Api::False(); |
| 810 } | 788 } |
| 811 | 789 |
| 812 | 790 |
| 813 DART_EXPORT bool Dart_IsBoolean(Dart_Handle object) { | 791 DART_EXPORT bool Dart_IsBoolean(Dart_Handle object) { |
| 814 Zone zone; // Setup a VM zone as we are creating some handles. | 792 DARTSCOPE(Isolate::Current()); |
| 815 HandleScope scope; // Setup a VM handle scope. | |
| 816 const Object& obj = Object::Handle(Api::UnwrapHandle(object)); | 793 const Object& obj = Object::Handle(Api::UnwrapHandle(object)); |
| 817 return obj.IsBool(); | 794 return obj.IsBool(); |
| 818 } | 795 } |
| 819 | 796 |
| 820 | 797 |
| 821 DART_EXPORT Dart_Handle Dart_NewBoolean(bool value) { | 798 DART_EXPORT Dart_Handle Dart_NewBoolean(bool value) { |
| 822 return value ? Api::True() : Api::False(); | 799 return value ? Api::True() : Api::False(); |
| 823 } | 800 } |
| 824 | 801 |
| 825 | 802 |
| 826 DART_EXPORT Dart_Handle Dart_BooleanValue(Dart_Handle bool_object, | 803 DART_EXPORT Dart_Handle Dart_BooleanValue(Dart_Handle bool_object, |
| 827 bool* value) { | 804 bool* value) { |
| 828 Zone zone; // Setup a VM zone as we are creating some handles. | 805 DARTSCOPE(Isolate::Current()); |
| 829 HandleScope scope; // Setup a VM handle scope. | |
| 830 const Object& obj = Object::Handle(Api::UnwrapHandle(bool_object)); | 806 const Object& obj = Object::Handle(Api::UnwrapHandle(bool_object)); |
| 831 if (obj.IsBool()) { | 807 if (obj.IsBool()) { |
| 832 Bool& bool_obj = Bool::Handle(); | 808 Bool& bool_obj = Bool::Handle(); |
| 833 bool_obj ^= obj.raw(); | 809 bool_obj ^= obj.raw(); |
| 834 *value = bool_obj.value(); | 810 *value = bool_obj.value(); |
| 835 return Api::Success(); | 811 return Api::Success(); |
| 836 } | 812 } |
| 837 return Api::Error("Object is not a Boolean"); | 813 return Api::Error("Object is not a Boolean"); |
| 838 } | 814 } |
| 839 | 815 |
| 840 | 816 |
| 841 DART_EXPORT bool Dart_IsDouble(Dart_Handle object) { | 817 DART_EXPORT bool Dart_IsDouble(Dart_Handle object) { |
| 842 Zone zone; // Setup a VM zone as we are creating some handles. | 818 DARTSCOPE(Isolate::Current()); |
| 843 HandleScope scope; // Setup a VM handle scope. | |
| 844 const Object& obj = Object::Handle(Api::UnwrapHandle(object)); | 819 const Object& obj = Object::Handle(Api::UnwrapHandle(object)); |
| 845 return obj.IsDouble(); | 820 return obj.IsDouble(); |
| 846 } | 821 } |
| 847 | 822 |
| 848 | 823 |
| 849 DART_EXPORT Dart_Handle Dart_NewDouble(double value) { | 824 DART_EXPORT Dart_Handle Dart_NewDouble(double value) { |
| 850 Zone zone; // Setup a VM zone as we are creating some handles. | 825 DARTSCOPE(Isolate::Current()); |
| 851 HandleScope scope; // Setup a VM handle scope. | |
| 852 const Double& obj = Double::Handle(Double::New(value)); | 826 const Double& obj = Double::Handle(Double::New(value)); |
| 853 return Api::NewLocalHandle(obj); | 827 return Api::NewLocalHandle(obj); |
| 854 } | 828 } |
| 855 | 829 |
| 856 | 830 |
| 857 DART_EXPORT Dart_Handle Dart_DoubleValue(Dart_Handle integer, double* result) { | 831 DART_EXPORT Dart_Handle Dart_DoubleValue(Dart_Handle integer, double* result) { |
| 858 Zone zone; // Setup a VM zone as we are creating some handles. | 832 DARTSCOPE(Isolate::Current()); |
| 859 HandleScope scope; // Setup a VM handle scope. | |
| 860 const Object& obj = Object::Handle(Api::UnwrapHandle(integer)); | 833 const Object& obj = Object::Handle(Api::UnwrapHandle(integer)); |
| 861 if (obj.IsDouble()) { | 834 if (obj.IsDouble()) { |
| 862 Double& double_obj = Double::Handle(); | 835 Double& double_obj = Double::Handle(); |
| 863 double_obj ^= obj.raw(); | 836 double_obj ^= obj.raw(); |
| 864 *result = double_obj.value(); | 837 *result = double_obj.value(); |
| 865 return Api::Success(); | 838 return Api::Success(); |
| 866 } | 839 } |
| 867 return Api::Error("Object is not a Double"); | 840 return Api::Error("Object is not a Double"); |
| 868 } | 841 } |
| 869 | 842 |
| 870 | 843 |
| 871 DART_EXPORT bool Dart_IsString(Dart_Handle object) { | 844 DART_EXPORT bool Dart_IsString(Dart_Handle object) { |
| 872 Zone zone; // Setup a VM zone as we are creating some handles. | 845 DARTSCOPE(Isolate::Current()); |
| 873 HandleScope scope; // Setup a VM handle scope. | |
| 874 const Object& obj = Object::Handle(Api::UnwrapHandle(object)); | 846 const Object& obj = Object::Handle(Api::UnwrapHandle(object)); |
| 875 return obj.IsString(); | 847 return obj.IsString(); |
| 876 } | 848 } |
| 877 | 849 |
| 878 | 850 |
| 879 DART_EXPORT Dart_Handle Dart_StringLength(Dart_Handle str, intptr_t* len) { | 851 DART_EXPORT Dart_Handle Dart_StringLength(Dart_Handle str, intptr_t* len) { |
| 880 Zone zone; // Setup a VM zone as we are creating some handles. | 852 DARTSCOPE(Isolate::Current()); |
| 881 HandleScope scope; // Setup a VM handle scope. | |
| 882 const Object& obj = Object::Handle(Api::UnwrapHandle(str)); | 853 const Object& obj = Object::Handle(Api::UnwrapHandle(str)); |
| 883 if (obj.IsString()) { | 854 if (obj.IsString()) { |
| 884 String& string_obj = String::Handle(); | 855 String& string_obj = String::Handle(); |
| 885 string_obj ^= obj.raw(); | 856 string_obj ^= obj.raw(); |
| 886 *len = string_obj.Length(); | 857 *len = string_obj.Length(); |
| 887 return Api::Success(); | 858 return Api::Success(); |
| 888 } | 859 } |
| 889 return Api::Error("Object is not a String"); | 860 return Api::Error("Object is not a String"); |
| 890 } | 861 } |
| 891 | 862 |
| 892 | 863 |
| 893 DART_EXPORT Dart_Handle Dart_NewString(const char* str) { | 864 DART_EXPORT Dart_Handle Dart_NewString(const char* str) { |
| 894 Zone zone; // Setup a VM zone as we are creating some handles. | 865 DARTSCOPE(Isolate::Current()); |
| 895 HandleScope scope; // Setup a VM handle scope. | |
| 896 const String& obj = String::Handle(String::New(str)); | 866 const String& obj = String::Handle(String::New(str)); |
| 897 return Api::NewLocalHandle(obj); | 867 return Api::NewLocalHandle(obj); |
| 898 } | 868 } |
| 899 | 869 |
| 900 | 870 |
| 901 DART_EXPORT Dart_Handle Dart_NewString8(const uint8_t* codepoints, | 871 DART_EXPORT Dart_Handle Dart_NewString8(const uint8_t* codepoints, |
| 902 intptr_t length) { | 872 intptr_t length) { |
| 903 Zone zone; // Setup a VM zone as we are creating some handles. | 873 DARTSCOPE(Isolate::Current()); |
| 904 HandleScope scope; // Setup a VM handle scope. | |
| 905 const String& obj = String::Handle(String::New(codepoints, length)); | 874 const String& obj = String::Handle(String::New(codepoints, length)); |
| 906 return Api::NewLocalHandle(obj); | 875 return Api::NewLocalHandle(obj); |
| 907 } | 876 } |
| 908 | 877 |
| 909 | 878 |
| 910 DART_EXPORT Dart_Handle Dart_NewString16(const uint16_t* codepoints, | 879 DART_EXPORT Dart_Handle Dart_NewString16(const uint16_t* codepoints, |
| 911 intptr_t length) { | 880 intptr_t length) { |
| 912 Zone zone; // Setup a VM zone as we are creating some handles. | 881 DARTSCOPE(Isolate::Current()); |
| 913 HandleScope scope; // Setup a VM handle scope. | |
| 914 const String& obj = String::Handle(String::New(codepoints, length)); | 882 const String& obj = String::Handle(String::New(codepoints, length)); |
| 915 return Api::NewLocalHandle(obj); | 883 return Api::NewLocalHandle(obj); |
| 916 } | 884 } |
| 917 | 885 |
| 918 | 886 |
| 919 DART_EXPORT Dart_Handle Dart_NewString32(const uint32_t* codepoints, | 887 DART_EXPORT Dart_Handle Dart_NewString32(const uint32_t* codepoints, |
| 920 intptr_t length) { | 888 intptr_t length) { |
| 921 Zone zone; // Setup a VM zone as we are creating some handles. | 889 DARTSCOPE(Isolate::Current()); |
| 922 HandleScope scope; // Setup a VM handle scope. | |
| 923 const String& obj = String::Handle(String::New(codepoints, length)); | 890 const String& obj = String::Handle(String::New(codepoints, length)); |
| 924 return Api::NewLocalHandle(obj); | 891 return Api::NewLocalHandle(obj); |
| 925 } | 892 } |
| 926 | 893 |
| 927 | 894 |
| 928 DART_EXPORT bool Dart_IsString8(Dart_Handle object) { | 895 DART_EXPORT bool Dart_IsString8(Dart_Handle object) { |
| 929 Zone zone; // Setup a VM zone as we are creating some handles. | 896 DARTSCOPE(Isolate::Current()); |
| 930 HandleScope scope; // Setup a VM handle scope. | |
| 931 const Object& obj = Object::Handle(Api::UnwrapHandle(object)); | 897 const Object& obj = Object::Handle(Api::UnwrapHandle(object)); |
| 932 return obj.IsOneByteString(); | 898 return obj.IsOneByteString(); |
| 933 } | 899 } |
| 934 | 900 |
| 935 | 901 |
| 936 DART_EXPORT bool Dart_IsString16(Dart_Handle object) { | 902 DART_EXPORT bool Dart_IsString16(Dart_Handle object) { |
| 937 Zone zone; // Setup a VM zone as we are creating some handles. | 903 DARTSCOPE(Isolate::Current()); |
| 938 HandleScope scope; // Setup a VM handle scope. | |
| 939 const Object& obj = Object::Handle(Api::UnwrapHandle(object)); | 904 const Object& obj = Object::Handle(Api::UnwrapHandle(object)); |
| 940 return obj.IsOneByteString() || obj.IsTwoByteString(); | 905 return obj.IsOneByteString() || obj.IsTwoByteString(); |
| 941 } | 906 } |
| 942 | 907 |
| 943 | 908 |
| 944 DART_EXPORT Dart_Handle Dart_StringGet8(Dart_Handle str, | 909 DART_EXPORT Dart_Handle Dart_StringGet8(Dart_Handle str, |
| 945 uint8_t* codepoints, | 910 uint8_t* codepoints, |
| 946 intptr_t* length) { | 911 intptr_t* length) { |
| 947 Zone zone; // Setup a VM zone as we are creating some handles. | 912 DARTSCOPE(Isolate::Current()); |
| 948 HandleScope scope; // Setup a VM handle scope. | |
| 949 const Object& obj = Object::Handle(Api::UnwrapHandle(str)); | 913 const Object& obj = Object::Handle(Api::UnwrapHandle(str)); |
| 950 if (obj.IsOneByteString()) { | 914 if (obj.IsOneByteString()) { |
| 951 OneByteString& string_obj = OneByteString::Handle(); | 915 OneByteString& string_obj = OneByteString::Handle(); |
| 952 string_obj ^= obj.raw(); | 916 string_obj ^= obj.raw(); |
| 953 intptr_t str_len = string_obj.Length(); | 917 intptr_t str_len = string_obj.Length(); |
| 954 intptr_t copy_len = (str_len > *length) ? *length : str_len; | 918 intptr_t copy_len = (str_len > *length) ? *length : str_len; |
| 955 for (intptr_t i = 0; i < copy_len; i++) { | 919 for (intptr_t i = 0; i < copy_len; i++) { |
| 956 codepoints[i] = static_cast<uint8_t>(string_obj.CharAt(i)); | 920 codepoints[i] = static_cast<uint8_t>(string_obj.CharAt(i)); |
| 957 } | 921 } |
| 958 *length= copy_len; | 922 *length= copy_len; |
| 959 return Api::Success(); | 923 return Api::Success(); |
| 960 } | 924 } |
| 961 return Api::Error(obj.IsString() | 925 return Api::Error(obj.IsString() |
| 962 ? "Object is not a String8" | 926 ? "Object is not a String8" |
| 963 : "Object is not a String"); | 927 : "Object is not a String"); |
| 964 } | 928 } |
| 965 | 929 |
| 966 | 930 |
| 967 DART_EXPORT Dart_Handle Dart_StringGet16(Dart_Handle str, | 931 DART_EXPORT Dart_Handle Dart_StringGet16(Dart_Handle str, |
| 968 uint16_t* codepoints, | 932 uint16_t* codepoints, |
| 969 intptr_t* length) { | 933 intptr_t* length) { |
| 970 Zone zone; // Setup a VM zone as we are creating some handles. | 934 DARTSCOPE(Isolate::Current()); |
| 971 HandleScope scope; // Setup a VM handle scope. | |
| 972 const Object& obj = Object::Handle(Api::UnwrapHandle(str)); | 935 const Object& obj = Object::Handle(Api::UnwrapHandle(str)); |
| 973 if (obj.IsOneByteString() || obj.IsTwoByteString()) { | 936 if (obj.IsOneByteString() || obj.IsTwoByteString()) { |
| 974 String& string_obj = String::Handle(); | 937 String& string_obj = String::Handle(); |
| 975 string_obj ^= obj.raw(); | 938 string_obj ^= obj.raw(); |
| 976 intptr_t str_len = string_obj.Length(); | 939 intptr_t str_len = string_obj.Length(); |
| 977 intptr_t copy_len = (str_len > *length) ? *length : str_len; | 940 intptr_t copy_len = (str_len > *length) ? *length : str_len; |
| 978 for (intptr_t i = 0; i < copy_len; i++) { | 941 for (intptr_t i = 0; i < copy_len; i++) { |
| 979 codepoints[i] = static_cast<uint16_t>(string_obj.CharAt(i)); | 942 codepoints[i] = static_cast<uint16_t>(string_obj.CharAt(i)); |
| 980 } | 943 } |
| 981 *length = copy_len; | 944 *length = copy_len; |
| 982 return Api::Success(); | 945 return Api::Success(); |
| 983 } | 946 } |
| 984 return Api::Error(obj.IsString() | 947 return Api::Error(obj.IsString() |
| 985 ? "Object is not a String16" | 948 ? "Object is not a String16" |
| 986 : "Object is not a String"); | 949 : "Object is not a String"); |
| 987 } | 950 } |
| 988 | 951 |
| 989 | 952 |
| 990 DART_EXPORT Dart_Handle Dart_StringGet32(Dart_Handle str, | 953 DART_EXPORT Dart_Handle Dart_StringGet32(Dart_Handle str, |
| 991 uint32_t* codepoints, | 954 uint32_t* codepoints, |
| 992 intptr_t* length) { | 955 intptr_t* length) { |
| 993 Zone zone; // Setup a VM zone as we are creating some handles. | 956 DARTSCOPE(Isolate::Current()); |
| 994 HandleScope scope; // Setup a VM handle scope. | |
| 995 const Object& obj = Object::Handle(Api::UnwrapHandle(str)); | 957 const Object& obj = Object::Handle(Api::UnwrapHandle(str)); |
| 996 if (obj.IsString()) { | 958 if (obj.IsString()) { |
| 997 String& string_obj = String::Handle(); | 959 String& string_obj = String::Handle(); |
| 998 string_obj ^= obj.raw(); | 960 string_obj ^= obj.raw(); |
| 999 intptr_t str_len = string_obj.Length(); | 961 intptr_t str_len = string_obj.Length(); |
| 1000 intptr_t copy_len = (str_len > *length) ? *length : str_len; | 962 intptr_t copy_len = (str_len > *length) ? *length : str_len; |
| 1001 for (intptr_t i = 0; i < copy_len; i++) { | 963 for (intptr_t i = 0; i < copy_len; i++) { |
| 1002 codepoints[i] = static_cast<uint32_t>(string_obj.CharAt(i)); | 964 codepoints[i] = static_cast<uint32_t>(string_obj.CharAt(i)); |
| 1003 } | 965 } |
| 1004 *length = copy_len; | 966 *length = copy_len; |
| 1005 return Api::Success(); | 967 return Api::Success(); |
| 1006 } | 968 } |
| 1007 return Api::Error("Object is not a String"); | 969 return Api::Error("Object is not a String"); |
| 1008 } | 970 } |
| 1009 | 971 |
| 1010 | 972 |
| 1011 DART_EXPORT Dart_Handle Dart_StringToCString(Dart_Handle object, | 973 DART_EXPORT Dart_Handle Dart_StringToCString(Dart_Handle object, |
| 1012 const char** result) { | 974 const char** result) { |
| 1013 Zone zone; // Setup a VM zone as we are creating some handles. | 975 DARTSCOPE(Isolate::Current()); |
| 1014 HandleScope scope; // Setup a VM handle scope. | |
| 1015 const Object& obj = Object::Handle(Api::UnwrapHandle(object)); | 976 const Object& obj = Object::Handle(Api::UnwrapHandle(object)); |
| 1016 if (obj.IsString()) { | 977 if (obj.IsString()) { |
| 1017 const char* string_value = obj.ToCString(); | 978 const char* string_value = obj.ToCString(); |
| 1018 intptr_t string_length = strlen(string_value); | 979 intptr_t string_length = strlen(string_value); |
| 1019 char* res = reinterpret_cast<char*>(Api::Allocate(string_length + 1)); | 980 char* res = reinterpret_cast<char*>(Api::Allocate(string_length + 1)); |
| 1020 if (res == NULL) { | 981 if (res == NULL) { |
| 1021 return Api::Error("Unable to allocate memory"); | 982 return Api::Error("Unable to allocate memory"); |
| 1022 } | 983 } |
| 1023 strncpy(res, string_value, string_length + 1); | 984 strncpy(res, string_value, string_length + 1); |
| 1024 ASSERT(res[string_length] == '\0'); | 985 ASSERT(res[string_length] == '\0'); |
| 1025 *result = res; | 986 *result = res; |
| 1026 return Api::Success(); | 987 return Api::Success(); |
| 1027 } | 988 } |
| 1028 return Api::Error("Object is not a String"); | 989 return Api::Error("Object is not a String"); |
| 1029 } | 990 } |
| 1030 | 991 |
| 1031 | 992 |
| 1032 static RawInstance* GetListInstance(Isolate* isolate, const Object& obj) { | 993 static RawInstance* GetListInstance(Isolate* isolate, const Object& obj) { |
| 1033 if (obj.IsInstance()) { | 994 if (obj.IsInstance()) { |
| 1034 Instance& instance = Instance::Handle(); | 995 Instance& instance = Instance::Handle(); |
| 1035 instance ^= obj.raw(); | 996 instance ^= obj.raw(); |
| 1036 const Type& type = Type::Handle(isolate->object_store()->list_interface()); | 997 const Type& type = Type::Handle(isolate->object_store()->list_interface()); |
| 1037 return instance.Is(type) ? instance.raw() : Instance::null(); | 998 return instance.Is(type) ? instance.raw() : Instance::null(); |
| 1038 } | 999 } |
| 1039 return Instance::null(); | 1000 return Instance::null(); |
| 1040 } | 1001 } |
| 1041 | 1002 |
| 1042 | 1003 |
| 1043 DART_EXPORT bool Dart_IsList(Dart_Handle object) { | 1004 DART_EXPORT bool Dart_IsList(Dart_Handle object) { |
| 1044 Zone zone; // Setup a VM zone as we are creating some handles. | 1005 Isolate* isolate = Isolate::Current(); |
| 1045 HandleScope scope; // Setup a VM handle scope. | 1006 DARTSCOPE(isolate); |
| 1046 const Object& obj = Object::Handle(Api::UnwrapHandle(object)); | 1007 const Object& obj = Object::Handle(Api::UnwrapHandle(object)); |
| 1047 // TODO(5526318): Make access to GrowableObjectArray more efficient. | 1008 // TODO(5526318): Make access to GrowableObjectArray more efficient. |
| 1048 return (obj.IsArray() || | 1009 return (obj.IsArray() || |
| 1049 (GetListInstance(Isolate::Current(), obj) != Instance::null())); | 1010 (GetListInstance(isolate, obj) != Instance::null())); |
| 1050 } | 1011 } |
| 1051 | 1012 |
| 1052 | 1013 |
| 1053 DART_EXPORT Dart_Handle Dart_NewList(intptr_t length) { | 1014 DART_EXPORT Dart_Handle Dart_NewList(intptr_t length) { |
| 1054 Zone zone; // Setup a VM zone as we are creating some handles. | 1015 DARTSCOPE(Isolate::Current()); |
| 1055 HandleScope scope; // Setup a VM handle scope. | |
| 1056 const Array& obj = Array::Handle(Array::New(length)); | 1016 const Array& obj = Array::Handle(Array::New(length)); |
| 1057 return Api::NewLocalHandle(obj); | 1017 return Api::NewLocalHandle(obj); |
| 1058 } | 1018 } |
| 1059 | 1019 |
| 1060 | 1020 |
| 1061 DART_EXPORT Dart_Handle Dart_ListLength(Dart_Handle list, intptr_t* len) { | 1021 DART_EXPORT Dart_Handle Dart_ListLength(Dart_Handle list, intptr_t* len) { |
| 1062 Zone zone; // Setup a VM zone as we are creating some handles. | 1022 Isolate* isolate = Isolate::Current(); |
| 1063 HandleScope scope; // Setup a VM handle scope. | 1023 DARTSCOPE(isolate); |
| 1064 const Object& obj = Object::Handle(Api::UnwrapHandle(list)); | 1024 const Object& obj = Object::Handle(Api::UnwrapHandle(list)); |
| 1065 if (obj.IsArray()) { | 1025 if (obj.IsArray()) { |
| 1066 Array& array_obj = Array::Handle(); | 1026 Array& array_obj = Array::Handle(); |
| 1067 array_obj ^= obj.raw(); | 1027 array_obj ^= obj.raw(); |
| 1068 *len = array_obj.Length(); | 1028 *len = array_obj.Length(); |
| 1069 return Api::Success(); | 1029 return Api::Success(); |
| 1070 } | 1030 } |
| 1071 // TODO(5526318): Make access to GrowableObjectArray more efficient. | 1031 // TODO(5526318): Make access to GrowableObjectArray more efficient. |
| 1072 // Now check and handle a dart object that implements the List interface. | 1032 // Now check and handle a dart object that implements the List interface. |
| 1073 Isolate* isolate = Isolate::Current(); | |
| 1074 const Instance& instance = Instance::Handle(GetListInstance(isolate, obj)); | 1033 const Instance& instance = Instance::Handle(GetListInstance(isolate, obj)); |
| 1075 if (!instance.IsNull()) { | 1034 if (!instance.IsNull()) { |
| 1076 String& name = String::Handle(String::New("length")); | 1035 String& name = String::Handle(String::New("length")); |
| 1077 name = Field::GetterName(name); | 1036 name = Field::GetterName(name); |
| 1078 const Function& function = Function::Handle( | 1037 const Function& function = Function::Handle( |
| 1079 Resolver::ResolveDynamic(instance, name, 1, 0)); | 1038 Resolver::ResolveDynamic(instance, name, 1, 0)); |
| 1080 if (!function.IsNull()) { | 1039 if (!function.IsNull()) { |
| 1081 GrowableArray<const Object*> args(0); | 1040 GrowableArray<const Object*> args(0); |
| 1082 LongJump* base = isolate->long_jump_base(); | 1041 LongJump* base = isolate->long_jump_base(); |
| 1083 LongJump jump; | 1042 LongJump jump; |
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1150 SetupErrorResult(result); | 1109 SetupErrorResult(result); |
| 1151 isolate->set_long_jump_base(base); | 1110 isolate->set_long_jump_base(base); |
| 1152 return Object::null(); | 1111 return Object::null(); |
| 1153 } | 1112 } |
| 1154 | 1113 |
| 1155 | 1114 |
| 1156 DART_EXPORT Dart_Handle Dart_ListGetAsBytes(Dart_Handle list, | 1115 DART_EXPORT Dart_Handle Dart_ListGetAsBytes(Dart_Handle list, |
| 1157 intptr_t offset, | 1116 intptr_t offset, |
| 1158 uint8_t* native_array, | 1117 uint8_t* native_array, |
| 1159 intptr_t length) { | 1118 intptr_t length) { |
| 1160 Zone zone; // Setup a VM zone as we are creating some handles. | 1119 Isolate* isolate = Isolate::Current(); |
| 1161 HandleScope scope; // Setup a VM handle scope. | 1120 DARTSCOPE(isolate); |
| 1162 const Object& obj = Object::Handle(Api::UnwrapHandle(list)); | 1121 const Object& obj = Object::Handle(Api::UnwrapHandle(list)); |
| 1163 if (obj.IsArray()) { | 1122 if (obj.IsArray()) { |
| 1164 Array& array_obj = Array::Handle(); | 1123 Array& array_obj = Array::Handle(); |
| 1165 array_obj ^= obj.raw(); | 1124 array_obj ^= obj.raw(); |
| 1166 if ((offset + length) <= array_obj.Length()) { | 1125 if ((offset + length) <= array_obj.Length()) { |
| 1167 Object& element = Object::Handle(); | 1126 Object& element = Object::Handle(); |
| 1168 Integer& integer = Integer::Handle(); | 1127 Integer& integer = Integer::Handle(); |
| 1169 for (int i = 0; i < length; i++) { | 1128 for (int i = 0; i < length; i++) { |
| 1170 element = array_obj.At(offset + i); | 1129 element = array_obj.At(offset + i); |
| 1171 integer ^= element.raw(); | 1130 integer ^= element.raw(); |
| 1172 native_array[i] = static_cast<uint8_t>(integer.AsInt64Value() & 0xff); | 1131 native_array[i] = static_cast<uint8_t>(integer.AsInt64Value() & 0xff); |
| 1173 ASSERT(integer.AsInt64Value() <= 0xff); | 1132 ASSERT(integer.AsInt64Value() <= 0xff); |
| 1174 // TODO(hpayer): value should always be smaller then 0xff. Add error | 1133 // TODO(hpayer): value should always be smaller then 0xff. Add error |
| 1175 // handling. | 1134 // handling. |
| 1176 } | 1135 } |
| 1177 return Api::Success(); | 1136 return Api::Success(); |
| 1178 } | 1137 } |
| 1179 return Api::Error("Invalid length passed in to access array elements"); | 1138 return Api::Error("Invalid length passed in to access array elements"); |
| 1180 } | 1139 } |
| 1181 // TODO(5526318): Make access to GrowableObjectArray more efficient. | 1140 // TODO(5526318): Make access to GrowableObjectArray more efficient. |
| 1182 // Now check and handle a dart object that implements the List interface. | 1141 // Now check and handle a dart object that implements the List interface. |
| 1183 Isolate* isolate = Isolate::Current(); | |
| 1184 const Instance& instance = Instance::Handle(GetListInstance(isolate, obj)); | 1142 const Instance& instance = Instance::Handle(GetListInstance(isolate, obj)); |
| 1185 if (!instance.IsNull()) { | 1143 if (!instance.IsNull()) { |
| 1186 String& name = String::Handle(String::New("[]")); | 1144 String& name = String::Handle(String::New("[]")); |
| 1187 const Function& function = Function::Handle( | 1145 const Function& function = Function::Handle( |
| 1188 Resolver::ResolveDynamic(instance, name, 2, 0)); | 1146 Resolver::ResolveDynamic(instance, name, 2, 0)); |
| 1189 if (!function.IsNull()) { | 1147 if (!function.IsNull()) { |
| 1190 Object& element = Object::Handle(); | 1148 Object& element = Object::Handle(); |
| 1191 Integer& intobj = Integer::Handle(); | 1149 Integer& intobj = Integer::Handle(); |
| 1192 Dart_Handle result; | 1150 Dart_Handle result; |
| 1193 for (int i = 0; i < length; i++) { | 1151 for (int i = 0; i < length; i++) { |
| 1194 intobj = Integer::New(offset + i); | 1152 intobj = Integer::New(offset + i); |
| 1195 element = GetListAt(isolate, instance, intobj, function, &result); | 1153 element = GetListAt(isolate, instance, intobj, function, &result); |
| 1196 if (Dart_IsError(result)) { | 1154 if (Dart_IsError(result)) { |
| 1197 return result; // Error condition. | 1155 return result; // Error condition. |
| 1198 } | 1156 } |
| 1199 intobj ^= element.raw(); | 1157 intobj ^= element.raw(); |
| 1200 ASSERT(intobj.AsInt64Value() <= 0xff); | 1158 ASSERT(intobj.AsInt64Value() <= 0xff); |
| 1201 // TODO(hpayer): value should always be smaller then 0xff. Add error | 1159 // TODO(hpayer): value should always be smaller then 0xff. Add error |
| 1202 // handling. | 1160 // handling. |
| 1203 native_array[i] = static_cast<uint8_t>(intobj.AsInt64Value() & 0xff); | 1161 native_array[i] = static_cast<uint8_t>(intobj.AsInt64Value() & 0xff); |
| 1204 } | 1162 } |
| 1205 return Api::Success(); | 1163 return Api::Success(); |
| 1206 } | 1164 } |
| 1207 } | 1165 } |
| 1208 return Api::Error("Object does not implement the 'List' interface"); | 1166 return Api::Error("Object does not implement the 'List' interface"); |
| 1209 } | 1167 } |
| 1210 | 1168 |
| 1211 | 1169 |
| 1212 DART_EXPORT Dart_Handle Dart_ListGetAt(Dart_Handle list, intptr_t index) { | 1170 DART_EXPORT Dart_Handle Dart_ListGetAt(Dart_Handle list, intptr_t index) { |
| 1213 Zone zone; // Setup a VM zone as we are creating some handles. | 1171 Isolate* isolate = Isolate::Current(); |
| 1214 HandleScope scope; // Setup a VM handle scope. | 1172 DARTSCOPE(isolate); |
| 1215 const Object& obj = Object::Handle(Api::UnwrapHandle(list)); | 1173 const Object& obj = Object::Handle(Api::UnwrapHandle(list)); |
| 1216 if (obj.IsArray()) { | 1174 if (obj.IsArray()) { |
| 1217 Array& array_obj = Array::Handle(); | 1175 Array& array_obj = Array::Handle(); |
| 1218 array_obj ^= obj.raw(); | 1176 array_obj ^= obj.raw(); |
| 1219 if ((index >= 0) && (index < array_obj.Length())) { | 1177 if ((index >= 0) && (index < array_obj.Length())) { |
| 1220 const Object& element = Object::Handle(array_obj.At(index)); | 1178 const Object& element = Object::Handle(array_obj.At(index)); |
| 1221 return Api::NewLocalHandle(element); | 1179 return Api::NewLocalHandle(element); |
| 1222 } | 1180 } |
| 1223 return Api::Error("Invalid index passed in to access array element"); | 1181 return Api::Error("Invalid index passed in to access array element"); |
| 1224 } | 1182 } |
| 1225 // TODO(5526318): Make access to GrowableObjectArray more efficient. | 1183 // TODO(5526318): Make access to GrowableObjectArray more efficient. |
| 1226 // Now check and handle a dart object that implements the List interface. | 1184 // Now check and handle a dart object that implements the List interface. |
| 1227 Isolate* isolate = Isolate::Current(); | |
| 1228 const Instance& instance = Instance::Handle(GetListInstance(isolate, obj)); | 1185 const Instance& instance = Instance::Handle(GetListInstance(isolate, obj)); |
| 1229 if (!instance.IsNull()) { | 1186 if (!instance.IsNull()) { |
| 1230 String& name = String::Handle(String::New("[]")); | 1187 String& name = String::Handle(String::New("[]")); |
| 1231 const Function& function = Function::Handle( | 1188 const Function& function = Function::Handle( |
| 1232 Resolver::ResolveDynamic(instance, name, 2, 0)); | 1189 Resolver::ResolveDynamic(instance, name, 2, 0)); |
| 1233 if (!function.IsNull()) { | 1190 if (!function.IsNull()) { |
| 1234 Object& element = Object::Handle(); | 1191 Object& element = Object::Handle(); |
| 1235 Integer& indexobj = Integer::Handle(); | 1192 Integer& indexobj = Integer::Handle(); |
| 1236 Dart_Handle result; | 1193 Dart_Handle result; |
| 1237 indexobj = Integer::New(index); | 1194 indexobj = Integer::New(index); |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1276 SetupErrorResult(result); | 1233 SetupErrorResult(result); |
| 1277 } | 1234 } |
| 1278 isolate->set_long_jump_base(base); | 1235 isolate->set_long_jump_base(base); |
| 1279 } | 1236 } |
| 1280 | 1237 |
| 1281 | 1238 |
| 1282 DART_EXPORT Dart_Handle Dart_ListSetAsBytes(Dart_Handle list, | 1239 DART_EXPORT Dart_Handle Dart_ListSetAsBytes(Dart_Handle list, |
| 1283 intptr_t offset, | 1240 intptr_t offset, |
| 1284 uint8_t* native_array, | 1241 uint8_t* native_array, |
| 1285 intptr_t length) { | 1242 intptr_t length) { |
| 1286 Zone zone; | 1243 Isolate* isolate = Isolate::Current(); |
| 1287 HandleScope scope; | 1244 DARTSCOPE(isolate); |
| 1288 const Object& obj = Object::Handle(Api::UnwrapHandle(list)); | 1245 const Object& obj = Object::Handle(Api::UnwrapHandle(list)); |
| 1289 if (obj.IsArray()) { | 1246 if (obj.IsArray()) { |
| 1290 Array& array_obj = Array::Handle(); | 1247 Array& array_obj = Array::Handle(); |
| 1291 array_obj ^= obj.raw(); | 1248 array_obj ^= obj.raw(); |
| 1292 Integer& integer = Integer::Handle(); | 1249 Integer& integer = Integer::Handle(); |
| 1293 if ((offset + length) <= array_obj.Length()) { | 1250 if ((offset + length) <= array_obj.Length()) { |
| 1294 for (int i = 0; i < length; i++) { | 1251 for (int i = 0; i < length; i++) { |
| 1295 integer ^= Integer::New(native_array[i]); | 1252 integer ^= Integer::New(native_array[i]); |
| 1296 array_obj.SetAt(offset + i, integer); | 1253 array_obj.SetAt(offset + i, integer); |
| 1297 } | 1254 } |
| 1298 return Api::Success(); | 1255 return Api::Success(); |
| 1299 } | 1256 } |
| 1300 return Api::Error("Invalid length passed in to set array elements"); | 1257 return Api::Error("Invalid length passed in to set array elements"); |
| 1301 } | 1258 } |
| 1302 // TODO(5526318): Make access to GrowableObjectArray more efficient. | 1259 // TODO(5526318): Make access to GrowableObjectArray more efficient. |
| 1303 // Now check and handle a dart object that implements the List interface. | 1260 // Now check and handle a dart object that implements the List interface. |
| 1304 Isolate* isolate = Isolate::Current(); | |
| 1305 const Instance& instance = Instance::Handle(GetListInstance(isolate, obj)); | 1261 const Instance& instance = Instance::Handle(GetListInstance(isolate, obj)); |
| 1306 if (!instance.IsNull()) { | 1262 if (!instance.IsNull()) { |
| 1307 String& name = String::Handle(String::New("[]=")); | 1263 String& name = String::Handle(String::New("[]=")); |
| 1308 const Function& function = Function::Handle( | 1264 const Function& function = Function::Handle( |
| 1309 Resolver::ResolveDynamic(instance, name, 3, 0)); | 1265 Resolver::ResolveDynamic(instance, name, 3, 0)); |
| 1310 if (!function.IsNull()) { | 1266 if (!function.IsNull()) { |
| 1311 Integer& indexobj = Integer::Handle(); | 1267 Integer& indexobj = Integer::Handle(); |
| 1312 Integer& valueobj = Integer::Handle(); | 1268 Integer& valueobj = Integer::Handle(); |
| 1313 Dart_Handle result; | 1269 Dart_Handle result; |
| 1314 for (int i = 0; i < length; i++) { | 1270 for (int i = 0; i < length; i++) { |
| 1315 indexobj = Integer::New(offset + i); | 1271 indexobj = Integer::New(offset + i); |
| 1316 valueobj ^= Integer::New(native_array[i]); | 1272 valueobj ^= Integer::New(native_array[i]); |
| 1317 SetListAt(isolate, instance, indexobj, valueobj, function, &result); | 1273 SetListAt(isolate, instance, indexobj, valueobj, function, &result); |
| 1318 if (Dart_IsError(result)) { | 1274 if (Dart_IsError(result)) { |
| 1319 return result; // Error condition. | 1275 return result; // Error condition. |
| 1320 } | 1276 } |
| 1321 } | 1277 } |
| 1322 return Api::Success(); | 1278 return Api::Success(); |
| 1323 } | 1279 } |
| 1324 } | 1280 } |
| 1325 return Api::Error("Object does not implement the 'List' interface"); | 1281 return Api::Error("Object does not implement the 'List' interface"); |
| 1326 } | 1282 } |
| 1327 | 1283 |
| 1328 | 1284 |
| 1329 DART_EXPORT Dart_Handle Dart_ListSetAt(Dart_Handle list, | 1285 DART_EXPORT Dart_Handle Dart_ListSetAt(Dart_Handle list, |
| 1330 intptr_t index, | 1286 intptr_t index, |
| 1331 Dart_Handle value) { | 1287 Dart_Handle value) { |
| 1332 Zone zone; // Setup a VM zone as we are creating some handles. | 1288 Isolate* isolate = Isolate::Current(); |
| 1333 HandleScope scope; // Setup a VM handle scope. | 1289 DARTSCOPE(isolate); |
| 1334 const Object& obj = Object::Handle(Api::UnwrapHandle(list)); | 1290 const Object& obj = Object::Handle(Api::UnwrapHandle(list)); |
| 1335 if (obj.IsArray()) { | 1291 if (obj.IsArray()) { |
| 1336 Array& array_obj = Array::Handle(); | 1292 Array& array_obj = Array::Handle(); |
| 1337 array_obj ^= obj.raw(); | 1293 array_obj ^= obj.raw(); |
| 1338 const Object& value_obj = Object::Handle(Api::UnwrapHandle(value)); | 1294 const Object& value_obj = Object::Handle(Api::UnwrapHandle(value)); |
| 1339 if ((index >= 0) && (index < array_obj.Length())) { | 1295 if ((index >= 0) && (index < array_obj.Length())) { |
| 1340 array_obj.SetAt(index, value_obj); | 1296 array_obj.SetAt(index, value_obj); |
| 1341 return Api::Success(); | 1297 return Api::Success(); |
| 1342 } | 1298 } |
| 1343 return Api::Error("Invalid index passed in to set array element"); | 1299 return Api::Error("Invalid index passed in to set array element"); |
| 1344 } | 1300 } |
| 1345 // TODO(5526318): Make access to GrowableObjectArray more efficient. | 1301 // TODO(5526318): Make access to GrowableObjectArray more efficient. |
| 1346 // Now check and handle a dart object that implements the List interface. | 1302 // Now check and handle a dart object that implements the List interface. |
| 1347 Isolate* isolate = Isolate::Current(); | |
| 1348 const Instance& instance = Instance::Handle(GetListInstance(isolate, obj)); | 1303 const Instance& instance = Instance::Handle(GetListInstance(isolate, obj)); |
| 1349 if (!instance.IsNull()) { | 1304 if (!instance.IsNull()) { |
| 1350 String& name = String::Handle(String::New("[]=")); | 1305 String& name = String::Handle(String::New("[]=")); |
| 1351 const Function& function = Function::Handle( | 1306 const Function& function = Function::Handle( |
| 1352 Resolver::ResolveDynamic(instance, name, 3, 0)); | 1307 Resolver::ResolveDynamic(instance, name, 3, 0)); |
| 1353 if (!function.IsNull()) { | 1308 if (!function.IsNull()) { |
| 1354 Dart_Handle result; | 1309 Dart_Handle result; |
| 1355 const Integer& index_obj = Integer::Handle(Integer::New(index)); | 1310 const Integer& index_obj = Integer::Handle(Integer::New(index)); |
| 1356 const Object& value_obj = Object::Handle(Api::UnwrapHandle(value)); | 1311 const Object& value_obj = Object::Handle(Api::UnwrapHandle(value)); |
| 1357 SetListAt(isolate, instance, index_obj, value_obj, function, &result); | 1312 SetListAt(isolate, instance, index_obj, value_obj, function, &result); |
| 1358 return result; | 1313 return result; |
| 1359 } | 1314 } |
| 1360 } | 1315 } |
| 1361 return Api::Error("Object does not implement the 'List' interface"); | 1316 return Api::Error("Object does not implement the 'List' interface"); |
| 1362 } | 1317 } |
| 1363 | 1318 |
| 1364 | 1319 |
| 1365 // NOTE: Need to pass 'result' as a parameter here in order to avoid | 1320 // NOTE: Need to pass 'result' as a parameter here in order to avoid |
| 1366 // warning: variable 'result' might be clobbered by 'longjmp' or 'vfork' | 1321 // warning: variable 'result' might be clobbered by 'longjmp' or 'vfork' |
| 1367 // which shows up because of the use of setjmp. | 1322 // which shows up because of the use of setjmp. |
| 1368 static void InvokeStatic(const Function& function, | 1323 static void InvokeStatic(Isolate* isolate, |
| 1324 const Function& function, |
| 1369 GrowableArray<const Object*>& args, | 1325 GrowableArray<const Object*>& args, |
| 1370 Dart_Handle* result) { | 1326 Dart_Handle* result) { |
| 1371 Isolate* isolate = Isolate::Current(); | |
| 1372 ASSERT(isolate != NULL); | 1327 ASSERT(isolate != NULL); |
| 1373 LongJump* base = isolate->long_jump_base(); | 1328 LongJump* base = isolate->long_jump_base(); |
| 1374 LongJump jump; | 1329 LongJump jump; |
| 1375 isolate->set_long_jump_base(&jump); | 1330 isolate->set_long_jump_base(&jump); |
| 1376 if (setjmp(*jump.Set()) == 0) { | 1331 if (setjmp(*jump.Set()) == 0) { |
| 1377 const Array& kNoArgumentNames = Array::Handle(); | 1332 const Array& kNoArgumentNames = Array::Handle(); |
| 1378 const Instance& retval = Instance::Handle( | 1333 const Instance& retval = Instance::Handle( |
| 1379 DartEntry::InvokeStatic(function, args, kNoArgumentNames)); | 1334 DartEntry::InvokeStatic(function, args, kNoArgumentNames)); |
| 1380 if (retval.IsUnhandledException()) { | 1335 if (retval.IsUnhandledException()) { |
| 1381 *result = Api::ErrorFromException(retval); | 1336 *result = Api::ErrorFromException(retval); |
| 1382 } else { | 1337 } else { |
| 1383 *result = Api::NewLocalHandle(retval); | 1338 *result = Api::NewLocalHandle(retval); |
| 1384 } | 1339 } |
| 1385 } else { | 1340 } else { |
| 1386 SetupErrorResult(result); | 1341 SetupErrorResult(result); |
| 1387 } | 1342 } |
| 1388 isolate->set_long_jump_base(base); | 1343 isolate->set_long_jump_base(base); |
| 1389 } | 1344 } |
| 1390 | 1345 |
| 1391 | 1346 |
| 1392 // NOTE: Need to pass 'result' as a parameter here in order to avoid | 1347 // NOTE: Need to pass 'result' as a parameter here in order to avoid |
| 1393 // warning: variable 'result' might be clobbered by 'longjmp' or 'vfork' | 1348 // warning: variable 'result' might be clobbered by 'longjmp' or 'vfork' |
| 1394 // which shows up because of the use of setjmp. | 1349 // which shows up because of the use of setjmp. |
| 1395 static void InvokeDynamic(const Instance& receiver, | 1350 static void InvokeDynamic(Isolate* isolate, |
| 1351 const Instance& receiver, |
| 1396 const Function& function, | 1352 const Function& function, |
| 1397 GrowableArray<const Object*>& args, | 1353 GrowableArray<const Object*>& args, |
| 1398 Dart_Handle* result) { | 1354 Dart_Handle* result) { |
| 1399 Isolate* isolate = Isolate::Current(); | |
| 1400 ASSERT(isolate != NULL); | 1355 ASSERT(isolate != NULL); |
| 1401 LongJump* base = isolate->long_jump_base(); | 1356 LongJump* base = isolate->long_jump_base(); |
| 1402 LongJump jump; | 1357 LongJump jump; |
| 1403 isolate->set_long_jump_base(&jump); | 1358 isolate->set_long_jump_base(&jump); |
| 1404 if (setjmp(*jump.Set()) == 0) { | 1359 if (setjmp(*jump.Set()) == 0) { |
| 1405 const Array& kNoArgumentNames = Array::Handle(); | 1360 const Array& kNoArgumentNames = Array::Handle(); |
| 1406 const Instance& retval = Instance::Handle( | 1361 const Instance& retval = Instance::Handle( |
| 1407 DartEntry::InvokeDynamic(receiver, function, args, kNoArgumentNames)); | 1362 DartEntry::InvokeDynamic(receiver, function, args, kNoArgumentNames)); |
| 1408 if (retval.IsUnhandledException()) { | 1363 if (retval.IsUnhandledException()) { |
| 1409 *result = Api::ErrorFromException(retval); | 1364 *result = Api::ErrorFromException(retval); |
| 1410 } else { | 1365 } else { |
| 1411 *result = Api::NewLocalHandle(retval); | 1366 *result = Api::NewLocalHandle(retval); |
| 1412 } | 1367 } |
| 1413 } else { | 1368 } else { |
| 1414 SetupErrorResult(result); | 1369 SetupErrorResult(result); |
| 1415 } | 1370 } |
| 1416 isolate->set_long_jump_base(base); | 1371 isolate->set_long_jump_base(base); |
| 1417 } | 1372 } |
| 1418 | 1373 |
| 1419 | 1374 |
| 1420 // NOTE: Need to pass 'result' as a parameter here in order to avoid | 1375 // NOTE: Need to pass 'result' as a parameter here in order to avoid |
| 1421 // warning: variable 'result' might be clobbered by 'longjmp' or 'vfork' | 1376 // warning: variable 'result' might be clobbered by 'longjmp' or 'vfork' |
| 1422 // which shows up because of the use of setjmp. | 1377 // which shows up because of the use of setjmp. |
| 1423 static void InvokeClosure(const Closure& closure, | 1378 static void InvokeClosure(Isolate* isolate, |
| 1379 const Closure& closure, |
| 1424 GrowableArray<const Object*>& args, | 1380 GrowableArray<const Object*>& args, |
| 1425 Dart_Handle* result) { | 1381 Dart_Handle* result) { |
| 1426 Isolate* isolate = Isolate::Current(); | |
| 1427 ASSERT(isolate != NULL); | 1382 ASSERT(isolate != NULL); |
| 1428 LongJump* base = isolate->long_jump_base(); | 1383 LongJump* base = isolate->long_jump_base(); |
| 1429 LongJump jump; | 1384 LongJump jump; |
| 1430 isolate->set_long_jump_base(&jump); | 1385 isolate->set_long_jump_base(&jump); |
| 1431 if (setjmp(*jump.Set()) == 0) { | 1386 if (setjmp(*jump.Set()) == 0) { |
| 1432 const Array& kNoArgumentNames = Array::Handle(); | 1387 const Array& kNoArgumentNames = Array::Handle(); |
| 1433 const Instance& retval = Instance::Handle( | 1388 const Instance& retval = Instance::Handle( |
| 1434 DartEntry::InvokeClosure(closure, args, kNoArgumentNames)); | 1389 DartEntry::InvokeClosure(closure, args, kNoArgumentNames)); |
| 1435 if (retval.IsUnhandledException()) { | 1390 if (retval.IsUnhandledException()) { |
| 1436 *result = Api::ErrorFromException(retval); | 1391 *result = Api::ErrorFromException(retval); |
| 1437 } else { | 1392 } else { |
| 1438 *result = Api::NewLocalHandle(retval); | 1393 *result = Api::NewLocalHandle(retval); |
| 1439 } | 1394 } |
| 1440 } else { | 1395 } else { |
| 1441 SetupErrorResult(result); | 1396 SetupErrorResult(result); |
| 1442 } | 1397 } |
| 1443 isolate->set_long_jump_base(base); | 1398 isolate->set_long_jump_base(base); |
| 1444 } | 1399 } |
| 1445 | 1400 |
| 1446 | 1401 |
| 1447 DART_EXPORT Dart_Handle Dart_InvokeStatic(Dart_Handle library_in, | 1402 DART_EXPORT Dart_Handle Dart_InvokeStatic(Dart_Handle library_in, |
| 1448 Dart_Handle class_name_in, | 1403 Dart_Handle class_name_in, |
| 1449 Dart_Handle function_name_in, | 1404 Dart_Handle function_name_in, |
| 1450 int number_of_arguments, | 1405 int number_of_arguments, |
| 1451 Dart_Handle* arguments) { | 1406 Dart_Handle* arguments) { |
| 1452 Zone zone; // Setup a VM zone as we are creating some handles. | 1407 Isolate* isolate = Isolate::Current(); |
| 1453 HandleScope scope; // Setup a VM handle scope. | 1408 DARTSCOPE(isolate); |
| 1454 // Finalize all classes. | 1409 // Finalize all classes. |
| 1455 const char* msg = CheckIsolateState(); | 1410 const char* msg = CheckIsolateState(isolate); |
| 1456 if (msg != NULL) { | 1411 if (msg != NULL) { |
| 1457 return Api::Error(msg); | 1412 return Api::Error(msg); |
| 1458 } | 1413 } |
| 1459 | 1414 |
| 1460 // Now try to resolve and invoke the static function. | 1415 // Now try to resolve and invoke the static function. |
| 1461 const Library& library = | 1416 const Library& library = |
| 1462 Library::CheckedHandle(Api::UnwrapHandle(library_in)); | 1417 Library::CheckedHandle(Api::UnwrapHandle(library_in)); |
| 1463 if (library.IsNull()) { | 1418 if (library.IsNull()) { |
| 1464 return Api::Error("No library specified"); | 1419 return Api::Error("No library specified"); |
| 1465 } | 1420 } |
| (...skipping 26 matching lines...) Expand all Loading... |
| 1492 class_name.ToCString(), function_name.ToCString()); | 1447 class_name.ToCString(), function_name.ToCString()); |
| 1493 } | 1448 } |
| 1494 return Api::Error(msg); | 1449 return Api::Error(msg); |
| 1495 } | 1450 } |
| 1496 Dart_Handle retval; | 1451 Dart_Handle retval; |
| 1497 GrowableArray<const Object*> dart_arguments(number_of_arguments); | 1452 GrowableArray<const Object*> dart_arguments(number_of_arguments); |
| 1498 for (int i = 0; i < number_of_arguments; i++) { | 1453 for (int i = 0; i < number_of_arguments; i++) { |
| 1499 const Object& arg = Object::Handle(Api::UnwrapHandle(arguments[i])); | 1454 const Object& arg = Object::Handle(Api::UnwrapHandle(arguments[i])); |
| 1500 dart_arguments.Add(&arg); | 1455 dart_arguments.Add(&arg); |
| 1501 } | 1456 } |
| 1502 InvokeStatic(function, dart_arguments, &retval); | 1457 InvokeStatic(isolate, function, dart_arguments, &retval); |
| 1503 return retval; | 1458 return retval; |
| 1504 } | 1459 } |
| 1505 | 1460 |
| 1506 | 1461 |
| 1507 DART_EXPORT Dart_Handle Dart_InvokeDynamic(Dart_Handle object, | 1462 DART_EXPORT Dart_Handle Dart_InvokeDynamic(Dart_Handle object, |
| 1508 Dart_Handle function_name, | 1463 Dart_Handle function_name, |
| 1509 int number_of_arguments, | 1464 int number_of_arguments, |
| 1510 Dart_Handle* arguments) { | 1465 Dart_Handle* arguments) { |
| 1511 Zone zone; // Setup a VM zone as we are creating some handles. | 1466 Isolate* isolate = Isolate::Current(); |
| 1512 HandleScope scope; // Setup a VM handle scope. | 1467 DARTSCOPE(isolate); |
| 1513 const Object& obj = Object::Handle(Api::UnwrapHandle(object)); | 1468 const Object& obj = Object::Handle(Api::UnwrapHandle(object)); |
| 1514 // Let the resolver figure out the correct target for null receiver. | 1469 // Let the resolver figure out the correct target for null receiver. |
| 1515 // E.g., (null).toString() should execute correctly. | 1470 // E.g., (null).toString() should execute correctly. |
| 1516 if (!obj.IsNull() && !obj.IsInstance()) { | 1471 if (!obj.IsNull() && !obj.IsInstance()) { |
| 1517 return Api::Error( | 1472 return Api::Error( |
| 1518 "Invalid receiver (not instance) passed to invoke dynamic"); | 1473 "Invalid receiver (not instance) passed to invoke dynamic"); |
| 1519 } | 1474 } |
| 1520 if (function_name == NULL) { | 1475 if (function_name == NULL) { |
| 1521 return Api::Error("Invalid function name specified"); | 1476 return Api::Error("Invalid function name specified"); |
| 1522 } | 1477 } |
| (...skipping 12 matching lines...) Expand all Loading... |
| 1535 // TODO(5415268): Invoke noSuchMethod instead of failing. | 1490 // TODO(5415268): Invoke noSuchMethod instead of failing. |
| 1536 OS::PrintErr("Unable to find instance function: %s\n", name.ToCString()); | 1491 OS::PrintErr("Unable to find instance function: %s\n", name.ToCString()); |
| 1537 return Api::Error("Unable to find instance function"); | 1492 return Api::Error("Unable to find instance function"); |
| 1538 } | 1493 } |
| 1539 Dart_Handle retval; | 1494 Dart_Handle retval; |
| 1540 GrowableArray<const Object*> dart_arguments(number_of_arguments); | 1495 GrowableArray<const Object*> dart_arguments(number_of_arguments); |
| 1541 for (int i = 0; i < number_of_arguments; i++) { | 1496 for (int i = 0; i < number_of_arguments; i++) { |
| 1542 const Object& arg = Object::Handle(Api::UnwrapHandle(arguments[i])); | 1497 const Object& arg = Object::Handle(Api::UnwrapHandle(arguments[i])); |
| 1543 dart_arguments.Add(&arg); | 1498 dart_arguments.Add(&arg); |
| 1544 } | 1499 } |
| 1545 InvokeDynamic(receiver, function, dart_arguments, &retval); | 1500 InvokeDynamic(isolate, receiver, function, dart_arguments, &retval); |
| 1546 return retval; | 1501 return retval; |
| 1547 } | 1502 } |
| 1548 | 1503 |
| 1549 | 1504 |
| 1550 DART_EXPORT Dart_Handle Dart_InvokeClosure(Dart_Handle closure, | 1505 DART_EXPORT Dart_Handle Dart_InvokeClosure(Dart_Handle closure, |
| 1551 int number_of_arguments, | 1506 int number_of_arguments, |
| 1552 Dart_Handle* arguments) { | 1507 Dart_Handle* arguments) { |
| 1553 Zone zone; // Setup a VM zone as we are creating some handles. | 1508 Isolate* isolate = Isolate::Current(); |
| 1554 HandleScope scope; // Setup a VM handle scope. | 1509 DARTSCOPE(isolate); |
| 1555 const Object& obj = Object::Handle(Api::UnwrapHandle(closure)); | 1510 const Object& obj = Object::Handle(Api::UnwrapHandle(closure)); |
| 1556 if (obj.IsNull()) { | 1511 if (obj.IsNull()) { |
| 1557 return Api::Error("Null object passed in to invoke closure"); | 1512 return Api::Error("Null object passed in to invoke closure"); |
| 1558 } | 1513 } |
| 1559 if (!obj.IsClosure()) { | 1514 if (!obj.IsClosure()) { |
| 1560 return Api::Error("Invalid closure passed to invoke closure"); | 1515 return Api::Error("Invalid closure passed to invoke closure"); |
| 1561 } | 1516 } |
| 1562 ASSERT(ClassFinalizer::AllClassesFinalized()); | 1517 ASSERT(ClassFinalizer::AllClassesFinalized()); |
| 1563 | 1518 |
| 1564 // Now try to invoke the closure. | 1519 // Now try to invoke the closure. |
| 1565 Closure& closure_obj = Closure::Handle(); | 1520 Closure& closure_obj = Closure::Handle(); |
| 1566 closure_obj ^= obj.raw(); | 1521 closure_obj ^= obj.raw(); |
| 1567 Dart_Handle retval; | 1522 Dart_Handle retval; |
| 1568 GrowableArray<const Object*> dart_arguments(number_of_arguments); | 1523 GrowableArray<const Object*> dart_arguments(number_of_arguments); |
| 1569 for (int i = 0; i < number_of_arguments; i++) { | 1524 for (int i = 0; i < number_of_arguments; i++) { |
| 1570 const Object& arg = Object::Handle(Api::UnwrapHandle(arguments[i])); | 1525 const Object& arg = Object::Handle(Api::UnwrapHandle(arguments[i])); |
| 1571 dart_arguments.Add(&arg); | 1526 dart_arguments.Add(&arg); |
| 1572 } | 1527 } |
| 1573 InvokeClosure(closure_obj, dart_arguments, &retval); | 1528 InvokeClosure(isolate, closure_obj, dart_arguments, &retval); |
| 1574 return retval; | 1529 return retval; |
| 1575 } | 1530 } |
| 1576 | 1531 |
| 1577 | 1532 |
| 1578 DART_EXPORT Dart_Handle Dart_GetNativeArgument(Dart_NativeArguments args, | 1533 DART_EXPORT Dart_Handle Dart_GetNativeArgument(Dart_NativeArguments args, |
| 1579 int index) { | 1534 int index) { |
| 1580 Zone zone; // Setup a VM zone as we are creating some handles. | 1535 DARTSCOPE(Isolate::Current()); |
| 1581 HandleScope scope; // Setup a VM handle scope. | |
| 1582 NativeArguments* arguments = reinterpret_cast<NativeArguments*>(args); | 1536 NativeArguments* arguments = reinterpret_cast<NativeArguments*>(args); |
| 1583 const Object& obj = Object::Handle(arguments->At(index)); | 1537 const Object& obj = Object::Handle(arguments->At(index)); |
| 1584 return Api::NewLocalHandle(obj); | 1538 return Api::NewLocalHandle(obj); |
| 1585 } | 1539 } |
| 1586 | 1540 |
| 1587 | 1541 |
| 1588 DART_EXPORT int Dart_GetNativeArgumentCount(Dart_NativeArguments args) { | 1542 DART_EXPORT int Dart_GetNativeArgumentCount(Dart_NativeArguments args) { |
| 1589 NativeArguments* arguments = reinterpret_cast<NativeArguments*>(args); | 1543 NativeArguments* arguments = reinterpret_cast<NativeArguments*>(args); |
| 1590 return arguments->Count(); | 1544 return arguments->Count(); |
| 1591 } | 1545 } |
| 1592 | 1546 |
| 1593 | 1547 |
| 1594 DART_EXPORT void Dart_SetReturnValue(Dart_NativeArguments args, | 1548 DART_EXPORT void Dart_SetReturnValue(Dart_NativeArguments args, |
| 1595 Dart_Handle retval) { | 1549 Dart_Handle retval) { |
| 1596 Zone zone; // Setup a VM zone as we are creating some handles. | 1550 DARTSCOPE(Isolate::Current()); |
| 1597 HandleScope scope; // Setup a VM handle scope. | |
| 1598 NativeArguments* arguments = reinterpret_cast<NativeArguments*>(args); | 1551 NativeArguments* arguments = reinterpret_cast<NativeArguments*>(args); |
| 1599 arguments->SetReturn(Object::Handle(Api::UnwrapHandle(retval))); | 1552 arguments->SetReturn(Object::Handle(Api::UnwrapHandle(retval))); |
| 1600 } | 1553 } |
| 1601 | 1554 |
| 1602 | 1555 |
| 1603 DART_EXPORT Dart_Handle Dart_ThrowException(Dart_Handle exception) { | 1556 DART_EXPORT Dart_Handle Dart_ThrowException(Dart_Handle exception) { |
| 1604 Isolate* isolate = Isolate::Current(); | 1557 Isolate* isolate = Isolate::Current(); |
| 1605 ASSERT(isolate != NULL); | 1558 DARTSCOPE(isolate); |
| 1606 Zone zone; // Setup a VM zone as we are creating some handles. | |
| 1607 HandleScope scope; // Setup a VM handle scope. | |
| 1608 if (isolate->top_exit_frame_info() == 0) { | 1559 if (isolate->top_exit_frame_info() == 0) { |
| 1609 // There are no dart frames on the stack so it would be illegal to | 1560 // There are no dart frames on the stack so it would be illegal to |
| 1610 // throw an exception here. | 1561 // throw an exception here. |
| 1611 return Api::Error("No Dart frames on stack, cannot throw exception"); | 1562 return Api::Error("No Dart frames on stack, cannot throw exception"); |
| 1612 } | 1563 } |
| 1613 const Instance& excp = Instance::CheckedHandle(Api::UnwrapHandle(exception)); | 1564 const Instance& excp = Instance::CheckedHandle(Api::UnwrapHandle(exception)); |
| 1614 // Unwind all the API scopes till the exit frame before throwing an | 1565 // Unwind all the API scopes till the exit frame before throwing an |
| 1615 // exception. | 1566 // exception. |
| 1616 ApiState* state = isolate->api_state(); | 1567 ApiState* state = isolate->api_state(); |
| 1617 ASSERT(state != NULL); | 1568 ASSERT(state != NULL); |
| 1618 state->UnwindScopes(isolate->top_exit_frame_info()); | 1569 state->UnwindScopes(isolate->top_exit_frame_info()); |
| 1619 Exceptions::Throw(excp); | 1570 Exceptions::Throw(excp); |
| 1620 return Api::Error("Exception was not thrown, internal error"); | 1571 return Api::Error("Exception was not thrown, internal error"); |
| 1621 } | 1572 } |
| 1622 | 1573 |
| 1623 | 1574 |
| 1624 DART_EXPORT Dart_Handle Dart_ReThrowException(Dart_Handle exception, | 1575 DART_EXPORT Dart_Handle Dart_ReThrowException(Dart_Handle exception, |
| 1625 Dart_Handle stacktrace) { | 1576 Dart_Handle stacktrace) { |
| 1626 Isolate* isolate = Isolate::Current(); | 1577 Isolate* isolate = Isolate::Current(); |
| 1627 ASSERT(isolate != NULL); | 1578 ASSERT(isolate != NULL); |
| 1628 if (isolate->top_exit_frame_info() == 0) { | 1579 if (isolate->top_exit_frame_info() == 0) { |
| 1629 // There are no dart frames on the stack so it would be illegal to | 1580 // There are no dart frames on the stack so it would be illegal to |
| 1630 // throw an exception here. | 1581 // throw an exception here. |
| 1631 return Api::Error("No Dart frames on stack, cannot throw exception"); | 1582 return Api::Error("No Dart frames on stack, cannot throw exception"); |
| 1632 } | 1583 } |
| 1633 Zone zone; // Setup a VM zone as we are creating some handles. | 1584 DARTSCOPE(isolate); |
| 1634 HandleScope scope; // Setup a VM handle scope. | |
| 1635 const Instance& excp = Instance::CheckedHandle(Api::UnwrapHandle(exception)); | 1585 const Instance& excp = Instance::CheckedHandle(Api::UnwrapHandle(exception)); |
| 1636 const Instance& stk = Instance::CheckedHandle(Api::UnwrapHandle(stacktrace)); | 1586 const Instance& stk = Instance::CheckedHandle(Api::UnwrapHandle(stacktrace)); |
| 1637 // Unwind all the API scopes till the exit frame before throwing an | 1587 // Unwind all the API scopes till the exit frame before throwing an |
| 1638 // exception. | 1588 // exception. |
| 1639 ApiState* state = isolate->api_state(); | 1589 ApiState* state = isolate->api_state(); |
| 1640 ASSERT(state != NULL); | 1590 ASSERT(state != NULL); |
| 1641 state->UnwindScopes(isolate->top_exit_frame_info()); | 1591 state->UnwindScopes(isolate->top_exit_frame_info()); |
| 1642 Exceptions::ReThrow(excp, stk); | 1592 Exceptions::ReThrow(excp, stk); |
| 1643 return Api::Error("Exception was not re thrown, internal error"); | 1593 return Api::Error("Exception was not re thrown, internal error"); |
| 1644 } | 1594 } |
| (...skipping 17 matching lines...) Expand all Loading... |
| 1662 ApiState* state = isolate->api_state(); | 1612 ApiState* state = isolate->api_state(); |
| 1663 ASSERT(state != NULL); | 1613 ASSERT(state != NULL); |
| 1664 ApiLocalScope* scope = state->top_scope(); | 1614 ApiLocalScope* scope = state->top_scope(); |
| 1665 ASSERT(scope != NULL); | 1615 ASSERT(scope != NULL); |
| 1666 state->set_top_scope(scope->previous()); // Reset top scope to previous. | 1616 state->set_top_scope(scope->previous()); // Reset top scope to previous. |
| 1667 delete scope; // Free up the old scope which we have just exited. | 1617 delete scope; // Free up the old scope which we have just exited. |
| 1668 } | 1618 } |
| 1669 | 1619 |
| 1670 | 1620 |
| 1671 DART_EXPORT Dart_Handle Dart_NewPersistentHandle(Dart_Handle object) { | 1621 DART_EXPORT Dart_Handle Dart_NewPersistentHandle(Dart_Handle object) { |
| 1672 Zone zone; // Setup a VM zone as we are creating some handles. | |
| 1673 HandleScope scope; // Setup a VM handle scope. | |
| 1674 Isolate* isolate = Isolate::Current(); | 1622 Isolate* isolate = Isolate::Current(); |
| 1675 ASSERT(isolate != NULL); | 1623 DARTSCOPE(isolate); |
| 1676 ApiState* state = isolate->api_state(); | 1624 ApiState* state = isolate->api_state(); |
| 1677 ASSERT(state != NULL); | 1625 ASSERT(state != NULL); |
| 1678 const Object& old_ref = Object::Handle(Api::UnwrapHandle(object)); | 1626 const Object& old_ref = Object::Handle(Api::UnwrapHandle(object)); |
| 1679 PersistentHandle* new_ref = state->persistent_handles().AllocateHandle(); | 1627 PersistentHandle* new_ref = state->persistent_handles().AllocateHandle(); |
| 1680 new_ref->set_raw(old_ref); | 1628 new_ref->set_raw(old_ref); |
| 1681 return reinterpret_cast<Dart_Handle>(new_ref); | 1629 return reinterpret_cast<Dart_Handle>(new_ref); |
| 1682 } | 1630 } |
| 1683 | 1631 |
| 1684 | 1632 |
| 1685 DART_EXPORT Dart_Handle Dart_MakeWeakPersistentHandle(Dart_Handle object) { | 1633 DART_EXPORT Dart_Handle Dart_MakeWeakPersistentHandle(Dart_Handle object) { |
| (...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1786 return Api::NewLocalHandle(function); | 1734 return Api::NewLocalHandle(function); |
| 1787 } | 1735 } |
| 1788 cls = cls.SuperClass(); | 1736 cls = cls.SuperClass(); |
| 1789 } | 1737 } |
| 1790 return Api::Error("Unable to find field in the class"); | 1738 return Api::Error("Unable to find field in the class"); |
| 1791 } | 1739 } |
| 1792 | 1740 |
| 1793 | 1741 |
| 1794 DART_EXPORT Dart_Handle Dart_GetStaticField(Dart_Handle cls, | 1742 DART_EXPORT Dart_Handle Dart_GetStaticField(Dart_Handle cls, |
| 1795 Dart_Handle name) { | 1743 Dart_Handle name) { |
| 1796 Zone zone; // Setup a VM zone as we are creating some handles. | 1744 Isolate* isolate = Isolate::Current(); |
| 1797 HandleScope scope; // Setup a VM handle scope. | 1745 DARTSCOPE(isolate); |
| 1798 Dart_Handle result = LookupStaticField(cls, name, kGetter); | 1746 Dart_Handle result = LookupStaticField(cls, name, kGetter); |
| 1799 if (::Dart_IsError(result)) { | 1747 if (::Dart_IsError(result)) { |
| 1800 return result; | 1748 return result; |
| 1801 } | 1749 } |
| 1802 Object& retval = Object::Handle(); | 1750 Object& retval = Object::Handle(); |
| 1803 const Object& obj = Object::Handle(Api::UnwrapHandle(result)); | 1751 const Object& obj = Object::Handle(Api::UnwrapHandle(result)); |
| 1804 if (obj.IsField()) { | 1752 if (obj.IsField()) { |
| 1805 Field& fld = Field::Handle(); | 1753 Field& fld = Field::Handle(); |
| 1806 fld ^= obj.raw(); | 1754 fld ^= obj.raw(); |
| 1807 retval = fld.value(); | 1755 retval = fld.value(); |
| 1808 return Api::NewLocalHandle(retval); | 1756 return Api::NewLocalHandle(retval); |
| 1809 } else { | 1757 } else { |
| 1810 Function& func = Function::Handle(); | 1758 Function& func = Function::Handle(); |
| 1811 func ^= obj.raw(); | 1759 func ^= obj.raw(); |
| 1812 GrowableArray<const Object*> args; | 1760 GrowableArray<const Object*> args; |
| 1813 InvokeStatic(func, args, &result); | 1761 InvokeStatic(isolate, func, args, &result); |
| 1814 return result; | 1762 return result; |
| 1815 } | 1763 } |
| 1816 } | 1764 } |
| 1817 | 1765 |
| 1818 | 1766 |
| 1819 // TODO(iposva): The value parameter should be documented as being an instance. | 1767 // TODO(iposva): The value parameter should be documented as being an instance. |
| 1820 // TODO(turnidge): Is this skipping the setter? | 1768 // TODO(turnidge): Is this skipping the setter? |
| 1821 DART_EXPORT Dart_Handle Dart_SetStaticField(Dart_Handle cls, | 1769 DART_EXPORT Dart_Handle Dart_SetStaticField(Dart_Handle cls, |
| 1822 Dart_Handle name, | 1770 Dart_Handle name, |
| 1823 Dart_Handle value) { | 1771 Dart_Handle value) { |
| 1824 Zone zone; // Setup a VM zone as we are creating some handles. | 1772 DARTSCOPE(Isolate::Current()); |
| 1825 HandleScope scope; // Setup a VM handle scope. | |
| 1826 Dart_Handle result = LookupStaticField(cls, name, kSetter); | 1773 Dart_Handle result = LookupStaticField(cls, name, kSetter); |
| 1827 if (::Dart_IsError(result)) { | 1774 if (::Dart_IsError(result)) { |
| 1828 return result; | 1775 return result; |
| 1829 } | 1776 } |
| 1830 Field& fld = Field::Handle(); | 1777 Field& fld = Field::Handle(); |
| 1831 fld ^= Api::UnwrapHandle(result); | 1778 fld ^= Api::UnwrapHandle(result); |
| 1832 if (fld.is_final()) { | 1779 if (fld.is_final()) { |
| 1833 return Api::Error("Specified field is a static final field in the class"); | 1780 return Api::Error("Specified field is a static final field in the class"); |
| 1834 } | 1781 } |
| 1835 const Object& val = Object::Handle(Api::UnwrapHandle(value)); | 1782 const Object& val = Object::Handle(Api::UnwrapHandle(value)); |
| 1836 Instance& instance = Instance::Handle(); | 1783 Instance& instance = Instance::Handle(); |
| 1837 instance ^= val.raw(); | 1784 instance ^= val.raw(); |
| 1838 fld.set_value(instance); | 1785 fld.set_value(instance); |
| 1839 return Api::NewLocalHandle(val); | 1786 return Api::NewLocalHandle(val); |
| 1840 } | 1787 } |
| 1841 | 1788 |
| 1842 | 1789 |
| 1843 DART_EXPORT Dart_Handle Dart_GetInstanceField(Dart_Handle obj, | 1790 DART_EXPORT Dart_Handle Dart_GetInstanceField(Dart_Handle obj, |
| 1844 Dart_Handle name) { | 1791 Dart_Handle name) { |
| 1845 Zone zone; // Setup a VM zone as we are creating some handles. | 1792 Isolate* isolate = Isolate::Current(); |
| 1846 HandleScope scope; // Setup a VM handle scope. | 1793 DARTSCOPE(isolate); |
| 1847 const Object& param = Object::Handle(Api::UnwrapHandle(obj)); | 1794 const Object& param = Object::Handle(Api::UnwrapHandle(obj)); |
| 1848 if (param.IsNull() || !param.IsInstance()) { | 1795 if (param.IsNull() || !param.IsInstance()) { |
| 1849 return Api::Error("Invalid object passed in to access instance field"); | 1796 return Api::Error("Invalid object passed in to access instance field"); |
| 1850 } | 1797 } |
| 1851 Instance& object = Instance::Handle(); | 1798 Instance& object = Instance::Handle(); |
| 1852 object ^= param.raw(); | 1799 object ^= param.raw(); |
| 1853 Dart_Handle result = LookupInstanceField(object, name, kGetter); | 1800 Dart_Handle result = LookupInstanceField(object, name, kGetter); |
| 1854 if (::Dart_IsError(result)) { | 1801 if (::Dart_IsError(result)) { |
| 1855 return result; | 1802 return result; |
| 1856 } | 1803 } |
| 1857 Function& func = Function::Handle(); | 1804 Function& func = Function::Handle(); |
| 1858 func ^= Api::UnwrapHandle(result); | 1805 func ^= Api::UnwrapHandle(result); |
| 1859 GrowableArray<const Object*> arguments; | 1806 GrowableArray<const Object*> arguments; |
| 1860 InvokeDynamic(object, func, arguments, &result); | 1807 InvokeDynamic(isolate, object, func, arguments, &result); |
| 1861 return result; | 1808 return result; |
| 1862 } | 1809 } |
| 1863 | 1810 |
| 1864 | 1811 |
| 1865 DART_EXPORT Dart_Handle Dart_SetInstanceField(Dart_Handle obj, | 1812 DART_EXPORT Dart_Handle Dart_SetInstanceField(Dart_Handle obj, |
| 1866 Dart_Handle name, | 1813 Dart_Handle name, |
| 1867 Dart_Handle value) { | 1814 Dart_Handle value) { |
| 1868 Zone zone; // Setup a VM zone as we are creating some handles. | 1815 Isolate* isolate = Isolate::Current(); |
| 1869 HandleScope scope; // Setup a VM handle scope. | 1816 DARTSCOPE(isolate); |
| 1870 const Object& param = Object::Handle(Api::UnwrapHandle(obj)); | 1817 const Object& param = Object::Handle(Api::UnwrapHandle(obj)); |
| 1871 if (param.IsNull() || !param.IsInstance()) { | 1818 if (param.IsNull() || !param.IsInstance()) { |
| 1872 return Api::Error("Invalid object passed in to access instance field"); | 1819 return Api::Error("Invalid object passed in to access instance field"); |
| 1873 } | 1820 } |
| 1874 Instance& object = Instance::Handle(); | 1821 Instance& object = Instance::Handle(); |
| 1875 object ^= param.raw(); | 1822 object ^= param.raw(); |
| 1876 Dart_Handle result = LookupInstanceField(object, name, kSetter); | 1823 Dart_Handle result = LookupInstanceField(object, name, kSetter); |
| 1877 if (::Dart_IsError(result)) { | 1824 if (::Dart_IsError(result)) { |
| 1878 return result; | 1825 return result; |
| 1879 } | 1826 } |
| 1880 Function& func = Function::Handle(); | 1827 Function& func = Function::Handle(); |
| 1881 func ^= Api::UnwrapHandle(result); | 1828 func ^= Api::UnwrapHandle(result); |
| 1882 GrowableArray<const Object*> arguments(1); | 1829 GrowableArray<const Object*> arguments(1); |
| 1883 const Object& arg = Object::Handle(Api::UnwrapHandle(value)); | 1830 const Object& arg = Object::Handle(Api::UnwrapHandle(value)); |
| 1884 arguments.Add(&arg); | 1831 arguments.Add(&arg); |
| 1885 InvokeDynamic(object, func, arguments, &result); | 1832 InvokeDynamic(isolate, object, func, arguments, &result); |
| 1886 return result; | 1833 return result; |
| 1887 } | 1834 } |
| 1888 | 1835 |
| 1889 | 1836 |
| 1890 DART_EXPORT Dart_Handle Dart_CreateNativeWrapperClass(Dart_Handle library, | 1837 DART_EXPORT Dart_Handle Dart_CreateNativeWrapperClass(Dart_Handle library, |
| 1891 Dart_Handle name, | 1838 Dart_Handle name, |
| 1892 int field_count) { | 1839 int field_count) { |
| 1893 Zone zone; // Setup a VM zone as we are creating some handles. | 1840 Isolate* isolate = Isolate::Current(); |
| 1894 HandleScope scope; // Setup a VM handle scope. | 1841 DARTSCOPE(isolate); |
| 1895 const Object& param = Object::Handle(Api::UnwrapHandle(name)); | 1842 const Object& param = Object::Handle(Api::UnwrapHandle(name)); |
| 1896 if (param.IsNull() || !param.IsString() || field_count <= 0) { | 1843 if (param.IsNull() || !param.IsString() || field_count <= 0) { |
| 1897 return Api::Error( | 1844 return Api::Error( |
| 1898 "Invalid arguments passed to Dart_CreateNativeWrapperClass"); | 1845 "Invalid arguments passed to Dart_CreateNativeWrapperClass"); |
| 1899 } | 1846 } |
| 1900 String& cls_name = String::Handle(); | 1847 String& cls_name = String::Handle(); |
| 1901 cls_name ^= param.raw(); | 1848 cls_name ^= param.raw(); |
| 1902 cls_name = String::NewSymbol(cls_name); | 1849 cls_name = String::NewSymbol(cls_name); |
| 1903 Library& lib = Library::Handle(); | 1850 Library& lib = Library::Handle(); |
| 1904 lib ^= Api::UnwrapHandle(library); | 1851 lib ^= Api::UnwrapHandle(library); |
| 1905 if (lib.IsNull()) { | 1852 if (lib.IsNull()) { |
| 1906 return Api::Error( | 1853 return Api::Error( |
| 1907 "Invalid arguments passed to Dart_CreateNativeWrapperClass"); | 1854 "Invalid arguments passed to Dart_CreateNativeWrapperClass"); |
| 1908 } | 1855 } |
| 1909 const Class& cls = Class::Handle(Class::NewNativeWrapper(&lib, | 1856 const Class& cls = Class::Handle(Class::NewNativeWrapper(&lib, |
| 1910 cls_name, | 1857 cls_name, |
| 1911 field_count)); | 1858 field_count)); |
| 1912 if (cls.IsNull()) { | 1859 if (cls.IsNull()) { |
| 1913 return Api::Error( | 1860 return Api::Error( |
| 1914 "Unable to create native wrapper class : already exists"); | 1861 "Unable to create native wrapper class : already exists"); |
| 1915 } | 1862 } |
| 1916 return Api::NewLocalHandle(cls); | 1863 return Api::NewLocalHandle(cls); |
| 1917 } | 1864 } |
| 1918 | 1865 |
| 1919 | 1866 |
| 1920 DART_EXPORT Dart_Handle Dart_GetNativeInstanceField(Dart_Handle obj, | 1867 DART_EXPORT Dart_Handle Dart_GetNativeInstanceField(Dart_Handle obj, |
| 1921 int index, | 1868 int index, |
| 1922 intptr_t* value) { | 1869 intptr_t* value) { |
| 1923 Zone zone; // Setup a VM zone as we are creating some handles. | 1870 DARTSCOPE(Isolate::Current()); |
| 1924 HandleScope scope; // Setup a VM handle scope. | |
| 1925 const Object& param = Object::Handle(Api::UnwrapHandle(obj)); | 1871 const Object& param = Object::Handle(Api::UnwrapHandle(obj)); |
| 1926 if (param.IsNull() || !param.IsInstance()) { | 1872 if (param.IsNull() || !param.IsInstance()) { |
| 1927 return Api::Error( | 1873 return Api::Error( |
| 1928 "Invalid object passed in to access native instance field"); | 1874 "Invalid object passed in to access native instance field"); |
| 1929 } | 1875 } |
| 1930 Instance& object = Instance::Handle(); | 1876 Instance& object = Instance::Handle(); |
| 1931 object ^= param.raw(); | 1877 object ^= param.raw(); |
| 1932 if (!object.IsValidNativeIndex(index)) { | 1878 if (!object.IsValidNativeIndex(index)) { |
| 1933 return Api::Error( | 1879 return Api::Error( |
| 1934 "Invalid index passed in to access native instance field"); | 1880 "Invalid index passed in to access native instance field"); |
| 1935 } | 1881 } |
| 1936 *value = object.GetNativeField(index); | 1882 *value = object.GetNativeField(index); |
| 1937 return Api::Success(); | 1883 return Api::Success(); |
| 1938 } | 1884 } |
| 1939 | 1885 |
| 1940 | 1886 |
| 1941 DART_EXPORT Dart_Handle Dart_SetNativeInstanceField(Dart_Handle obj, | 1887 DART_EXPORT Dart_Handle Dart_SetNativeInstanceField(Dart_Handle obj, |
| 1942 int index, | 1888 int index, |
| 1943 intptr_t value) { | 1889 intptr_t value) { |
| 1944 Zone zone; // Setup a VM zone as we are creating some handles. | 1890 DARTSCOPE(Isolate::Current()); |
| 1945 HandleScope scope; // Setup a VM handle scope. | |
| 1946 const Object& param = Object::Handle(Api::UnwrapHandle(obj)); | 1891 const Object& param = Object::Handle(Api::UnwrapHandle(obj)); |
| 1947 if (param.IsNull() || !param.IsInstance()) { | 1892 if (param.IsNull() || !param.IsInstance()) { |
| 1948 return Api::Error("Invalid object passed in to set native instance field"); | 1893 return Api::Error("Invalid object passed in to set native instance field"); |
| 1949 } | 1894 } |
| 1950 Instance& object = Instance::Handle(); | 1895 Instance& object = Instance::Handle(); |
| 1951 object ^= param.raw(); | 1896 object ^= param.raw(); |
| 1952 if (!object.IsValidNativeIndex(index)) { | 1897 if (!object.IsValidNativeIndex(index)) { |
| 1953 return Api::Error("Invalid index passed in to set native instance field"); | 1898 return Api::Error("Invalid index passed in to set native instance field"); |
| 1954 } | 1899 } |
| 1955 object.SetNativeField(index, value); | 1900 object.SetNativeField(index, value); |
| 1956 return Api::Success(); | 1901 return Api::Success(); |
| 1957 } | 1902 } |
| 1958 | 1903 |
| 1959 | 1904 |
| 1960 static uint8_t* ApiAllocator(uint8_t* ptr, | 1905 static uint8_t* ApiAllocator(uint8_t* ptr, |
| 1961 intptr_t old_size, | 1906 intptr_t old_size, |
| 1962 intptr_t new_size) { | 1907 intptr_t new_size) { |
| 1963 uword new_ptr = Api::Reallocate(reinterpret_cast<uword>(ptr), | 1908 uword new_ptr = Api::Reallocate(reinterpret_cast<uword>(ptr), |
| 1964 old_size, | 1909 old_size, |
| 1965 new_size); | 1910 new_size); |
| 1966 return reinterpret_cast<uint8_t*>(new_ptr); | 1911 return reinterpret_cast<uint8_t*>(new_ptr); |
| 1967 } | 1912 } |
| 1968 | 1913 |
| 1969 | 1914 |
| 1970 DART_EXPORT Dart_Handle Dart_CreateSnapshot(uint8_t** snapshot_buffer, | 1915 DART_EXPORT Dart_Handle Dart_CreateSnapshot(uint8_t** snapshot_buffer, |
| 1971 intptr_t* snapshot_size) { | 1916 intptr_t* snapshot_size) { |
| 1972 Zone zone; // Setup a VM zone as we are creating some handles. | 1917 Isolate* isolate = Isolate::Current(); |
| 1973 HandleScope scope; // Setup a VM handle scope. | 1918 DARTSCOPE(isolate); |
| 1974 if (snapshot_buffer == NULL || snapshot_size == NULL) { | 1919 if (snapshot_buffer == NULL || snapshot_size == NULL) { |
| 1975 return Api::Error("Invalid input parameters to Dart_CreateSnapshot"); | 1920 return Api::Error("Invalid input parameters to Dart_CreateSnapshot"); |
| 1976 } | 1921 } |
| 1977 const char* msg = CheckIsolateState(); | 1922 const char* msg = CheckIsolateState(isolate); |
| 1978 if (msg != NULL) { | 1923 if (msg != NULL) { |
| 1979 return Api::Error(msg); | 1924 return Api::Error(msg); |
| 1980 } | 1925 } |
| 1981 // Since this is only a snapshot the root library should not be set. | 1926 // Since this is only a snapshot the root library should not be set. |
| 1982 Isolate* isolate = Isolate::Current(); | |
| 1983 isolate->object_store()->set_root_library(Library::Handle()); | 1927 isolate->object_store()->set_root_library(Library::Handle()); |
| 1984 SnapshotWriter writer(true, snapshot_buffer, ApiAllocator); | 1928 SnapshotWriter writer(true, snapshot_buffer, ApiAllocator); |
| 1985 writer.WriteFullSnapshot(); | 1929 writer.WriteFullSnapshot(); |
| 1986 *snapshot_size = writer.Size(); | 1930 *snapshot_size = writer.Size(); |
| 1987 return Api::Success(); | 1931 return Api::Success(); |
| 1988 } | 1932 } |
| 1989 | 1933 |
| 1990 | 1934 |
| 1991 static uint8_t* allocator(uint8_t* ptr, intptr_t old_size, intptr_t new_size) { | 1935 static uint8_t* allocator(uint8_t* ptr, intptr_t old_size, intptr_t new_size) { |
| 1992 void* new_ptr = realloc(reinterpret_cast<void*>(ptr), new_size); | 1936 void* new_ptr = realloc(reinterpret_cast<void*>(ptr), new_size); |
| 1993 return reinterpret_cast<uint8_t*>(new_ptr); | 1937 return reinterpret_cast<uint8_t*>(new_ptr); |
| 1994 } | 1938 } |
| 1995 | 1939 |
| 1996 | 1940 |
| 1997 DART_EXPORT bool Dart_PostIntArray(Dart_Port port, | 1941 DART_EXPORT bool Dart_PostIntArray(Dart_Port port, |
| 1998 intptr_t len, | 1942 intptr_t len, |
| 1999 intptr_t* data) { | 1943 intptr_t* data) { |
| 2000 uint8_t* buffer = NULL; | 1944 uint8_t* buffer = NULL; |
| 2001 MessageWriter writer(&buffer, &allocator); | 1945 MessageWriter writer(&buffer, &allocator); |
| 2002 | 1946 |
| 2003 writer.WriteMessage(len, data); | 1947 writer.WriteMessage(len, data); |
| 2004 | 1948 |
| 2005 // Post the message at the given port. | 1949 // Post the message at the given port. |
| 2006 return PortMap::PostMessage(port, kNoReplyPort, buffer); | 1950 return PortMap::PostMessage(port, kNoReplyPort, buffer); |
| 2007 } | 1951 } |
| 2008 | 1952 |
| 2009 | 1953 |
| 2010 DART_EXPORT bool Dart_Post(Dart_Port port, Dart_Handle handle) { | 1954 DART_EXPORT bool Dart_Post(Dart_Port port, Dart_Handle handle) { |
| 2011 Zone zone; // Setup a VM zone as we are creating some handles. | 1955 DARTSCOPE(Isolate::Current()); |
| 2012 HandleScope scope; // Setup a VM handle scope. | |
| 2013 const Object& object = Object::Handle(Api::UnwrapHandle(handle)); | 1956 const Object& object = Object::Handle(Api::UnwrapHandle(handle)); |
| 2014 uint8_t* data = NULL; | 1957 uint8_t* data = NULL; |
| 2015 SnapshotWriter writer(false, &data, &allocator); | 1958 SnapshotWriter writer(false, &data, &allocator); |
| 2016 writer.WriteObject(object.raw()); | 1959 writer.WriteObject(object.raw()); |
| 2017 writer.FinalizeBuffer(); | 1960 writer.FinalizeBuffer(); |
| 2018 return PortMap::PostMessage(port, kNoReplyPort, data); | 1961 return PortMap::PostMessage(port, kNoReplyPort, data); |
| 2019 } | 1962 } |
| 2020 | 1963 |
| 2021 | 1964 |
| 2022 DART_EXPORT void Dart_InitPprofSupport() { | 1965 DART_EXPORT void Dart_InitPprofSupport() { |
| (...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2103 Isolate* isolate = Isolate::Current(); | 2046 Isolate* isolate = Isolate::Current(); |
| 2104 ASSERT(isolate != NULL); | 2047 ASSERT(isolate != NULL); |
| 2105 ApiState* state = isolate->api_state(); | 2048 ApiState* state = isolate->api_state(); |
| 2106 ASSERT(state != NULL); | 2049 ASSERT(state != NULL); |
| 2107 PersistentHandle* true_handle = state->True(); | 2050 PersistentHandle* true_handle = state->True(); |
| 2108 return reinterpret_cast<Dart_Handle>(true_handle); | 2051 return reinterpret_cast<Dart_Handle>(true_handle); |
| 2109 } | 2052 } |
| 2110 | 2053 |
| 2111 | 2054 |
| 2112 Dart_Handle Api::Error(const char* format, ...) { | 2055 Dart_Handle Api::Error(const char* format, ...) { |
| 2113 Zone zone; // Setup a VM zone as we are creating some handles. | 2056 DARTSCOPE(Isolate::Current()); |
| 2114 HandleScope scope; // Setup a VM handle scope. | |
| 2115 | 2057 |
| 2116 va_list args; | 2058 va_list args; |
| 2117 va_start(args, format); | 2059 va_start(args, format); |
| 2118 intptr_t len = OS::VSNPrint(NULL, 0, format, args); | 2060 intptr_t len = OS::VSNPrint(NULL, 0, format, args); |
| 2119 va_end(args); | 2061 va_end(args); |
| 2120 | 2062 |
| 2121 char* buffer = reinterpret_cast<char*>(zone.Allocate(len + 1)); | 2063 char* buffer = reinterpret_cast<char*>(zone.Allocate(len + 1)); |
| 2122 va_list args2; | 2064 va_list args2; |
| 2123 va_start(args2, format); | 2065 va_start(args2, format); |
| 2124 OS::VSNPrint(buffer, (len + 1), format, args2); | 2066 OS::VSNPrint(buffer, (len + 1), format, args2); |
| 2125 va_end(args2); | 2067 va_end(args2); |
| 2126 | 2068 |
| 2127 const String& message = String::Handle(String::New(buffer)); | 2069 const String& message = String::Handle(String::New(buffer)); |
| 2128 const Object& obj = Object::Handle(ApiError::New(message)); | 2070 const Object& obj = Object::Handle(ApiError::New(message)); |
| 2129 return Api::NewLocalHandle(obj); | 2071 return Api::NewLocalHandle(obj); |
| 2130 } | 2072 } |
| 2131 | 2073 |
| 2132 | 2074 |
| 2133 Dart_Handle Api::ErrorFromException(const Object& obj) { | 2075 Dart_Handle Api::ErrorFromException(const Object& obj) { |
| 2134 Zone zone; // Setup a VM zone as we are creating some handles. | 2076 DARTSCOPE(Isolate::Current()); |
| 2135 HandleScope scope; // Setup a VM handle scope. | |
| 2136 | 2077 |
| 2137 ASSERT(obj.IsUnhandledException()); | 2078 ASSERT(obj.IsUnhandledException()); |
| 2138 if (obj.IsUnhandledException()) { | 2079 if (obj.IsUnhandledException()) { |
| 2139 UnhandledException& uhe = UnhandledException::Handle(); | 2080 UnhandledException& uhe = UnhandledException::Handle(); |
| 2140 uhe ^= obj.raw(); | 2081 uhe ^= obj.raw(); |
| 2141 const Object& error = Object::Handle(ApiError::New(uhe)); | 2082 const Object& error = Object::Handle(ApiError::New(uhe)); |
| 2142 return Api::NewLocalHandle(error); | 2083 return Api::NewLocalHandle(error); |
| 2143 } else { | 2084 } else { |
| 2144 return Api::Error("Internal error: expected obj.IsUnhandledException()."); | 2085 return Api::Error("Internal error: expected obj.IsUnhandledException()."); |
| 2145 } | 2086 } |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2192 ASSERT(isolate != NULL); | 2133 ASSERT(isolate != NULL); |
| 2193 ApiState* state = isolate->api_state(); | 2134 ApiState* state = isolate->api_state(); |
| 2194 ASSERT(state != NULL); | 2135 ASSERT(state != NULL); |
| 2195 ApiLocalScope* scope = state->top_scope(); | 2136 ApiLocalScope* scope = state->top_scope(); |
| 2196 ASSERT(scope != NULL); | 2137 ASSERT(scope != NULL); |
| 2197 return scope->zone().Reallocate(ptr, old_size, new_size); | 2138 return scope->zone().Reallocate(ptr, old_size, new_size); |
| 2198 } | 2139 } |
| 2199 | 2140 |
| 2200 | 2141 |
| 2201 } // namespace dart | 2142 } // namespace dart |
| OLD | NEW |