| Index: runtime/vm/code_generator.cc
|
| ===================================================================
|
| --- runtime/vm/code_generator.cc (revision 3862)
|
| +++ runtime/vm/code_generator.cc (working copy)
|
| @@ -431,7 +431,10 @@
|
| return Code::null();
|
| } else {
|
| if (!function.HasCode()) {
|
| - Compiler::CompileFunction(function);
|
| + const Error& error = Error::Handle(Compiler::CompileFunction(function));
|
| + if (!error.IsNull()) {
|
| + Exceptions::PropagateError(error);
|
| + }
|
| }
|
| functions_cache.AddCompiledFunction(function,
|
| num_arguments,
|
| @@ -443,13 +446,9 @@
|
|
|
| // Result of an invoke may be an unhandled exception, in which case we
|
| // rethrow it.
|
| -static void CheckResultException(const Instance& result) {
|
| - if (result.IsUnhandledException()) {
|
| - const UnhandledException& unhandled = UnhandledException::Handle(
|
| - reinterpret_cast<RawUnhandledException*>(result.raw()));
|
| - const Instance& excp = Instance::Handle(unhandled.exception());
|
| - const Instance& stack = Instance::Handle(unhandled.stacktrace());
|
| - Exceptions::ReThrow(excp, stack);
|
| +static void CheckResultError(const Object& result) {
|
| + if (result.IsError()) {
|
| + Exceptions::PropagateError(result);
|
| }
|
| }
|
|
|
| @@ -482,7 +481,10 @@
|
| // further tests.
|
| const Function& function = Function::CheckedHandle(arguments.At(0));
|
| if (!function.HasCode()) {
|
| - Compiler::CompileFunction(function);
|
| + const Error& error = Error::Handle(Compiler::CompileFunction(function));
|
| + if (!error.IsNull()) {
|
| + Exceptions::PropagateError(error);
|
| + }
|
| }
|
| }
|
|
|
| @@ -707,15 +709,19 @@
|
| }
|
| GrowableArray<const Object*> invoke_arguments(0);
|
| const Array& kNoArgumentNames = Array::Handle();
|
| - const Instance& result =
|
| - Instance::Handle(
|
| - DartEntry::InvokeDynamic(receiver,
|
| - function,
|
| - invoke_arguments,
|
| - kNoArgumentNames));
|
| - if (result.IsUnhandledException()) {
|
| - arguments.SetReturn(code);
|
| - return; // Error accessing getter, treat as no such method.
|
| + const Object& result =
|
| + Object::Handle(DartEntry::InvokeDynamic(receiver,
|
| + function,
|
| + invoke_arguments,
|
| + kNoArgumentNames));
|
| + if (result.IsError()) {
|
| + if (result.IsUnhandledException()) {
|
| + // If the getter throws an exception, treat as no such method.
|
| + arguments.SetReturn(code);
|
| + return;
|
| + } else {
|
| + Exceptions::PropagateError(result);
|
| + }
|
| }
|
| if (!result.IsSmi()) {
|
| const Class& cls = Class::Handle(result.clazz());
|
| @@ -743,7 +749,10 @@
|
| const Function& function = Function::Handle(closure.function());
|
| ASSERT(!function.IsNull());
|
| if (!function.HasCode()) {
|
| - Compiler::CompileFunction(function);
|
| + const Error& error = Error::Handle(Compiler::CompileFunction(function));
|
| + if (!error.IsNull()) {
|
| + Exceptions::PropagateError(error);
|
| + }
|
| }
|
| const Context& context = Context::Handle(closure.context());
|
| const Code& code = Code::Handle(function.code());
|
| @@ -792,12 +801,12 @@
|
| DartEntry::invokestub entrypoint = reinterpret_cast<DartEntry::invokestub>(
|
| StubCode::InvokeDartCodeEntryPoint());
|
| ASSERT(context.isolate() == Isolate::Current());
|
| - const Instance& result = Instance::Handle(
|
| + const Object& result = Object::Handle(
|
| entrypoint(instrs.EntryPoint(),
|
| adjusted_arg_descriptor,
|
| invoke_arguments.data(),
|
| context));
|
| - CheckResultException(result);
|
| + CheckResultError(result);
|
| arguments.SetReturn(result);
|
| }
|
|
|
| @@ -833,12 +842,12 @@
|
| GrowableArray<const Object*> invoke_arguments(2);
|
| invoke_arguments.Add(&original_function_name);
|
| invoke_arguments.Add(&orig_arguments);
|
| - const Instance& result = Instance::Handle(
|
| + const Object& result = Object::Handle(
|
| DartEntry::InvokeDynamic(receiver,
|
| function,
|
| invoke_arguments,
|
| kNoArgumentNames));
|
| - CheckResultException(result);
|
| + CheckResultError(result);
|
| arguments.SetReturn(result);
|
| }
|
|
|
| @@ -918,7 +927,11 @@
|
| ASSERT(!Code::Handle(function.code()).is_optimized());
|
| const Code& unoptimized_code = Code::Handle(function.code());
|
| // Compilation patches the entry of unoptimized code.
|
| - Compiler::CompileOptimizedFunction(function);
|
| + const Error& error =
|
| + Error::Handle(Compiler::CompileOptimizedFunction(function));
|
| + if (!error.IsNull()) {
|
| + Exceptions::PropagateError(error);
|
| + }
|
| const Code& optimized_code = Code::Handle(function.code());
|
| ASSERT(!optimized_code.IsNull());
|
| ASSERT(!unoptimized_code.IsNull());
|
| @@ -1025,7 +1038,10 @@
|
| if (Code::Handle(function.code()).is_optimized()) {
|
| // Get unoptimized code. Compilation restores (reenables) the entry of
|
| // unoptimized code.
|
| - Compiler::CompileFunction(function);
|
| + const Error& error = Error::Handle(Compiler::CompileFunction(function));
|
| + if (!error.IsNull()) {
|
| + Exceptions::PropagateError(error);
|
| + }
|
| }
|
| // TODO(srdjan): Handle better complex cases, e.g. when an older optimized
|
| // code is alive on frame and gets deoptimized after the function was
|
|
|