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

Unified Diff: runtime/vm/dart_api_impl.cc

Issue 9314053: Revert Dart_PropagateError until I can track down the problems in (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « runtime/vm/dart.cc ('k') | runtime/vm/dart_api_impl_test.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: runtime/vm/dart_api_impl.cc
===================================================================
--- runtime/vm/dart_api_impl.cc (revision 3821)
+++ runtime/vm/dart_api_impl.cc (working copy)
@@ -14,6 +14,7 @@
#include "vm/debuginfo.h"
#include "vm/exceptions.h"
#include "vm/growable_array.h"
+#include "vm/longjump.h"
#include "vm/message.h"
#include "vm/native_entry.h"
#include "vm/native_message_handler.h"
@@ -86,6 +87,53 @@
}
+// NOTE: Need to pass 'result' as a parameter here in order to avoid
+// warning: variable 'result' might be clobbered by 'longjmp' or 'vfork'
+// which shows up because of the use of setjmp.
+static void InvokeStatic(Isolate* isolate,
+ const Function& function,
+ GrowableArray<const Object*>& args,
+ Dart_Handle* result) {
+ ASSERT(isolate != NULL);
+ LongJump* base = isolate->long_jump_base();
+ LongJump jump;
+ isolate->set_long_jump_base(&jump);
+ if (setjmp(*jump.Set()) == 0) {
+ const Array& kNoArgumentNames = Array::Handle();
+ const Instance& retval = Instance::Handle(
+ DartEntry::InvokeStatic(function, args, kNoArgumentNames));
+ *result = Api::NewLocalHandle(retval);
+ } else {
+ SetupErrorResult(result);
+ }
+ isolate->set_long_jump_base(base);
+}
+
+
+// NOTE: Need to pass 'result' as a parameter here in order to avoid
+// warning: variable 'result' might be clobbered by 'longjmp' or 'vfork'
+// which shows up because of the use of setjmp.
+static void InvokeDynamic(Isolate* isolate,
+ const Instance& receiver,
+ const Function& function,
+ GrowableArray<const Object*>& args,
+ Dart_Handle* result) {
+ ASSERT(isolate != NULL);
+ LongJump* base = isolate->long_jump_base();
+ LongJump jump;
+ isolate->set_long_jump_base(&jump);
+ if (setjmp(*jump.Set()) == 0) {
+ const Array& kNoArgumentNames = Array::Handle();
+ const Instance& retval = Instance::Handle(
+ DartEntry::InvokeDynamic(receiver, function, args, kNoArgumentNames));
+ *result = Api::NewLocalHandle(retval);
+ } else {
+ SetupErrorResult(result);
+ }
+ isolate->set_long_jump_base(base);
+}
+
+
Dart_Handle Api::NewLocalHandle(const Object& object) {
Isolate* isolate = Isolate::Current();
ASSERT(isolate != NULL);
@@ -325,33 +373,6 @@
}
-DART_EXPORT Dart_Handle Dart_PropagateError(Dart_Handle handle) {
- Isolate* isolate = Isolate::Current();
- CHECK_ISOLATE(isolate);
- const Object& error = Object::Handle(Api::UnwrapHandle(handle));
- if (!error.IsError()) {
- return Api::NewError(
- "%s expects argument 'handle' to be an error handle. "
- "Did you forget to check Dart_IsError first?",
- CURRENT_FUNC);
- }
- if (isolate->top_exit_frame_info() == 0) {
- // There are no dart frames on the stack so it would be illegal to
- // propagate an error here.
- return Api::NewError("No Dart frames on stack, cannot propagate error.");
- }
-
- // Unwind all the API scopes till the exit frame before propagating.
- ApiState* state = isolate->api_state();
- ASSERT(state != NULL);
- state->UnwindScopes(isolate->top_exit_frame_info());
- Exceptions::PropagateError(error);
- UNREACHABLE();
-
- return Api::NewError("Cannot reach here. Internal error.");
-}
-
-
DART_EXPORT void _Dart_ReportErrorHandle(const char* file,
int line,
const char* handle,
@@ -479,17 +500,24 @@
char** error) {
Isolate* isolate = Dart::CreateIsolate(name_prefix);
assert(isolate != NULL);
- DARTSCOPE_NOCHECKS(isolate);
- const Error& error_obj =
- Error::Handle(Dart::InitializeIsolate(snapshot, callback_data));
- if (error_obj.IsNull()) {
+ LongJump* base = isolate->long_jump_base();
+ LongJump jump;
+ isolate->set_long_jump_base(&jump);
+ if (setjmp(*jump.Set()) == 0) {
+ Dart::InitializeIsolate(snapshot, callback_data);
START_TIMER(time_total_runtime);
+ isolate->set_long_jump_base(base);
return reinterpret_cast<Dart_Isolate>(isolate);
} else {
- *error = strdup(error_obj.ToErrorCString());
+ {
+ DARTSCOPE_NOCHECKS(isolate);
+ const Error& error_obj =
+ Error::Handle(isolate->object_store()->sticky_error());
+ *error = strdup(error_obj.ToErrorCString());
+ }
Dart::ShutdownIsolate();
- return reinterpret_cast<Dart_Isolate>(NULL);
}
+ return reinterpret_cast<Dart_Isolate>(NULL);
}
@@ -608,12 +636,24 @@
DART_EXPORT Dart_Handle Dart_RunLoop() {
Isolate* isolate = Isolate::Current();
DARTSCOPE(isolate);
- const Object& obj = Object::Handle(isolate->StandardRunLoop());
- if (obj.IsError()) {
- return Api::NewLocalHandle(obj);
+
+ LongJump* base = isolate->long_jump_base();
+ LongJump jump;
+ Dart_Handle result;
+ isolate->set_long_jump_base(&jump);
+ if (setjmp(*jump.Set()) == 0) {
+ const Object& obj = Object::Handle(isolate->StandardRunLoop());
+ if (obj.IsError()) {
+ result = Api::NewLocalHandle(obj);
+ } else {
+ ASSERT(obj.IsNull());
+ result = Api::Success();
+ }
+ } else {
+ SetupErrorResult(&result);
}
- ASSERT(obj.IsNull());
- return Api::Success();
+ isolate->set_long_jump_base(base);
+ return result;
}
@@ -753,9 +793,9 @@
Resolver::kIsQualified));
GrowableArray<const Object*> arguments(kNumArguments);
arguments.Add(&Integer::Handle(Integer::New(port_id)));
- const Object& result = Object::Handle(
- DartEntry::InvokeStatic(function, arguments, kNoArgumentNames));
- return Api::NewLocalHandle(result);
+ Dart_Handle result;
+ InvokeStatic(isolate, function, arguments, &result);
+ return result;
}
@@ -777,9 +817,9 @@
Resolver::kIsQualified));
GrowableArray<const Object*> arguments(kNumArguments);
arguments.Add(&Integer::Handle(Integer::New(port_id)));
- const Object& result = Object::Handle(
- DartEntry::InvokeStatic(function, arguments, kNoArgumentNames));
- return Api::NewLocalHandle(result);
+ Dart_Handle result;
+ InvokeStatic(isolate, function, arguments, &result);
+ return result;
}
@@ -836,8 +876,8 @@
DARTSCOPE(Isolate::Current());
const Instance& expected = Instance::CheckedHandle(Api::UnwrapHandle(obj1));
const Instance& actual = Instance::CheckedHandle(Api::UnwrapHandle(obj2));
- const Object& result =
- Object::Handle(DartLibraryCalls::Equals(expected, actual));
+ const Instance& result =
+ Instance::Handle(DartLibraryCalls::Equals(expected, actual));
if (result.IsBool()) {
Bool& b = Bool::Handle();
b ^= result.raw();
@@ -1366,41 +1406,84 @@
// TODO(5526318): Make access to GrowableObjectArray more efficient.
// Now check and handle a dart object that implements the List interface.
const Instance& instance = Instance::Handle(GetListInstance(isolate, obj));
- if (instance.IsNull()) {
- return Api::NewError("Object does not implement the List inteface");
+ if (!instance.IsNull()) {
+ String& name = String::Handle(String::New("length"));
+ name = Field::GetterName(name);
+ const Function& function = Function::Handle(
+ Resolver::ResolveDynamic(instance, name, 1, 0));
+ if (!function.IsNull()) {
+ GrowableArray<const Object*> args(0);
+ LongJump* base = isolate->long_jump_base();
+ LongJump jump;
+ isolate->set_long_jump_base(&jump);
+ Dart_Handle result;
+ if (setjmp(*jump.Set()) == 0) {
+ const Array& kNoArgumentNames = Array::Handle();
+ const Instance& retval = Instance::Handle(
+ DartEntry::InvokeDynamic(instance,
+ function,
+ args,
+ kNoArgumentNames));
+ result = Api::Success();
+ if (retval.IsSmi() || retval.IsMint()) {
+ Integer& integer = Integer::Handle();
+ integer ^= retval.raw();
+ *len = integer.AsInt64Value();
+ } else if (retval.IsBigint()) {
+ Bigint& bigint = Bigint::Handle();
+ bigint ^= retval.raw();
+ if (BigintOperations::FitsIntoInt64(bigint)) {
+ *len = BigintOperations::ToInt64(bigint);
+ } else {
+ result =
+ Api::NewError("Length of List object is greater than the "
+ "maximum value that 'len' parameter can hold");
+ }
+ } else if (retval.IsError()) {
+ result = Api::NewLocalHandle(retval);
+ } else {
+ result = Api::NewError("Length of List object is not an integer");
+ }
+ } else {
+ SetupErrorResult(&result);
+ }
+ isolate->set_long_jump_base(base);
+ return result;
+ }
}
- String& name = String::Handle(String::New("length"));
- name = Field::GetterName(name);
- const Function& function = Function::Handle(
- Resolver::ResolveDynamic(instance, name, 1, 0));
- if (function.IsNull()) {
- return Api::NewError("List object does not have a 'length' field.");
- }
+ return Api::NewError("Object does not implement the 'List' inteface");
+}
- GrowableArray<const Object*> args(0);
- const Array& kNoArgumentNames = Array::Handle();
- const Object& retval = Object::Handle(
- DartEntry::InvokeDynamic(instance, function, args, kNoArgumentNames));
- if (retval.IsSmi() || retval.IsMint()) {
- Integer& integer = Integer::Handle();
- integer ^= retval.raw();
- *len = integer.AsInt64Value();
- return Api::Success();
- } else if (retval.IsBigint()) {
- Bigint& bigint = Bigint::Handle();
- bigint ^= retval.raw();
- if (BigintOperations::FitsIntoInt64(bigint)) {
- *len = BigintOperations::ToInt64(bigint);
- return Api::Success();
+static RawObject* GetListAt(Isolate* isolate,
+ const Instance& instance,
+ const Integer& index,
+ const Function& function,
+ Dart_Handle* result) {
+ ASSERT(isolate != NULL);
+ ASSERT(result != NULL);
+ LongJump* base = isolate->long_jump_base();
+ LongJump jump;
+ isolate->set_long_jump_base(&jump);
+ if (setjmp(*jump.Set()) == 0) {
+ Instance& retval = Instance::Handle();
+ GrowableArray<const Object*> args(0);
+ args.Add(&index);
+ const Array& kNoArgumentNames = Array::Handle();
+ retval = DartEntry::InvokeDynamic(instance,
+ function,
+ args,
+ kNoArgumentNames);
+ if (retval.IsError()) {
+ *result = Api::NewLocalHandle(retval);
} else {
- return Api::NewError("Length of List object is greater than the "
- "maximum value that 'len' parameter can hold");
+ *result = Api::Success();
}
- } else if (retval.IsError()) {
- return Api::NewLocalHandle(retval);
- } else {
- return Api::NewError("Length of List object is not an integer");
+ isolate->set_long_jump_base(base);
+ return retval.raw();
}
+ SetupErrorResult(result);
+ isolate->set_long_jump_base(base);
+ return Object::null();
}
@@ -1425,20 +1508,54 @@
const Function& function = Function::Handle(
Resolver::ResolveDynamic(instance, name, 2, 0));
if (!function.IsNull()) {
- GrowableArray<const Object*> args(1);
+ Object& element = Object::Handle();
Integer& indexobj = Integer::Handle();
+ Dart_Handle result;
indexobj = Integer::New(index);
- args.Add(&indexobj);
- const Array& kNoArgumentNames = Array::Handle();
- const Object& result = Object::Handle(
- DartEntry::InvokeDynamic(instance, function, args, kNoArgumentNames));
- return Api::NewLocalHandle(result);
+ element = GetListAt(isolate, instance, indexobj, function, &result);
+ if (::Dart_IsError(result)) {
+ return result; // Error condition.
+ }
+ return Api::NewLocalHandle(element);
}
}
return Api::NewError("Object does not implement the 'List' interface");
}
+static void SetListAt(Isolate* isolate,
+ const Instance& instance,
+ const Integer& index,
+ const Object& value,
+ const Function& function,
+ Dart_Handle* result) {
+ ASSERT(isolate != NULL);
+ ASSERT(result != NULL);
+ LongJump* base = isolate->long_jump_base();
+ LongJump jump;
+ isolate->set_long_jump_base(&jump);
+ if (setjmp(*jump.Set()) == 0) {
+ GrowableArray<const Object*> args(1);
+ args.Add(&index);
+ args.Add(&value);
+ Instance& retval = Instance::Handle();
+ const Array& kNoArgumentNames = Array::Handle();
+ retval = DartEntry::InvokeDynamic(instance,
+ function,
+ args,
+ kNoArgumentNames);
+ if (retval.IsError()) {
+ *result = Api::NewLocalHandle(retval);
+ } else {
+ *result = Api::Success();
+ }
+ } else {
+ SetupErrorResult(result);
+ }
+ isolate->set_long_jump_base(base);
+}
+
+
DART_EXPORT Dart_Handle Dart_ListSetAt(Dart_Handle list,
intptr_t index,
Dart_Handle value) {
@@ -1466,15 +1583,11 @@
const Function& function = Function::Handle(
Resolver::ResolveDynamic(instance, name, 3, 0));
if (!function.IsNull()) {
+ Dart_Handle result;
const Integer& index_obj = Integer::Handle(Integer::New(index));
const Object& value_obj = Object::Handle(Api::UnwrapHandle(value));
- GrowableArray<const Object*> args(2);
- args.Add(&index_obj);
- args.Add(&value_obj);
- const Array& kNoArgumentNames = Array::Handle();
- const Object& result = Object::Handle(
- DartEntry::InvokeDynamic(instance, function, args, kNoArgumentNames));
- return Api::NewLocalHandle(result);
+ SetListAt(isolate, instance, index_obj, value_obj, function, &result);
+ return result;
}
}
return Api::NewError("Object does not implement the 'List' interface");
@@ -1527,23 +1640,20 @@
const Function& function = Function::Handle(
Resolver::ResolveDynamic(instance, name, 2, 0));
if (!function.IsNull()) {
- Object& result = Object::Handle();
+ Object& element = Object::Handle();
Integer& intobj = Integer::Handle();
+ Dart_Handle result;
for (int i = 0; i < length; i++) {
intobj = Integer::New(offset + i);
- GrowableArray<const Object*> args(1);
- args.Add(&intobj);
- const Array& kNoArgumentNames = Array::Handle();
- result = DartEntry::InvokeDynamic(
- instance, function, args, kNoArgumentNames);
- if (result.IsError()) {
- return Api::NewLocalHandle(result);
+ element = GetListAt(isolate, instance, intobj, function, &result);
+ if (::Dart_IsError(result)) {
+ return result; // Error condition.
}
- if (!result.IsInteger()) {
+ if (!element.IsInteger()) {
return Api::NewError("%s expects the argument 'list' to be "
- "a List of int", CURRENT_FUNC);
+ "a List of int", CURRENT_FUNC);
}
- intobj ^= result.raw();
+ intobj ^= element.raw();
ASSERT(intobj.AsInt64Value() <= 0xff);
// TODO(hpayer): value should always be smaller then 0xff. Add error
// handling.
@@ -1591,6 +1701,7 @@
// TODO(5526318): Make access to GrowableObjectArray more efficient.
// Now check and handle a dart object that implements the List interface.
const Instance& instance = Instance::Handle(GetListInstance(isolate, obj));
+ Dart_Handle result;
if (!instance.IsNull()) {
String& name = String::Handle(String::New("[]="));
const Function& function = Function::Handle(
@@ -1601,15 +1712,9 @@
for (int i = 0; i < length; i++) {
indexobj = Integer::New(offset + i);
valueobj = Integer::New(native_array[i]);
- GrowableArray<const Object*> args(2);
- args.Add(&indexobj);
- args.Add(&valueobj);
- const Array& kNoArgumentNames = Array::Handle();
- const Object& result = Object::Handle(
- DartEntry::InvokeDynamic(
- instance, function, args, kNoArgumentNames));
- if (result.IsError()) {
- return Api::NewLocalHandle(result);
+ SetListAt(isolate, instance, indexobj, valueobj, function, &result);
+ if (::Dart_IsError(result)) {
+ return result; // Error condition.
}
}
return Api::Success();
@@ -1647,6 +1752,29 @@
}
+// NOTE: Need to pass 'result' as a parameter here in order to avoid
+// warning: variable 'result' might be clobbered by 'longjmp' or 'vfork'
+// which shows up because of the use of setjmp.
+static void InvokeClosure(Isolate* isolate,
+ const Closure& closure,
+ GrowableArray<const Object*>& args,
+ Dart_Handle* result) {
+ ASSERT(isolate != NULL);
+ LongJump* base = isolate->long_jump_base();
+ LongJump jump;
+ isolate->set_long_jump_base(&jump);
+ if (setjmp(*jump.Set()) == 0) {
+ const Array& kNoArgumentNames = Array::Handle();
+ const Instance& retval = Instance::Handle(
+ DartEntry::InvokeClosure(closure, args, kNoArgumentNames));
+ *result = Api::NewLocalHandle(retval);
+ } else {
+ SetupErrorResult(result);
+ }
+ isolate->set_long_jump_base(base);
+}
+
+
DART_EXPORT Dart_Handle Dart_InvokeClosure(Dart_Handle closure,
int number_of_arguments,
Dart_Handle* arguments) {
@@ -1664,15 +1792,14 @@
// Now try to invoke the closure.
Closure& closure_obj = Closure::Handle();
closure_obj ^= obj.raw();
+ Dart_Handle retval;
GrowableArray<const Object*> dart_arguments(number_of_arguments);
for (int i = 0; i < number_of_arguments; i++) {
const Object& arg = Object::Handle(Api::UnwrapHandle(arguments[i]));
dart_arguments.Add(&arg);
}
- const Array& kNoArgumentNames = Array::Handle();
- const Object& result = Object::Handle(
- DartEntry::InvokeClosure(closure_obj, dart_arguments, kNoArgumentNames));
- return Api::NewLocalHandle(result);
+ InvokeClosure(isolate, closure_obj, dart_arguments, &retval);
+ return retval;
}
@@ -1749,10 +1876,9 @@
const Object& arg = Object::Handle(Api::UnwrapHandle(arguments[i]));
dart_arguments.Add(&arg);
}
- const Array& kNoArgumentNames = Array::Handle();
- const Object& result = Object::Handle(
- DartEntry::InvokeStatic(function, dart_arguments, kNoArgumentNames));
- return Api::NewLocalHandle(result);
+ Dart_Handle retval;
+ InvokeStatic(isolate, function, dart_arguments, &retval);
+ return retval;
}
@@ -1793,11 +1919,9 @@
const Object& arg = Object::Handle(Api::UnwrapHandle(arguments[i]));
dart_arguments.Add(&arg);
}
- const Array& kNoArgumentNames = Array::Handle();
- const Object& result = Object::Handle(
- DartEntry::InvokeDynamic(
- receiver, function, dart_arguments, kNoArgumentNames));
- return Api::NewLocalHandle(result);
+ Dart_Handle retval;
+ InvokeDynamic(isolate, receiver, function, dart_arguments, &retval);
+ return retval;
}
@@ -1904,10 +2028,8 @@
Function& func = Function::Handle();
func ^= obj.raw();
GrowableArray<const Object*> args;
- const Array& kNoArgumentNames = Array::Handle();
- const Object& result = Object::Handle(
- DartEntry::InvokeStatic(func, args, kNoArgumentNames));
- return Api::NewLocalHandle(result);
+ InvokeStatic(isolate, func, args, &result);
+ return result;
}
}
@@ -1953,10 +2075,8 @@
Function& func = Function::Handle();
func ^= Api::UnwrapHandle(result);
GrowableArray<const Object*> arguments;
- const Array& kNoArgumentNames = Array::Handle();
- const Object& retval = Object::Handle(
- DartEntry::InvokeDynamic(object, func, arguments, kNoArgumentNames));
- return Api::NewLocalHandle(retval);
+ InvokeDynamic(isolate, object, func, arguments, &result);
+ return result;
}
@@ -1980,10 +2100,8 @@
GrowableArray<const Object*> arguments(1);
const Object& arg = Object::Handle(Api::UnwrapHandle(value));
arguments.Add(&arg);
- const Array& kNoArgumentNames = Array::Handle();
- const Object& retval = Object::Handle(
- DartEntry::InvokeDynamic(object, func, arguments, kNoArgumentNames));
- return Api::NewLocalHandle(retval);
+ InvokeDynamic(isolate, object, func, arguments, &result);
+ return result;
}
@@ -2147,18 +2265,22 @@
}
const Script& script = Script::Handle(Script::New(url, source, kind));
ASSERT(isolate != NULL);
- const Error& error = Error::Handle(Compiler::Compile(lib, script));
- if (error.IsNull()) {
+ LongJump* base = isolate->long_jump_base();
+ LongJump jump;
+ isolate->set_long_jump_base(&jump);
+ if (setjmp(*jump.Set()) == 0) {
+ Compiler::Compile(lib, script);
*result = Api::NewLocalHandle(lib);
if (update_lib_status) {
lib.SetLoaded();
}
} else {
- *result = Api::NewLocalHandle(error);
+ SetupErrorResult(result);
if (update_lib_status) {
lib.SetLoadError();
}
}
+ isolate->set_long_jump_base(base);
}
@@ -2230,13 +2352,17 @@
static void CompileAll(Isolate* isolate, Dart_Handle* result) {
+ *result = Api::Success();
ASSERT(isolate != NULL);
- const Error& error = Error::Handle(Library::CompileAll());
- if (error.IsNull()) {
- *result = Api::Success();
+ LongJump* base = isolate->long_jump_base();
+ LongJump jump;
+ isolate->set_long_jump_base(&jump);
+ if (setjmp(*jump.Set()) == 0) {
+ Library::CompileAll();
} else {
- *result = Api::NewLocalHandle(error);
+ SetupErrorResult(result);
}
+ isolate->set_long_jump_base(base);
}
« no previous file with comments | « runtime/vm/dart.cc ('k') | runtime/vm/dart_api_impl_test.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698