Index: lib/isolate.cc |
=================================================================== |
--- lib/isolate.cc (revision 13564) |
+++ lib/isolate.cc (working copy) |
@@ -398,10 +398,19 @@ |
DEFINE_NATIVE_ENTRY(isolate_spawnFunction, 1) { |
- GET_NATIVE_ARGUMENT(Closure, closure, arguments->At(0)); |
- const Function& func = Function::Handle(closure.function()); |
- const Class& cls = Class::Handle(func.Owner()); |
- if (!func.IsClosureFunction() || !func.is_static() || !cls.IsTopLevel()) { |
+ GET_NATIVE_ARGUMENT(Instance, closure, arguments->At(0)); |
+ bool throw_exception = false; |
+ Function& func = Function::Handle(); |
+ if (closure.IsClosure()) { |
+ func ^= Closure::function(closure); |
+ const Class& cls = Class::Handle(func.Owner()); |
+ if (!func.IsClosureFunction() || !func.is_static() || !cls.IsTopLevel()) { |
+ throw_exception = true; |
+ } |
+ } else { |
+ throw_exception = true; |
+ } |
+ if (throw_exception) { |
const String& msg = String::Handle(String::New( |
"spawnFunction expects to be passed a closure to a top-level static " |
"function")); |
@@ -409,7 +418,7 @@ |
} |
#if defined(DEBUG) |
- const Context& ctx = Context::Handle(closure.context()); |
+ const Context& ctx = Context::Handle(Closure::context(closure)); |
ASSERT(ctx.num_variables() == 0); |
#endif |