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

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: Removed some unneeded includes Created 8 years, 11 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
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/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
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
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
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
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
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
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
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, 1363 static RawObject* GetListAt(Isolate* isolate,
1412 const Instance& instance, 1364 const Instance& instance,
1413 const Integer& index, 1365 const Integer& index,
1414 const Function& function, 1366 const Function& function,
1415 Dart_Handle* result) { 1367 Dart_Handle* result) {
siva 2012/01/31 00:52:34 Why does this have to take the result as parameter
turnidge 2012/01/31 21:56:31 Got rid of GetListAt. It made more trouble than i
1416 ASSERT(isolate != NULL); 1368 ASSERT(isolate != NULL);
1417 ASSERT(result != NULL); 1369 ASSERT(result != NULL);
1418 LongJump* base = isolate->long_jump_base(); 1370 GrowableArray<const Object*> args(0);
1419 LongJump jump; 1371 args.Add(&index);
1420 isolate->set_long_jump_base(&jump); 1372 const Array& kNoArgumentNames = Array::Handle();
1421 if (setjmp(*jump.Set()) == 0) { 1373 const Object& retval = Object::Handle(DartEntry::InvokeDynamic(
1422 Instance& retval = Instance::Handle(); 1374 instance, function, args, kNoArgumentNames));
1423 GrowableArray<const Object*> args(0); 1375 if (retval.IsError()) {
1424 args.Add(&index); 1376 *result = Api::NewLocalHandle(retval);
1425 const Array& kNoArgumentNames = Array::Handle(); 1377 return Object::null();
1426 retval = DartEntry::InvokeDynamic(instance, 1378 } else {
1427 function, 1379 *result = Api::Success();
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(); 1380 return retval.raw();
1437 } 1381 }
1438 SetupErrorResult(result);
1439 isolate->set_long_jump_base(base);
1440 return Object::null();
1441 } 1382 }
1442 1383
1443 1384
1444 DART_EXPORT Dart_Handle Dart_ListGetAt(Dart_Handle list, intptr_t index) { 1385 DART_EXPORT Dart_Handle Dart_ListGetAt(Dart_Handle list, intptr_t index) {
1445 Isolate* isolate = Isolate::Current(); 1386 Isolate* isolate = Isolate::Current();
1446 DARTSCOPE(isolate); 1387 DARTSCOPE(isolate);
1447 const Object& obj = Object::Handle(Api::UnwrapHandle(list)); 1388 const Object& obj = Object::Handle(Api::UnwrapHandle(list));
1448 if (obj.IsArray()) { 1389 if (obj.IsArray()) {
1449 Array& array_obj = Array::Handle(); 1390 Array& array_obj = Array::Handle();
1450 array_obj ^= obj.raw(); 1391 array_obj ^= obj.raw();
(...skipping 12 matching lines...) Expand all
1463 Resolver::ResolveDynamic(instance, name, 2, 0)); 1404 Resolver::ResolveDynamic(instance, name, 2, 0));
1464 if (!function.IsNull()) { 1405 if (!function.IsNull()) {
1465 Object& element = Object::Handle(); 1406 Object& element = Object::Handle();
1466 Integer& indexobj = Integer::Handle(); 1407 Integer& indexobj = Integer::Handle();
1467 Dart_Handle result; 1408 Dart_Handle result;
1468 indexobj = Integer::New(index); 1409 indexobj = Integer::New(index);
1469 element = GetListAt(isolate, instance, indexobj, function, &result); 1410 element = GetListAt(isolate, instance, indexobj, function, &result);
1470 if (::Dart_IsError(result)) { 1411 if (::Dart_IsError(result)) {
1471 return result; // Error condition. 1412 return result; // Error condition.
1472 } 1413 }
1473 return Api::NewLocalHandle(element); 1414 return Api::NewLocalHandle(element);
siva 2012/01/31 00:52:34 Should just be: element = GetListAt(instance, inde
turnidge 2012/01/31 21:56:31 Reworked this.
1474 } 1415 }
1475 } 1416 }
1476 return Api::NewError("Object does not implement the 'List' interface"); 1417 return Api::NewError("Object does not implement the 'List' interface");
1477 } 1418 }
1478 1419
1479 1420
1480 static void SetListAt(Isolate* isolate, 1421 static void SetListAt(Isolate* isolate,
1481 const Instance& instance, 1422 const Instance& instance,
1482 const Integer& index, 1423 const Integer& index,
1483 const Object& value, 1424 const Object& value,
1484 const Function& function, 1425 const Function& function,
1485 Dart_Handle* result) { 1426 Dart_Handle* result) {
siva 2012/01/31 00:52:34 Why does this need the isolate parameter? Also co
turnidge 2012/01/31 21:56:31 Got rid of SetListAt as well.
1486 ASSERT(isolate != NULL); 1427 ASSERT(isolate != NULL);
1487 ASSERT(result != NULL); 1428 ASSERT(result != NULL);
1488 LongJump* base = isolate->long_jump_base(); 1429 GrowableArray<const Object*> args(1);
1489 LongJump jump; 1430 args.Add(&index);
1490 isolate->set_long_jump_base(&jump); 1431 args.Add(&value);
1491 if (setjmp(*jump.Set()) == 0) { 1432 const Array& kNoArgumentNames = Array::Handle();
1492 GrowableArray<const Object*> args(1); 1433 const Object& retval = Object::Handle(
1493 args.Add(&index); 1434 DartEntry::InvokeDynamic(instance, function, args, kNoArgumentNames));
1494 args.Add(&value); 1435 if (retval.IsError()) {
1495 Instance& retval = Instance::Handle(); 1436 *result = Api::NewLocalHandle(retval);
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 { 1437 } else {
1507 SetupErrorResult(result); 1438 *result = Api::Success();
1508 } 1439 }
1509 isolate->set_long_jump_base(base);
1510 } 1440 }
1511 1441
1512 1442
1513 DART_EXPORT Dart_Handle Dart_ListSetAt(Dart_Handle list, 1443 DART_EXPORT Dart_Handle Dart_ListSetAt(Dart_Handle list,
1514 intptr_t index, 1444 intptr_t index,
1515 Dart_Handle value) { 1445 Dart_Handle value) {
1516 Isolate* isolate = Isolate::Current(); 1446 Isolate* isolate = Isolate::Current();
1517 DARTSCOPE(isolate); 1447 DARTSCOPE(isolate);
1518 const Object& obj = Object::Handle(Api::UnwrapHandle(list)); 1448 const Object& obj = Object::Handle(Api::UnwrapHandle(list));
1519 if (obj.IsArray()) { 1449 if (obj.IsArray()) {
(...skipping 13 matching lines...) Expand all
1533 // Now check and handle a dart object that implements the List interface. 1463 // Now check and handle a dart object that implements the List interface.
1534 const Instance& instance = Instance::Handle(GetListInstance(isolate, obj)); 1464 const Instance& instance = Instance::Handle(GetListInstance(isolate, obj));
1535 if (!instance.IsNull()) { 1465 if (!instance.IsNull()) {
1536 String& name = String::Handle(String::New("[]=")); 1466 String& name = String::Handle(String::New("[]="));
1537 const Function& function = Function::Handle( 1467 const Function& function = Function::Handle(
1538 Resolver::ResolveDynamic(instance, name, 3, 0)); 1468 Resolver::ResolveDynamic(instance, name, 3, 0));
1539 if (!function.IsNull()) { 1469 if (!function.IsNull()) {
1540 Dart_Handle result; 1470 Dart_Handle result;
1541 const Integer& index_obj = Integer::Handle(Integer::New(index)); 1471 const Integer& index_obj = Integer::Handle(Integer::New(index));
1542 const Object& value_obj = Object::Handle(Api::UnwrapHandle(value)); 1472 const Object& value_obj = Object::Handle(Api::UnwrapHandle(value));
1543 SetListAt(isolate, instance, index_obj, value_obj, function, &result); 1473 SetListAt(isolate, instance, index_obj, value_obj, function, &result);
siva 2012/01/31 00:52:34 return SetListAt(instance, index_obj, value_obj, f
turnidge 2012/01/31 21:56:31 Code has changed.
1544 return result; 1474 return result;
1545 } 1475 }
1546 } 1476 }
1547 return Api::NewError("Object does not implement the 'List' interface"); 1477 return Api::NewError("Object does not implement the 'List' interface");
1548 } 1478 }
1549 1479
1550 1480
1551 DART_EXPORT Dart_Handle Dart_ListGetAsBytes(Dart_Handle list, 1481 DART_EXPORT Dart_Handle Dart_ListGetAsBytes(Dart_Handle list,
1552 intptr_t offset, 1482 intptr_t offset,
1553 uint8_t* native_array, 1483 uint8_t* native_array,
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
1586 Resolver::ResolveDynamic(instance, name, 2, 0)); 1516 Resolver::ResolveDynamic(instance, name, 2, 0));
1587 if (!function.IsNull()) { 1517 if (!function.IsNull()) {
1588 Object& element = Object::Handle(); 1518 Object& element = Object::Handle();
1589 Integer& intobj = Integer::Handle(); 1519 Integer& intobj = Integer::Handle();
1590 Dart_Handle result; 1520 Dart_Handle result;
1591 for (int i = 0; i < length; i++) { 1521 for (int i = 0; i < length; i++) {
1592 intobj = Integer::New(offset + i); 1522 intobj = Integer::New(offset + i);
1593 element = GetListAt(isolate, instance, intobj, function, &result); 1523 element = GetListAt(isolate, instance, intobj, function, &result);
1594 if (::Dart_IsError(result)) { 1524 if (::Dart_IsError(result)) {
1595 return result; // Error condition. 1525 return result; // Error condition.
1596 } 1526 }
siva 2012/01/31 00:52:34 Ditto comment.
turnidge 2012/01/31 21:56:31 Code changed.
1597 if (!element.IsInteger()) { 1527 if (!element.IsInteger()) {
1598 return Api::NewError("%s expects the argument 'list' to be " 1528 return Api::NewError("%s expects the argument 'list' to be "
1599 "a List of int", CURRENT_FUNC); 1529 "a List of int", CURRENT_FUNC);
1600 } 1530 }
1601 intobj ^= element.raw(); 1531 intobj ^= element.raw();
1602 ASSERT(intobj.AsInt64Value() <= 0xff); 1532 ASSERT(intobj.AsInt64Value() <= 0xff);
1603 // TODO(hpayer): value should always be smaller then 0xff. Add error 1533 // TODO(hpayer): value should always be smaller then 0xff. Add error
1604 // handling. 1534 // handling.
1605 native_array[i] = static_cast<uint8_t>(intobj.AsInt64Value() & 0xff); 1535 native_array[i] = static_cast<uint8_t>(intobj.AsInt64Value() & 0xff);
1606 } 1536 }
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
1641 String& name = String::Handle(String::New("[]=")); 1571 String& name = String::Handle(String::New("[]="));
1642 const Function& function = Function::Handle( 1572 const Function& function = Function::Handle(
1643 Resolver::ResolveDynamic(instance, name, 3, 0)); 1573 Resolver::ResolveDynamic(instance, name, 3, 0));
1644 if (!function.IsNull()) { 1574 if (!function.IsNull()) {
1645 Integer& indexobj = Integer::Handle(); 1575 Integer& indexobj = Integer::Handle();
1646 Integer& valueobj = Integer::Handle(); 1576 Integer& valueobj = Integer::Handle();
1647 Dart_Handle result; 1577 Dart_Handle result;
1648 for (int i = 0; i < length; i++) { 1578 for (int i = 0; i < length; i++) {
1649 indexobj = Integer::New(offset + i); 1579 indexobj = Integer::New(offset + i);
1650 valueobj = Integer::New(native_array[i]); 1580 valueobj = Integer::New(native_array[i]);
1651 SetListAt(isolate, instance, indexobj, valueobj, function, &result); 1581 SetListAt(isolate, instance, indexobj, valueobj, function, &result);
siva 2012/01/31 00:52:34 Ditto.
turnidge 2012/01/31 21:56:31 Code changed.
1652 if (::Dart_IsError(result)) { 1582 if (::Dart_IsError(result)) {
1653 return result; // Error condition. 1583 return result; // Error condition.
1654 } 1584 }
1655 } 1585 }
1656 return Api::Success(); 1586 return Api::Success();
1657 } 1587 }
1658 } 1588 }
1659 return Api::NewError("Object does not implement the 'List' interface"); 1589 return Api::NewError("Object does not implement the 'List' interface");
1660 } 1590 }
1661 1591
1662 1592
1663 // --- Closures --- 1593 // --- Closures ---
1664 1594
1665 1595
1666 DART_EXPORT bool Dart_IsClosure(Dart_Handle object) { 1596 DART_EXPORT bool Dart_IsClosure(Dart_Handle object) {
1667 DARTSCOPE(Isolate::Current()); 1597 DARTSCOPE(Isolate::Current());
1668 const Object& obj = Object::Handle(Api::UnwrapHandle(object)); 1598 const Object& obj = Object::Handle(Api::UnwrapHandle(object));
1669 return obj.IsClosure(); 1599 return obj.IsClosure();
1670 } 1600 }
1671 1601
1672 1602
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, 1603 DART_EXPORT Dart_Handle Dart_InvokeClosure(Dart_Handle closure,
1697 int number_of_arguments, 1604 int number_of_arguments,
1698 Dart_Handle* arguments) { 1605 Dart_Handle* arguments) {
1699 Isolate* isolate = Isolate::Current(); 1606 Isolate* isolate = Isolate::Current();
1700 DARTSCOPE(isolate); 1607 DARTSCOPE(isolate);
1701 const Object& obj = Object::Handle(Api::UnwrapHandle(closure)); 1608 const Object& obj = Object::Handle(Api::UnwrapHandle(closure));
1702 if (obj.IsNull()) { 1609 if (obj.IsNull()) {
1703 return Api::NewError("Null object passed in to invoke closure"); 1610 return Api::NewError("Null object passed in to invoke closure");
1704 } 1611 }
1705 if (!obj.IsClosure()) { 1612 if (!obj.IsClosure()) {
1706 return Api::NewError("Invalid closure passed to invoke closure"); 1613 return Api::NewError("Invalid closure passed to invoke closure");
1707 } 1614 }
1708 ASSERT(ClassFinalizer::AllClassesFinalized()); 1615 ASSERT(ClassFinalizer::AllClassesFinalized());
1709 1616
1710 // Now try to invoke the closure. 1617 // Now try to invoke the closure.
1711 Closure& closure_obj = Closure::Handle(); 1618 Closure& closure_obj = Closure::Handle();
1712 closure_obj ^= obj.raw(); 1619 closure_obj ^= obj.raw();
1713 Dart_Handle retval;
1714 GrowableArray<const Object*> dart_arguments(number_of_arguments); 1620 GrowableArray<const Object*> dart_arguments(number_of_arguments);
1715 for (int i = 0; i < number_of_arguments; i++) { 1621 for (int i = 0; i < number_of_arguments; i++) {
1716 const Object& arg = Object::Handle(Api::UnwrapHandle(arguments[i])); 1622 const Object& arg = Object::Handle(Api::UnwrapHandle(arguments[i]));
1717 dart_arguments.Add(&arg); 1623 dart_arguments.Add(&arg);
1718 } 1624 }
1719 InvokeClosure(isolate, closure_obj, dart_arguments, &retval); 1625 const Array& kNoArgumentNames = Array::Handle();
1720 return retval; 1626 const Object& result = Object::Handle(
1627 DartEntry::InvokeClosure(closure_obj, dart_arguments, kNoArgumentNames));
1628 return Api::NewLocalHandle(result);
1721 } 1629 }
1722 1630
1723 1631
1724 DART_EXPORT int64_t Dart_ClosureSmrck(Dart_Handle object) { 1632 DART_EXPORT int64_t Dart_ClosureSmrck(Dart_Handle object) {
1725 DARTSCOPE(Isolate::Current()); 1633 DARTSCOPE(Isolate::Current());
1726 const Closure& obj = Closure::CheckedHandle(Api::UnwrapHandle(object)); 1634 const Closure& obj = Closure::CheckedHandle(Api::UnwrapHandle(object));
1727 const Integer& smrck = Integer::Handle(obj.smrck()); 1635 const Integer& smrck = Integer::Handle(obj.smrck());
1728 return smrck.IsNull() ? 0 : smrck.AsInt64Value(); 1636 return smrck.IsNull() ? 0 : smrck.AsInt64Value();
1729 } 1637 }
1730 1638
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
1788 class_name.ToCString(), function_name.ToCString()); 1696 class_name.ToCString(), function_name.ToCString());
1789 } 1697 }
1790 return Api::NewError(msg); 1698 return Api::NewError(msg);
1791 } 1699 }
1792 Dart_Handle retval; 1700 Dart_Handle retval;
1793 GrowableArray<const Object*> dart_arguments(number_of_arguments); 1701 GrowableArray<const Object*> dart_arguments(number_of_arguments);
1794 for (int i = 0; i < number_of_arguments; i++) { 1702 for (int i = 0; i < number_of_arguments; i++) {
1795 const Object& arg = Object::Handle(Api::UnwrapHandle(arguments[i])); 1703 const Object& arg = Object::Handle(Api::UnwrapHandle(arguments[i]));
1796 dart_arguments.Add(&arg); 1704 dart_arguments.Add(&arg);
1797 } 1705 }
1798 InvokeStatic(isolate, function, dart_arguments, &retval); 1706 const Array& kNoArgumentNames = Array::Handle();
1799 return retval; 1707 const Object& result = Object::Handle(
1708 DartEntry::InvokeStatic(function, dart_arguments, kNoArgumentNames));
1709 return Api::NewLocalHandle(result);
1800 } 1710 }
1801 1711
1802 1712
1803 DART_EXPORT Dart_Handle Dart_InvokeDynamic(Dart_Handle object, 1713 DART_EXPORT Dart_Handle Dart_InvokeDynamic(Dart_Handle object,
1804 Dart_Handle function_name, 1714 Dart_Handle function_name,
1805 int number_of_arguments, 1715 int number_of_arguments,
1806 Dart_Handle* arguments) { 1716 Dart_Handle* arguments) {
1807 Isolate* isolate = Isolate::Current(); 1717 Isolate* isolate = Isolate::Current();
1808 DARTSCOPE(isolate); 1718 DARTSCOPE(isolate);
1809 const Object& obj = Object::Handle(Api::UnwrapHandle(object)); 1719 const Object& obj = Object::Handle(Api::UnwrapHandle(object));
(...skipping 21 matching lines...) Expand all
1831 // TODO(5415268): Invoke noSuchMethod instead of failing. 1741 // TODO(5415268): Invoke noSuchMethod instead of failing.
1832 OS::PrintErr("Unable to find instance function: %s\n", name.ToCString()); 1742 OS::PrintErr("Unable to find instance function: %s\n", name.ToCString());
1833 return Api::NewError("Unable to find instance function"); 1743 return Api::NewError("Unable to find instance function");
1834 } 1744 }
1835 Dart_Handle retval; 1745 Dart_Handle retval;
1836 GrowableArray<const Object*> dart_arguments(number_of_arguments); 1746 GrowableArray<const Object*> dart_arguments(number_of_arguments);
1837 for (int i = 0; i < number_of_arguments; i++) { 1747 for (int i = 0; i < number_of_arguments; i++) {
1838 const Object& arg = Object::Handle(Api::UnwrapHandle(arguments[i])); 1748 const Object& arg = Object::Handle(Api::UnwrapHandle(arguments[i]));
1839 dart_arguments.Add(&arg); 1749 dart_arguments.Add(&arg);
1840 } 1750 }
1841 InvokeDynamic(isolate, receiver, function, dart_arguments, &retval); 1751 const Array& kNoArgumentNames = Array::Handle();
1842 return retval; 1752 const Object& result = Object::Handle(
1753 DartEntry::InvokeDynamic(
1754 receiver, function, dart_arguments, kNoArgumentNames));
1755 return Api::NewLocalHandle(result);
1843 } 1756 }
1844 1757
1845 1758
1846 static const bool kGetter = true; 1759 static const bool kGetter = true;
1847 static const bool kSetter = false; 1760 static const bool kSetter = false;
1848 1761
1849 1762
1850 static bool UseGetterForStaticField(const Field& fld) { 1763 static bool UseGetterForStaticField(const Field& fld) {
1851 if (fld.IsNull()) { 1764 if (fld.IsNull()) {
1852 return true; 1765 return true;
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after
1939 const Object& obj = Object::Handle(Api::UnwrapHandle(result)); 1852 const Object& obj = Object::Handle(Api::UnwrapHandle(result));
1940 if (obj.IsField()) { 1853 if (obj.IsField()) {
1941 Field& fld = Field::Handle(); 1854 Field& fld = Field::Handle();
1942 fld ^= obj.raw(); 1855 fld ^= obj.raw();
1943 retval = fld.value(); 1856 retval = fld.value();
1944 return Api::NewLocalHandle(retval); 1857 return Api::NewLocalHandle(retval);
1945 } else { 1858 } else {
1946 Function& func = Function::Handle(); 1859 Function& func = Function::Handle();
1947 func ^= obj.raw(); 1860 func ^= obj.raw();
1948 GrowableArray<const Object*> args; 1861 GrowableArray<const Object*> args;
1949 InvokeStatic(isolate, func, args, &result); 1862 const Array& kNoArgumentNames = Array::Handle();
1950 return result; 1863 const Object& result = Object::Handle(
1864 DartEntry::InvokeStatic(func, args, kNoArgumentNames));
1865 return Api::NewLocalHandle(result);
1951 } 1866 }
1952 } 1867 }
1953 1868
1954 1869
1955 // TODO(iposva): The value parameter should be documented as being an instance. 1870 // TODO(iposva): The value parameter should be documented as being an instance.
1956 // TODO(turnidge): Is this skipping the setter? 1871 // TODO(turnidge): Is this skipping the setter?
1957 DART_EXPORT Dart_Handle Dart_SetStaticField(Dart_Handle cls, 1872 DART_EXPORT Dart_Handle Dart_SetStaticField(Dart_Handle cls,
1958 Dart_Handle name, 1873 Dart_Handle name,
1959 Dart_Handle value) { 1874 Dart_Handle value) {
1960 DARTSCOPE(Isolate::Current()); 1875 DARTSCOPE(Isolate::Current());
(...skipping 25 matching lines...) Expand all
1986 } 1901 }
1987 Instance& object = Instance::Handle(); 1902 Instance& object = Instance::Handle();
1988 object ^= param.raw(); 1903 object ^= param.raw();
1989 Dart_Handle result = LookupInstanceField(object, name, kGetter); 1904 Dart_Handle result = LookupInstanceField(object, name, kGetter);
1990 if (::Dart_IsError(result)) { 1905 if (::Dart_IsError(result)) {
1991 return result; 1906 return result;
1992 } 1907 }
1993 Function& func = Function::Handle(); 1908 Function& func = Function::Handle();
1994 func ^= Api::UnwrapHandle(result); 1909 func ^= Api::UnwrapHandle(result);
1995 GrowableArray<const Object*> arguments; 1910 GrowableArray<const Object*> arguments;
1996 InvokeDynamic(isolate, object, func, arguments, &result); 1911 const Array& kNoArgumentNames = Array::Handle();
1997 return result; 1912 const Object& retval = Object::Handle(
1913 DartEntry::InvokeDynamic(object, func, arguments, kNoArgumentNames));
1914 return Api::NewLocalHandle(retval);
1998 } 1915 }
1999 1916
2000 1917
2001 DART_EXPORT Dart_Handle Dart_SetInstanceField(Dart_Handle obj, 1918 DART_EXPORT Dart_Handle Dart_SetInstanceField(Dart_Handle obj,
2002 Dart_Handle name, 1919 Dart_Handle name,
2003 Dart_Handle value) { 1920 Dart_Handle value) {
2004 Isolate* isolate = Isolate::Current(); 1921 Isolate* isolate = Isolate::Current();
2005 DARTSCOPE(isolate); 1922 DARTSCOPE(isolate);
2006 const Object& param = Object::Handle(Api::UnwrapHandle(obj)); 1923 const Object& param = Object::Handle(Api::UnwrapHandle(obj));
2007 if (param.IsNull() || !param.IsInstance()) { 1924 if (param.IsNull() || !param.IsInstance()) {
2008 return Api::NewError("Invalid object passed in to access instance field"); 1925 return Api::NewError("Invalid object passed in to access instance field");
2009 } 1926 }
2010 Instance& object = Instance::Handle(); 1927 Instance& object = Instance::Handle();
2011 object ^= param.raw(); 1928 object ^= param.raw();
2012 Dart_Handle result = LookupInstanceField(object, name, kSetter); 1929 Dart_Handle result = LookupInstanceField(object, name, kSetter);
2013 if (::Dart_IsError(result)) { 1930 if (::Dart_IsError(result)) {
2014 return result; 1931 return result;
2015 } 1932 }
2016 Function& func = Function::Handle(); 1933 Function& func = Function::Handle();
2017 func ^= Api::UnwrapHandle(result); 1934 func ^= Api::UnwrapHandle(result);
2018 GrowableArray<const Object*> arguments(1); 1935 GrowableArray<const Object*> arguments(1);
2019 const Object& arg = Object::Handle(Api::UnwrapHandle(value)); 1936 const Object& arg = Object::Handle(Api::UnwrapHandle(value));
2020 arguments.Add(&arg); 1937 arguments.Add(&arg);
2021 InvokeDynamic(isolate, object, func, arguments, &result); 1938 const Array& kNoArgumentNames = Array::Handle();
2022 return result; 1939 const Object& retval = Object::Handle(
1940 DartEntry::InvokeDynamic(object, func, arguments, kNoArgumentNames));
1941 return Api::NewLocalHandle(retval);
2023 } 1942 }
2024 1943
2025 1944
2026 DART_EXPORT Dart_Handle Dart_CreateNativeWrapperClass(Dart_Handle library, 1945 DART_EXPORT Dart_Handle Dart_CreateNativeWrapperClass(Dart_Handle library,
2027 Dart_Handle name, 1946 Dart_Handle name,
2028 int field_count) { 1947 int field_count) {
2029 Isolate* isolate = Isolate::Current(); 1948 Isolate* isolate = Isolate::Current();
2030 DARTSCOPE(isolate); 1949 DARTSCOPE(isolate);
2031 const Object& param = Object::Handle(Api::UnwrapHandle(name)); 1950 const Object& param = Object::Handle(Api::UnwrapHandle(name));
2032 if (param.IsNull() || !param.IsString() || field_count <= 0) { 1951 if (param.IsNull() || !param.IsString() || field_count <= 0) {
(...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after
2176 const String& source, 2095 const String& source,
2177 RawScript::Kind kind, 2096 RawScript::Kind kind,
2178 Dart_Handle* result) { 2097 Dart_Handle* result) {
2179 bool update_lib_status = (kind == RawScript::kScript || 2098 bool update_lib_status = (kind == RawScript::kScript ||
2180 kind == RawScript::kLibrary); 2099 kind == RawScript::kLibrary);
2181 if (update_lib_status) { 2100 if (update_lib_status) {
2182 lib.SetLoadInProgress(); 2101 lib.SetLoadInProgress();
2183 } 2102 }
2184 const Script& script = Script::Handle(Script::New(url, source, kind)); 2103 const Script& script = Script::Handle(Script::New(url, source, kind));
2185 ASSERT(isolate != NULL); 2104 ASSERT(isolate != NULL);
2186 LongJump* base = isolate->long_jump_base(); 2105 const Error& error = Error::Handle(Compiler::Compile(lib, script));
2187 LongJump jump; 2106 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); 2107 *result = Api::NewLocalHandle(lib);
2192 if (update_lib_status) { 2108 if (update_lib_status) {
2193 lib.SetLoaded(); 2109 lib.SetLoaded();
2194 } 2110 }
2195 } else { 2111 } else {
2196 SetupErrorResult(result); 2112 *result = Api::NewLocalHandle(error);
2197 if (update_lib_status) { 2113 if (update_lib_status) {
2198 lib.SetLoadError(); 2114 lib.SetLoadError();
2199 } 2115 }
2200 } 2116 }
2201 isolate->set_long_jump_base(base);
2202 } 2117 }
2203 2118
2204 2119
2205 DART_EXPORT Dart_Handle Dart_LoadScript(Dart_Handle url, 2120 DART_EXPORT Dart_Handle Dart_LoadScript(Dart_Handle url,
2206 Dart_Handle source, 2121 Dart_Handle source,
2207 Dart_LibraryTagHandler handler) { 2122 Dart_LibraryTagHandler handler) {
2208 TIMERSCOPE(time_script_loading); 2123 TIMERSCOPE(time_script_loading);
2209 Isolate* isolate = Isolate::Current(); 2124 Isolate* isolate = Isolate::Current();
2210 DARTSCOPE(isolate); 2125 DARTSCOPE(isolate);
2211 const String& url_str = Api::UnwrapStringHandle(url); 2126 const String& url_str = Api::UnwrapStringHandle(url);
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
2263 CURRENT_FUNC); 2178 CURRENT_FUNC);
2264 } 2179 }
2265 library ^= tmp.raw(); 2180 library ^= tmp.raw();
2266 library.Register(); 2181 library.Register();
2267 isolate->object_store()->set_root_library(library); 2182 isolate->object_store()->set_root_library(library);
2268 return Api::NewLocalHandle(library); 2183 return Api::NewLocalHandle(library);
2269 } 2184 }
2270 2185
2271 2186
2272 static void CompileAll(Isolate* isolate, Dart_Handle* result) { 2187 static void CompileAll(Isolate* isolate, Dart_Handle* result) {
2273 *result = Api::Success();
2274 ASSERT(isolate != NULL); 2188 ASSERT(isolate != NULL);
2275 LongJump* base = isolate->long_jump_base(); 2189 const Error& error = Error::Handle(Library::CompileAll());
2276 LongJump jump; 2190 if (error.IsNull()) {
2277 isolate->set_long_jump_base(&jump); 2191 *result = Api::Success();
2278 if (setjmp(*jump.Set()) == 0) {
2279 Library::CompileAll();
2280 } else { 2192 } else {
2281 SetupErrorResult(result); 2193 *result = Api::NewLocalHandle(error);
2282 } 2194 }
2283 isolate->set_long_jump_base(base);
2284 } 2195 }
2285 2196
2286 2197
2287 DART_EXPORT Dart_Handle Dart_CompileAll() { 2198 DART_EXPORT Dart_Handle Dart_CompileAll() {
2288 Isolate* isolate = Isolate::Current(); 2199 Isolate* isolate = Isolate::Current();
2289 DARTSCOPE(isolate); 2200 DARTSCOPE(isolate);
2290 Dart_Handle result; 2201 Dart_Handle result;
2291 const char* msg = CheckIsolateState(isolate); 2202 const char* msg = CheckIsolateState(isolate);
2292 if (msg != NULL) { 2203 if (msg != NULL) {
2293 return Api::NewError(msg); 2204 return Api::NewError(msg);
(...skipping 171 matching lines...) Expand 10 before | Expand all | Expand 10 after
2465 } 2376 }
2466 delete debug_region; 2377 delete debug_region;
2467 } else { 2378 } else {
2468 *buffer = NULL; 2379 *buffer = NULL;
2469 *buffer_size = 0; 2380 *buffer_size = 0;
2470 } 2381 }
2471 } 2382 }
2472 2383
2473 2384
2474 } // namespace dart 2385 } // namespace dart
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698