Index: runtime/vm/object.cc |
diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc |
index 248622662a4be3a742e84099c3c422939abaa036..2ddf729fea1f0cbf3a6d29b3f23b0c3100edf420 100644 |
--- a/runtime/vm/object.cc |
+++ b/runtime/vm/object.cc |
@@ -5601,6 +5601,9 @@ const char* Function::KindToCString(RawFunction::Kind kind) { |
case RawFunction::kClosureFunction: |
return "ClosureFunction"; |
break; |
+ case RawFunction::kImplicitClosureFunction: |
+ return "ImplicitClosureFunction"; |
+ break; |
case RawFunction::kSignatureFunction: |
return "SignatureFunction"; |
break; |
@@ -5987,20 +5990,23 @@ intptr_t Function::NumParameters() const { |
} |
intptr_t Function::NumImplicitParameters() const { |
- if (kind() == RawFunction::kConstructor) { |
+ const RawFunction::Kind k = kind(); |
+ if (k == RawFunction::kConstructor) { |
// Type arguments for factory; instance for generative constructor. |
return 1; |
} |
- if ((kind() == RawFunction::kClosureFunction) || |
- (kind() == RawFunction::kSignatureFunction)) { |
+ if ((k == RawFunction::kClosureFunction) || |
+ (k == RawFunction::kImplicitClosureFunction) || |
+ (k == RawFunction::kSignatureFunction)) { |
return 1; // Closure object. |
} |
if (!is_static()) { |
// Closure functions defined inside instance (i.e. non-static) functions are |
// marked as non-static, but they do not have a receiver. |
// Closures are handled above. |
- ASSERT((kind() != RawFunction::kClosureFunction) && |
- (kind() != RawFunction::kSignatureFunction)); |
+ ASSERT((k != RawFunction::kClosureFunction) && |
+ (k != RawFunction::kImplicitClosureFunction) && |
+ (k != RawFunction::kSignatureFunction)); |
return 1; // Receiver. |
} |
return 0; // No implicit parameters. |
@@ -6530,26 +6536,12 @@ bool Function::IsImplicitConstructor() const { |
return IsGenerativeConstructor() && (token_pos() == end_token_pos()); |
} |
-bool Function::IsImplicitClosureFunction() const { |
- if (!IsClosureFunction()) { |
- return false; |
- } |
- const Function& parent = Function::Handle(parent_function()); |
- return (parent.implicit_closure_function() == raw()); |
-} |
- |
bool Function::IsImplicitStaticClosureFunction(RawFunction* func) { |
NoSafepointScope no_safepoint; |
uint32_t kind_tag = func->ptr()->kind_tag_; |
- if (KindBits::decode(kind_tag) != RawFunction::kClosureFunction) { |
- return false; |
- } |
- if (!StaticBit::decode(kind_tag)) { |
- return false; |
- } |
- RawClosureData* data = reinterpret_cast<RawClosureData*>(func->ptr()->data_); |
- RawFunction* parent_function = data->ptr()->parent_function_; |
- return (parent_function->ptr()->data_ == reinterpret_cast<RawObject*>(func)); |
+ return (KindBits::decode(kind_tag) == |
+ RawFunction::kImplicitClosureFunction) && |
+ StaticBit::decode(kind_tag); |
} |
bool Function::IsConstructorClosureFunction() const { |
@@ -6613,6 +6605,7 @@ RawFunction* Function::New(const String& name, |
result.SetInstructionsSafe( |
Code::Handle(StubCode::LazyCompile_entry()->code())); |
if (kind == RawFunction::kClosureFunction || |
+ kind == RawFunction::kImplicitClosureFunction || |
kind == RawFunction::kConvertedClosureFunction) { |
ASSERT(space == Heap::kOld); |
const ClosureData& data = ClosureData::Handle(ClosureData::New()); |
@@ -6678,15 +6671,22 @@ RawFunction* Function::Clone(const Class& new_owner) const { |
return clone.raw(); |
} |
-RawFunction* Function::NewClosureFunction(const String& name, |
- const Function& parent, |
- TokenPosition token_pos) { |
+RawFunction* Function::NewClosureFunctionWithKind(RawFunction::Kind kind, |
+ const String& name, |
+ const Function& parent, |
+ TokenPosition token_pos) { |
+ ASSERT((kind == RawFunction::kClosureFunction) || |
+ (kind == RawFunction::kImplicitClosureFunction) || |
+ (kind == RawFunction::kConvertedClosureFunction)); |
ASSERT(!parent.IsNull()); |
+ // Only static top-level functions are allowed to be converted right now. |
+ ASSERT((kind != RawFunction::kConvertedClosureFunction) || |
+ parent.is_static()); |
// Use the owner defining the parent function and not the class containing it. |
const Object& parent_owner = Object::Handle(parent.raw_ptr()->owner_); |
ASSERT(!parent_owner.IsNull()); |
const Function& result = Function::Handle( |
- Function::New(name, RawFunction::kClosureFunction, |
+ Function::New(name, kind, |
/* is_static = */ parent.is_static(), |
/* is_const = */ false, |
/* is_abstract = */ false, |
@@ -6696,24 +6696,25 @@ RawFunction* Function::NewClosureFunction(const String& name, |
return result.raw(); |
} |
+RawFunction* Function::NewClosureFunction(const String& name, |
+ const Function& parent, |
+ TokenPosition token_pos) { |
+ return NewClosureFunctionWithKind(RawFunction::kClosureFunction, name, parent, |
+ token_pos); |
+} |
+ |
+RawFunction* Function::NewImplicitClosureFunction(const String& name, |
+ const Function& parent, |
+ TokenPosition token_pos) { |
+ return NewClosureFunctionWithKind(RawFunction::kImplicitClosureFunction, name, |
+ parent, token_pos); |
+} |
+ |
RawFunction* Function::NewConvertedClosureFunction(const String& name, |
const Function& parent, |
TokenPosition token_pos) { |
- ASSERT(!parent.IsNull()); |
- // Only static top-level functions are allowed to be converted right now. |
- ASSERT(parent.is_static()); |
- // Use the owner defining the parent function and not the class containing it. |
- const Object& parent_owner = Object::Handle(parent.raw_ptr()->owner_); |
- ASSERT(!parent_owner.IsNull()); |
- const Function& result = Function::Handle( |
- Function::New(name, RawFunction::kConvertedClosureFunction, |
- /* is_static = */ true, |
- /* is_const = */ false, |
- /* is_abstract = */ false, |
- /* is_external = */ false, |
- /* is_native = */ false, parent_owner, token_pos)); |
- result.set_parent_function(parent); |
- return result.raw(); |
+ return NewClosureFunctionWithKind(RawFunction::kConvertedClosureFunction, |
+ name, parent, token_pos); |
} |
RawFunction* Function::NewSignatureFunction(const Object& owner, |
@@ -6767,7 +6768,7 @@ RawFunction* Function::ImplicitClosureFunction() const { |
// Create closure function. |
const String& closure_name = String::Handle(zone, name()); |
const Function& closure_function = Function::Handle( |
- zone, NewClosureFunction(closure_name, *this, token_pos())); |
+ zone, NewImplicitClosureFunction(closure_name, *this, token_pos())); |
// Set closure function's context scope. |
if (is_static()) { |
@@ -7482,6 +7483,7 @@ const char* Function::ToCString() const { |
switch (kind()) { |
case RawFunction::kRegularFunction: |
case RawFunction::kClosureFunction: |
+ case RawFunction::kImplicitClosureFunction: |
case RawFunction::kConvertedClosureFunction: |
case RawFunction::kGetterFunction: |
case RawFunction::kSetterFunction: |