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" |
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/native_entry.h" | 17 #include "vm/native_entry.h" |
19 #include "vm/object.h" | 18 #include "vm/object.h" |
20 #include "vm/object_store.h" | 19 #include "vm/object_store.h" |
21 #include "vm/port.h" | 20 #include "vm/port.h" |
22 #include "vm/resolver.h" | 21 #include "vm/resolver.h" |
23 #include "vm/snapshot.h" | 22 #include "vm/snapshot.h" |
24 #include "vm/stack_frame.h" | 23 #include "vm/stack_frame.h" |
25 #include "vm/timer.h" | 24 #include "vm/timer.h" |
26 #include "vm/verifier.h" | 25 #include "vm/verifier.h" |
27 | 26 |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
78 } | 77 } |
79 | 78 |
80 | 79 |
81 void SetupErrorResult(Dart_Handle* handle) { | 80 void SetupErrorResult(Dart_Handle* handle) { |
82 const Error& error = Error::Handle( | 81 const Error& error = Error::Handle( |
83 Isolate::Current()->object_store()->sticky_error()); | 82 Isolate::Current()->object_store()->sticky_error()); |
84 *handle = Api::NewLocalHandle(error); | 83 *handle = Api::NewLocalHandle(error); |
85 } | 84 } |
86 | 85 |
87 | 86 |
88 // NOTE: Need to pass 'result' as a parameter here in order to avoid | |
89 // warning: variable 'result' might be clobbered by 'longjmp' or 'vfork' | |
90 // which shows up because of the use of setjmp. | |
91 static void InvokeStatic(Isolate* isolate, | |
92 const Function& function, | |
93 GrowableArray<const Object*>& args, | |
94 Dart_Handle* result) { | |
95 ASSERT(isolate != NULL); | |
96 LongJump* base = isolate->long_jump_base(); | |
97 LongJump jump; | |
98 isolate->set_long_jump_base(&jump); | |
99 if (setjmp(*jump.Set()) == 0) { | |
100 const Array& kNoArgumentNames = Array::Handle(); | |
101 const Instance& retval = Instance::Handle( | |
102 DartEntry::InvokeStatic(function, args, kNoArgumentNames)); | |
103 *result = Api::NewLocalHandle(retval); | |
104 } else { | |
105 SetupErrorResult(result); | |
106 } | |
107 isolate->set_long_jump_base(base); | |
108 } | |
109 | |
110 | |
111 // NOTE: Need to pass 'result' as a parameter here in order to avoid | |
112 // warning: variable 'result' might be clobbered by 'longjmp' or 'vfork' | |
113 // which shows up because of the use of setjmp. | |
114 static void InvokeDynamic(Isolate* isolate, | |
115 const Instance& receiver, | |
116 const Function& function, | |
117 GrowableArray<const Object*>& args, | |
118 Dart_Handle* result) { | |
119 ASSERT(isolate != NULL); | |
120 LongJump* base = isolate->long_jump_base(); | |
121 LongJump jump; | |
122 isolate->set_long_jump_base(&jump); | |
123 if (setjmp(*jump.Set()) == 0) { | |
124 const Array& kNoArgumentNames = Array::Handle(); | |
125 const Instance& retval = Instance::Handle( | |
126 DartEntry::InvokeDynamic(receiver, function, args, kNoArgumentNames)); | |
127 *result = Api::NewLocalHandle(retval); | |
128 } else { | |
129 SetupErrorResult(result); | |
130 } | |
131 isolate->set_long_jump_base(base); | |
132 } | |
133 | |
134 | |
135 Dart_Handle Api::NewLocalHandle(const Object& object) { | 87 Dart_Handle Api::NewLocalHandle(const Object& object) { |
136 Isolate* isolate = Isolate::Current(); | 88 Isolate* isolate = Isolate::Current(); |
137 ASSERT(isolate != NULL); | 89 ASSERT(isolate != NULL); |
138 ApiState* state = isolate->api_state(); | 90 ApiState* state = isolate->api_state(); |
139 ASSERT(state != NULL); | 91 ASSERT(state != NULL); |
140 ApiLocalScope* scope = state->top_scope(); | 92 ApiLocalScope* scope = state->top_scope(); |
141 ASSERT(scope != NULL); | 93 ASSERT(scope != NULL); |
142 LocalHandles* local_handles = scope->local_handles(); | 94 LocalHandles* local_handles = scope->local_handles(); |
143 ASSERT(local_handles != NULL); | 95 ASSERT(local_handles != NULL); |
144 LocalHandle* ref = local_handles->AllocateHandle(); | 96 LocalHandle* ref = local_handles->AllocateHandle(); |
(...skipping 224 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
369 va_start(args2, format); | 321 va_start(args2, format); |
370 OS::VSNPrint(buffer, (len + 1), format, args2); | 322 OS::VSNPrint(buffer, (len + 1), format, args2); |
371 va_end(args2); | 323 va_end(args2); |
372 | 324 |
373 const String& message = String::Handle(String::New(buffer)); | 325 const String& message = String::Handle(String::New(buffer)); |
374 const Object& obj = Object::Handle(ApiError::New(message)); | 326 const Object& obj = Object::Handle(ApiError::New(message)); |
375 return Api::NewLocalHandle(obj); | 327 return Api::NewLocalHandle(obj); |
376 } | 328 } |
377 | 329 |
378 | 330 |
| 331 DART_EXPORT Dart_Handle Dart_PropagateError(Dart_Handle handle) { |
| 332 Isolate* isolate = Isolate::Current(); |
| 333 CHECK_ISOLATE(isolate); |
| 334 const Object& obj = Object::Handle(Api::UnwrapHandle(handle)); |
| 335 if (!obj.IsError()) { |
| 336 return Api::NewError( |
| 337 "%s expects argument 'handle' to be an error handle. " |
| 338 "Did you forget to check Dart_IsError first?", |
| 339 CURRENT_FUNC); |
| 340 } |
| 341 if (isolate->top_exit_frame_info() == 0) { |
| 342 // There are no dart frames on the stack so it would be illegal to |
| 343 // propagate an error here. |
| 344 return Api::NewError("No Dart frames on stack, cannot propagate error."); |
| 345 } |
| 346 |
| 347 // Unwind all the API scopes till the exit frame before propagating. |
| 348 ApiState* state = isolate->api_state(); |
| 349 ASSERT(state != NULL); |
| 350 state->UnwindScopes(isolate->top_exit_frame_info()); |
| 351 |
| 352 Error& error = Error::Handle(); |
| 353 error ^= obj.raw(); |
| 354 Exceptions::PropagateError(error); |
| 355 UNREACHABLE(); |
| 356 |
| 357 return Api::NewError("Cannot reach here. Internal error."); |
| 358 } |
| 359 |
| 360 |
379 DART_EXPORT void _Dart_ReportErrorHandle(const char* file, | 361 DART_EXPORT void _Dart_ReportErrorHandle(const char* file, |
380 int line, | 362 int line, |
381 const char* handle, | 363 const char* handle, |
382 const char* message) { | 364 const char* message) { |
383 fprintf(stderr, "%s:%d: error handle: '%s':\n '%s'\n", | 365 fprintf(stderr, "%s:%d: error handle: '%s':\n '%s'\n", |
384 file, line, handle, message); | 366 file, line, handle, message); |
385 OS::Abort(); | 367 OS::Abort(); |
386 } | 368 } |
387 | 369 |
388 | 370 |
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
496 | 478 |
497 // --- Isolates --- | 479 // --- Isolates --- |
498 | 480 |
499 | 481 |
500 DART_EXPORT Dart_Isolate Dart_CreateIsolate(const char* name_prefix, | 482 DART_EXPORT Dart_Isolate Dart_CreateIsolate(const char* name_prefix, |
501 const uint8_t* snapshot, | 483 const uint8_t* snapshot, |
502 void* callback_data, | 484 void* callback_data, |
503 char** error) { | 485 char** error) { |
504 Isolate* isolate = Dart::CreateIsolate(name_prefix); | 486 Isolate* isolate = Dart::CreateIsolate(name_prefix); |
505 assert(isolate != NULL); | 487 assert(isolate != NULL); |
506 LongJump* base = isolate->long_jump_base(); | 488 DARTSCOPE_NOCHECKS(isolate); |
507 LongJump jump; | 489 const Error& error_obj = |
508 isolate->set_long_jump_base(&jump); | 490 Error::Handle(Dart::InitializeIsolate(snapshot, callback_data)); |
509 if (setjmp(*jump.Set()) == 0) { | 491 if (error_obj.IsNull()) { |
510 Dart::InitializeIsolate(snapshot, callback_data); | |
511 START_TIMER(time_total_runtime); | 492 START_TIMER(time_total_runtime); |
512 isolate->set_long_jump_base(base); | |
513 return reinterpret_cast<Dart_Isolate>(isolate); | 493 return reinterpret_cast<Dart_Isolate>(isolate); |
514 } else { | 494 } else { |
515 { | 495 *error = strdup(error_obj.ToErrorCString()); |
516 DARTSCOPE_NOCHECKS(isolate); | |
517 const Error& error_obj = | |
518 Error::Handle(isolate->object_store()->sticky_error()); | |
519 *error = strdup(error_obj.ToErrorCString()); | |
520 } | |
521 Dart::ShutdownIsolate(); | 496 Dart::ShutdownIsolate(); |
| 497 return reinterpret_cast<Dart_Isolate>(NULL); |
522 } | 498 } |
523 return reinterpret_cast<Dart_Isolate>(NULL); | |
524 } | 499 } |
525 | 500 |
526 | 501 |
527 DART_EXPORT void Dart_ShutdownIsolate() { | 502 DART_EXPORT void Dart_ShutdownIsolate() { |
528 CHECK_ISOLATE(Isolate::Current()); | 503 CHECK_ISOLATE(Isolate::Current()); |
529 STOP_TIMER(time_total_runtime); | 504 STOP_TIMER(time_total_runtime); |
530 Dart::ShutdownIsolate(); | 505 Dart::ShutdownIsolate(); |
531 } | 506 } |
532 | 507 |
533 | 508 |
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
636 ASSERT(post_message_callback != NULL); | 611 ASSERT(post_message_callback != NULL); |
637 ASSERT(close_port_callback != NULL); | 612 ASSERT(close_port_callback != NULL); |
638 isolate->set_post_message_callback(post_message_callback); | 613 isolate->set_post_message_callback(post_message_callback); |
639 isolate->set_close_port_callback(close_port_callback); | 614 isolate->set_close_port_callback(close_port_callback); |
640 } | 615 } |
641 | 616 |
642 | 617 |
643 DART_EXPORT Dart_Handle Dart_RunLoop() { | 618 DART_EXPORT Dart_Handle Dart_RunLoop() { |
644 Isolate* isolate = Isolate::Current(); | 619 Isolate* isolate = Isolate::Current(); |
645 DARTSCOPE(isolate); | 620 DARTSCOPE(isolate); |
646 | 621 const Object& obj = Object::Handle(isolate->StandardRunLoop()); |
647 LongJump* base = isolate->long_jump_base(); | 622 if (obj.IsError()) { |
648 LongJump jump; | 623 return Api::NewLocalHandle(obj); |
649 Dart_Handle result; | |
650 isolate->set_long_jump_base(&jump); | |
651 if (setjmp(*jump.Set()) == 0) { | |
652 const Object& obj = Object::Handle(isolate->StandardRunLoop()); | |
653 if (obj.IsError()) { | |
654 result = Api::NewLocalHandle(obj); | |
655 } else { | |
656 ASSERT(obj.IsNull()); | |
657 result = Api::Success(); | |
658 } | |
659 } else { | |
660 SetupErrorResult(&result); | |
661 } | 624 } |
662 isolate->set_long_jump_base(base); | 625 ASSERT(obj.IsNull()); |
663 return result; | 626 return Api::Success(); |
664 } | 627 } |
665 | 628 |
666 | 629 |
667 static RawInstance* DeserializeMessage(void* data) { | 630 static RawInstance* DeserializeMessage(void* data) { |
668 // Create a snapshot object using the buffer. | 631 // Create a snapshot object using the buffer. |
669 const Snapshot* snapshot = Snapshot::SetupFromBuffer(data); | 632 const Snapshot* snapshot = Snapshot::SetupFromBuffer(data); |
670 ASSERT(snapshot->IsMessageSnapshot()); | 633 ASSERT(snapshot->IsMessageSnapshot()); |
671 | 634 |
672 // Read object back from the snapshot. | 635 // Read object back from the snapshot. |
673 SnapshotReader reader(snapshot, Isolate::Current()); | 636 SnapshotReader reader(snapshot, Isolate::Current()); |
674 Instance& instance = Instance::Handle(); | 637 Instance& instance = Instance::Handle(); |
675 instance ^= reader.ReadObject(); | 638 instance ^= reader.ReadObject(); |
676 return instance.raw(); | 639 return instance.raw(); |
677 } | 640 } |
678 | 641 |
679 | 642 |
680 DART_EXPORT Dart_Handle Dart_HandleMessage(Dart_Port dest_port_id, | 643 DART_EXPORT Dart_Handle Dart_HandleMessage(Dart_Port dest_port_id, |
681 Dart_Port reply_port_id, | 644 Dart_Port reply_port_id, |
682 Dart_Message dart_message) { | 645 Dart_Message dart_message) { |
683 DARTSCOPE(Isolate::Current()); | 646 DARTSCOPE(Isolate::Current()); |
684 const Instance& msg = Instance::Handle(DeserializeMessage(dart_message)); | 647 const Instance& msg = Instance::Handle(DeserializeMessage(dart_message)); |
685 // TODO(turnidge): Should this call be wrapped in a longjmp? | |
686 const Object& result = | 648 const Object& result = |
687 Object::Handle(DartLibraryCalls::HandleMessage(dest_port_id, | 649 Object::Handle(DartLibraryCalls::HandleMessage(dest_port_id, |
688 reply_port_id, | 650 reply_port_id, |
689 msg)); | 651 msg)); |
690 if (result.IsError()) { | 652 if (result.IsError()) { |
691 return Api::NewLocalHandle(result); | 653 return Api::NewLocalHandle(result); |
692 } | 654 } |
693 ASSERT(result.IsNull()); | 655 ASSERT(result.IsNull()); |
694 return Api::Success(); | 656 return Api::Success(); |
695 } | 657 } |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
745 // function resolution by class name and function name more concise. | 707 // function resolution by class name and function name more concise. |
746 const Function& function = Function::Handle( | 708 const Function& function = Function::Handle( |
747 Resolver::ResolveStatic(Library::Handle(Library::CoreLibrary()), | 709 Resolver::ResolveStatic(Library::Handle(Library::CoreLibrary()), |
748 class_name, | 710 class_name, |
749 function_name, | 711 function_name, |
750 kNumArguments, | 712 kNumArguments, |
751 kNoArgumentNames, | 713 kNoArgumentNames, |
752 Resolver::kIsQualified)); | 714 Resolver::kIsQualified)); |
753 GrowableArray<const Object*> arguments(kNumArguments); | 715 GrowableArray<const Object*> arguments(kNumArguments); |
754 arguments.Add(&Integer::Handle(Integer::New(port_id))); | 716 arguments.Add(&Integer::Handle(Integer::New(port_id))); |
755 Dart_Handle result; | 717 const Object& result = Object::Handle( |
756 InvokeStatic(isolate, function, arguments, &result); | 718 DartEntry::InvokeStatic(function, arguments, kNoArgumentNames)); |
757 return result; | 719 return Api::NewLocalHandle(result); |
758 } | 720 } |
759 | 721 |
760 | 722 |
761 DART_EXPORT Dart_Handle Dart_GetReceivePort(Dart_Port port_id) { | 723 DART_EXPORT Dart_Handle Dart_GetReceivePort(Dart_Port port_id) { |
762 Isolate* isolate = Isolate::Current(); | 724 Isolate* isolate = Isolate::Current(); |
763 DARTSCOPE(isolate); | 725 DARTSCOPE(isolate); |
764 const String& class_name = | 726 const String& class_name = |
765 String::Handle(String::NewSymbol("ReceivePortImpl")); | 727 String::Handle(String::NewSymbol("ReceivePortImpl")); |
766 const String& function_name = | 728 const String& function_name = |
767 String::Handle(String::NewSymbol("_get_or_create")); | 729 String::Handle(String::NewSymbol("_get_or_create")); |
768 const int kNumArguments = 1; | 730 const int kNumArguments = 1; |
769 const Array& kNoArgumentNames = Array::Handle(); | 731 const Array& kNoArgumentNames = Array::Handle(); |
770 const Function& function = Function::Handle( | 732 const Function& function = Function::Handle( |
771 Resolver::ResolveStatic(Library::Handle(Library::CoreLibrary()), | 733 Resolver::ResolveStatic(Library::Handle(Library::CoreLibrary()), |
772 class_name, | 734 class_name, |
773 function_name, | 735 function_name, |
774 kNumArguments, | 736 kNumArguments, |
775 kNoArgumentNames, | 737 kNoArgumentNames, |
776 Resolver::kIsQualified)); | 738 Resolver::kIsQualified)); |
777 GrowableArray<const Object*> arguments(kNumArguments); | 739 GrowableArray<const Object*> arguments(kNumArguments); |
778 arguments.Add(&Integer::Handle(Integer::New(port_id))); | 740 arguments.Add(&Integer::Handle(Integer::New(port_id))); |
779 Dart_Handle result; | 741 const Object& result = Object::Handle( |
780 InvokeStatic(isolate, function, arguments, &result); | 742 DartEntry::InvokeStatic(function, arguments, kNoArgumentNames)); |
781 return result; | 743 return Api::NewLocalHandle(result); |
782 } | 744 } |
783 | 745 |
784 | 746 |
785 DART_EXPORT Dart_Port Dart_GetMainPortId() { | 747 DART_EXPORT Dart_Port Dart_GetMainPortId() { |
786 Isolate* isolate = Isolate::Current(); | 748 Isolate* isolate = Isolate::Current(); |
787 CHECK_ISOLATE(isolate); | 749 CHECK_ISOLATE(isolate); |
788 return isolate->main_port(); | 750 return isolate->main_port(); |
789 } | 751 } |
790 | 752 |
791 // --- Scopes ---- | 753 // --- Scopes ---- |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
828 const Object& obj = Object::Handle(Api::UnwrapHandle(object)); | 790 const Object& obj = Object::Handle(Api::UnwrapHandle(object)); |
829 return obj.IsNull(); | 791 return obj.IsNull(); |
830 } | 792 } |
831 | 793 |
832 | 794 |
833 DART_EXPORT Dart_Handle Dart_ObjectEquals(Dart_Handle obj1, Dart_Handle obj2, | 795 DART_EXPORT Dart_Handle Dart_ObjectEquals(Dart_Handle obj1, Dart_Handle obj2, |
834 bool* value) { | 796 bool* value) { |
835 DARTSCOPE(Isolate::Current()); | 797 DARTSCOPE(Isolate::Current()); |
836 const Instance& expected = Instance::CheckedHandle(Api::UnwrapHandle(obj1)); | 798 const Instance& expected = Instance::CheckedHandle(Api::UnwrapHandle(obj1)); |
837 const Instance& actual = Instance::CheckedHandle(Api::UnwrapHandle(obj2)); | 799 const Instance& actual = Instance::CheckedHandle(Api::UnwrapHandle(obj2)); |
838 const Instance& result = | 800 const Object& result = |
839 Instance::Handle(DartLibraryCalls::Equals(expected, actual)); | 801 Object::Handle(DartLibraryCalls::Equals(expected, actual)); |
840 if (result.IsBool()) { | 802 if (result.IsBool()) { |
841 Bool& b = Bool::Handle(); | 803 Bool& b = Bool::Handle(); |
842 b ^= result.raw(); | 804 b ^= result.raw(); |
843 *value = b.value(); | 805 *value = b.value(); |
844 return Api::Success(); | 806 return Api::Success(); |
845 } else if (result.IsError()) { | 807 } else if (result.IsError()) { |
846 return Api::NewLocalHandle(result); | 808 return Api::NewLocalHandle(result); |
847 } else { | 809 } else { |
848 return Api::NewError("Expected boolean result from =="); | 810 return Api::NewError("Expected boolean result from =="); |
849 } | 811 } |
(...skipping 502 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1352 const Object& obj = Object::Handle(Api::UnwrapHandle(list)); | 1314 const Object& obj = Object::Handle(Api::UnwrapHandle(list)); |
1353 if (obj.IsArray()) { | 1315 if (obj.IsArray()) { |
1354 Array& array_obj = Array::Handle(); | 1316 Array& array_obj = Array::Handle(); |
1355 array_obj ^= obj.raw(); | 1317 array_obj ^= obj.raw(); |
1356 *len = array_obj.Length(); | 1318 *len = array_obj.Length(); |
1357 return Api::Success(); | 1319 return Api::Success(); |
1358 } | 1320 } |
1359 // TODO(5526318): Make access to GrowableObjectArray more efficient. | 1321 // TODO(5526318): Make access to GrowableObjectArray more efficient. |
1360 // Now check and handle a dart object that implements the List interface. | 1322 // Now check and handle a dart object that implements the List interface. |
1361 const Instance& instance = Instance::Handle(GetListInstance(isolate, obj)); | 1323 const Instance& instance = Instance::Handle(GetListInstance(isolate, obj)); |
1362 if (!instance.IsNull()) { | 1324 if (instance.IsNull()) { |
1363 String& name = String::Handle(String::New("length")); | 1325 return Api::NewError("Object does not implement the List inteface"); |
1364 name = Field::GetterName(name); | 1326 } |
1365 const Function& function = Function::Handle( | 1327 String& name = String::Handle(String::New("length")); |
1366 Resolver::ResolveDynamic(instance, name, 1, 0)); | 1328 name = Field::GetterName(name); |
1367 if (!function.IsNull()) { | 1329 const Function& function = Function::Handle( |
1368 GrowableArray<const Object*> args(0); | 1330 Resolver::ResolveDynamic(instance, name, 1, 0)); |
1369 LongJump* base = isolate->long_jump_base(); | 1331 if (function.IsNull()) { |
1370 LongJump jump; | 1332 return Api::NewError("List object does not have a 'length' field."); |
1371 isolate->set_long_jump_base(&jump); | 1333 } |
1372 Dart_Handle result; | 1334 |
1373 if (setjmp(*jump.Set()) == 0) { | 1335 GrowableArray<const Object*> args(0); |
1374 const Array& kNoArgumentNames = Array::Handle(); | 1336 Dart_Handle result; |
1375 const Instance& retval = Instance::Handle( | 1337 const Array& kNoArgumentNames = Array::Handle(); |
1376 DartEntry::InvokeDynamic(instance, | 1338 const Object& retval = Object::Handle( |
1377 function, | 1339 DartEntry::InvokeDynamic(instance, function, args, kNoArgumentNames)); |
1378 args, | 1340 if (retval.IsSmi() || retval.IsMint()) { |
1379 kNoArgumentNames)); | 1341 Integer& integer = Integer::Handle(); |
1380 result = Api::Success(); | 1342 integer ^= retval.raw(); |
1381 if (retval.IsSmi() || retval.IsMint()) { | 1343 *len = integer.AsInt64Value(); |
1382 Integer& integer = Integer::Handle(); | 1344 return Api::Success(); |
1383 integer ^= retval.raw(); | 1345 } else if (retval.IsBigint()) { |
1384 *len = integer.AsInt64Value(); | 1346 Bigint& bigint = Bigint::Handle(); |
1385 } else if (retval.IsBigint()) { | 1347 bigint ^= retval.raw(); |
1386 Bigint& bigint = Bigint::Handle(); | 1348 if (BigintOperations::FitsIntoInt64(bigint)) { |
1387 bigint ^= retval.raw(); | 1349 *len = BigintOperations::ToInt64(bigint); |
1388 if (BigintOperations::FitsIntoInt64(bigint)) { | 1350 return Api::Success(); |
1389 *len = BigintOperations::ToInt64(bigint); | 1351 } else { |
1390 } else { | 1352 return Api::NewError("Length of List object is greater than the " |
1391 result = | 1353 "maximum value that 'len' parameter can hold"); |
1392 Api::NewError("Length of List object is greater than the " | |
1393 "maximum value that 'len' parameter can hold"); | |
1394 } | |
1395 } else if (retval.IsError()) { | |
1396 result = Api::NewLocalHandle(retval); | |
1397 } else { | |
1398 result = Api::NewError("Length of List object is not an integer"); | |
1399 } | |
1400 } else { | |
1401 SetupErrorResult(&result); | |
1402 } | |
1403 isolate->set_long_jump_base(base); | |
1404 return result; | |
1405 } | 1354 } |
| 1355 } else if (retval.IsError()) { |
| 1356 return Api::NewLocalHandle(retval); |
| 1357 } else { |
| 1358 return Api::NewError("Length of List object is not an integer"); |
1406 } | 1359 } |
1407 return Api::NewError("Object does not implement the list inteface"); | |
1408 } | 1360 } |
1409 | 1361 |
1410 | 1362 |
1411 static RawObject* GetListAt(Isolate* isolate, | |
1412 const Instance& instance, | |
1413 const Integer& index, | |
1414 const Function& function, | |
1415 Dart_Handle* result) { | |
1416 ASSERT(isolate != NULL); | |
1417 ASSERT(result != NULL); | |
1418 LongJump* base = isolate->long_jump_base(); | |
1419 LongJump jump; | |
1420 isolate->set_long_jump_base(&jump); | |
1421 if (setjmp(*jump.Set()) == 0) { | |
1422 Instance& retval = Instance::Handle(); | |
1423 GrowableArray<const Object*> args(0); | |
1424 args.Add(&index); | |
1425 const Array& kNoArgumentNames = Array::Handle(); | |
1426 retval = DartEntry::InvokeDynamic(instance, | |
1427 function, | |
1428 args, | |
1429 kNoArgumentNames); | |
1430 if (retval.IsError()) { | |
1431 *result = Api::NewLocalHandle(retval); | |
1432 } else { | |
1433 *result = Api::Success(); | |
1434 } | |
1435 isolate->set_long_jump_base(base); | |
1436 return retval.raw(); | |
1437 } | |
1438 SetupErrorResult(result); | |
1439 isolate->set_long_jump_base(base); | |
1440 return Object::null(); | |
1441 } | |
1442 | |
1443 | |
1444 DART_EXPORT Dart_Handle Dart_ListGetAt(Dart_Handle list, intptr_t index) { | 1363 DART_EXPORT Dart_Handle Dart_ListGetAt(Dart_Handle list, intptr_t index) { |
1445 Isolate* isolate = Isolate::Current(); | 1364 Isolate* isolate = Isolate::Current(); |
1446 DARTSCOPE(isolate); | 1365 DARTSCOPE(isolate); |
1447 const Object& obj = Object::Handle(Api::UnwrapHandle(list)); | 1366 const Object& obj = Object::Handle(Api::UnwrapHandle(list)); |
1448 if (obj.IsArray()) { | 1367 if (obj.IsArray()) { |
1449 Array& array_obj = Array::Handle(); | 1368 Array& array_obj = Array::Handle(); |
1450 array_obj ^= obj.raw(); | 1369 array_obj ^= obj.raw(); |
1451 if ((index >= 0) && (index < array_obj.Length())) { | 1370 if ((index >= 0) && (index < array_obj.Length())) { |
1452 const Object& element = Object::Handle(array_obj.At(index)); | 1371 const Object& element = Object::Handle(array_obj.At(index)); |
1453 return Api::NewLocalHandle(element); | 1372 return Api::NewLocalHandle(element); |
1454 } | 1373 } |
1455 return Api::NewError("Invalid index passed in to access array element"); | 1374 return Api::NewError("Invalid index passed in to access array element"); |
1456 } | 1375 } |
1457 // TODO(5526318): Make access to GrowableObjectArray more efficient. | 1376 // TODO(5526318): Make access to GrowableObjectArray more efficient. |
1458 // Now check and handle a dart object that implements the List interface. | 1377 // Now check and handle a dart object that implements the List interface. |
1459 const Instance& instance = Instance::Handle(GetListInstance(isolate, obj)); | 1378 const Instance& instance = Instance::Handle(GetListInstance(isolate, obj)); |
1460 if (!instance.IsNull()) { | 1379 if (!instance.IsNull()) { |
1461 String& name = String::Handle(String::New("[]")); | 1380 String& name = String::Handle(String::New("[]")); |
1462 const Function& function = Function::Handle( | 1381 const Function& function = Function::Handle( |
1463 Resolver::ResolveDynamic(instance, name, 2, 0)); | 1382 Resolver::ResolveDynamic(instance, name, 2, 0)); |
1464 if (!function.IsNull()) { | 1383 if (!function.IsNull()) { |
1465 Object& element = Object::Handle(); | 1384 GrowableArray<const Object*> args(1); |
1466 Integer& indexobj = Integer::Handle(); | 1385 Integer& indexobj = Integer::Handle(); |
1467 Dart_Handle result; | |
1468 indexobj = Integer::New(index); | 1386 indexobj = Integer::New(index); |
1469 element = GetListAt(isolate, instance, indexobj, function, &result); | 1387 args.Add(&indexobj); |
1470 if (::Dart_IsError(result)) { | 1388 const Array& kNoArgumentNames = Array::Handle(); |
1471 return result; // Error condition. | 1389 const Object& result = Object::Handle( |
1472 } | 1390 DartEntry::InvokeDynamic(instance, function, args, kNoArgumentNames)); |
1473 return Api::NewLocalHandle(element); | 1391 return Api::NewLocalHandle(result); |
1474 } | 1392 } |
1475 } | 1393 } |
1476 return Api::NewError("Object does not implement the 'List' interface"); | 1394 return Api::NewError("Object does not implement the 'List' interface"); |
1477 } | 1395 } |
1478 | 1396 |
1479 | 1397 |
1480 static void SetListAt(Isolate* isolate, | |
1481 const Instance& instance, | |
1482 const Integer& index, | |
1483 const Object& value, | |
1484 const Function& function, | |
1485 Dart_Handle* result) { | |
1486 ASSERT(isolate != NULL); | |
1487 ASSERT(result != NULL); | |
1488 LongJump* base = isolate->long_jump_base(); | |
1489 LongJump jump; | |
1490 isolate->set_long_jump_base(&jump); | |
1491 if (setjmp(*jump.Set()) == 0) { | |
1492 GrowableArray<const Object*> args(1); | |
1493 args.Add(&index); | |
1494 args.Add(&value); | |
1495 Instance& retval = Instance::Handle(); | |
1496 const Array& kNoArgumentNames = Array::Handle(); | |
1497 retval = DartEntry::InvokeDynamic(instance, | |
1498 function, | |
1499 args, | |
1500 kNoArgumentNames); | |
1501 if (retval.IsError()) { | |
1502 *result = Api::NewLocalHandle(retval); | |
1503 } else { | |
1504 *result = Api::Success(); | |
1505 } | |
1506 } else { | |
1507 SetupErrorResult(result); | |
1508 } | |
1509 isolate->set_long_jump_base(base); | |
1510 } | |
1511 | |
1512 | |
1513 DART_EXPORT Dart_Handle Dart_ListSetAt(Dart_Handle list, | 1398 DART_EXPORT Dart_Handle Dart_ListSetAt(Dart_Handle list, |
1514 intptr_t index, | 1399 intptr_t index, |
1515 Dart_Handle value) { | 1400 Dart_Handle value) { |
1516 Isolate* isolate = Isolate::Current(); | 1401 Isolate* isolate = Isolate::Current(); |
1517 DARTSCOPE(isolate); | 1402 DARTSCOPE(isolate); |
1518 const Object& obj = Object::Handle(Api::UnwrapHandle(list)); | 1403 const Object& obj = Object::Handle(Api::UnwrapHandle(list)); |
1519 if (obj.IsArray()) { | 1404 if (obj.IsArray()) { |
1520 if (obj.IsImmutableArray()) { | 1405 if (obj.IsImmutableArray()) { |
1521 return Api::NewError("Cannot modify immutable array"); | 1406 return Api::NewError("Cannot modify immutable array"); |
1522 } | 1407 } |
1523 Array& array_obj = Array::Handle(); | 1408 Array& array_obj = Array::Handle(); |
1524 array_obj ^= obj.raw(); | 1409 array_obj ^= obj.raw(); |
1525 const Object& value_obj = Object::Handle(Api::UnwrapHandle(value)); | 1410 const Object& value_obj = Object::Handle(Api::UnwrapHandle(value)); |
1526 if ((index >= 0) && (index < array_obj.Length())) { | 1411 if ((index >= 0) && (index < array_obj.Length())) { |
1527 array_obj.SetAt(index, value_obj); | 1412 array_obj.SetAt(index, value_obj); |
1528 return Api::Success(); | 1413 return Api::Success(); |
1529 } | 1414 } |
1530 return Api::NewError("Invalid index passed in to set array element"); | 1415 return Api::NewError("Invalid index passed in to set array element"); |
1531 } | 1416 } |
1532 // TODO(5526318): Make access to GrowableObjectArray more efficient. | 1417 // TODO(5526318): Make access to GrowableObjectArray more efficient. |
1533 // Now check and handle a dart object that implements the List interface. | 1418 // Now check and handle a dart object that implements the List interface. |
1534 const Instance& instance = Instance::Handle(GetListInstance(isolate, obj)); | 1419 const Instance& instance = Instance::Handle(GetListInstance(isolate, obj)); |
1535 if (!instance.IsNull()) { | 1420 if (!instance.IsNull()) { |
1536 String& name = String::Handle(String::New("[]=")); | 1421 String& name = String::Handle(String::New("[]=")); |
1537 const Function& function = Function::Handle( | 1422 const Function& function = Function::Handle( |
1538 Resolver::ResolveDynamic(instance, name, 3, 0)); | 1423 Resolver::ResolveDynamic(instance, name, 3, 0)); |
1539 if (!function.IsNull()) { | 1424 if (!function.IsNull()) { |
1540 Dart_Handle result; | |
1541 const Integer& index_obj = Integer::Handle(Integer::New(index)); | 1425 const Integer& index_obj = Integer::Handle(Integer::New(index)); |
1542 const Object& value_obj = Object::Handle(Api::UnwrapHandle(value)); | 1426 const Object& value_obj = Object::Handle(Api::UnwrapHandle(value)); |
1543 SetListAt(isolate, instance, index_obj, value_obj, function, &result); | 1427 GrowableArray<const Object*> args(2); |
1544 return result; | 1428 args.Add(&index_obj); |
| 1429 args.Add(&value_obj); |
| 1430 const Array& kNoArgumentNames = Array::Handle(); |
| 1431 const Object& result = Object::Handle( |
| 1432 DartEntry::InvokeDynamic(instance, function, args, kNoArgumentNames)); |
| 1433 return Api::NewLocalHandle(result); |
1545 } | 1434 } |
1546 } | 1435 } |
1547 return Api::NewError("Object does not implement the 'List' interface"); | 1436 return Api::NewError("Object does not implement the 'List' interface"); |
1548 } | 1437 } |
1549 | 1438 |
1550 | 1439 |
1551 DART_EXPORT Dart_Handle Dart_ListGetAsBytes(Dart_Handle list, | 1440 DART_EXPORT Dart_Handle Dart_ListGetAsBytes(Dart_Handle list, |
1552 intptr_t offset, | 1441 intptr_t offset, |
1553 uint8_t* native_array, | 1442 uint8_t* native_array, |
1554 intptr_t length) { | 1443 intptr_t length) { |
(...skipping 23 matching lines...) Expand all Loading... |
1578 return Api::NewError("Invalid length passed in to access array elements"); | 1467 return Api::NewError("Invalid length passed in to access array elements"); |
1579 } | 1468 } |
1580 // TODO(5526318): Make access to GrowableObjectArray more efficient. | 1469 // TODO(5526318): Make access to GrowableObjectArray more efficient. |
1581 // Now check and handle a dart object that implements the List interface. | 1470 // Now check and handle a dart object that implements the List interface. |
1582 const Instance& instance = Instance::Handle(GetListInstance(isolate, obj)); | 1471 const Instance& instance = Instance::Handle(GetListInstance(isolate, obj)); |
1583 if (!instance.IsNull()) { | 1472 if (!instance.IsNull()) { |
1584 String& name = String::Handle(String::New("[]")); | 1473 String& name = String::Handle(String::New("[]")); |
1585 const Function& function = Function::Handle( | 1474 const Function& function = Function::Handle( |
1586 Resolver::ResolveDynamic(instance, name, 2, 0)); | 1475 Resolver::ResolveDynamic(instance, name, 2, 0)); |
1587 if (!function.IsNull()) { | 1476 if (!function.IsNull()) { |
1588 Object& element = Object::Handle(); | 1477 Object& result = Object::Handle(); |
1589 Integer& intobj = Integer::Handle(); | 1478 Integer& intobj = Integer::Handle(); |
1590 Dart_Handle result; | |
1591 for (int i = 0; i < length; i++) { | 1479 for (int i = 0; i < length; i++) { |
1592 intobj = Integer::New(offset + i); | 1480 intobj = Integer::New(offset + i); |
1593 element = GetListAt(isolate, instance, intobj, function, &result); | 1481 GrowableArray<const Object*> args(1); |
1594 if (::Dart_IsError(result)) { | 1482 args.Add(&intobj); |
1595 return result; // Error condition. | 1483 const Array& kNoArgumentNames = Array::Handle(); |
| 1484 result = DartEntry::InvokeDynamic( |
| 1485 instance, function, args, kNoArgumentNames); |
| 1486 if (result.IsError()) { |
| 1487 return Api::NewLocalHandle(result); |
1596 } | 1488 } |
1597 if (!element.IsInteger()) { | 1489 if (!result.IsInteger()) { |
1598 return Api::NewError("%s expects the argument 'list' to be " | 1490 return Api::NewError("%s expects the argument 'list' to be " |
1599 "a List of int", CURRENT_FUNC); | 1491 "a List of int", CURRENT_FUNC); |
1600 } | 1492 } |
1601 intobj ^= element.raw(); | 1493 intobj ^= result.raw(); |
1602 ASSERT(intobj.AsInt64Value() <= 0xff); | 1494 ASSERT(intobj.AsInt64Value() <= 0xff); |
1603 // TODO(hpayer): value should always be smaller then 0xff. Add error | 1495 // TODO(hpayer): value should always be smaller then 0xff. Add error |
1604 // handling. | 1496 // handling. |
1605 native_array[i] = static_cast<uint8_t>(intobj.AsInt64Value() & 0xff); | 1497 native_array[i] = static_cast<uint8_t>(intobj.AsInt64Value() & 0xff); |
1606 } | 1498 } |
1607 return Api::Success(); | 1499 return Api::Success(); |
1608 } | 1500 } |
1609 } | 1501 } |
1610 return Api::NewError("Object does not implement the 'List' interface"); | 1502 return Api::NewError("Object does not implement the 'List' interface"); |
1611 } | 1503 } |
(...skipping 29 matching lines...) Expand all Loading... |
1641 String& name = String::Handle(String::New("[]=")); | 1533 String& name = String::Handle(String::New("[]=")); |
1642 const Function& function = Function::Handle( | 1534 const Function& function = Function::Handle( |
1643 Resolver::ResolveDynamic(instance, name, 3, 0)); | 1535 Resolver::ResolveDynamic(instance, name, 3, 0)); |
1644 if (!function.IsNull()) { | 1536 if (!function.IsNull()) { |
1645 Integer& indexobj = Integer::Handle(); | 1537 Integer& indexobj = Integer::Handle(); |
1646 Integer& valueobj = Integer::Handle(); | 1538 Integer& valueobj = Integer::Handle(); |
1647 Dart_Handle result; | 1539 Dart_Handle result; |
1648 for (int i = 0; i < length; i++) { | 1540 for (int i = 0; i < length; i++) { |
1649 indexobj = Integer::New(offset + i); | 1541 indexobj = Integer::New(offset + i); |
1650 valueobj = Integer::New(native_array[i]); | 1542 valueobj = Integer::New(native_array[i]); |
1651 SetListAt(isolate, instance, indexobj, valueobj, function, &result); | 1543 GrowableArray<const Object*> args(2); |
1652 if (::Dart_IsError(result)) { | 1544 args.Add(&indexobj); |
1653 return result; // Error condition. | 1545 args.Add(&valueobj); |
| 1546 const Array& kNoArgumentNames = Array::Handle(); |
| 1547 const Object& result = Object::Handle( |
| 1548 DartEntry::InvokeDynamic( |
| 1549 instance, function, args, kNoArgumentNames)); |
| 1550 if (result.IsError()) { |
| 1551 return Api::NewLocalHandle(result); |
1654 } | 1552 } |
1655 } | 1553 } |
1656 return Api::Success(); | 1554 return Api::Success(); |
1657 } | 1555 } |
1658 } | 1556 } |
1659 return Api::NewError("Object does not implement the 'List' interface"); | 1557 return Api::NewError("Object does not implement the 'List' interface"); |
1660 } | 1558 } |
1661 | 1559 |
1662 | 1560 |
1663 // --- Closures --- | 1561 // --- Closures --- |
1664 | 1562 |
1665 | 1563 |
1666 DART_EXPORT bool Dart_IsClosure(Dart_Handle object) { | 1564 DART_EXPORT bool Dart_IsClosure(Dart_Handle object) { |
1667 DARTSCOPE(Isolate::Current()); | 1565 DARTSCOPE(Isolate::Current()); |
1668 const Object& obj = Object::Handle(Api::UnwrapHandle(object)); | 1566 const Object& obj = Object::Handle(Api::UnwrapHandle(object)); |
1669 return obj.IsClosure(); | 1567 return obj.IsClosure(); |
1670 } | 1568 } |
1671 | 1569 |
1672 | 1570 |
1673 // NOTE: Need to pass 'result' as a parameter here in order to avoid | |
1674 // warning: variable 'result' might be clobbered by 'longjmp' or 'vfork' | |
1675 // which shows up because of the use of setjmp. | |
1676 static void InvokeClosure(Isolate* isolate, | |
1677 const Closure& closure, | |
1678 GrowableArray<const Object*>& args, | |
1679 Dart_Handle* result) { | |
1680 ASSERT(isolate != NULL); | |
1681 LongJump* base = isolate->long_jump_base(); | |
1682 LongJump jump; | |
1683 isolate->set_long_jump_base(&jump); | |
1684 if (setjmp(*jump.Set()) == 0) { | |
1685 const Array& kNoArgumentNames = Array::Handle(); | |
1686 const Instance& retval = Instance::Handle( | |
1687 DartEntry::InvokeClosure(closure, args, kNoArgumentNames)); | |
1688 *result = Api::NewLocalHandle(retval); | |
1689 } else { | |
1690 SetupErrorResult(result); | |
1691 } | |
1692 isolate->set_long_jump_base(base); | |
1693 } | |
1694 | |
1695 | |
1696 DART_EXPORT Dart_Handle Dart_InvokeClosure(Dart_Handle closure, | 1571 DART_EXPORT Dart_Handle Dart_InvokeClosure(Dart_Handle closure, |
1697 int number_of_arguments, | 1572 int number_of_arguments, |
1698 Dart_Handle* arguments) { | 1573 Dart_Handle* arguments) { |
1699 Isolate* isolate = Isolate::Current(); | 1574 Isolate* isolate = Isolate::Current(); |
1700 DARTSCOPE(isolate); | 1575 DARTSCOPE(isolate); |
1701 const Object& obj = Object::Handle(Api::UnwrapHandle(closure)); | 1576 const Object& obj = Object::Handle(Api::UnwrapHandle(closure)); |
1702 if (obj.IsNull()) { | 1577 if (obj.IsNull()) { |
1703 return Api::NewError("Null object passed in to invoke closure"); | 1578 return Api::NewError("Null object passed in to invoke closure"); |
1704 } | 1579 } |
1705 if (!obj.IsClosure()) { | 1580 if (!obj.IsClosure()) { |
1706 return Api::NewError("Invalid closure passed to invoke closure"); | 1581 return Api::NewError("Invalid closure passed to invoke closure"); |
1707 } | 1582 } |
1708 ASSERT(ClassFinalizer::AllClassesFinalized()); | 1583 ASSERT(ClassFinalizer::AllClassesFinalized()); |
1709 | 1584 |
1710 // Now try to invoke the closure. | 1585 // Now try to invoke the closure. |
1711 Closure& closure_obj = Closure::Handle(); | 1586 Closure& closure_obj = Closure::Handle(); |
1712 closure_obj ^= obj.raw(); | 1587 closure_obj ^= obj.raw(); |
1713 Dart_Handle retval; | |
1714 GrowableArray<const Object*> dart_arguments(number_of_arguments); | 1588 GrowableArray<const Object*> dart_arguments(number_of_arguments); |
1715 for (int i = 0; i < number_of_arguments; i++) { | 1589 for (int i = 0; i < number_of_arguments; i++) { |
1716 const Object& arg = Object::Handle(Api::UnwrapHandle(arguments[i])); | 1590 const Object& arg = Object::Handle(Api::UnwrapHandle(arguments[i])); |
1717 dart_arguments.Add(&arg); | 1591 dart_arguments.Add(&arg); |
1718 } | 1592 } |
1719 InvokeClosure(isolate, closure_obj, dart_arguments, &retval); | 1593 const Array& kNoArgumentNames = Array::Handle(); |
1720 return retval; | 1594 const Object& result = Object::Handle( |
| 1595 DartEntry::InvokeClosure(closure_obj, dart_arguments, kNoArgumentNames)); |
| 1596 return Api::NewLocalHandle(result); |
1721 } | 1597 } |
1722 | 1598 |
1723 | 1599 |
1724 DART_EXPORT int64_t Dart_ClosureSmrck(Dart_Handle object) { | 1600 DART_EXPORT int64_t Dart_ClosureSmrck(Dart_Handle object) { |
1725 DARTSCOPE(Isolate::Current()); | 1601 DARTSCOPE(Isolate::Current()); |
1726 const Closure& obj = Closure::CheckedHandle(Api::UnwrapHandle(object)); | 1602 const Closure& obj = Closure::CheckedHandle(Api::UnwrapHandle(object)); |
1727 const Integer& smrck = Integer::Handle(obj.smrck()); | 1603 const Integer& smrck = Integer::Handle(obj.smrck()); |
1728 return smrck.IsNull() ? 0 : smrck.AsInt64Value(); | 1604 return smrck.IsNull() ? 0 : smrck.AsInt64Value(); |
1729 } | 1605 } |
1730 | 1606 |
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1788 class_name.ToCString(), function_name.ToCString()); | 1664 class_name.ToCString(), function_name.ToCString()); |
1789 } | 1665 } |
1790 return Api::NewError(msg); | 1666 return Api::NewError(msg); |
1791 } | 1667 } |
1792 Dart_Handle retval; | 1668 Dart_Handle retval; |
1793 GrowableArray<const Object*> dart_arguments(number_of_arguments); | 1669 GrowableArray<const Object*> dart_arguments(number_of_arguments); |
1794 for (int i = 0; i < number_of_arguments; i++) { | 1670 for (int i = 0; i < number_of_arguments; i++) { |
1795 const Object& arg = Object::Handle(Api::UnwrapHandle(arguments[i])); | 1671 const Object& arg = Object::Handle(Api::UnwrapHandle(arguments[i])); |
1796 dart_arguments.Add(&arg); | 1672 dart_arguments.Add(&arg); |
1797 } | 1673 } |
1798 InvokeStatic(isolate, function, dart_arguments, &retval); | 1674 const Array& kNoArgumentNames = Array::Handle(); |
1799 return retval; | 1675 const Object& result = Object::Handle( |
| 1676 DartEntry::InvokeStatic(function, dart_arguments, kNoArgumentNames)); |
| 1677 return Api::NewLocalHandle(result); |
1800 } | 1678 } |
1801 | 1679 |
1802 | 1680 |
1803 DART_EXPORT Dart_Handle Dart_InvokeDynamic(Dart_Handle object, | 1681 DART_EXPORT Dart_Handle Dart_InvokeDynamic(Dart_Handle object, |
1804 Dart_Handle function_name, | 1682 Dart_Handle function_name, |
1805 int number_of_arguments, | 1683 int number_of_arguments, |
1806 Dart_Handle* arguments) { | 1684 Dart_Handle* arguments) { |
1807 Isolate* isolate = Isolate::Current(); | 1685 Isolate* isolate = Isolate::Current(); |
1808 DARTSCOPE(isolate); | 1686 DARTSCOPE(isolate); |
1809 const Object& obj = Object::Handle(Api::UnwrapHandle(object)); | 1687 const Object& obj = Object::Handle(Api::UnwrapHandle(object)); |
(...skipping 21 matching lines...) Expand all Loading... |
1831 // TODO(5415268): Invoke noSuchMethod instead of failing. | 1709 // TODO(5415268): Invoke noSuchMethod instead of failing. |
1832 OS::PrintErr("Unable to find instance function: %s\n", name.ToCString()); | 1710 OS::PrintErr("Unable to find instance function: %s\n", name.ToCString()); |
1833 return Api::NewError("Unable to find instance function"); | 1711 return Api::NewError("Unable to find instance function"); |
1834 } | 1712 } |
1835 Dart_Handle retval; | 1713 Dart_Handle retval; |
1836 GrowableArray<const Object*> dart_arguments(number_of_arguments); | 1714 GrowableArray<const Object*> dart_arguments(number_of_arguments); |
1837 for (int i = 0; i < number_of_arguments; i++) { | 1715 for (int i = 0; i < number_of_arguments; i++) { |
1838 const Object& arg = Object::Handle(Api::UnwrapHandle(arguments[i])); | 1716 const Object& arg = Object::Handle(Api::UnwrapHandle(arguments[i])); |
1839 dart_arguments.Add(&arg); | 1717 dart_arguments.Add(&arg); |
1840 } | 1718 } |
1841 InvokeDynamic(isolate, receiver, function, dart_arguments, &retval); | 1719 const Array& kNoArgumentNames = Array::Handle(); |
1842 return retval; | 1720 const Object& result = Object::Handle( |
| 1721 DartEntry::InvokeDynamic( |
| 1722 receiver, function, dart_arguments, kNoArgumentNames)); |
| 1723 return Api::NewLocalHandle(result); |
1843 } | 1724 } |
1844 | 1725 |
1845 | 1726 |
1846 static const bool kGetter = true; | 1727 static const bool kGetter = true; |
1847 static const bool kSetter = false; | 1728 static const bool kSetter = false; |
1848 | 1729 |
1849 | 1730 |
1850 static bool UseGetterForStaticField(const Field& fld) { | 1731 static bool UseGetterForStaticField(const Field& fld) { |
1851 if (fld.IsNull()) { | 1732 if (fld.IsNull()) { |
1852 return true; | 1733 return true; |
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1939 const Object& obj = Object::Handle(Api::UnwrapHandle(result)); | 1820 const Object& obj = Object::Handle(Api::UnwrapHandle(result)); |
1940 if (obj.IsField()) { | 1821 if (obj.IsField()) { |
1941 Field& fld = Field::Handle(); | 1822 Field& fld = Field::Handle(); |
1942 fld ^= obj.raw(); | 1823 fld ^= obj.raw(); |
1943 retval = fld.value(); | 1824 retval = fld.value(); |
1944 return Api::NewLocalHandle(retval); | 1825 return Api::NewLocalHandle(retval); |
1945 } else { | 1826 } else { |
1946 Function& func = Function::Handle(); | 1827 Function& func = Function::Handle(); |
1947 func ^= obj.raw(); | 1828 func ^= obj.raw(); |
1948 GrowableArray<const Object*> args; | 1829 GrowableArray<const Object*> args; |
1949 InvokeStatic(isolate, func, args, &result); | 1830 const Array& kNoArgumentNames = Array::Handle(); |
1950 return result; | 1831 const Object& result = Object::Handle( |
| 1832 DartEntry::InvokeStatic(func, args, kNoArgumentNames)); |
| 1833 return Api::NewLocalHandle(result); |
1951 } | 1834 } |
1952 } | 1835 } |
1953 | 1836 |
1954 | 1837 |
1955 // TODO(iposva): The value parameter should be documented as being an instance. | 1838 // TODO(iposva): The value parameter should be documented as being an instance. |
1956 // TODO(turnidge): Is this skipping the setter? | 1839 // TODO(turnidge): Is this skipping the setter? |
1957 DART_EXPORT Dart_Handle Dart_SetStaticField(Dart_Handle cls, | 1840 DART_EXPORT Dart_Handle Dart_SetStaticField(Dart_Handle cls, |
1958 Dart_Handle name, | 1841 Dart_Handle name, |
1959 Dart_Handle value) { | 1842 Dart_Handle value) { |
1960 DARTSCOPE(Isolate::Current()); | 1843 DARTSCOPE(Isolate::Current()); |
(...skipping 25 matching lines...) Expand all Loading... |
1986 } | 1869 } |
1987 Instance& object = Instance::Handle(); | 1870 Instance& object = Instance::Handle(); |
1988 object ^= param.raw(); | 1871 object ^= param.raw(); |
1989 Dart_Handle result = LookupInstanceField(object, name, kGetter); | 1872 Dart_Handle result = LookupInstanceField(object, name, kGetter); |
1990 if (::Dart_IsError(result)) { | 1873 if (::Dart_IsError(result)) { |
1991 return result; | 1874 return result; |
1992 } | 1875 } |
1993 Function& func = Function::Handle(); | 1876 Function& func = Function::Handle(); |
1994 func ^= Api::UnwrapHandle(result); | 1877 func ^= Api::UnwrapHandle(result); |
1995 GrowableArray<const Object*> arguments; | 1878 GrowableArray<const Object*> arguments; |
1996 InvokeDynamic(isolate, object, func, arguments, &result); | 1879 const Array& kNoArgumentNames = Array::Handle(); |
1997 return result; | 1880 const Object& retval = Object::Handle( |
| 1881 DartEntry::InvokeDynamic(object, func, arguments, kNoArgumentNames)); |
| 1882 return Api::NewLocalHandle(retval); |
1998 } | 1883 } |
1999 | 1884 |
2000 | 1885 |
2001 DART_EXPORT Dart_Handle Dart_SetInstanceField(Dart_Handle obj, | 1886 DART_EXPORT Dart_Handle Dart_SetInstanceField(Dart_Handle obj, |
2002 Dart_Handle name, | 1887 Dart_Handle name, |
2003 Dart_Handle value) { | 1888 Dart_Handle value) { |
2004 Isolate* isolate = Isolate::Current(); | 1889 Isolate* isolate = Isolate::Current(); |
2005 DARTSCOPE(isolate); | 1890 DARTSCOPE(isolate); |
2006 const Object& param = Object::Handle(Api::UnwrapHandle(obj)); | 1891 const Object& param = Object::Handle(Api::UnwrapHandle(obj)); |
2007 if (param.IsNull() || !param.IsInstance()) { | 1892 if (param.IsNull() || !param.IsInstance()) { |
2008 return Api::NewError("Invalid object passed in to access instance field"); | 1893 return Api::NewError("Invalid object passed in to access instance field"); |
2009 } | 1894 } |
2010 Instance& object = Instance::Handle(); | 1895 Instance& object = Instance::Handle(); |
2011 object ^= param.raw(); | 1896 object ^= param.raw(); |
2012 Dart_Handle result = LookupInstanceField(object, name, kSetter); | 1897 Dart_Handle result = LookupInstanceField(object, name, kSetter); |
2013 if (::Dart_IsError(result)) { | 1898 if (::Dart_IsError(result)) { |
2014 return result; | 1899 return result; |
2015 } | 1900 } |
2016 Function& func = Function::Handle(); | 1901 Function& func = Function::Handle(); |
2017 func ^= Api::UnwrapHandle(result); | 1902 func ^= Api::UnwrapHandle(result); |
2018 GrowableArray<const Object*> arguments(1); | 1903 GrowableArray<const Object*> arguments(1); |
2019 const Object& arg = Object::Handle(Api::UnwrapHandle(value)); | 1904 const Object& arg = Object::Handle(Api::UnwrapHandle(value)); |
2020 arguments.Add(&arg); | 1905 arguments.Add(&arg); |
2021 InvokeDynamic(isolate, object, func, arguments, &result); | 1906 const Array& kNoArgumentNames = Array::Handle(); |
2022 return result; | 1907 const Object& retval = Object::Handle( |
| 1908 DartEntry::InvokeDynamic(object, func, arguments, kNoArgumentNames)); |
| 1909 return Api::NewLocalHandle(retval); |
2023 } | 1910 } |
2024 | 1911 |
2025 | 1912 |
2026 DART_EXPORT Dart_Handle Dart_CreateNativeWrapperClass(Dart_Handle library, | 1913 DART_EXPORT Dart_Handle Dart_CreateNativeWrapperClass(Dart_Handle library, |
2027 Dart_Handle name, | 1914 Dart_Handle name, |
2028 int field_count) { | 1915 int field_count) { |
2029 Isolate* isolate = Isolate::Current(); | 1916 Isolate* isolate = Isolate::Current(); |
2030 DARTSCOPE(isolate); | 1917 DARTSCOPE(isolate); |
2031 const Object& param = Object::Handle(Api::UnwrapHandle(name)); | 1918 const Object& param = Object::Handle(Api::UnwrapHandle(name)); |
2032 if (param.IsNull() || !param.IsString() || field_count <= 0) { | 1919 if (param.IsNull() || !param.IsString() || field_count <= 0) { |
(...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2176 const String& source, | 2063 const String& source, |
2177 RawScript::Kind kind, | 2064 RawScript::Kind kind, |
2178 Dart_Handle* result) { | 2065 Dart_Handle* result) { |
2179 bool update_lib_status = (kind == RawScript::kScript || | 2066 bool update_lib_status = (kind == RawScript::kScript || |
2180 kind == RawScript::kLibrary); | 2067 kind == RawScript::kLibrary); |
2181 if (update_lib_status) { | 2068 if (update_lib_status) { |
2182 lib.SetLoadInProgress(); | 2069 lib.SetLoadInProgress(); |
2183 } | 2070 } |
2184 const Script& script = Script::Handle(Script::New(url, source, kind)); | 2071 const Script& script = Script::Handle(Script::New(url, source, kind)); |
2185 ASSERT(isolate != NULL); | 2072 ASSERT(isolate != NULL); |
2186 LongJump* base = isolate->long_jump_base(); | 2073 const Error& error = Error::Handle(Compiler::Compile(lib, script)); |
2187 LongJump jump; | 2074 if (error.IsNull()) { |
2188 isolate->set_long_jump_base(&jump); | |
2189 if (setjmp(*jump.Set()) == 0) { | |
2190 Compiler::Compile(lib, script); | |
2191 *result = Api::NewLocalHandle(lib); | 2075 *result = Api::NewLocalHandle(lib); |
2192 if (update_lib_status) { | 2076 if (update_lib_status) { |
2193 lib.SetLoaded(); | 2077 lib.SetLoaded(); |
2194 } | 2078 } |
2195 } else { | 2079 } else { |
2196 SetupErrorResult(result); | 2080 *result = Api::NewLocalHandle(error); |
2197 if (update_lib_status) { | 2081 if (update_lib_status) { |
2198 lib.SetLoadError(); | 2082 lib.SetLoadError(); |
2199 } | 2083 } |
2200 } | 2084 } |
2201 isolate->set_long_jump_base(base); | |
2202 } | 2085 } |
2203 | 2086 |
2204 | 2087 |
2205 DART_EXPORT Dart_Handle Dart_LoadScript(Dart_Handle url, | 2088 DART_EXPORT Dart_Handle Dart_LoadScript(Dart_Handle url, |
2206 Dart_Handle source, | 2089 Dart_Handle source, |
2207 Dart_LibraryTagHandler handler) { | 2090 Dart_LibraryTagHandler handler) { |
2208 TIMERSCOPE(time_script_loading); | 2091 TIMERSCOPE(time_script_loading); |
2209 Isolate* isolate = Isolate::Current(); | 2092 Isolate* isolate = Isolate::Current(); |
2210 DARTSCOPE(isolate); | 2093 DARTSCOPE(isolate); |
2211 const String& url_str = Api::UnwrapStringHandle(url); | 2094 const String& url_str = Api::UnwrapStringHandle(url); |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2263 CURRENT_FUNC); | 2146 CURRENT_FUNC); |
2264 } | 2147 } |
2265 library ^= tmp.raw(); | 2148 library ^= tmp.raw(); |
2266 library.Register(); | 2149 library.Register(); |
2267 isolate->object_store()->set_root_library(library); | 2150 isolate->object_store()->set_root_library(library); |
2268 return Api::NewLocalHandle(library); | 2151 return Api::NewLocalHandle(library); |
2269 } | 2152 } |
2270 | 2153 |
2271 | 2154 |
2272 static void CompileAll(Isolate* isolate, Dart_Handle* result) { | 2155 static void CompileAll(Isolate* isolate, Dart_Handle* result) { |
2273 *result = Api::Success(); | |
2274 ASSERT(isolate != NULL); | 2156 ASSERT(isolate != NULL); |
2275 LongJump* base = isolate->long_jump_base(); | 2157 const Error& error = Error::Handle(Library::CompileAll()); |
2276 LongJump jump; | 2158 if (error.IsNull()) { |
2277 isolate->set_long_jump_base(&jump); | 2159 *result = Api::Success(); |
2278 if (setjmp(*jump.Set()) == 0) { | |
2279 Library::CompileAll(); | |
2280 } else { | 2160 } else { |
2281 SetupErrorResult(result); | 2161 *result = Api::NewLocalHandle(error); |
2282 } | 2162 } |
2283 isolate->set_long_jump_base(base); | |
2284 } | 2163 } |
2285 | 2164 |
2286 | 2165 |
2287 DART_EXPORT Dart_Handle Dart_CompileAll() { | 2166 DART_EXPORT Dart_Handle Dart_CompileAll() { |
2288 Isolate* isolate = Isolate::Current(); | 2167 Isolate* isolate = Isolate::Current(); |
2289 DARTSCOPE(isolate); | 2168 DARTSCOPE(isolate); |
2290 Dart_Handle result; | 2169 Dart_Handle result; |
2291 const char* msg = CheckIsolateState(isolate); | 2170 const char* msg = CheckIsolateState(isolate); |
2292 if (msg != NULL) { | 2171 if (msg != NULL) { |
2293 return Api::NewError(msg); | 2172 return Api::NewError(msg); |
(...skipping 171 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2465 } | 2344 } |
2466 delete debug_region; | 2345 delete debug_region; |
2467 } else { | 2346 } else { |
2468 *buffer = NULL; | 2347 *buffer = NULL; |
2469 *buffer_size = 0; | 2348 *buffer_size = 0; |
2470 } | 2349 } |
2471 } | 2350 } |
2472 | 2351 |
2473 | 2352 |
2474 } // namespace dart | 2353 } // namespace dart |
OLD | NEW |