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

Side by Side Diff: pkg/kernel/lib/interpreter/interpreter.dart

Issue 2979293002: Store field locations instead of field values in objects (Closed)
Patch Set: Modify class definition in interpreter according to spec 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 unified diff | Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 library kernel.interpreter; 4 library kernel.interpreter;
5 5
6 import '../ast.dart'; 6 import '../ast.dart';
7 import '../ast.dart' as ast show Class; 7 import '../ast.dart' as ast show Class;
8 8
9 import '../log.dart'; 9 import '../log.dart';
10 export '../log.dart'; 10 export '../log.dart';
(...skipping 1014 matching lines...) Expand 10 before | Expand all | Expand 10 after
1025 // ------------------------------------------------------------------------ 1025 // ------------------------------------------------------------------------
1026 // VALUES 1026 // VALUES
1027 // ------------------------------------------------------------------------ 1027 // ------------------------------------------------------------------------
1028 1028
1029 typedef Value Getter(Value receiver); 1029 typedef Value Getter(Value receiver);
1030 typedef void Setter(Value receiver, Value value); 1030 typedef void Setter(Value receiver, Value value);
1031 1031
1032 class Class { 1032 class Class {
1033 static final Map<Reference, Class> _classes = <Reference, Class>{}; 1033 static final Map<Reference, Class> _classes = <Reference, Class>{};
1034 1034
1035 /// The immediate super class, or `null` if this is the root class object.
1035 Class superclass; 1036 Class superclass;
1036 List<Field> instanceFields = <Field>[];
1037 // Implicit getters and setters for instance Fields.
1038 Map<Name, Getter> getters = <Name, Getter>{};
1039 Map<Name, Setter> setters = <Name, Setter>{};
1040 // The initializers of static fields are evaluated the first time the field
1041 // is accessed.
1042 List<Procedure> methods = <Procedure>[];
1043 1037
1044 int get instanceSize => instanceFields.length; 1038 /// The class definitions from the `implements` clause.
1039 final List<Supertype> interfaces = <Supertype>[];
1040
1041 /// Implicit getters for instance fields.
1042 Map<Name, Getter> implicitGetters = <Name, Getter>{};
1043
1044 /// Implicit setters for non final instance fields.
1045 Map<Name, Setter> implicitSetters = <Name, Setter>{};
1046
1047 /// Instance methods, explicit getters and setters.
1048 Map<Name, Procedure> methods = <Name, Procedure>{};
1049
1050 int get instanceSize => implicitGetters.length;
1045 1051
1046 factory Class(Reference classRef) { 1052 factory Class(Reference classRef) {
1047 return _classes.putIfAbsent( 1053 return _classes.putIfAbsent(
1048 classRef, () => new Class._internal(classRef.asClass)); 1054 classRef, () => new Class._internal(classRef.asClass));
1049 } 1055 }
1050 1056
1051 Class._internal(ast.Class currentClass) { 1057 Class._internal(ast.Class currentClass) {
1052 if (currentClass.superclass != null) { 1058 if (currentClass.superclass != null) {
1053 superclass = new Class(currentClass.superclass.reference); 1059 superclass = new Class(currentClass.superclass.reference);
1054 } 1060 }
1055 1061
1056 _populateInstanceFields(currentClass); 1062 _populateImplicitGettersAndSetters(currentClass);
1057 // TODO: Populate methods. 1063 _populateInstanceMethods(currentClass);
1058 } 1064 }
1059 1065
1060 Getter lookupImplicitGetter(Name name) { 1066 Getter lookupImplicitGetter(Name name) {
1061 Getter getter = getters[name]; 1067 Getter getter = implicitGetters[name];
1062 if (getter != null) return getter; 1068 if (getter != null) return getter;
1063 if (superclass != null) return superclass.lookupImplicitGetter(name); 1069 if (superclass != null) return superclass.lookupImplicitGetter(name);
1064 return (Value receiver) => notImplemented(obj: name); 1070 return (Value receiver) => notImplemented(obj: name);
1065 } 1071 }
1066 1072
1067 Setter lookupImplicitSetter(Name name) { 1073 Setter lookupImplicitSetter(Name name) {
1068 Setter setter = setters[name]; 1074 Setter setter = implicitSetters[name];
1069 if (setter != null) return setter; 1075 if (setter != null) return setter;
1070 if (superclass != null) return superclass.lookupImplicitSetter(name); 1076 if (superclass != null) return superclass.lookupImplicitSetter(name);
1071 return (Value receiver, Value value) => notImplemented(obj: name); 1077 return (Value receiver, Value value) => notImplemented(obj: name);
1072 } 1078 }
1073 1079
1074 Value getProperty(ObjectValue object, Member member) { 1080 /// Populates implicit getters and setters for the current class and its
1075 if (member is Field) { 1081 /// superclass recursively.
1076 int index = instanceFields.indexOf(member); 1082 _populateImplicitGettersAndSetters(ast.Class class_) {
1077 // TODO: throw NoSuchMethodError instead.
1078 if (index < 0) return notImplemented(m: 'NoSuchMethod: ${member}');
1079 return object.fields[index].value;
1080 }
1081 return notImplemented(obj: member);
1082 }
1083
1084 Value setProperty(ObjectValue object, Member member, Value value) {
1085 if (member is Field) {
1086 int index = instanceFields.indexOf(member);
1087 // TODO: throw NoSuchMethodError instead.
1088 if (index < 0) return notImplemented(m: 'NoSuchMethod: ${member}');
1089 object.fields[index] = new Location(value);
1090 return Value.nullInstance;
1091 }
1092 return notImplemented(obj: member);
1093 }
1094
1095 /// Populates instance variables and the corresponding implicit getters and
1096 /// setters for the current class and its superclass recursively.
1097 _populateInstanceFields(ast.Class class_) {
1098 if (class_.superclass != null) { 1083 if (class_.superclass != null) {
1099 _populateInstanceFields(class_.superclass); 1084 _populateImplicitGettersAndSetters(class_.superclass);
1100 } 1085 }
1101 1086
1102 for (Field f in class_.fields) { 1087 for (Field f in class_.fields) {
1103 if (f.isStatic) continue; 1088 if (f.isStatic) continue;
1104 instanceFields.add(f);
1105 assert(f.hasImplicitGetter); 1089 assert(f.hasImplicitGetter);
1106 1090
1107 int currentFieldIndex = instanceFields.length - 1; 1091 int currentFieldIndex = implicitGetters.length;
1108
1109 // Shadowing an inherited getter with the same name. 1092 // Shadowing an inherited getter with the same name.
1110 getters[f.name] = 1093 implicitGetters[f.name] =
1111 (Value receiver) => receiver.fields[currentFieldIndex].value; 1094 (Value receiver) => receiver.fields[currentFieldIndex].value;
1112 if (f.hasImplicitSetter) { 1095 if (f.hasImplicitSetter) {
1113 // Shadowing an inherited setter with the same name. 1096 // Shadowing an inherited setter with the same name.
1114 setters[f.name] = (Value receiver, Value value) => 1097 implicitSetters[f.name] = (Value receiver, Value value) =>
1115 receiver.fields[currentFieldIndex] = new Location(value); 1098 receiver.fields[currentFieldIndex] = new Location(value);
1116 } 1099 }
1117 } 1100 }
1118 } 1101 }
1102
1103 /// Populates instance methods, getters and setters for the current class and
1104 /// its super class recursively.
1105 _populateInstanceMethods(ast.Class class_) {
1106 if (class_.superclass != null) {
1107 _populateInstanceMethods(class_.superclass);
1108 }
1109
1110 for (Procedure p in class_.members) {
1111 if (p.isStatic) continue;
1112 // Shadowing an inherited method, getter or setter with the same name.
1113 methods[p.name] = p;
1114 }
1115 }
1119 } 1116 }
1120 1117
1121 abstract class Value { 1118 abstract class Value {
1122 Class get class_; 1119 Class get class_;
1123 List<Location> get fields; 1120 List<Location> get fields;
1124 Object get value; 1121 Object get value;
1125 1122
1126 static final NullValue nullInstance = const NullValue(); 1123 static final NullValue nullInstance = const NullValue();
1127 static final BoolValue trueInstance = const BoolValue(true); 1124 static final BoolValue trueInstance = const BoolValue(true);
1128 static final BoolValue falseInstance = const BoolValue(false); 1125 static final BoolValue falseInstance = const BoolValue(false);
(...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after
1283 var current = providedArgs.named[i]; 1280 var current = providedArgs.named[i];
1284 args.add(new NamedExpression(current.name, current.value)); 1281 args.add(new NamedExpression(current.name, current.value));
1285 namedFormals.remove(current.name); 1282 namedFormals.remove(current.name);
1286 } 1283 }
1287 1284
1288 // Add missing optional named initializers. 1285 // Add missing optional named initializers.
1289 args.addAll(namedFormals.values); 1286 args.addAll(namedFormals.values);
1290 1287
1291 return args; 1288 return args;
1292 } 1289 }
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698