| Index: runtime/lib/isolate.cc
|
| ===================================================================
|
| --- runtime/lib/isolate.cc (revision 35287)
|
| +++ runtime/lib/isolate.cc (working copy)
|
| @@ -27,36 +27,10 @@
|
| }
|
|
|
|
|
| -// TODO(turnidge): Move to DartLibraryCalls.
|
| -static RawObject* ReceivePortCreate(Dart_Port port_id) {
|
| - Isolate* isolate = Isolate::Current();
|
| - Function& func =
|
| - Function::Handle(isolate,
|
| - isolate->object_store()->receive_port_create_function());
|
| - const int kNumArguments = 1;
|
| - if (func.IsNull()) {
|
| - Library& isolate_lib = Library::Handle(Library::IsolateLibrary());
|
| - ASSERT(!isolate_lib.IsNull());
|
| - const String& class_name =
|
| - String::Handle(isolate_lib.PrivateName(Symbols::_RawReceivePortImpl()));
|
| - const String& function_name =
|
| - String::Handle(isolate_lib.PrivateName(Symbols::_create()));
|
| - func = Resolver::ResolveStatic(isolate_lib,
|
| - class_name,
|
| - function_name,
|
| - kNumArguments,
|
| - Object::empty_array());
|
| - ASSERT(!func.IsNull());
|
| - isolate->object_store()->set_receive_port_create_function(func);
|
| - }
|
| - const Array& args = Array::Handle(isolate, Array::New(kNumArguments));
|
| - args.SetAt(0, Integer::Handle(isolate, Integer::New(port_id)));
|
| - const Object& result =
|
| - Object::Handle(isolate, DartEntry::InvokeFunction(func, args));
|
| - if (!result.IsError()) {
|
| - PortMap::SetLive(port_id);
|
| - }
|
| - return result.raw();
|
| +DEFINE_NATIVE_ENTRY(CapabilityImpl_factory, 1) {
|
| + ASSERT(TypeArguments::CheckedHandle(arguments->NativeArgAt(0)).IsNull());
|
| + uint64_t id = isolate->random()->NextUInt64();
|
| + return Capability::New(id);
|
| }
|
|
|
|
|
| @@ -64,23 +38,48 @@
|
| ASSERT(TypeArguments::CheckedHandle(arguments->NativeArgAt(0)).IsNull());
|
| Dart_Port port_id =
|
| PortMap::CreatePort(arguments->isolate()->message_handler());
|
| - const Object& port = Object::Handle(ReceivePortCreate(port_id));
|
| - if (port.IsError()) {
|
| - Exceptions::PropagateError(Error::Cast(port));
|
| - }
|
| - return port.raw();
|
| + return ReceivePort::New(port_id);
|
| }
|
|
|
|
|
| +DEFINE_NATIVE_ENTRY(RawReceivePortImpl_get_id, 1) {
|
| + GET_NON_NULL_NATIVE_ARGUMENT(ReceivePort, port, arguments->NativeArgAt(0));
|
| + return Integer::NewFromUint64(port.Id());
|
| +}
|
| +
|
| +
|
| +DEFINE_NATIVE_ENTRY(RawReceivePortImpl_get_sendport, 1) {
|
| + GET_NON_NULL_NATIVE_ARGUMENT(ReceivePort, port, arguments->NativeArgAt(0));
|
| + return port.send_port();
|
| +}
|
| +
|
| +
|
| DEFINE_NATIVE_ENTRY(RawReceivePortImpl_closeInternal, 1) {
|
| - GET_NON_NULL_NATIVE_ARGUMENT(Smi, id, arguments->NativeArgAt(0));
|
| - PortMap::ClosePort(id.Value());
|
| - return Object::null();
|
| + GET_NON_NULL_NATIVE_ARGUMENT(ReceivePort, port, arguments->NativeArgAt(0));
|
| + Dart_Port id = port.Id();
|
| + PortMap::ClosePort(id);
|
| + return Integer::NewFromUint64(id);
|
| }
|
|
|
|
|
| +DEFINE_NATIVE_ENTRY(SendPortImpl_get_id, 1) {
|
| + GET_NON_NULL_NATIVE_ARGUMENT(SendPort, port, arguments->NativeArgAt(0));
|
| + return Integer::NewFromUint64(port.Id());
|
| +}
|
| +
|
| +
|
| +DEFINE_NATIVE_ENTRY(SendPortImpl_get_hashcode, 1) {
|
| + GET_NON_NULL_NATIVE_ARGUMENT(SendPort, port, arguments->NativeArgAt(0));
|
| + int64_t id = port.Id();
|
| + int32_t hi = static_cast<int32_t>(id >> 32);
|
| + int32_t lo = static_cast<int32_t>(id);
|
| + int32_t hash = (hi ^ lo) & kSmiMax;
|
| + return Smi::New(hash);
|
| +}
|
| +
|
| +
|
| DEFINE_NATIVE_ENTRY(SendPortImpl_sendInternal_, 2) {
|
| - GET_NON_NULL_NATIVE_ARGUMENT(Smi, send_id, arguments->NativeArgAt(0));
|
| + GET_NON_NULL_NATIVE_ARGUMENT(SendPort, port, arguments->NativeArgAt(0));
|
| // TODO(iposva): Allow for arbitrary messages to be sent.
|
| GET_NON_NULL_NATIVE_ARGUMENT(Instance, obj, arguments->NativeArgAt(1));
|
|
|
| @@ -89,7 +88,7 @@
|
| writer.WriteMessage(obj);
|
|
|
| // TODO(turnidge): Throw an exception when the return value is false?
|
| - PortMap::PostMessage(new Message(send_id.Value(),
|
| + PortMap::PostMessage(new Message(port.Id(),
|
| data, writer.BytesWritten(),
|
| Message::kNormalPriority));
|
| return Object::null();
|
| @@ -178,13 +177,8 @@
|
| }
|
|
|
| // Try to create a SendPort for the new isolate.
|
| - const Object& port = Object::Handle(
|
| - DartLibraryCalls::NewSendPort(state->isolate()->main_port()));
|
| - if (port.IsError()) {
|
| - state->Cleanup();
|
| - delete state;
|
| - Exceptions::PropagateError(Error::Cast(port));
|
| - }
|
| + const SendPort& port = SendPort::Handle(
|
| + SendPort::New(state->isolate()->main_port()));
|
|
|
| // Start the new isolate if it is already marked as runnable.
|
| MutexLocker ml(state->isolate()->mutex());
|
| @@ -237,17 +231,12 @@
|
|
|
|
|
| DEFINE_NATIVE_ENTRY(Isolate_mainPort, 0) {
|
| - const Object& port = Object::Handle(ReceivePortCreate(isolate->main_port()));
|
| - if (port.IsError()) {
|
| - Exceptions::PropagateError(Error::Cast(port));
|
| - }
|
| -
|
| // The control port is being accessed as a regular port from Dart code. This
|
| // is most likely due to the _startIsolate code in dart:isolate. Account for
|
| // this by increasing the number of open control ports.
|
| isolate->message_handler()->increment_control_ports();
|
|
|
| - return port.raw();
|
| + return ReceivePort::New(isolate->main_port());
|
| }
|
|
|
| } // namespace dart
|
|
|