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

Unified Diff: lib/src/compiler/code_generator.dart

Issue 1927353002: Use lazy static fields when overriding static getters or setters. (Closed) Base URL: git@github.com:dart-lang/dev_compiler.git@master
Patch Set: Created 4 years, 8 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 | « no previous file | lib/src/compiler/js_field_storage.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: lib/src/compiler/code_generator.dart
diff --git a/lib/src/compiler/code_generator.dart b/lib/src/compiler/code_generator.dart
index afc215888c7717e1d980700366cea3921e415cff..bfc7dc95e960e65c47c14f4b018e088ee168da51 100644
--- a/lib/src/compiler/code_generator.dart
+++ b/lib/src/compiler/code_generator.dart
@@ -546,13 +546,14 @@ class CodeGenerator extends GeneralizingAstVisitor
className = _emitTopLevelName(classElem);
}
+ var allFields = new List.from(fields)..addAll(staticFields);
var superclasses = getSuperclasses(classElem);
var virtualFields = <FieldElement, JS.TemporaryId>{};
var virtualFieldSymbols = <JS.Statement>[];
- _registerVirtualFields(classElem, className, superclasses, fields,
- virtualFields, virtualFieldSymbols);
+ var staticFieldOverrides = new HashSet<FieldElement>();
+ _registerPropertyOverrides(classElem, className, superclasses, allFields,
+ virtualFields, virtualFieldSymbols, staticFieldOverrides);
- var allFields = new List.from(fields)..addAll(staticFields);
var classExpr = _emitClassExpression(classElem,
_emitClassMethods(node, ctors, fields, superclasses, virtualFields),
fields: allFields);
@@ -579,30 +580,35 @@ class CodeGenerator extends GeneralizingAstVisitor
}
body = <JS.Statement>[classDef];
- _emitStaticFields(staticFields, classElem, body);
+ _emitStaticFields(staticFields, staticFieldOverrides, classElem, body);
_registerExtensionType(classElem, body);
return _statement(body);
}
- void _registerVirtualFields(
+ void _registerPropertyOverrides(
ClassElement classElem,
JS.Expression className,
List<ClassElement> superclasses,
List<FieldDeclaration> fields,
Map<FieldElement, JS.TemporaryId> virtualFields,
- List<JS.Statement> virtualFieldSymbols) {
+ List<JS.Statement> virtualFieldSymbols,
+ Set<FieldElement> staticFieldOverrides) {
for (var field in fields) {
for (VariableDeclaration field in field.fields.variables) {
var overrideInfo = checkForPropertyOverride(
field.element, superclasses, _extensionTypes);
if (overrideInfo.foundGetter || overrideInfo.foundSetter) {
- var fieldName =
- _emitMemberName(field.element.name, type: classElem.type);
- var virtualField = new JS.TemporaryId(field.element.name);
- virtualFields[field.element] = virtualField;
- virtualFieldSymbols.add(js.statement(
- 'const # = Symbol(#.name + "." + #.toString());',
- [virtualField, className, fieldName]));
+ if (field.element.isStatic) {
+ staticFieldOverrides.add(field.element);
+ } else {
+ var fieldName =
+ _emitMemberName(field.element.name, type: classElem.type);
+ var virtualField = new JS.TemporaryId(field.element.name);
+ virtualFields[field.element] = virtualField;
+ virtualFieldSymbols.add(js.statement(
+ 'const # = Symbol(#.name + "." + #.toString());',
+ [virtualField, className, fieldName]));
+ }
}
}
}
@@ -1012,12 +1018,16 @@ class CodeGenerator extends GeneralizingAstVisitor
/// Emits static fields for a class, and initialize them eagerly if possible,
/// otherwise define them as lazy properties.
- void _emitStaticFields(List<FieldDeclaration> staticFields,
- ClassElement classElem, List<JS.Statement> body) {
+ void _emitStaticFields(
+ List<FieldDeclaration> staticFields,
+ Set<FieldElement> staticFieldOverrides,
+ ClassElement classElem,
+ List<JS.Statement> body) {
var lazyStatics = <VariableDeclaration>[];
for (FieldDeclaration member in staticFields) {
for (VariableDeclaration field in member.fields.variables) {
- JS.Statement eagerField = _emitConstantStaticField(classElem, field);
+ JS.Statement eagerField =
+ _emitConstantStaticField(classElem, field, staticFieldOverrides);
if (eagerField != null) {
body.add(eagerField);
} else {
@@ -2573,8 +2583,8 @@ class CodeGenerator extends GeneralizingAstVisitor
/// Otherwise, we'll need to generate a lazy-static field. That ensures
/// correct visible behavior, as well as avoiding referencing something that
/// isn't defined yet (because it is defined later in the module).
- JS.Statement _emitConstantStaticField(
- ClassElement classElem, VariableDeclaration field) {
+ JS.Statement _emitConstantStaticField(ClassElement classElem,
+ VariableDeclaration field, Set<FieldElement> staticFieldOverrides) {
PropertyInducingElement element = field.element;
assert(element.isStatic);
@@ -2586,7 +2596,9 @@ class CodeGenerator extends GeneralizingAstVisitor
isLoaded && (field.isConst || _constField.isFieldInitConstant(field));
var fieldName = field.name.name;
- if (eagerInit && !JS.invalidStaticFieldName(fieldName)) {
+ if (eagerInit &&
+ !JS.invalidStaticFieldName(fieldName) &&
+ !staticFieldOverrides.contains(element)) {
return annotate(
js.statement('#.# = #;', [
_emitTopLevelName(classElem),
« no previous file with comments | « no previous file | lib/src/compiler/js_field_storage.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698