| Index: vm/object.cc
|
| ===================================================================
|
| --- vm/object.cc (revision 13564)
|
| +++ vm/object.cc (working copy)
|
| @@ -1345,8 +1345,7 @@
|
| result.set_handle_vtable(fake.vtable());
|
| result.set_instance_size(FakeObject::InstanceSize());
|
| result.set_next_field_offset(FakeObject::InstanceSize());
|
| - ASSERT((FakeObject::kClassId != kInstanceCid) &&
|
| - (FakeObject::kClassId != kClosureCid));
|
| + ASSERT((FakeObject::kClassId != kInstanceCid));
|
| result.set_id(FakeObject::kClassId);
|
| result.raw_ptr()->state_bits_ = 0;
|
| // VM backed classes are almost ready: run checks and resolve class
|
| @@ -1778,10 +1777,6 @@
|
| }
|
|
|
|
|
| -// Force instantiation of template version to work around ld problems.
|
| -template RawClass* Class::New<Closure>(intptr_t index);
|
| -
|
| -
|
| template <class FakeInstance>
|
| RawClass* Class::New(const String& name,
|
| const Script& script,
|
| @@ -1827,10 +1822,12 @@
|
| type_parameters = owner_class.type_parameters();
|
| }
|
| const intptr_t token_pos = signature_function.token_pos();
|
| - Class& result = Class::Handle(New<Closure>(name, script, token_pos));
|
| + Class& result = Class::Handle(New<Instance>(name, script, token_pos));
|
| const Type& super_type = Type::Handle(Type::ObjectType());
|
| const Array& empty_array = Array::Handle(Object::empty_array());
|
| ASSERT(!super_type.IsNull());
|
| + result.set_instance_size(Closure::InstanceSize());
|
| + result.set_next_field_offset(Closure::InstanceSize());
|
| result.set_super_type(super_type);
|
| result.set_signature_function(signature_function);
|
| result.set_type_parameters(type_parameters);
|
| @@ -3142,7 +3139,7 @@
|
| if (!IsFactory() || (raw_ptr()->data_ == Object::null())) {
|
| return false;
|
| }
|
| - ASSERT(!IsClosure()); // A factory cannot also be a closure.
|
| + ASSERT(!IsClosureFunction()); // A factory cannot also be a closure.
|
| return true;
|
| }
|
|
|
| @@ -8120,6 +8117,12 @@
|
| }
|
|
|
|
|
| +bool Instance::IsClosure() const {
|
| + const Class& cls = Class::Handle(clazz());
|
| + return cls.IsSignatureClass();
|
| +}
|
| +
|
| +
|
| RawInstance* Instance::New(const Class& cls, Heap::Space space) {
|
| Instance& result = Instance::Handle();
|
| {
|
| @@ -8158,8 +8161,11 @@
|
| // Can occur when running disassembler.
|
| return "Instance";
|
| } else {
|
| + if (IsClosure()) {
|
| + return Closure::ToCString(*this);
|
| + }
|
| const char* kFormat = "Instance of '%s'";
|
| - Class& cls = Class::Handle(clazz());
|
| + const Class& cls = Class::Handle(clazz());
|
| AbstractTypeArguments& type_arguments = AbstractTypeArguments::Handle();
|
| const intptr_t num_type_arguments = cls.NumTypeArguments();
|
| if (num_type_arguments > 0) {
|
| @@ -11894,55 +11900,45 @@
|
| }
|
|
|
|
|
| +const char* Closure::ToCString(const Instance& closure) {
|
| + const Function& fun = Function::Handle(Closure::function(closure));
|
| + const bool is_implicit_closure = fun.IsImplicitClosureFunction();
|
| + const char* fun_sig = String::Handle(fun.Signature()).ToCString();
|
| + const char* from = is_implicit_closure ? " from " : "";
|
| + const char* fun_desc = is_implicit_closure ? fun.ToCString() : "";
|
| + const char* format = "Closure: %s%s%s";
|
| + intptr_t len = OS::SNPrint(NULL, 0, format, fun_sig, from, fun_desc) + 1;
|
| + char* chars = Isolate::Current()->current_zone()->Alloc<char>(len);
|
| + OS::SNPrint(chars, len, format, fun_sig, from, fun_desc);
|
| + return chars;
|
| +}
|
|
|
| -RawClosure* Closure::New(const Function& function,
|
| - const Context& context,
|
| - Heap::Space space) {
|
| +
|
| +RawInstance* Closure::New(const Function& function,
|
| + const Context& context,
|
| + Heap::Space space) {
|
| Isolate* isolate = Isolate::Current();
|
| ASSERT(context.isolate() == isolate);
|
|
|
| const Class& cls = Class::Handle(function.signature_class());
|
| - Closure& result = Closure::Handle();
|
| + ASSERT(cls.instance_size() == Closure::InstanceSize());
|
| + Instance& result = Instance::Handle();
|
| {
|
| RawObject* raw = Object::Allocate(cls.id(), Closure::InstanceSize(), space);
|
| NoGCScope no_gc;
|
| result ^= raw;
|
| }
|
| - result.set_function(function);
|
| - result.set_context(context);
|
| + Closure::set_function(result, function);
|
| + Closure::set_context(result, context);
|
| return result.raw();
|
| }
|
|
|
|
|
| -void Closure::set_context(const Context& value) const {
|
| - StorePointer(&raw_ptr()->context_, value.raw());
|
| -}
|
| -
|
| -
|
| -void Closure::set_function(const Function& value) const {
|
| - StorePointer(&raw_ptr()->function_, value.raw());
|
| -}
|
| -
|
| -
|
| const char* DartFunction::ToCString() const {
|
| return "Function type class";
|
| }
|
|
|
|
|
| -const char* Closure::ToCString() const {
|
| - const Function& fun = Function::Handle(function());
|
| - const bool is_implicit_closure = fun.IsImplicitClosureFunction();
|
| - const char* fun_sig = String::Handle(fun.Signature()).ToCString();
|
| - const char* from = is_implicit_closure ? " from " : "";
|
| - const char* fun_desc = is_implicit_closure ? fun.ToCString() : "";
|
| - const char* format = "Closure: %s%s%s";
|
| - intptr_t len = OS::SNPrint(NULL, 0, format, fun_sig, from, fun_desc) + 1;
|
| - char* chars = Isolate::Current()->current_zone()->Alloc<char>(len);
|
| - OS::SNPrint(chars, len, format, fun_sig, from, fun_desc);
|
| - return chars;
|
| -}
|
| -
|
| -
|
| intptr_t Stacktrace::Length() const {
|
| const Array& code_array = Array::Handle(raw_ptr()->code_array_);
|
| return code_array.Length();
|
|
|