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

Side by Side Diff: runtime/vm/dart_api_impl.cc

Issue 9169102: Add Dart_PropagateError. (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: '' Created 8 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « runtime/vm/dart.cc ('k') | runtime/vm/dart_api_impl_test.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (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"
11 #include "vm/dart_api_impl.h" 11 #include "vm/dart_api_impl.h"
12 #include "vm/dart_api_state.h" 12 #include "vm/dart_api_state.h"
13 #include "vm/dart_entry.h" 13 #include "vm/dart_entry.h"
14 #include "vm/debuginfo.h" 14 #include "vm/debuginfo.h"
15 #include "vm/exceptions.h" 15 #include "vm/exceptions.h"
16 #include "vm/growable_array.h" 16 #include "vm/growable_array.h"
17 #include "vm/longjump.h"
18 #include "vm/message.h" 17 #include "vm/message.h"
19 #include "vm/native_entry.h" 18 #include "vm/native_entry.h"
20 #include "vm/native_message_handler.h" 19 #include "vm/native_message_handler.h"
21 #include "vm/object.h" 20 #include "vm/object.h"
22 #include "vm/object_store.h" 21 #include "vm/object_store.h"
23 #include "vm/port.h" 22 #include "vm/port.h"
24 #include "vm/resolver.h" 23 #include "vm/resolver.h"
25 #include "vm/snapshot.h" 24 #include "vm/snapshot.h"
26 #include "vm/stack_frame.h" 25 #include "vm/stack_frame.h"
27 #include "vm/timer.h" 26 #include "vm/timer.h"
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
80 } 79 }
81 80
82 81
83 void SetupErrorResult(Dart_Handle* handle) { 82 void SetupErrorResult(Dart_Handle* handle) {
84 const Error& error = Error::Handle( 83 const Error& error = Error::Handle(
85 Isolate::Current()->object_store()->sticky_error()); 84 Isolate::Current()->object_store()->sticky_error());
86 *handle = Api::NewLocalHandle(error); 85 *handle = Api::NewLocalHandle(error);
87 } 86 }
88 87
89 88
90 // NOTE: Need to pass 'result' as a parameter here in order to avoid
91 // warning: variable 'result' might be clobbered by 'longjmp' or 'vfork'
92 // which shows up because of the use of setjmp.
93 static void InvokeStatic(Isolate* isolate,
94 const Function& function,
95 GrowableArray<const Object*>& args,
96 Dart_Handle* result) {
97 ASSERT(isolate != NULL);
98 LongJump* base = isolate->long_jump_base();
99 LongJump jump;
100 isolate->set_long_jump_base(&jump);
101 if (setjmp(*jump.Set()) == 0) {
102 const Array& kNoArgumentNames = Array::Handle();
103 const Instance& retval = Instance::Handle(
104 DartEntry::InvokeStatic(function, args, kNoArgumentNames));
105 *result = Api::NewLocalHandle(retval);
106 } else {
107 SetupErrorResult(result);
108 }
109 isolate->set_long_jump_base(base);
110 }
111
112
113 // NOTE: Need to pass 'result' as a parameter here in order to avoid
114 // warning: variable 'result' might be clobbered by 'longjmp' or 'vfork'
115 // which shows up because of the use of setjmp.
116 static void InvokeDynamic(Isolate* isolate,
117 const Instance& receiver,
118 const Function& function,
119 GrowableArray<const Object*>& args,
120 Dart_Handle* result) {
121 ASSERT(isolate != NULL);
122 LongJump* base = isolate->long_jump_base();
123 LongJump jump;
124 isolate->set_long_jump_base(&jump);
125 if (setjmp(*jump.Set()) == 0) {
126 const Array& kNoArgumentNames = Array::Handle();
127 const Instance& retval = Instance::Handle(
128 DartEntry::InvokeDynamic(receiver, function, args, kNoArgumentNames));
129 *result = Api::NewLocalHandle(retval);
130 } else {
131 SetupErrorResult(result);
132 }
133 isolate->set_long_jump_base(base);
134 }
135
136
137 Dart_Handle Api::NewLocalHandle(const Object& object) { 89 Dart_Handle Api::NewLocalHandle(const Object& object) {
138 Isolate* isolate = Isolate::Current(); 90 Isolate* isolate = Isolate::Current();
139 ASSERT(isolate != NULL); 91 ASSERT(isolate != NULL);
140 ApiState* state = isolate->api_state(); 92 ApiState* state = isolate->api_state();
141 ASSERT(state != NULL); 93 ASSERT(state != NULL);
142 ApiLocalScope* scope = state->top_scope(); 94 ApiLocalScope* scope = state->top_scope();
143 ASSERT(scope != NULL); 95 ASSERT(scope != NULL);
144 LocalHandles* local_handles = scope->local_handles(); 96 LocalHandles* local_handles = scope->local_handles();
145 ASSERT(local_handles != NULL); 97 ASSERT(local_handles != NULL);
146 LocalHandle* ref = local_handles->AllocateHandle(); 98 LocalHandle* ref = local_handles->AllocateHandle();
(...skipping 219 matching lines...) Expand 10 before | Expand all | Expand 10 after
366 va_start(args2, format); 318 va_start(args2, format);
367 OS::VSNPrint(buffer, (len + 1), format, args2); 319 OS::VSNPrint(buffer, (len + 1), format, args2);
368 va_end(args2); 320 va_end(args2);
369 321
370 const String& message = String::Handle(String::New(buffer)); 322 const String& message = String::Handle(String::New(buffer));
371 const Object& obj = Object::Handle(ApiError::New(message)); 323 const Object& obj = Object::Handle(ApiError::New(message));
372 return Api::NewLocalHandle(obj); 324 return Api::NewLocalHandle(obj);
373 } 325 }
374 326
375 327
328 DART_EXPORT Dart_Handle Dart_PropagateError(Dart_Handle handle) {
329 Isolate* isolate = Isolate::Current();
330 CHECK_ISOLATE(isolate);
331 const Object& error = Object::Handle(Api::UnwrapHandle(handle));
332 if (!error.IsError()) {
333 return Api::NewError(
334 "%s expects argument 'handle' to be an error handle. "
335 "Did you forget to check Dart_IsError first?",
336 CURRENT_FUNC);
337 }
338 if (isolate->top_exit_frame_info() == 0) {
339 // There are no dart frames on the stack so it would be illegal to
340 // propagate an error here.
341 return Api::NewError("No Dart frames on stack, cannot propagate error.");
342 }
343
344 // Unwind all the API scopes till the exit frame before propagating.
345 ApiState* state = isolate->api_state();
346 ASSERT(state != NULL);
347 state->UnwindScopes(isolate->top_exit_frame_info());
348 Exceptions::PropagateError(error);
349 UNREACHABLE();
350
351 return Api::NewError("Cannot reach here. Internal error.");
352 }
353
354
376 DART_EXPORT void _Dart_ReportErrorHandle(const char* file, 355 DART_EXPORT void _Dart_ReportErrorHandle(const char* file,
377 int line, 356 int line,
378 const char* handle, 357 const char* handle,
379 const char* message) { 358 const char* message) {
380 fprintf(stderr, "%s:%d: error handle: '%s':\n '%s'\n", 359 fprintf(stderr, "%s:%d: error handle: '%s':\n '%s'\n",
381 file, line, handle, message); 360 file, line, handle, message);
382 OS::Abort(); 361 OS::Abort();
383 } 362 }
384 363
385 364
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after
493 472
494 // --- Isolates --- 473 // --- Isolates ---
495 474
496 475
497 DART_EXPORT Dart_Isolate Dart_CreateIsolate(const char* name_prefix, 476 DART_EXPORT Dart_Isolate Dart_CreateIsolate(const char* name_prefix,
498 const uint8_t* snapshot, 477 const uint8_t* snapshot,
499 void* callback_data, 478 void* callback_data,
500 char** error) { 479 char** error) {
501 Isolate* isolate = Dart::CreateIsolate(name_prefix); 480 Isolate* isolate = Dart::CreateIsolate(name_prefix);
502 assert(isolate != NULL); 481 assert(isolate != NULL);
503 LongJump* base = isolate->long_jump_base(); 482 DARTSCOPE_NOCHECKS(isolate);
504 LongJump jump; 483 const Error& error_obj =
505 isolate->set_long_jump_base(&jump); 484 Error::Handle(Dart::InitializeIsolate(snapshot, callback_data));
506 if (setjmp(*jump.Set()) == 0) { 485 if (error_obj.IsNull()) {
507 Dart::InitializeIsolate(snapshot, callback_data);
508 START_TIMER(time_total_runtime); 486 START_TIMER(time_total_runtime);
509 isolate->set_long_jump_base(base);
510 return reinterpret_cast<Dart_Isolate>(isolate); 487 return reinterpret_cast<Dart_Isolate>(isolate);
511 } else { 488 } else {
512 { 489 *error = strdup(error_obj.ToErrorCString());
513 DARTSCOPE_NOCHECKS(isolate);
514 const Error& error_obj =
515 Error::Handle(isolate->object_store()->sticky_error());
516 *error = strdup(error_obj.ToErrorCString());
517 }
518 Dart::ShutdownIsolate(); 490 Dart::ShutdownIsolate();
491 return reinterpret_cast<Dart_Isolate>(NULL);
519 } 492 }
520 return reinterpret_cast<Dart_Isolate>(NULL);
521 } 493 }
522 494
523 495
524 DART_EXPORT void Dart_ShutdownIsolate() { 496 DART_EXPORT void Dart_ShutdownIsolate() {
525 CHECK_ISOLATE(Isolate::Current()); 497 CHECK_ISOLATE(Isolate::Current());
526 STOP_TIMER(time_total_runtime); 498 STOP_TIMER(time_total_runtime);
527 Dart::ShutdownIsolate(); 499 Dart::ShutdownIsolate();
528 } 500 }
529 501
530 502
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after
629 Dart_MessageNotifyCallback message_notify_callback) { 601 Dart_MessageNotifyCallback message_notify_callback) {
630 Isolate* isolate = Isolate::Current(); 602 Isolate* isolate = Isolate::Current();
631 CHECK_ISOLATE(isolate); 603 CHECK_ISOLATE(isolate);
632 isolate->set_message_notify_callback(message_notify_callback); 604 isolate->set_message_notify_callback(message_notify_callback);
633 } 605 }
634 606
635 607
636 DART_EXPORT Dart_Handle Dart_RunLoop() { 608 DART_EXPORT Dart_Handle Dart_RunLoop() {
637 Isolate* isolate = Isolate::Current(); 609 Isolate* isolate = Isolate::Current();
638 DARTSCOPE(isolate); 610 DARTSCOPE(isolate);
639 611 const Object& obj = Object::Handle(isolate->StandardRunLoop());
640 LongJump* base = isolate->long_jump_base(); 612 if (obj.IsError()) {
641 LongJump jump; 613 return Api::NewLocalHandle(obj);
642 Dart_Handle result;
643 isolate->set_long_jump_base(&jump);
644 if (setjmp(*jump.Set()) == 0) {
645 const Object& obj = Object::Handle(isolate->StandardRunLoop());
646 if (obj.IsError()) {
647 result = Api::NewLocalHandle(obj);
648 } else {
649 ASSERT(obj.IsNull());
650 result = Api::Success();
651 }
652 } else {
653 SetupErrorResult(&result);
654 } 614 }
655 isolate->set_long_jump_base(base); 615 ASSERT(obj.IsNull());
656 return result; 616 return Api::Success();
657 } 617 }
658 618
659 619
660 static RawInstance* DeserializeMessage(void* data) { 620 static RawInstance* DeserializeMessage(void* data) {
661 // Create a snapshot object using the buffer. 621 // Create a snapshot object using the buffer.
662 const Snapshot* snapshot = Snapshot::SetupFromBuffer(data); 622 const Snapshot* snapshot = Snapshot::SetupFromBuffer(data);
663 ASSERT(snapshot->IsMessageSnapshot()); 623 ASSERT(snapshot->IsMessageSnapshot());
664 624
665 // Read object back from the snapshot. 625 // Read object back from the snapshot.
666 SnapshotReader reader(snapshot, Isolate::Current()); 626 SnapshotReader reader(snapshot, Isolate::Current());
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after
786 // function resolution by class name and function name more concise. 746 // function resolution by class name and function name more concise.
787 const Function& function = Function::Handle( 747 const Function& function = Function::Handle(
788 Resolver::ResolveStatic(Library::Handle(Library::CoreLibrary()), 748 Resolver::ResolveStatic(Library::Handle(Library::CoreLibrary()),
789 class_name, 749 class_name,
790 function_name, 750 function_name,
791 kNumArguments, 751 kNumArguments,
792 kNoArgumentNames, 752 kNoArgumentNames,
793 Resolver::kIsQualified)); 753 Resolver::kIsQualified));
794 GrowableArray<const Object*> arguments(kNumArguments); 754 GrowableArray<const Object*> arguments(kNumArguments);
795 arguments.Add(&Integer::Handle(Integer::New(port_id))); 755 arguments.Add(&Integer::Handle(Integer::New(port_id)));
796 Dart_Handle result; 756 const Object& result = Object::Handle(
797 InvokeStatic(isolate, function, arguments, &result); 757 DartEntry::InvokeStatic(function, arguments, kNoArgumentNames));
798 return result; 758 return Api::NewLocalHandle(result);
799 } 759 }
800 760
801 761
802 DART_EXPORT Dart_Handle Dart_GetReceivePort(Dart_Port port_id) { 762 DART_EXPORT Dart_Handle Dart_GetReceivePort(Dart_Port port_id) {
803 Isolate* isolate = Isolate::Current(); 763 Isolate* isolate = Isolate::Current();
804 DARTSCOPE(isolate); 764 DARTSCOPE(isolate);
805 const String& class_name = 765 const String& class_name =
806 String::Handle(String::NewSymbol("ReceivePortImpl")); 766 String::Handle(String::NewSymbol("ReceivePortImpl"));
807 const String& function_name = 767 const String& function_name =
808 String::Handle(String::NewSymbol("_get_or_create")); 768 String::Handle(String::NewSymbol("_get_or_create"));
809 const int kNumArguments = 1; 769 const int kNumArguments = 1;
810 const Array& kNoArgumentNames = Array::Handle(); 770 const Array& kNoArgumentNames = Array::Handle();
811 const Function& function = Function::Handle( 771 const Function& function = Function::Handle(
812 Resolver::ResolveStatic(Library::Handle(Library::CoreLibrary()), 772 Resolver::ResolveStatic(Library::Handle(Library::CoreLibrary()),
813 class_name, 773 class_name,
814 function_name, 774 function_name,
815 kNumArguments, 775 kNumArguments,
816 kNoArgumentNames, 776 kNoArgumentNames,
817 Resolver::kIsQualified)); 777 Resolver::kIsQualified));
818 GrowableArray<const Object*> arguments(kNumArguments); 778 GrowableArray<const Object*> arguments(kNumArguments);
819 arguments.Add(&Integer::Handle(Integer::New(port_id))); 779 arguments.Add(&Integer::Handle(Integer::New(port_id)));
820 Dart_Handle result; 780 const Object& result = Object::Handle(
821 InvokeStatic(isolate, function, arguments, &result); 781 DartEntry::InvokeStatic(function, arguments, kNoArgumentNames));
822 return result; 782 return Api::NewLocalHandle(result);
823 } 783 }
824 784
825 785
826 DART_EXPORT Dart_Port Dart_GetMainPortId() { 786 DART_EXPORT Dart_Port Dart_GetMainPortId() {
827 Isolate* isolate = Isolate::Current(); 787 Isolate* isolate = Isolate::Current();
828 CHECK_ISOLATE(isolate); 788 CHECK_ISOLATE(isolate);
829 return isolate->main_port(); 789 return isolate->main_port();
830 } 790 }
831 791
832 // --- Scopes ---- 792 // --- Scopes ----
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
869 const Object& obj = Object::Handle(Api::UnwrapHandle(object)); 829 const Object& obj = Object::Handle(Api::UnwrapHandle(object));
870 return obj.IsNull(); 830 return obj.IsNull();
871 } 831 }
872 832
873 833
874 DART_EXPORT Dart_Handle Dart_ObjectEquals(Dart_Handle obj1, Dart_Handle obj2, 834 DART_EXPORT Dart_Handle Dart_ObjectEquals(Dart_Handle obj1, Dart_Handle obj2,
875 bool* value) { 835 bool* value) {
876 DARTSCOPE(Isolate::Current()); 836 DARTSCOPE(Isolate::Current());
877 const Instance& expected = Instance::CheckedHandle(Api::UnwrapHandle(obj1)); 837 const Instance& expected = Instance::CheckedHandle(Api::UnwrapHandle(obj1));
878 const Instance& actual = Instance::CheckedHandle(Api::UnwrapHandle(obj2)); 838 const Instance& actual = Instance::CheckedHandle(Api::UnwrapHandle(obj2));
879 const Instance& result = 839 const Object& result =
880 Instance::Handle(DartLibraryCalls::Equals(expected, actual)); 840 Object::Handle(DartLibraryCalls::Equals(expected, actual));
881 if (result.IsBool()) { 841 if (result.IsBool()) {
882 Bool& b = Bool::Handle(); 842 Bool& b = Bool::Handle();
883 b ^= result.raw(); 843 b ^= result.raw();
884 *value = b.value(); 844 *value = b.value();
885 return Api::Success(); 845 return Api::Success();
886 } else if (result.IsError()) { 846 } else if (result.IsError()) {
887 return Api::NewLocalHandle(result); 847 return Api::NewLocalHandle(result);
888 } else { 848 } else {
889 return Api::NewError("Expected boolean result from =="); 849 return Api::NewError("Expected boolean result from ==");
890 } 850 }
(...skipping 502 matching lines...) Expand 10 before | Expand all | Expand 10 after
1393 const Object& obj = Object::Handle(Api::UnwrapHandle(list)); 1353 const Object& obj = Object::Handle(Api::UnwrapHandle(list));
1394 if (obj.IsArray()) { 1354 if (obj.IsArray()) {
1395 Array& array_obj = Array::Handle(); 1355 Array& array_obj = Array::Handle();
1396 array_obj ^= obj.raw(); 1356 array_obj ^= obj.raw();
1397 *len = array_obj.Length(); 1357 *len = array_obj.Length();
1398 return Api::Success(); 1358 return Api::Success();
1399 } 1359 }
1400 // TODO(5526318): Make access to GrowableObjectArray more efficient. 1360 // TODO(5526318): Make access to GrowableObjectArray more efficient.
1401 // Now check and handle a dart object that implements the List interface. 1361 // Now check and handle a dart object that implements the List interface.
1402 const Instance& instance = Instance::Handle(GetListInstance(isolate, obj)); 1362 const Instance& instance = Instance::Handle(GetListInstance(isolate, obj));
1403 if (!instance.IsNull()) { 1363 if (instance.IsNull()) {
1404 String& name = String::Handle(String::New("length")); 1364 return Api::NewError("Object does not implement the List inteface");
1405 name = Field::GetterName(name); 1365 }
1406 const Function& function = Function::Handle( 1366 String& name = String::Handle(String::New("length"));
1407 Resolver::ResolveDynamic(instance, name, 1, 0)); 1367 name = Field::GetterName(name);
1408 if (!function.IsNull()) { 1368 const Function& function = Function::Handle(
1409 GrowableArray<const Object*> args(0); 1369 Resolver::ResolveDynamic(instance, name, 1, 0));
1410 LongJump* base = isolate->long_jump_base(); 1370 if (function.IsNull()) {
1411 LongJump jump; 1371 return Api::NewError("List object does not have a 'length' field.");
1412 isolate->set_long_jump_base(&jump); 1372 }
1413 Dart_Handle result; 1373
1414 if (setjmp(*jump.Set()) == 0) { 1374 GrowableArray<const Object*> args(0);
1415 const Array& kNoArgumentNames = Array::Handle(); 1375 Dart_Handle result;
1416 const Instance& retval = Instance::Handle( 1376 const Array& kNoArgumentNames = Array::Handle();
1417 DartEntry::InvokeDynamic(instance, 1377 const Object& retval = Object::Handle(
1418 function, 1378 DartEntry::InvokeDynamic(instance, function, args, kNoArgumentNames));
1419 args, 1379 if (retval.IsSmi() || retval.IsMint()) {
1420 kNoArgumentNames)); 1380 Integer& integer = Integer::Handle();
1421 result = Api::Success(); 1381 integer ^= retval.raw();
1422 if (retval.IsSmi() || retval.IsMint()) { 1382 *len = integer.AsInt64Value();
1423 Integer& integer = Integer::Handle(); 1383 return Api::Success();
1424 integer ^= retval.raw(); 1384 } else if (retval.IsBigint()) {
1425 *len = integer.AsInt64Value(); 1385 Bigint& bigint = Bigint::Handle();
1426 } else if (retval.IsBigint()) { 1386 bigint ^= retval.raw();
1427 Bigint& bigint = Bigint::Handle(); 1387 if (BigintOperations::FitsIntoInt64(bigint)) {
1428 bigint ^= retval.raw(); 1388 *len = BigintOperations::ToInt64(bigint);
1429 if (BigintOperations::FitsIntoInt64(bigint)) { 1389 return Api::Success();
1430 *len = BigintOperations::ToInt64(bigint); 1390 } else {
1431 } else { 1391 return Api::NewError("Length of List object is greater than the "
1432 result = 1392 "maximum value that 'len' parameter can hold");
1433 Api::NewError("Length of List object is greater than the "
1434 "maximum value that 'len' parameter can hold");
1435 }
1436 } else if (retval.IsError()) {
1437 result = Api::NewLocalHandle(retval);
1438 } else {
1439 result = Api::NewError("Length of List object is not an integer");
1440 }
1441 } else {
1442 SetupErrorResult(&result);
1443 }
1444 isolate->set_long_jump_base(base);
1445 return result;
1446 } 1393 }
1394 } else if (retval.IsError()) {
1395 return Api::NewLocalHandle(retval);
1396 } else {
1397 return Api::NewError("Length of List object is not an integer");
1447 } 1398 }
1448 return Api::NewError("Object does not implement the 'List' inteface");
1449 } 1399 }
1450 1400
1451 1401
1452 static RawObject* GetListAt(Isolate* isolate,
1453 const Instance& instance,
1454 const Integer& index,
1455 const Function& function,
1456 Dart_Handle* result) {
1457 ASSERT(isolate != NULL);
1458 ASSERT(result != NULL);
1459 LongJump* base = isolate->long_jump_base();
1460 LongJump jump;
1461 isolate->set_long_jump_base(&jump);
1462 if (setjmp(*jump.Set()) == 0) {
1463 Instance& retval = Instance::Handle();
1464 GrowableArray<const Object*> args(0);
1465 args.Add(&index);
1466 const Array& kNoArgumentNames = Array::Handle();
1467 retval = DartEntry::InvokeDynamic(instance,
1468 function,
1469 args,
1470 kNoArgumentNames);
1471 if (retval.IsError()) {
1472 *result = Api::NewLocalHandle(retval);
1473 } else {
1474 *result = Api::Success();
1475 }
1476 isolate->set_long_jump_base(base);
1477 return retval.raw();
1478 }
1479 SetupErrorResult(result);
1480 isolate->set_long_jump_base(base);
1481 return Object::null();
1482 }
1483
1484
1485 DART_EXPORT Dart_Handle Dart_ListGetAt(Dart_Handle list, intptr_t index) { 1402 DART_EXPORT Dart_Handle Dart_ListGetAt(Dart_Handle list, intptr_t index) {
1486 Isolate* isolate = Isolate::Current(); 1403 Isolate* isolate = Isolate::Current();
1487 DARTSCOPE(isolate); 1404 DARTSCOPE(isolate);
1488 const Object& obj = Object::Handle(Api::UnwrapHandle(list)); 1405 const Object& obj = Object::Handle(Api::UnwrapHandle(list));
1489 if (obj.IsArray()) { 1406 if (obj.IsArray()) {
1490 Array& array_obj = Array::Handle(); 1407 Array& array_obj = Array::Handle();
1491 array_obj ^= obj.raw(); 1408 array_obj ^= obj.raw();
1492 if ((index >= 0) && (index < array_obj.Length())) { 1409 if ((index >= 0) && (index < array_obj.Length())) {
1493 const Object& element = Object::Handle(array_obj.At(index)); 1410 const Object& element = Object::Handle(array_obj.At(index));
1494 return Api::NewLocalHandle(element); 1411 return Api::NewLocalHandle(element);
1495 } 1412 }
1496 return Api::NewError("Invalid index passed in to access array element"); 1413 return Api::NewError("Invalid index passed in to access array element");
1497 } 1414 }
1498 // TODO(5526318): Make access to GrowableObjectArray more efficient. 1415 // TODO(5526318): Make access to GrowableObjectArray more efficient.
1499 // Now check and handle a dart object that implements the List interface. 1416 // Now check and handle a dart object that implements the List interface.
1500 const Instance& instance = Instance::Handle(GetListInstance(isolate, obj)); 1417 const Instance& instance = Instance::Handle(GetListInstance(isolate, obj));
1501 if (!instance.IsNull()) { 1418 if (!instance.IsNull()) {
1502 String& name = String::Handle(String::New("[]")); 1419 String& name = String::Handle(String::New("[]"));
1503 const Function& function = Function::Handle( 1420 const Function& function = Function::Handle(
1504 Resolver::ResolveDynamic(instance, name, 2, 0)); 1421 Resolver::ResolveDynamic(instance, name, 2, 0));
1505 if (!function.IsNull()) { 1422 if (!function.IsNull()) {
1506 Object& element = Object::Handle(); 1423 GrowableArray<const Object*> args(1);
1507 Integer& indexobj = Integer::Handle(); 1424 Integer& indexobj = Integer::Handle();
1508 Dart_Handle result;
1509 indexobj = Integer::New(index); 1425 indexobj = Integer::New(index);
1510 element = GetListAt(isolate, instance, indexobj, function, &result); 1426 args.Add(&indexobj);
1511 if (::Dart_IsError(result)) { 1427 const Array& kNoArgumentNames = Array::Handle();
1512 return result; // Error condition. 1428 const Object& result = Object::Handle(
1513 } 1429 DartEntry::InvokeDynamic(instance, function, args, kNoArgumentNames));
1514 return Api::NewLocalHandle(element); 1430 return Api::NewLocalHandle(result);
1515 } 1431 }
1516 } 1432 }
1517 return Api::NewError("Object does not implement the 'List' interface"); 1433 return Api::NewError("Object does not implement the 'List' interface");
1518 } 1434 }
1519 1435
1520 1436
1521 static void SetListAt(Isolate* isolate,
1522 const Instance& instance,
1523 const Integer& index,
1524 const Object& value,
1525 const Function& function,
1526 Dart_Handle* result) {
1527 ASSERT(isolate != NULL);
1528 ASSERT(result != NULL);
1529 LongJump* base = isolate->long_jump_base();
1530 LongJump jump;
1531 isolate->set_long_jump_base(&jump);
1532 if (setjmp(*jump.Set()) == 0) {
1533 GrowableArray<const Object*> args(1);
1534 args.Add(&index);
1535 args.Add(&value);
1536 Instance& retval = Instance::Handle();
1537 const Array& kNoArgumentNames = Array::Handle();
1538 retval = DartEntry::InvokeDynamic(instance,
1539 function,
1540 args,
1541 kNoArgumentNames);
1542 if (retval.IsError()) {
1543 *result = Api::NewLocalHandle(retval);
1544 } else {
1545 *result = Api::Success();
1546 }
1547 } else {
1548 SetupErrorResult(result);
1549 }
1550 isolate->set_long_jump_base(base);
1551 }
1552
1553
1554 DART_EXPORT Dart_Handle Dart_ListSetAt(Dart_Handle list, 1437 DART_EXPORT Dart_Handle Dart_ListSetAt(Dart_Handle list,
1555 intptr_t index, 1438 intptr_t index,
1556 Dart_Handle value) { 1439 Dart_Handle value) {
1557 Isolate* isolate = Isolate::Current(); 1440 Isolate* isolate = Isolate::Current();
1558 DARTSCOPE(isolate); 1441 DARTSCOPE(isolate);
1559 const Object& obj = Object::Handle(Api::UnwrapHandle(list)); 1442 const Object& obj = Object::Handle(Api::UnwrapHandle(list));
1560 if (obj.IsArray()) { 1443 if (obj.IsArray()) {
1561 if (obj.IsImmutableArray()) { 1444 if (obj.IsImmutableArray()) {
1562 return Api::NewError("Cannot modify immutable array"); 1445 return Api::NewError("Cannot modify immutable array");
1563 } 1446 }
1564 Array& array_obj = Array::Handle(); 1447 Array& array_obj = Array::Handle();
1565 array_obj ^= obj.raw(); 1448 array_obj ^= obj.raw();
1566 const Object& value_obj = Object::Handle(Api::UnwrapHandle(value)); 1449 const Object& value_obj = Object::Handle(Api::UnwrapHandle(value));
1567 if ((index >= 0) && (index < array_obj.Length())) { 1450 if ((index >= 0) && (index < array_obj.Length())) {
1568 array_obj.SetAt(index, value_obj); 1451 array_obj.SetAt(index, value_obj);
1569 return Api::Success(); 1452 return Api::Success();
1570 } 1453 }
1571 return Api::NewError("Invalid index passed in to set array element"); 1454 return Api::NewError("Invalid index passed in to set array element");
1572 } 1455 }
1573 // TODO(5526318): Make access to GrowableObjectArray more efficient. 1456 // TODO(5526318): Make access to GrowableObjectArray more efficient.
1574 // Now check and handle a dart object that implements the List interface. 1457 // Now check and handle a dart object that implements the List interface.
1575 const Instance& instance = Instance::Handle(GetListInstance(isolate, obj)); 1458 const Instance& instance = Instance::Handle(GetListInstance(isolate, obj));
1576 if (!instance.IsNull()) { 1459 if (!instance.IsNull()) {
1577 String& name = String::Handle(String::New("[]=")); 1460 String& name = String::Handle(String::New("[]="));
1578 const Function& function = Function::Handle( 1461 const Function& function = Function::Handle(
1579 Resolver::ResolveDynamic(instance, name, 3, 0)); 1462 Resolver::ResolveDynamic(instance, name, 3, 0));
1580 if (!function.IsNull()) { 1463 if (!function.IsNull()) {
1581 Dart_Handle result;
1582 const Integer& index_obj = Integer::Handle(Integer::New(index)); 1464 const Integer& index_obj = Integer::Handle(Integer::New(index));
1583 const Object& value_obj = Object::Handle(Api::UnwrapHandle(value)); 1465 const Object& value_obj = Object::Handle(Api::UnwrapHandle(value));
1584 SetListAt(isolate, instance, index_obj, value_obj, function, &result); 1466 GrowableArray<const Object*> args(2);
1585 return result; 1467 args.Add(&index_obj);
1468 args.Add(&value_obj);
1469 const Array& kNoArgumentNames = Array::Handle();
1470 const Object& result = Object::Handle(
1471 DartEntry::InvokeDynamic(instance, function, args, kNoArgumentNames));
1472 return Api::NewLocalHandle(result);
1586 } 1473 }
1587 } 1474 }
1588 return Api::NewError("Object does not implement the 'List' interface"); 1475 return Api::NewError("Object does not implement the 'List' interface");
1589 } 1476 }
1590 1477
1591 1478
1592 DART_EXPORT Dart_Handle Dart_ListGetAsBytes(Dart_Handle list, 1479 DART_EXPORT Dart_Handle Dart_ListGetAsBytes(Dart_Handle list,
1593 intptr_t offset, 1480 intptr_t offset,
1594 uint8_t* native_array, 1481 uint8_t* native_array,
1595 intptr_t length) { 1482 intptr_t length) {
(...skipping 23 matching lines...) Expand all
1619 return Api::NewError("Invalid length passed in to access array elements"); 1506 return Api::NewError("Invalid length passed in to access array elements");
1620 } 1507 }
1621 // TODO(5526318): Make access to GrowableObjectArray more efficient. 1508 // TODO(5526318): Make access to GrowableObjectArray more efficient.
1622 // Now check and handle a dart object that implements the List interface. 1509 // Now check and handle a dart object that implements the List interface.
1623 const Instance& instance = Instance::Handle(GetListInstance(isolate, obj)); 1510 const Instance& instance = Instance::Handle(GetListInstance(isolate, obj));
1624 if (!instance.IsNull()) { 1511 if (!instance.IsNull()) {
1625 String& name = String::Handle(String::New("[]")); 1512 String& name = String::Handle(String::New("[]"));
1626 const Function& function = Function::Handle( 1513 const Function& function = Function::Handle(
1627 Resolver::ResolveDynamic(instance, name, 2, 0)); 1514 Resolver::ResolveDynamic(instance, name, 2, 0));
1628 if (!function.IsNull()) { 1515 if (!function.IsNull()) {
1629 Object& element = Object::Handle(); 1516 Object& result = Object::Handle();
1630 Integer& intobj = Integer::Handle(); 1517 Integer& intobj = Integer::Handle();
1631 Dart_Handle result;
1632 for (int i = 0; i < length; i++) { 1518 for (int i = 0; i < length; i++) {
1633 intobj = Integer::New(offset + i); 1519 intobj = Integer::New(offset + i);
1634 element = GetListAt(isolate, instance, intobj, function, &result); 1520 GrowableArray<const Object*> args(1);
1635 if (::Dart_IsError(result)) { 1521 args.Add(&intobj);
1636 return result; // Error condition. 1522 const Array& kNoArgumentNames = Array::Handle();
1523 result = DartEntry::InvokeDynamic(
1524 instance, function, args, kNoArgumentNames);
1525 if (result.IsError()) {
1526 return Api::NewLocalHandle(result);
1637 } 1527 }
1638 if (!element.IsInteger()) { 1528 if (!result.IsInteger()) {
1639 return Api::NewError("%s expects the argument 'list' to be " 1529 return Api::NewError("%s expects the argument 'list' to be "
1640 "a List of int", CURRENT_FUNC); 1530 "a List of int", CURRENT_FUNC);
1641 } 1531 }
1642 intobj ^= element.raw(); 1532 intobj ^= result.raw();
1643 ASSERT(intobj.AsInt64Value() <= 0xff); 1533 ASSERT(intobj.AsInt64Value() <= 0xff);
1644 // TODO(hpayer): value should always be smaller then 0xff. Add error 1534 // TODO(hpayer): value should always be smaller then 0xff. Add error
1645 // handling. 1535 // handling.
1646 native_array[i] = static_cast<uint8_t>(intobj.AsInt64Value() & 0xff); 1536 native_array[i] = static_cast<uint8_t>(intobj.AsInt64Value() & 0xff);
1647 } 1537 }
1648 return Api::Success(); 1538 return Api::Success();
1649 } 1539 }
1650 } 1540 }
1651 return Api::NewError("Object does not implement the 'List' interface"); 1541 return Api::NewError("Object does not implement the 'List' interface");
1652 } 1542 }
(...skipping 29 matching lines...) Expand all
1682 String& name = String::Handle(String::New("[]=")); 1572 String& name = String::Handle(String::New("[]="));
1683 const Function& function = Function::Handle( 1573 const Function& function = Function::Handle(
1684 Resolver::ResolveDynamic(instance, name, 3, 0)); 1574 Resolver::ResolveDynamic(instance, name, 3, 0));
1685 if (!function.IsNull()) { 1575 if (!function.IsNull()) {
1686 Integer& indexobj = Integer::Handle(); 1576 Integer& indexobj = Integer::Handle();
1687 Integer& valueobj = Integer::Handle(); 1577 Integer& valueobj = Integer::Handle();
1688 Dart_Handle result; 1578 Dart_Handle result;
1689 for (int i = 0; i < length; i++) { 1579 for (int i = 0; i < length; i++) {
1690 indexobj = Integer::New(offset + i); 1580 indexobj = Integer::New(offset + i);
1691 valueobj = Integer::New(native_array[i]); 1581 valueobj = Integer::New(native_array[i]);
1692 SetListAt(isolate, instance, indexobj, valueobj, function, &result); 1582 GrowableArray<const Object*> args(2);
1693 if (::Dart_IsError(result)) { 1583 args.Add(&indexobj);
1694 return result; // Error condition. 1584 args.Add(&valueobj);
1585 const Array& kNoArgumentNames = Array::Handle();
1586 const Object& result = Object::Handle(
1587 DartEntry::InvokeDynamic(
1588 instance, function, args, kNoArgumentNames));
1589 if (result.IsError()) {
1590 return Api::NewLocalHandle(result);
1695 } 1591 }
1696 } 1592 }
1697 return Api::Success(); 1593 return Api::Success();
1698 } 1594 }
1699 } 1595 }
1700 return Api::NewError("Object does not implement the 'List' interface"); 1596 return Api::NewError("Object does not implement the 'List' interface");
1701 } 1597 }
1702 1598
1703 1599
1704 // --- Byte Arrays --- 1600 // --- Byte Arrays ---
(...skipping 17 matching lines...) Expand all
1722 // --- Closures --- 1618 // --- Closures ---
1723 1619
1724 1620
1725 DART_EXPORT bool Dart_IsClosure(Dart_Handle object) { 1621 DART_EXPORT bool Dart_IsClosure(Dart_Handle object) {
1726 DARTSCOPE(Isolate::Current()); 1622 DARTSCOPE(Isolate::Current());
1727 const Object& obj = Object::Handle(Api::UnwrapHandle(object)); 1623 const Object& obj = Object::Handle(Api::UnwrapHandle(object));
1728 return obj.IsClosure(); 1624 return obj.IsClosure();
1729 } 1625 }
1730 1626
1731 1627
1732 // NOTE: Need to pass 'result' as a parameter here in order to avoid
1733 // warning: variable 'result' might be clobbered by 'longjmp' or 'vfork'
1734 // which shows up because of the use of setjmp.
1735 static void InvokeClosure(Isolate* isolate,
1736 const Closure& closure,
1737 GrowableArray<const Object*>& args,
1738 Dart_Handle* result) {
1739 ASSERT(isolate != NULL);
1740 LongJump* base = isolate->long_jump_base();
1741 LongJump jump;
1742 isolate->set_long_jump_base(&jump);
1743 if (setjmp(*jump.Set()) == 0) {
1744 const Array& kNoArgumentNames = Array::Handle();
1745 const Instance& retval = Instance::Handle(
1746 DartEntry::InvokeClosure(closure, args, kNoArgumentNames));
1747 *result = Api::NewLocalHandle(retval);
1748 } else {
1749 SetupErrorResult(result);
1750 }
1751 isolate->set_long_jump_base(base);
1752 }
1753
1754
1755 DART_EXPORT Dart_Handle Dart_InvokeClosure(Dart_Handle closure, 1628 DART_EXPORT Dart_Handle Dart_InvokeClosure(Dart_Handle closure,
1756 int number_of_arguments, 1629 int number_of_arguments,
1757 Dart_Handle* arguments) { 1630 Dart_Handle* arguments) {
1758 Isolate* isolate = Isolate::Current(); 1631 Isolate* isolate = Isolate::Current();
1759 DARTSCOPE(isolate); 1632 DARTSCOPE(isolate);
1760 const Object& obj = Object::Handle(Api::UnwrapHandle(closure)); 1633 const Object& obj = Object::Handle(Api::UnwrapHandle(closure));
1761 if (obj.IsNull()) { 1634 if (obj.IsNull()) {
1762 return Api::NewError("Null object passed in to invoke closure"); 1635 return Api::NewError("Null object passed in to invoke closure");
1763 } 1636 }
1764 if (!obj.IsClosure()) { 1637 if (!obj.IsClosure()) {
1765 return Api::NewError("Invalid closure passed to invoke closure"); 1638 return Api::NewError("Invalid closure passed to invoke closure");
1766 } 1639 }
1767 ASSERT(ClassFinalizer::AllClassesFinalized()); 1640 ASSERT(ClassFinalizer::AllClassesFinalized());
1768 1641
1769 // Now try to invoke the closure. 1642 // Now try to invoke the closure.
1770 Closure& closure_obj = Closure::Handle(); 1643 Closure& closure_obj = Closure::Handle();
1771 closure_obj ^= obj.raw(); 1644 closure_obj ^= obj.raw();
1772 Dart_Handle retval;
1773 GrowableArray<const Object*> dart_arguments(number_of_arguments); 1645 GrowableArray<const Object*> dart_arguments(number_of_arguments);
1774 for (int i = 0; i < number_of_arguments; i++) { 1646 for (int i = 0; i < number_of_arguments; i++) {
1775 const Object& arg = Object::Handle(Api::UnwrapHandle(arguments[i])); 1647 const Object& arg = Object::Handle(Api::UnwrapHandle(arguments[i]));
1776 dart_arguments.Add(&arg); 1648 dart_arguments.Add(&arg);
1777 } 1649 }
1778 InvokeClosure(isolate, closure_obj, dart_arguments, &retval); 1650 const Array& kNoArgumentNames = Array::Handle();
1779 return retval; 1651 const Object& result = Object::Handle(
1652 DartEntry::InvokeClosure(closure_obj, dart_arguments, kNoArgumentNames));
1653 return Api::NewLocalHandle(result);
1780 } 1654 }
1781 1655
1782 1656
1783 DART_EXPORT int64_t Dart_ClosureSmrck(Dart_Handle object) { 1657 DART_EXPORT int64_t Dart_ClosureSmrck(Dart_Handle object) {
1784 DARTSCOPE(Isolate::Current()); 1658 DARTSCOPE(Isolate::Current());
1785 const Closure& obj = Closure::CheckedHandle(Api::UnwrapHandle(object)); 1659 const Closure& obj = Closure::CheckedHandle(Api::UnwrapHandle(object));
1786 const Integer& smrck = Integer::Handle(obj.smrck()); 1660 const Integer& smrck = Integer::Handle(obj.smrck());
1787 return smrck.IsNull() ? 0 : smrck.AsInt64Value(); 1661 return smrck.IsNull() ? 0 : smrck.AsInt64Value();
1788 } 1662 }
1789 1663
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
1847 class_name.ToCString(), function_name.ToCString()); 1721 class_name.ToCString(), function_name.ToCString());
1848 } 1722 }
1849 return Api::NewError(msg); 1723 return Api::NewError(msg);
1850 } 1724 }
1851 Dart_Handle retval; 1725 Dart_Handle retval;
1852 GrowableArray<const Object*> dart_arguments(number_of_arguments); 1726 GrowableArray<const Object*> dart_arguments(number_of_arguments);
1853 for (int i = 0; i < number_of_arguments; i++) { 1727 for (int i = 0; i < number_of_arguments; i++) {
1854 const Object& arg = Object::Handle(Api::UnwrapHandle(arguments[i])); 1728 const Object& arg = Object::Handle(Api::UnwrapHandle(arguments[i]));
1855 dart_arguments.Add(&arg); 1729 dart_arguments.Add(&arg);
1856 } 1730 }
1857 InvokeStatic(isolate, function, dart_arguments, &retval); 1731 const Array& kNoArgumentNames = Array::Handle();
1858 return retval; 1732 const Object& result = Object::Handle(
1733 DartEntry::InvokeStatic(function, dart_arguments, kNoArgumentNames));
1734 return Api::NewLocalHandle(result);
1859 } 1735 }
1860 1736
1861 1737
1862 DART_EXPORT Dart_Handle Dart_InvokeDynamic(Dart_Handle object, 1738 DART_EXPORT Dart_Handle Dart_InvokeDynamic(Dart_Handle object,
1863 Dart_Handle function_name, 1739 Dart_Handle function_name,
1864 int number_of_arguments, 1740 int number_of_arguments,
1865 Dart_Handle* arguments) { 1741 Dart_Handle* arguments) {
1866 Isolate* isolate = Isolate::Current(); 1742 Isolate* isolate = Isolate::Current();
1867 DARTSCOPE(isolate); 1743 DARTSCOPE(isolate);
1868 const Object& obj = Object::Handle(Api::UnwrapHandle(object)); 1744 const Object& obj = Object::Handle(Api::UnwrapHandle(object));
(...skipping 21 matching lines...) Expand all
1890 // TODO(5415268): Invoke noSuchMethod instead of failing. 1766 // TODO(5415268): Invoke noSuchMethod instead of failing.
1891 OS::PrintErr("Unable to find instance function: %s\n", name.ToCString()); 1767 OS::PrintErr("Unable to find instance function: %s\n", name.ToCString());
1892 return Api::NewError("Unable to find instance function"); 1768 return Api::NewError("Unable to find instance function");
1893 } 1769 }
1894 Dart_Handle retval; 1770 Dart_Handle retval;
1895 GrowableArray<const Object*> dart_arguments(number_of_arguments); 1771 GrowableArray<const Object*> dart_arguments(number_of_arguments);
1896 for (int i = 0; i < number_of_arguments; i++) { 1772 for (int i = 0; i < number_of_arguments; i++) {
1897 const Object& arg = Object::Handle(Api::UnwrapHandle(arguments[i])); 1773 const Object& arg = Object::Handle(Api::UnwrapHandle(arguments[i]));
1898 dart_arguments.Add(&arg); 1774 dart_arguments.Add(&arg);
1899 } 1775 }
1900 InvokeDynamic(isolate, receiver, function, dart_arguments, &retval); 1776 const Array& kNoArgumentNames = Array::Handle();
1901 return retval; 1777 const Object& result = Object::Handle(
1778 DartEntry::InvokeDynamic(
1779 receiver, function, dart_arguments, kNoArgumentNames));
1780 return Api::NewLocalHandle(result);
1902 } 1781 }
1903 1782
1904 1783
1905 static const bool kGetter = true; 1784 static const bool kGetter = true;
1906 static const bool kSetter = false; 1785 static const bool kSetter = false;
1907 1786
1908 1787
1909 static bool UseGetterForStaticField(const Field& fld) { 1788 static bool UseGetterForStaticField(const Field& fld) {
1910 if (fld.IsNull()) { 1789 if (fld.IsNull()) {
1911 return true; 1790 return true;
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after
1998 const Object& obj = Object::Handle(Api::UnwrapHandle(result)); 1877 const Object& obj = Object::Handle(Api::UnwrapHandle(result));
1999 if (obj.IsField()) { 1878 if (obj.IsField()) {
2000 Field& fld = Field::Handle(); 1879 Field& fld = Field::Handle();
2001 fld ^= obj.raw(); 1880 fld ^= obj.raw();
2002 retval = fld.value(); 1881 retval = fld.value();
2003 return Api::NewLocalHandle(retval); 1882 return Api::NewLocalHandle(retval);
2004 } else { 1883 } else {
2005 Function& func = Function::Handle(); 1884 Function& func = Function::Handle();
2006 func ^= obj.raw(); 1885 func ^= obj.raw();
2007 GrowableArray<const Object*> args; 1886 GrowableArray<const Object*> args;
2008 InvokeStatic(isolate, func, args, &result); 1887 const Array& kNoArgumentNames = Array::Handle();
2009 return result; 1888 const Object& result = Object::Handle(
1889 DartEntry::InvokeStatic(func, args, kNoArgumentNames));
1890 return Api::NewLocalHandle(result);
2010 } 1891 }
2011 } 1892 }
2012 1893
2013 1894
2014 // TODO(iposva): The value parameter should be documented as being an instance. 1895 // TODO(iposva): The value parameter should be documented as being an instance.
2015 // TODO(turnidge): Is this skipping the setter? 1896 // TODO(turnidge): Is this skipping the setter?
2016 DART_EXPORT Dart_Handle Dart_SetStaticField(Dart_Handle cls, 1897 DART_EXPORT Dart_Handle Dart_SetStaticField(Dart_Handle cls,
2017 Dart_Handle name, 1898 Dart_Handle name,
2018 Dart_Handle value) { 1899 Dart_Handle value) {
2019 DARTSCOPE(Isolate::Current()); 1900 DARTSCOPE(Isolate::Current());
(...skipping 25 matching lines...) Expand all
2045 } 1926 }
2046 Instance& object = Instance::Handle(); 1927 Instance& object = Instance::Handle();
2047 object ^= param.raw(); 1928 object ^= param.raw();
2048 Dart_Handle result = LookupInstanceField(object, name, kGetter); 1929 Dart_Handle result = LookupInstanceField(object, name, kGetter);
2049 if (::Dart_IsError(result)) { 1930 if (::Dart_IsError(result)) {
2050 return result; 1931 return result;
2051 } 1932 }
2052 Function& func = Function::Handle(); 1933 Function& func = Function::Handle();
2053 func ^= Api::UnwrapHandle(result); 1934 func ^= Api::UnwrapHandle(result);
2054 GrowableArray<const Object*> arguments; 1935 GrowableArray<const Object*> arguments;
2055 InvokeDynamic(isolate, object, func, arguments, &result); 1936 const Array& kNoArgumentNames = Array::Handle();
2056 return result; 1937 const Object& retval = Object::Handle(
1938 DartEntry::InvokeDynamic(object, func, arguments, kNoArgumentNames));
1939 return Api::NewLocalHandle(retval);
2057 } 1940 }
2058 1941
2059 1942
2060 DART_EXPORT Dart_Handle Dart_SetInstanceField(Dart_Handle obj, 1943 DART_EXPORT Dart_Handle Dart_SetInstanceField(Dart_Handle obj,
2061 Dart_Handle name, 1944 Dart_Handle name,
2062 Dart_Handle value) { 1945 Dart_Handle value) {
2063 Isolate* isolate = Isolate::Current(); 1946 Isolate* isolate = Isolate::Current();
2064 DARTSCOPE(isolate); 1947 DARTSCOPE(isolate);
2065 const Object& param = Object::Handle(Api::UnwrapHandle(obj)); 1948 const Object& param = Object::Handle(Api::UnwrapHandle(obj));
2066 if (param.IsNull() || !param.IsInstance()) { 1949 if (param.IsNull() || !param.IsInstance()) {
2067 return Api::NewError("Invalid object passed in to access instance field"); 1950 return Api::NewError("Invalid object passed in to access instance field");
2068 } 1951 }
2069 Instance& object = Instance::Handle(); 1952 Instance& object = Instance::Handle();
2070 object ^= param.raw(); 1953 object ^= param.raw();
2071 Dart_Handle result = LookupInstanceField(object, name, kSetter); 1954 Dart_Handle result = LookupInstanceField(object, name, kSetter);
2072 if (::Dart_IsError(result)) { 1955 if (::Dart_IsError(result)) {
2073 return result; 1956 return result;
2074 } 1957 }
2075 Function& func = Function::Handle(); 1958 Function& func = Function::Handle();
2076 func ^= Api::UnwrapHandle(result); 1959 func ^= Api::UnwrapHandle(result);
2077 GrowableArray<const Object*> arguments(1); 1960 GrowableArray<const Object*> arguments(1);
2078 const Object& arg = Object::Handle(Api::UnwrapHandle(value)); 1961 const Object& arg = Object::Handle(Api::UnwrapHandle(value));
2079 arguments.Add(&arg); 1962 arguments.Add(&arg);
2080 InvokeDynamic(isolate, object, func, arguments, &result); 1963 const Array& kNoArgumentNames = Array::Handle();
2081 return result; 1964 const Object& retval = Object::Handle(
1965 DartEntry::InvokeDynamic(object, func, arguments, kNoArgumentNames));
1966 return Api::NewLocalHandle(retval);
2082 } 1967 }
2083 1968
2084 1969
2085 DART_EXPORT Dart_Handle Dart_CreateNativeWrapperClass(Dart_Handle library, 1970 DART_EXPORT Dart_Handle Dart_CreateNativeWrapperClass(Dart_Handle library,
2086 Dart_Handle name, 1971 Dart_Handle name,
2087 int field_count) { 1972 int field_count) {
2088 Isolate* isolate = Isolate::Current(); 1973 Isolate* isolate = Isolate::Current();
2089 DARTSCOPE(isolate); 1974 DARTSCOPE(isolate);
2090 const Object& param = Object::Handle(Api::UnwrapHandle(name)); 1975 const Object& param = Object::Handle(Api::UnwrapHandle(name));
2091 if (param.IsNull() || !param.IsString() || field_count <= 0) { 1976 if (param.IsNull() || !param.IsString() || field_count <= 0) {
(...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after
2235 const String& source, 2120 const String& source,
2236 RawScript::Kind kind, 2121 RawScript::Kind kind,
2237 Dart_Handle* result) { 2122 Dart_Handle* result) {
2238 bool update_lib_status = (kind == RawScript::kScript || 2123 bool update_lib_status = (kind == RawScript::kScript ||
2239 kind == RawScript::kLibrary); 2124 kind == RawScript::kLibrary);
2240 if (update_lib_status) { 2125 if (update_lib_status) {
2241 lib.SetLoadInProgress(); 2126 lib.SetLoadInProgress();
2242 } 2127 }
2243 const Script& script = Script::Handle(Script::New(url, source, kind)); 2128 const Script& script = Script::Handle(Script::New(url, source, kind));
2244 ASSERT(isolate != NULL); 2129 ASSERT(isolate != NULL);
2245 LongJump* base = isolate->long_jump_base(); 2130 const Error& error = Error::Handle(Compiler::Compile(lib, script));
2246 LongJump jump; 2131 if (error.IsNull()) {
2247 isolate->set_long_jump_base(&jump);
2248 if (setjmp(*jump.Set()) == 0) {
2249 Compiler::Compile(lib, script);
2250 *result = Api::NewLocalHandle(lib); 2132 *result = Api::NewLocalHandle(lib);
2251 if (update_lib_status) { 2133 if (update_lib_status) {
2252 lib.SetLoaded(); 2134 lib.SetLoaded();
2253 } 2135 }
2254 } else { 2136 } else {
2255 SetupErrorResult(result); 2137 *result = Api::NewLocalHandle(error);
2256 if (update_lib_status) { 2138 if (update_lib_status) {
2257 lib.SetLoadError(); 2139 lib.SetLoadError();
2258 } 2140 }
2259 } 2141 }
2260 isolate->set_long_jump_base(base);
2261 } 2142 }
2262 2143
2263 2144
2264 DART_EXPORT Dart_Handle Dart_LoadScript(Dart_Handle url, 2145 DART_EXPORT Dart_Handle Dart_LoadScript(Dart_Handle url,
2265 Dart_Handle source, 2146 Dart_Handle source,
2266 Dart_LibraryTagHandler handler) { 2147 Dart_LibraryTagHandler handler) {
2267 TIMERSCOPE(time_script_loading); 2148 TIMERSCOPE(time_script_loading);
2268 Isolate* isolate = Isolate::Current(); 2149 Isolate* isolate = Isolate::Current();
2269 DARTSCOPE(isolate); 2150 DARTSCOPE(isolate);
2270 const String& url_str = Api::UnwrapStringHandle(url); 2151 const String& url_str = Api::UnwrapStringHandle(url);
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
2322 CURRENT_FUNC); 2203 CURRENT_FUNC);
2323 } 2204 }
2324 library ^= tmp.raw(); 2205 library ^= tmp.raw();
2325 library.Register(); 2206 library.Register();
2326 isolate->object_store()->set_root_library(library); 2207 isolate->object_store()->set_root_library(library);
2327 return Api::NewLocalHandle(library); 2208 return Api::NewLocalHandle(library);
2328 } 2209 }
2329 2210
2330 2211
2331 static void CompileAll(Isolate* isolate, Dart_Handle* result) { 2212 static void CompileAll(Isolate* isolate, Dart_Handle* result) {
2332 *result = Api::Success();
2333 ASSERT(isolate != NULL); 2213 ASSERT(isolate != NULL);
2334 LongJump* base = isolate->long_jump_base(); 2214 const Error& error = Error::Handle(Library::CompileAll());
2335 LongJump jump; 2215 if (error.IsNull()) {
2336 isolate->set_long_jump_base(&jump); 2216 *result = Api::Success();
2337 if (setjmp(*jump.Set()) == 0) {
2338 Library::CompileAll();
2339 } else { 2217 } else {
2340 SetupErrorResult(result); 2218 *result = Api::NewLocalHandle(error);
2341 } 2219 }
2342 isolate->set_long_jump_base(base);
2343 } 2220 }
2344 2221
2345 2222
2346 DART_EXPORT Dart_Handle Dart_CompileAll() { 2223 DART_EXPORT Dart_Handle Dart_CompileAll() {
2347 Isolate* isolate = Isolate::Current(); 2224 Isolate* isolate = Isolate::Current();
2348 DARTSCOPE(isolate); 2225 DARTSCOPE(isolate);
2349 Dart_Handle result; 2226 Dart_Handle result;
2350 const char* msg = CheckIsolateState(isolate); 2227 const char* msg = CheckIsolateState(isolate);
2351 if (msg != NULL) { 2228 if (msg != NULL) {
2352 return Api::NewError(msg); 2229 return Api::NewError(msg);
(...skipping 171 matching lines...) Expand 10 before | Expand all | Expand 10 after
2524 } 2401 }
2525 delete debug_region; 2402 delete debug_region;
2526 } else { 2403 } else {
2527 *buffer = NULL; 2404 *buffer = NULL;
2528 *buffer_size = 0; 2405 *buffer_size = 0;
2529 } 2406 }
2530 } 2407 }
2531 2408
2532 2409
2533 } // namespace dart 2410 } // namespace dart
OLDNEW
« no previous file with comments | « runtime/vm/dart.cc ('k') | runtime/vm/dart_api_impl_test.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698