| OLD | NEW |
| 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 Loading... |
| 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 Loading... |
| 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 } |
| OLD | NEW |