Index: runtime/vm/object.cc |
=================================================================== |
--- runtime/vm/object.cc (revision 35287) |
+++ runtime/vm/object.cc (working copy) |
@@ -891,10 +891,10 @@ |
TIMERSCOPE(isolate, time_bootstrap); |
ObjectStore* object_store = isolate->object_store(); |
- Class& cls = Class::Handle(); |
- Type& type = Type::Handle(); |
- Array& array = Array::Handle(); |
- Library& lib = Library::Handle(); |
+ Class& cls = Class::Handle(isolate); |
+ Type& type = Type::Handle(isolate); |
+ Array& array = Array::Handle(isolate); |
+ Library& lib = Library::Handle(isolate); |
// All RawArray fields will be initialized to an empty array, therefore |
// initialize array class first. |
@@ -922,7 +922,8 @@ |
// Last element contains the count of used slots. |
const intptr_t kInitialCanonicalTypeArgumentsSize = 4; |
array = Array::New(kInitialCanonicalTypeArgumentsSize + 1); |
- array.SetAt(kInitialCanonicalTypeArgumentsSize, Smi::Handle(Smi::New(0))); |
+ array.SetAt(kInitialCanonicalTypeArgumentsSize, |
+ Smi::Handle(isolate, Smi::New(0))); |
object_store->set_canonical_type_arguments(array); |
// Setup type class early in the process. |
@@ -956,34 +957,34 @@ |
Symbols::SetupSymbolTable(isolate); |
// Set up the libraries array before initializing the core library. |
- const GrowableObjectArray& libraries = |
- GrowableObjectArray::Handle(GrowableObjectArray::New(Heap::kOld)); |
+ const GrowableObjectArray& libraries = GrowableObjectArray::Handle( |
+ isolate, GrowableObjectArray::New(Heap::kOld)); |
object_store->set_libraries(libraries); |
// Pre-register the core library. |
Library::InitCoreLibrary(isolate); |
// Basic infrastructure has been setup, initialize the class dictionary. |
- Library& core_lib = Library::Handle(Library::CoreLibrary()); |
+ const Library& core_lib = Library::Handle(isolate, Library::CoreLibrary()); |
ASSERT(!core_lib.IsNull()); |
const GrowableObjectArray& pending_classes = |
- GrowableObjectArray::Handle(GrowableObjectArray::New()); |
+ GrowableObjectArray::Handle(isolate, GrowableObjectArray::New()); |
object_store->set_pending_classes(pending_classes); |
- Context& context = Context::Handle(Context::New(0, Heap::kOld)); |
+ Context& context = Context::Handle(isolate, Context::New(0, Heap::kOld)); |
object_store->set_empty_context(context); |
// Now that the symbol table is initialized and that the core dictionary as |
// well as the core implementation dictionary have been setup, preallocate |
// remaining classes and register them by name in the dictionaries. |
- String& name = String::Handle(); |
+ String& name = String::Handle(isolate); |
cls = object_store->array_class(); // Was allocated above. |
RegisterPrivateClass(cls, Symbols::_List(), core_lib); |
pending_classes.Add(cls); |
// We cannot use NewNonParameterizedType(cls), because Array is parameterized. |
- type ^= Type::New(Object::Handle(cls.raw()), |
- TypeArguments::Handle(), |
+ type ^= Type::New(Object::Handle(isolate, cls.raw()), |
+ TypeArguments::Handle(isolate), |
Scanner::kNoSourcePos); |
type.SetIsFinalized(); |
type ^= type.Canonicalize(); |
@@ -1021,6 +1022,31 @@ |
RegisterPrivateClass(cls, Symbols::ExternalTwoByteString(), core_lib); |
pending_classes.Add(cls); |
+ // Pre-register the isolate library so the native class implementations |
+ // can be hooked up before compiling it. |
+ Library& isolate_lib = |
+ Library::Handle(isolate, Library::LookupLibrary(Symbols::DartIsolate())); |
+ if (isolate_lib.IsNull()) { |
+ isolate_lib = Library::NewLibraryHelper(Symbols::DartIsolate(), true); |
+ isolate_lib.Register(); |
+ isolate->object_store()->set_bootstrap_library(ObjectStore::kIsolate, |
+ isolate_lib); |
+ } |
+ ASSERT(!isolate_lib.IsNull()); |
+ ASSERT(isolate_lib.raw() == Library::IsolateLibrary()); |
+ |
+ cls = Class::New<Capability>(); |
+ RegisterPrivateClass(cls, Symbols::_CapabilityImpl(), isolate_lib); |
+ pending_classes.Add(cls); |
+ |
+ cls = Class::New<ReceivePort>(); |
+ RegisterPrivateClass(cls, Symbols::_RawReceivePortImpl(), isolate_lib); |
+ pending_classes.Add(cls); |
+ |
+ cls = Class::New<SendPort>(); |
+ RegisterPrivateClass(cls, Symbols::_SendPortImpl(), isolate_lib); |
+ pending_classes.Add(cls); |
+ |
cls = Class::New<Stacktrace>(); |
object_store->set_stacktrace_class(cls); |
RegisterClass(cls, Symbols::StackTrace(), core_lib); |
@@ -1443,6 +1469,10 @@ |
cls = Class::New<Instance>(kNullCid); |
object_store->set_null_class(cls); |
+ cls = Class::New<Capability>(); |
+ cls = Class::New<ReceivePort>(); |
+ cls = Class::New<SendPort>(); |
+ |
cls = Class::New<Stacktrace>(); |
object_store->set_stacktrace_class(cls); |
@@ -14701,7 +14731,7 @@ |
if (!silent && |
FLAG_throw_on_javascript_int_overflow && |
!IsJavascriptInt(value)) { |
- const Integer &i = Integer::Handle(Mint::New(value)); |
+ const Integer& i = Integer::Handle(Mint::New(value)); |
ThrowJavascriptIntegerOverflow(i); |
} |
return Mint::New(value, space); |
@@ -17864,7 +17894,82 @@ |
} |
+RawCapability* Capability::New(uint64_t id, Heap::Space space) { |
+ Capability& result = Capability::Handle(); |
+ { |
+ RawObject* raw = Object::Allocate(Capability::kClassId, |
+ Capability::InstanceSize(), |
+ space); |
+ NoGCScope no_gc; |
+ result ^= raw; |
+ } |
+ result.raw_ptr()->id_ = id; |
+ return result.raw(); |
+} |
+ |
+const char* Capability::ToCString() const { |
+ return "Capability"; |
+} |
+ |
+ |
+void Capability::PrintToJSONStream(JSONStream* stream, bool ref) const { |
+ Instance::PrintToJSONStream(stream, ref); |
+} |
+ |
+ |
+RawReceivePort* ReceivePort::New(Dart_Port id, Heap::Space space) { |
+ Isolate* isolate = Isolate::Current(); |
+ const SendPort& send_port = SendPort::Handle(isolate, SendPort::New(id)); |
+ |
+ ReceivePort& result = ReceivePort::Handle(isolate); |
+ { |
+ RawObject* raw = Object::Allocate(ReceivePort::kClassId, |
+ ReceivePort::InstanceSize(), |
+ space); |
+ NoGCScope no_gc; |
+ result ^= raw; |
+ } |
+ result.raw_ptr()->send_port_ = send_port.raw(); |
+ PortMap::SetLive(id); |
+ return result.raw(); |
+} |
+ |
+ |
+const char* ReceivePort::ToCString() const { |
+ return "ReceivePort"; |
+} |
+ |
+ |
+void ReceivePort::PrintToJSONStream(JSONStream* stream, bool ref) const { |
+ Instance::PrintToJSONStream(stream, ref); |
+} |
+ |
+ |
+RawSendPort* SendPort::New(Dart_Port id, Heap::Space space) { |
+ SendPort& result = SendPort::Handle(); |
+ { |
+ RawObject* raw = Object::Allocate(SendPort::kClassId, |
+ SendPort::InstanceSize(), |
+ space); |
+ NoGCScope no_gc; |
+ result ^= raw; |
+ } |
+ result.raw_ptr()->id_ = id; |
+ return result.raw(); |
+} |
+ |
+ |
+const char* SendPort::ToCString() const { |
+ return "SendPort"; |
+} |
+ |
+ |
+void SendPort::PrintToJSONStream(JSONStream* stream, bool ref) const { |
+ Instance::PrintToJSONStream(stream, ref); |
+} |
+ |
+ |
const char* Closure::ToCString(const Instance& closure) { |
const Function& fun = Function::Handle(Closure::function(closure)); |
const bool is_implicit_closure = fun.IsImplicitClosureFunction(); |