| Index: runtime/lib/isolate.cc
|
| ===================================================================
|
| --- runtime/lib/isolate.cc (revision 42788)
|
| +++ runtime/lib/isolate.cc (working copy)
|
| @@ -102,7 +102,8 @@
|
| GET_NON_NULL_NATIVE_ARGUMENT(Instance, obj, arguments->NativeArgAt(1));
|
|
|
| uint8_t* data = NULL;
|
| - MessageWriter writer(&data, &allocator);
|
| + bool can_send_any_object = (isolate->origin_id() == port.origin_id());
|
| + MessageWriter writer(&data, &allocator, can_send_any_object);
|
| writer.WriteMessage(obj);
|
|
|
| // TODO(turnidge): Throw an exception when the return value is false?
|
| @@ -178,6 +179,11 @@
|
| Isolate::SetCurrent(parent_isolate);
|
| return false;
|
| }
|
| + if (!state->is_spawn_uri()) {
|
| + // For isolates spawned using the spawnFunction semantics we set
|
| + // the origin_id to the origin_id of the parent isolate.
|
| + child_isolate->set_origin_id(parent_isolate->origin_id());
|
| + }
|
| state->set_isolate(reinterpret_cast<Isolate*>(child_isolate));
|
|
|
| Isolate::SetCurrent(parent_isolate);
|
| @@ -185,8 +191,7 @@
|
| }
|
|
|
|
|
| -static RawObject* Spawn(Isolate* parent_isolate,
|
| - IsolateSpawnState* state) {
|
| +static void Spawn(Isolate* parent_isolate, IsolateSpawnState* state) {
|
| // Create a new isolate.
|
| char* error = NULL;
|
| if (!CreateIsolate(parent_isolate, state, &error)) {
|
| @@ -196,19 +201,13 @@
|
| ThrowIsolateSpawnException(msg);
|
| }
|
|
|
| - // Create a SendPort for the new isolate.
|
| + // Start the new isolate if it is already marked as runnable.
|
| Isolate* spawned_isolate = state->isolate();
|
| - const SendPort& port = SendPort::Handle(
|
| - SendPort::New(spawned_isolate->main_port()));
|
| -
|
| - // Start the new isolate if it is already marked as runnable.
|
| MutexLocker ml(spawned_isolate->mutex());
|
| spawned_isolate->set_spawn_state(state);
|
| if (spawned_isolate->is_runnable()) {
|
| spawned_isolate->Run();
|
| }
|
| -
|
| - return port.raw();
|
| }
|
|
|
|
|
| @@ -226,8 +225,11 @@
|
| ctx = Closure::context(closure);
|
| ASSERT(ctx.num_variables() == 0);
|
| #endif
|
| - return Spawn(isolate, new IsolateSpawnState(
|
| - port.Id(), func, message, paused.value()));
|
| + Spawn(isolate, new IsolateSpawnState(port.Id(),
|
| + func,
|
| + message,
|
| + paused.value()));
|
| + return Object::null();
|
| }
|
| }
|
| const String& msg = String::Handle(String::New(
|
| @@ -265,12 +267,13 @@
|
| utf8_package_root[len] = '\0';
|
| }
|
|
|
| - return Spawn(isolate, new IsolateSpawnState(port.Id(),
|
| - canonical_uri,
|
| - utf8_package_root,
|
| - args,
|
| - message,
|
| - paused.value()));
|
| + Spawn(isolate, new IsolateSpawnState(port.Id(),
|
| + canonical_uri,
|
| + utf8_package_root,
|
| + args,
|
| + message,
|
| + paused.value()));
|
| + return Object::null();
|
| }
|
|
|
|
|
| @@ -293,7 +296,7 @@
|
| msg.SetAt(0, Smi::Handle(Smi::New(Message::kIsolateLibOOBMsg)));
|
|
|
| uint8_t* data = NULL;
|
| - MessageWriter writer(&data, &allocator);
|
| + MessageWriter writer(&data, &allocator, false);
|
| writer.WriteMessage(msg);
|
|
|
| PortMap::PostMessage(new Message(port.Id(),
|
|
|