Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(803)

Unified Diff: runtime/vm/object.cc

Issue 2984083002: Revert "Simplify and fix implicit closure check, speed up Closure_equals" (Closed)
Patch Set: Created 3 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « runtime/vm/object.h ('k') | runtime/vm/parser.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: runtime/vm/object.cc
diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc
index 2ddf729fea1f0cbf3a6d29b3f23b0c3100edf420..248622662a4be3a742e84099c3c422939abaa036 100644
--- a/runtime/vm/object.cc
+++ b/runtime/vm/object.cc
@@ -5601,9 +5601,6 @@ 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;
@@ -5990,23 +5987,20 @@ intptr_t Function::NumParameters() const {
}
intptr_t Function::NumImplicitParameters() const {
- const RawFunction::Kind k = kind();
- if (k == RawFunction::kConstructor) {
+ if (kind() == RawFunction::kConstructor) {
// Type arguments for factory; instance for generative constructor.
return 1;
}
- if ((k == RawFunction::kClosureFunction) ||
- (k == RawFunction::kImplicitClosureFunction) ||
- (k == RawFunction::kSignatureFunction)) {
+ if ((kind() == RawFunction::kClosureFunction) ||
+ (kind() == 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((k != RawFunction::kClosureFunction) &&
- (k != RawFunction::kImplicitClosureFunction) &&
- (k != RawFunction::kSignatureFunction));
+ ASSERT((kind() != RawFunction::kClosureFunction) &&
+ (kind() != RawFunction::kSignatureFunction));
return 1; // Receiver.
}
return 0; // No implicit parameters.
@@ -6536,12 +6530,26 @@ 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_;
- return (KindBits::decode(kind_tag) ==
- RawFunction::kImplicitClosureFunction) &&
- StaticBit::decode(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));
}
bool Function::IsConstructorClosureFunction() const {
@@ -6605,7 +6613,6 @@ 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());
@@ -6671,22 +6678,15 @@ RawFunction* Function::Clone(const Class& new_owner) const {
return clone.raw();
}
-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));
+RawFunction* Function::NewClosureFunction(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((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, kind,
+ Function::New(name, RawFunction::kClosureFunction,
/* is_static = */ parent.is_static(),
/* is_const = */ false,
/* is_abstract = */ false,
@@ -6696,25 +6696,24 @@ RawFunction* Function::NewClosureFunctionWithKind(RawFunction::Kind kind,
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) {
- return NewClosureFunctionWithKind(RawFunction::kConvertedClosureFunction,
- name, parent, 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();
}
RawFunction* Function::NewSignatureFunction(const Object& owner,
@@ -6768,7 +6767,7 @@ RawFunction* Function::ImplicitClosureFunction() const {
// Create closure function.
const String& closure_name = String::Handle(zone, name());
const Function& closure_function = Function::Handle(
- zone, NewImplicitClosureFunction(closure_name, *this, token_pos()));
+ zone, NewClosureFunction(closure_name, *this, token_pos()));
// Set closure function's context scope.
if (is_static()) {
@@ -7483,7 +7482,6 @@ 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:
« no previous file with comments | « runtime/vm/object.h ('k') | runtime/vm/parser.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698