OLD | NEW |
1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2016, 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 | 4 |
5 #include <set> | 5 #include <set> |
6 | 6 |
7 #include "vm/kernel_to_il.h" | 7 #include "vm/kernel_to_il.h" |
8 | 8 |
9 #include "vm/compiler.h" | 9 #include "vm/compiler.h" |
10 #include "vm/intermediate_language.h" | 10 #include "vm/intermediate_language.h" |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
65 zone_(translation_helper_.zone()), | 65 zone_(translation_helper_.zone()), |
66 type_translator_(&translation_helper_, &active_class_, /*finalize=*/true), | 66 type_translator_(&translation_helper_, &active_class_, /*finalize=*/true), |
67 current_function_scope_(NULL), | 67 current_function_scope_(NULL), |
68 scope_(NULL), | 68 scope_(NULL), |
69 depth_(0), | 69 depth_(0), |
70 name_index_(0), | 70 name_index_(0), |
71 needs_expr_temp_(false) { | 71 needs_expr_temp_(false) { |
72 Script& script = Script::Handle(Z, parsed_function->function().script()); | 72 Script& script = Script::Handle(Z, parsed_function->function().script()); |
73 H.SetStringOffsets(TypedData::Handle(Z, script.kernel_string_offsets())); | 73 H.SetStringOffsets(TypedData::Handle(Z, script.kernel_string_offsets())); |
74 H.SetStringData(TypedData::Handle(Z, script.kernel_string_data())); | 74 H.SetStringData(TypedData::Handle(Z, script.kernel_string_data())); |
| 75 H.SetCanonicalNames(TypedData::Handle(Z, script.kernel_canonical_names())); |
75 } | 76 } |
76 | 77 |
77 | 78 |
78 void ScopeBuilder::EnterScope(TreeNode* node, TokenPosition start_position) { | 79 void ScopeBuilder::EnterScope(TreeNode* node, TokenPosition start_position) { |
79 scope_ = new (Z) LocalScope(scope_, depth_.function_, depth_.loop_); | 80 scope_ = new (Z) LocalScope(scope_, depth_.function_, depth_.loop_); |
80 scope_->set_begin_token_pos(start_position); | 81 scope_->set_begin_token_pos(start_position); |
81 ASSERT(node->kernel_offset() >= 0); | 82 ASSERT(node->kernel_offset() >= 0); |
82 result_->scopes.Insert(node->kernel_offset(), scope_); | 83 result_->scopes.Insert(node->kernel_offset(), scope_); |
83 } | 84 } |
84 | 85 |
(...skipping 197 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
282 } | 283 } |
283 | 284 |
284 | 285 |
285 ScopeBuildingResult* ScopeBuilder::BuildScopes() { | 286 ScopeBuildingResult* ScopeBuilder::BuildScopes() { |
286 if (result_ != NULL) return result_; | 287 if (result_ != NULL) return result_; |
287 | 288 |
288 ASSERT(scope_ == NULL && depth_.loop_ == 0 && depth_.function_ == 0); | 289 ASSERT(scope_ == NULL && depth_.loop_ == 0 && depth_.function_ == 0); |
289 result_ = new (Z) ScopeBuildingResult(); | 290 result_ = new (Z) ScopeBuildingResult(); |
290 | 291 |
291 ParsedFunction* parsed_function = parsed_function_; | 292 ParsedFunction* parsed_function = parsed_function_; |
292 const dart::Function& function = parsed_function->function(); | 293 const Function& function = parsed_function->function(); |
293 | 294 |
294 // Setup a [ActiveClassScope] and a [ActiveMemberScope] which will be used | 295 // Setup a [ActiveClassScope] and a [ActiveMemberScope] which will be used |
295 // e.g. for type translation. | 296 // e.g. for type translation. |
296 const dart::Class& klass = | 297 const dart::Class& klass = |
297 dart::Class::Handle(zone_, parsed_function_->function().Owner()); | 298 dart::Class::Handle(zone_, parsed_function_->function().Owner()); |
298 Function& outermost_function = Function::Handle(Z); | 299 Function& outermost_function = Function::Handle(Z); |
299 TreeNode* outermost_node = NULL; | 300 TreeNode* outermost_node = NULL; |
300 Class* kernel_class = NULL; | 301 Class* kernel_class = NULL; |
301 DiscoverEnclosingElements(Z, function, &outermost_function, &outermost_node, | 302 DiscoverEnclosingElements(Z, function, &outermost_function, &outermost_node, |
302 &kernel_class); | 303 &kernel_class); |
(...skipping 728 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1031 } | 1032 } |
1032 | 1033 |
1033 | 1034 |
1034 Fragment operator<<(const Fragment& fragment, Instruction* next) { | 1035 Fragment operator<<(const Fragment& fragment, Instruction* next) { |
1035 Fragment result = fragment; | 1036 Fragment result = fragment; |
1036 result <<= next; | 1037 result <<= next; |
1037 return result; | 1038 return result; |
1038 } | 1039 } |
1039 | 1040 |
1040 | 1041 |
1041 TranslationHelper::TranslationHelper(dart::Thread* thread) | 1042 TranslationHelper::TranslationHelper(Thread* thread) |
1042 : thread_(thread), | 1043 : thread_(thread), |
1043 zone_(thread->zone()), | 1044 zone_(thread->zone()), |
1044 isolate_(thread->isolate()), | 1045 isolate_(thread->isolate()), |
1045 allocation_space_(thread->IsMutatorThread() ? Heap::kNew : Heap::kOld), | 1046 allocation_space_(thread->IsMutatorThread() ? Heap::kNew : Heap::kOld), |
1046 string_offsets_(TypedData::Handle(Z)), | 1047 string_offsets_(TypedData::Handle(Z)), |
1047 string_data_(TypedData::Handle(Z)) {} | 1048 string_data_(TypedData::Handle(Z)), |
| 1049 canonical_names_(TypedData::Handle(Z)) {} |
1048 | 1050 |
1049 | 1051 |
1050 void TranslationHelper::SetStringOffsets(const TypedData& string_offsets) { | 1052 void TranslationHelper::SetStringOffsets(const TypedData& string_offsets) { |
1051 ASSERT(string_offsets_.IsNull()); | 1053 ASSERT(string_offsets_.IsNull()); |
1052 string_offsets_ = string_offsets.raw(); | 1054 string_offsets_ = string_offsets.raw(); |
1053 } | 1055 } |
1054 | 1056 |
1055 | 1057 |
1056 void TranslationHelper::SetStringData(const TypedData& string_data) { | 1058 void TranslationHelper::SetStringData(const TypedData& string_data) { |
1057 ASSERT(string_data_.IsNull()); | 1059 ASSERT(string_data_.IsNull()); |
1058 string_data_ = string_data.raw(); | 1060 string_data_ = string_data.raw(); |
1059 } | 1061 } |
1060 | 1062 |
1061 | 1063 |
| 1064 void TranslationHelper::SetCanonicalNames(const TypedData& canonical_names) { |
| 1065 ASSERT(canonical_names_.IsNull()); |
| 1066 canonical_names_ = canonical_names.raw(); |
| 1067 } |
| 1068 |
| 1069 |
1062 intptr_t TranslationHelper::StringOffset(intptr_t string_index) const { | 1070 intptr_t TranslationHelper::StringOffset(intptr_t string_index) const { |
1063 return string_offsets_.GetUint32(string_index << 2); | 1071 return string_offsets_.GetUint32(string_index << 2); |
1064 } | 1072 } |
1065 | 1073 |
1066 | 1074 |
1067 intptr_t TranslationHelper::StringSize(intptr_t string_index) const { | 1075 intptr_t TranslationHelper::StringSize(intptr_t string_index) const { |
1068 return StringOffset(string_index + 1) - StringOffset(string_index); | 1076 return StringOffset(string_index + 1) - StringOffset(string_index); |
1069 } | 1077 } |
1070 | 1078 |
1071 | 1079 |
1072 uint8_t TranslationHelper::CharacterAt(intptr_t string_index, intptr_t index) { | 1080 uint8_t TranslationHelper::CharacterAt(intptr_t string_index, intptr_t index) { |
1073 ASSERT(index < StringSize(string_index)); | 1081 ASSERT(index < StringSize(string_index)); |
1074 return string_data_.GetUint8(StringOffset(string_index) + index); | 1082 return string_data_.GetUint8(StringOffset(string_index) + index); |
1075 } | 1083 } |
1076 | 1084 |
1077 | 1085 |
1078 bool TranslationHelper::StringEquals(intptr_t string_index, const char* other) { | 1086 bool TranslationHelper::StringEquals(intptr_t string_index, const char* other) { |
1079 NoSafepointScope no_safepoint; | 1087 NoSafepointScope no_safepoint; |
1080 intptr_t length = strlen(other); | 1088 intptr_t length = strlen(other); |
1081 return (length == StringSize(string_index)) && | 1089 return (length == StringSize(string_index)) && |
1082 (memcmp(string_data_.DataAddr(StringOffset(string_index)), other, | 1090 (memcmp(string_data_.DataAddr(StringOffset(string_index)), other, |
1083 length) == 0); | 1091 length) == 0); |
1084 } | 1092 } |
1085 | 1093 |
1086 | 1094 |
1087 bool TranslationHelper::IsAdministrative(CanonicalName* name) { | 1095 intptr_t TranslationHelper::CanonicalNameParent(intptr_t name) { |
1088 // Administrative names start with '@'. | 1096 // Canonical names are pairs of 4-byte parent and string indexes, so the size |
1089 return (StringSize(name->name()) > 0) && | 1097 // of an entry is 8 bytes. The parent is biased: 0 represents the root name |
1090 (CharacterAt(name->name(), 0) == '@'); | 1098 // and N+1 represents the name with index N. |
| 1099 return static_cast<intptr_t>(canonical_names_.GetUint32(8 * name)) - 1; |
1091 } | 1100 } |
1092 | 1101 |
1093 | 1102 |
1094 bool TranslationHelper::IsPrivate(CanonicalName* name) { | 1103 intptr_t TranslationHelper::CanonicalNameString(intptr_t name) { |
1095 // Private names start with '_'. | 1104 return canonical_names_.GetUint32((8 * name) + 4); |
1096 return (StringSize(name->name()) > 0) && | |
1097 (CharacterAt(name->name(), 0) == '_'); | |
1098 } | 1105 } |
1099 | 1106 |
1100 | 1107 |
1101 bool TranslationHelper::IsRoot(CanonicalName* name) { | 1108 bool TranslationHelper::IsAdministrative(intptr_t name) { |
1102 // The root is the only canonical name with no parent. | 1109 // Administrative names start with '@'. |
1103 return name->parent() == NULL; | 1110 intptr_t name_string = CanonicalNameString(name); |
| 1111 return (StringSize(name_string) > 0) && (CharacterAt(name_string, 0) == '@'); |
1104 } | 1112 } |
1105 | 1113 |
1106 | 1114 |
1107 bool TranslationHelper::IsLibrary(CanonicalName* name) { | 1115 bool TranslationHelper::IsPrivate(intptr_t name) { |
1108 // Libraries are the only canonical names with the root as their parent. | 1116 // Private names start with '_'. |
1109 return !IsRoot(name) && IsRoot(name->parent()); | 1117 intptr_t name_string = CanonicalNameString(name); |
| 1118 return (StringSize(name_string) > 0) && (CharacterAt(name_string, 0) == '_'); |
1110 } | 1119 } |
1111 | 1120 |
1112 | 1121 |
1113 bool TranslationHelper::IsClass(CanonicalName* name) { | 1122 bool TranslationHelper::IsRoot(intptr_t name) { |
1114 // Classes have the library as their parent and are not an administrative | 1123 return name == -1; |
1115 // name starting with @. | |
1116 return !IsAdministrative(name) && !IsRoot(name) && IsLibrary(name->parent()); | |
1117 } | 1124 } |
1118 | 1125 |
1119 | 1126 |
1120 bool TranslationHelper::IsMember(CanonicalName* name) { | 1127 bool TranslationHelper::IsLibrary(intptr_t name) { |
| 1128 // Libraries are the only canonical names with the root as their parent. |
| 1129 return !IsRoot(name) && IsRoot(CanonicalNameParent(name)); |
| 1130 } |
| 1131 |
| 1132 |
| 1133 bool TranslationHelper::IsClass(intptr_t name) { |
| 1134 // Classes have the library as their parent and are not an administrative |
| 1135 // name starting with @. |
| 1136 return !IsAdministrative(name) && !IsRoot(name) && |
| 1137 IsLibrary(CanonicalNameParent(name)); |
| 1138 } |
| 1139 |
| 1140 |
| 1141 bool TranslationHelper::IsMember(intptr_t name) { |
1121 return IsConstructor(name) || IsField(name) || IsProcedure(name); | 1142 return IsConstructor(name) || IsField(name) || IsProcedure(name); |
1122 } | 1143 } |
1123 | 1144 |
1124 | 1145 |
1125 bool TranslationHelper::IsField(CanonicalName* name) { | 1146 bool TranslationHelper::IsField(intptr_t name) { |
1126 // Fields with private names have the import URI of the library where they are | 1147 // Fields with private names have the import URI of the library where they are |
1127 // visible as the parent and the string "@fields" as the parent's parent. | 1148 // visible as the parent and the string "@fields" as the parent's parent. |
1128 // Fields with non-private names have the string "@fields' as the parent. | 1149 // Fields with non-private names have the string "@fields' as the parent. |
1129 if (IsRoot(name)) { | 1150 if (IsRoot(name)) { |
1130 return false; | 1151 return false; |
1131 } | 1152 } |
1132 CanonicalName* kind = name->parent(); | 1153 intptr_t kind = CanonicalNameParent(name); |
1133 if (IsPrivate(name)) { | 1154 if (IsPrivate(name)) { |
1134 kind = kind->parent(); | 1155 kind = CanonicalNameParent(kind); |
1135 } | 1156 } |
1136 return StringEquals(kind->name(), "@fields"); | 1157 return StringEquals(CanonicalNameString(kind), "@fields"); |
1137 } | 1158 } |
1138 | 1159 |
1139 | 1160 |
1140 bool TranslationHelper::IsConstructor(CanonicalName* name) { | 1161 bool TranslationHelper::IsConstructor(intptr_t name) { |
1141 // Constructors with private names have the import URI of the library where | 1162 // Constructors with private names have the import URI of the library where |
1142 // they are visible as the parent and the string "@constructors" as the | 1163 // they are visible as the parent and the string "@constructors" as the |
1143 // parent's parent. Constructors with non-private names have the string | 1164 // parent's parent. Constructors with non-private names have the string |
1144 // "@constructors" as the parent. | 1165 // "@constructors" as the parent. |
1145 if (IsRoot(name)) { | 1166 if (IsRoot(name)) { |
1146 return false; | 1167 return false; |
1147 } | 1168 } |
1148 CanonicalName* kind = name->parent(); | 1169 intptr_t kind = CanonicalNameParent(name); |
1149 if (IsPrivate(name)) { | 1170 if (IsPrivate(name)) { |
1150 kind = kind->parent(); | 1171 kind = CanonicalNameParent(kind); |
1151 } | 1172 } |
1152 return StringEquals(kind->name(), "@constructors"); | 1173 return StringEquals(CanonicalNameString(kind), "@constructors"); |
1153 } | 1174 } |
1154 | 1175 |
1155 | 1176 |
1156 bool TranslationHelper::IsProcedure(CanonicalName* name) { | 1177 bool TranslationHelper::IsProcedure(intptr_t name) { |
1157 return IsMethod(name) || IsGetter(name) || IsSetter(name) || IsFactory(name); | 1178 return IsMethod(name) || IsGetter(name) || IsSetter(name) || IsFactory(name); |
1158 } | 1179 } |
1159 | 1180 |
1160 | 1181 |
1161 bool TranslationHelper::IsMethod(CanonicalName* name) { | 1182 bool TranslationHelper::IsMethod(intptr_t name) { |
1162 // Methods with private names have the import URI of the library where they | 1183 // Methods with private names have the import URI of the library where they |
1163 // are visible as the parent and the string "@methods" as the parent's parent. | 1184 // are visible as the parent and the string "@methods" as the parent's parent. |
1164 // Methods with non-private names have the string "@methods" as the parent. | 1185 // Methods with non-private names have the string "@methods" as the parent. |
1165 if (IsRoot(name)) { | 1186 if (IsRoot(name)) { |
1166 return false; | 1187 return false; |
1167 } | 1188 } |
1168 CanonicalName* kind = name->parent(); | 1189 intptr_t kind = CanonicalNameParent(name); |
1169 if (IsPrivate(name)) { | 1190 if (IsPrivate(name)) { |
1170 kind = kind->parent(); | 1191 kind = CanonicalNameParent(kind); |
1171 } | 1192 } |
1172 return StringEquals(kind->name(), "@methods"); | 1193 return StringEquals(CanonicalNameString(kind), "@methods"); |
1173 } | 1194 } |
1174 | 1195 |
1175 | 1196 |
1176 bool TranslationHelper::IsGetter(CanonicalName* name) { | 1197 bool TranslationHelper::IsGetter(intptr_t name) { |
1177 // Getters with private names have the import URI of the library where they | 1198 // Getters with private names have the import URI of the library where they |
1178 // are visible as the parent and the string "@getters" as the parent's parent. | 1199 // are visible as the parent and the string "@getters" as the parent's parent. |
1179 // Getters with non-private names have the string "@getters" as the parent. | 1200 // Getters with non-private names have the string "@getters" as the parent. |
1180 if (IsRoot(name)) { | 1201 if (IsRoot(name)) { |
1181 return false; | 1202 return false; |
1182 } | 1203 } |
1183 CanonicalName* kind = name->parent(); | 1204 intptr_t kind = CanonicalNameParent(name); |
1184 if (IsPrivate(name)) { | 1205 if (IsPrivate(name)) { |
1185 kind = kind->parent(); | 1206 kind = CanonicalNameParent(kind); |
1186 } | 1207 } |
1187 return StringEquals(kind->name(), "@getters"); | 1208 return StringEquals(CanonicalNameString(kind), "@getters"); |
1188 } | 1209 } |
1189 | 1210 |
1190 | 1211 |
1191 bool TranslationHelper::IsSetter(CanonicalName* name) { | 1212 bool TranslationHelper::IsSetter(intptr_t name) { |
1192 // Setters with private names have the import URI of the library where they | 1213 // Setters with private names have the import URI of the library where they |
1193 // are visible as the parent and the string "@setters" as the parent's parent. | 1214 // are visible as the parent and the string "@setters" as the parent's parent. |
1194 // Setters with non-private names have the string "@setters" as the parent. | 1215 // Setters with non-private names have the string "@setters" as the parent. |
1195 if (IsRoot(name)) { | 1216 if (IsRoot(name)) { |
1196 return false; | 1217 return false; |
1197 } | 1218 } |
1198 CanonicalName* kind = name->parent(); | 1219 intptr_t kind = CanonicalNameParent(name); |
1199 if (IsPrivate(name)) { | 1220 if (IsPrivate(name)) { |
1200 kind = kind->parent(); | 1221 kind = CanonicalNameParent(kind); |
1201 } | 1222 } |
1202 return StringEquals(kind->name(), "@setters"); | 1223 return StringEquals(CanonicalNameString(kind), "@setters"); |
1203 } | 1224 } |
1204 | 1225 |
1205 | 1226 |
1206 bool TranslationHelper::IsFactory(CanonicalName* name) { | 1227 bool TranslationHelper::IsFactory(intptr_t name) { |
1207 // Factories with private names have the import URI of the library where they | 1228 // Factories with private names have the import URI of the library where they |
1208 // are visible as the parent and the string "@factories" as the parent's | 1229 // are visible as the parent and the string "@factories" as the parent's |
1209 // parent. Factories with non-private names have the string "@factories" as | 1230 // parent. Factories with non-private names have the string "@factories" as |
1210 // the parent. | 1231 // the parent. |
1211 if (IsRoot(name)) { | 1232 if (IsRoot(name)) { |
1212 return false; | 1233 return false; |
1213 } | 1234 } |
1214 CanonicalName* kind = name->parent(); | 1235 intptr_t kind = CanonicalNameParent(name); |
1215 if (IsPrivate(name)) { | 1236 if (IsPrivate(name)) { |
1216 kind = kind->parent(); | 1237 kind = CanonicalNameParent(kind); |
1217 } | 1238 } |
1218 return StringEquals(kind->name(), "@factories"); | 1239 return StringEquals(CanonicalNameString(kind), "@factories"); |
1219 } | 1240 } |
1220 | 1241 |
1221 | 1242 |
1222 CanonicalName* TranslationHelper::EnclosingName(CanonicalName* name) { | 1243 intptr_t TranslationHelper::EnclosingName(intptr_t name) { |
1223 ASSERT(IsField(name) || IsConstructor(name) || IsProcedure(name)); | 1244 ASSERT(IsField(name) || IsConstructor(name) || IsProcedure(name)); |
1224 CanonicalName* enclosing = name->parent()->parent(); | 1245 intptr_t enclosing = CanonicalNameParent(CanonicalNameParent(name)); |
1225 if (IsPrivate(name)) { | 1246 if (IsPrivate(name)) { |
1226 enclosing = enclosing->parent(); | 1247 enclosing = CanonicalNameParent(enclosing); |
1227 } | 1248 } |
1228 ASSERT(IsLibrary(enclosing) || IsClass(enclosing)); | 1249 ASSERT(IsLibrary(enclosing) || IsClass(enclosing)); |
1229 return enclosing; | 1250 return enclosing; |
1230 } | 1251 } |
1231 | 1252 |
1232 | 1253 |
1233 RawInstance* TranslationHelper::Canonicalize(const Instance& instance) { | 1254 RawInstance* TranslationHelper::Canonicalize(const Instance& instance) { |
1234 if (instance.IsNull()) return instance.raw(); | 1255 if (instance.IsNull()) return instance.raw(); |
1235 | 1256 |
1236 const char* error_str = NULL; | 1257 const char* error_str = NULL; |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1274 } | 1295 } |
1275 | 1296 |
1276 | 1297 |
1277 dart::String& TranslationHelper::DartSymbol(intptr_t string_index) const { | 1298 dart::String& TranslationHelper::DartSymbol(intptr_t string_index) const { |
1278 intptr_t length = StringSize(string_index); | 1299 intptr_t length = StringSize(string_index); |
1279 uint8_t* buffer = Z->Alloc<uint8_t>(length); | 1300 uint8_t* buffer = Z->Alloc<uint8_t>(length); |
1280 { | 1301 { |
1281 NoSafepointScope no_safepoint; | 1302 NoSafepointScope no_safepoint; |
1282 memmove(buffer, string_data_.DataAddr(StringOffset(string_index)), length); | 1303 memmove(buffer, string_data_.DataAddr(StringOffset(string_index)), length); |
1283 } | 1304 } |
1284 return dart::String::ZoneHandle( | 1305 return dart::String::ZoneHandle(Z, |
1285 Z, dart::Symbols::FromUTF8(thread_, buffer, length)); | 1306 Symbols::FromUTF8(thread_, buffer, length)); |
1286 } | 1307 } |
1287 | 1308 |
1288 dart::String& TranslationHelper::DartSymbol(const uint8_t* utf8_array, | 1309 dart::String& TranslationHelper::DartSymbol(const uint8_t* utf8_array, |
1289 intptr_t len) const { | 1310 intptr_t len) const { |
1290 return dart::String::ZoneHandle( | 1311 return dart::String::ZoneHandle(Z, |
1291 Z, dart::Symbols::FromUTF8(thread_, utf8_array, len)); | 1312 Symbols::FromUTF8(thread_, utf8_array, len)); |
1292 } | 1313 } |
1293 | 1314 |
1294 const dart::String& TranslationHelper::DartClassName( | 1315 const dart::String& TranslationHelper::DartClassName(intptr_t kernel_class) { |
1295 CanonicalName* kernel_class) { | |
1296 ASSERT(IsClass(kernel_class)); | 1316 ASSERT(IsClass(kernel_class)); |
1297 dart::String& name = DartString(kernel_class->name()); | 1317 dart::String& name = DartString(CanonicalNameString(kernel_class)); |
1298 return ManglePrivateName(kernel_class->parent(), &name); | 1318 return ManglePrivateName(CanonicalNameParent(kernel_class), &name); |
1299 } | 1319 } |
1300 | 1320 |
1301 | 1321 |
1302 const dart::String& TranslationHelper::DartConstructorName( | 1322 const dart::String& TranslationHelper::DartConstructorName( |
1303 CanonicalName* constructor) { | 1323 intptr_t constructor) { |
1304 ASSERT(IsConstructor(constructor)); | 1324 ASSERT(IsConstructor(constructor)); |
1305 return DartFactoryName(constructor); | 1325 return DartFactoryName(constructor); |
1306 } | 1326 } |
1307 | 1327 |
1308 | 1328 |
1309 const dart::String& TranslationHelper::DartProcedureName( | 1329 const dart::String& TranslationHelper::DartProcedureName(intptr_t procedure) { |
1310 CanonicalName* procedure) { | |
1311 ASSERT(IsProcedure(procedure)); | 1330 ASSERT(IsProcedure(procedure)); |
1312 if (IsSetter(procedure)) { | 1331 if (IsSetter(procedure)) { |
1313 return DartSetterName(procedure); | 1332 return DartSetterName(procedure); |
1314 } else if (IsGetter(procedure)) { | 1333 } else if (IsGetter(procedure)) { |
1315 return DartGetterName(procedure); | 1334 return DartGetterName(procedure); |
1316 } else if (IsFactory(procedure)) { | 1335 } else if (IsFactory(procedure)) { |
1317 return DartFactoryName(procedure); | 1336 return DartFactoryName(procedure); |
1318 } else { | 1337 } else { |
1319 return DartMethodName(procedure); | 1338 return DartMethodName(procedure); |
1320 } | 1339 } |
1321 } | 1340 } |
1322 | 1341 |
1323 | 1342 |
1324 const dart::String& TranslationHelper::DartSetterName(CanonicalName* setter) { | 1343 const dart::String& TranslationHelper::DartSetterName(intptr_t setter) { |
1325 return DartSetterName(setter->parent(), setter->name()); | 1344 return DartSetterName(CanonicalNameParent(setter), |
| 1345 CanonicalNameString(setter)); |
1326 } | 1346 } |
1327 | 1347 |
1328 | 1348 |
1329 const dart::String& TranslationHelper::DartSetterName(Name* setter_name) { | 1349 const dart::String& TranslationHelper::DartSetterName(Name* setter_name) { |
1330 return DartSetterName(setter_name->library(), setter_name->string_index()); | 1350 return DartSetterName(setter_name->library(), setter_name->string_index()); |
1331 } | 1351 } |
1332 | 1352 |
1333 | 1353 |
1334 const dart::String& TranslationHelper::DartSetterName(CanonicalName* parent, | 1354 const dart::String& TranslationHelper::DartSetterName(intptr_t parent, |
1335 intptr_t setter) { | 1355 intptr_t setter) { |
1336 // The names flowing into [setter] are coming from the Kernel file: | 1356 // The names flowing into [setter] are coming from the Kernel file: |
1337 // * user-defined setters: `fieldname=` | 1357 // * user-defined setters: `fieldname=` |
1338 // * property-set expressions: `fieldname` | 1358 // * property-set expressions: `fieldname` |
1339 // | 1359 // |
1340 // The VM uses `get:fieldname` and `set:fieldname`. | 1360 // The VM uses `get:fieldname` and `set:fieldname`. |
1341 // | 1361 // |
1342 // => In order to be consistent, we remove the `=` always and adopt the VM | 1362 // => In order to be consistent, we remove the `=` always and adopt the VM |
1343 // conventions. | 1363 // conventions. |
1344 intptr_t size = StringSize(setter); | 1364 intptr_t size = StringSize(setter); |
1345 ASSERT(size > 0); | 1365 ASSERT(size > 0); |
1346 if (CharacterAt(setter, size - 1) == '=') { | 1366 if (CharacterAt(setter, size - 1) == '=') { |
1347 --size; | 1367 --size; |
1348 } | 1368 } |
1349 uint8_t* buffer = Z->Alloc<uint8_t>(size); | 1369 uint8_t* buffer = Z->Alloc<uint8_t>(size); |
1350 { | 1370 { |
1351 NoSafepointScope no_safepoint; | 1371 NoSafepointScope no_safepoint; |
1352 memmove(buffer, string_data_.DataAddr(StringOffset(setter)), size); | 1372 memmove(buffer, string_data_.DataAddr(StringOffset(setter)), size); |
1353 } | 1373 } |
1354 dart::String& name = dart::String::ZoneHandle( | 1374 dart::String& name = dart::String::ZoneHandle( |
1355 Z, dart::String::FromUTF8(buffer, size, allocation_space_)); | 1375 Z, dart::String::FromUTF8(buffer, size, allocation_space_)); |
1356 ManglePrivateName(parent, &name, false); | 1376 ManglePrivateName(parent, &name, false); |
1357 name = dart::Field::SetterSymbol(name); | 1377 name = dart::Field::SetterSymbol(name); |
1358 return name; | 1378 return name; |
1359 } | 1379 } |
1360 | 1380 |
1361 | 1381 |
1362 const dart::String& TranslationHelper::DartGetterName(CanonicalName* getter) { | 1382 const dart::String& TranslationHelper::DartGetterName(intptr_t getter) { |
1363 return DartGetterName(getter->parent(), getter->name()); | 1383 return DartGetterName(CanonicalNameParent(getter), |
| 1384 CanonicalNameString(getter)); |
1364 } | 1385 } |
1365 | 1386 |
1366 | 1387 |
1367 const dart::String& TranslationHelper::DartGetterName(Name* getter_name) { | 1388 const dart::String& TranslationHelper::DartGetterName(Name* getter_name) { |
1368 return DartGetterName(getter_name->library(), getter_name->string_index()); | 1389 return DartGetterName(getter_name->library(), getter_name->string_index()); |
1369 } | 1390 } |
1370 | 1391 |
1371 | 1392 |
1372 const dart::String& TranslationHelper::DartGetterName(CanonicalName* parent, | 1393 const dart::String& TranslationHelper::DartGetterName(intptr_t parent, |
1373 intptr_t getter) { | 1394 intptr_t getter) { |
1374 dart::String& name = DartString(getter); | 1395 dart::String& name = DartString(getter); |
1375 ManglePrivateName(parent, &name, false); | 1396 ManglePrivateName(parent, &name, false); |
1376 name = dart::Field::GetterSymbol(name); | 1397 name = dart::Field::GetterSymbol(name); |
1377 return name; | 1398 return name; |
1378 } | 1399 } |
1379 | 1400 |
1380 | 1401 |
1381 const dart::String& TranslationHelper::DartFieldName(Name* kernel_name) { | 1402 const dart::String& TranslationHelper::DartFieldName(Name* kernel_name) { |
1382 dart::String& name = DartString(kernel_name->string_index()); | 1403 dart::String& name = DartString(kernel_name->string_index()); |
1383 return ManglePrivateName(kernel_name->library(), &name); | 1404 return ManglePrivateName(kernel_name->library(), &name); |
1384 } | 1405 } |
1385 | 1406 |
1386 | 1407 |
1387 const dart::String& TranslationHelper::DartInitializerName(Name* kernel_name) { | 1408 const dart::String& TranslationHelper::DartInitializerName(Name* kernel_name) { |
1388 // The [DartFieldName] will take care of mangling the name. | 1409 // The [DartFieldName] will take care of mangling the name. |
1389 dart::String& name = | 1410 dart::String& name = |
1390 dart::String::Handle(Z, DartFieldName(kernel_name).raw()); | 1411 dart::String::Handle(Z, DartFieldName(kernel_name).raw()); |
1391 name = Symbols::FromConcat(thread_, Symbols::InitPrefix(), name); | 1412 name = Symbols::FromConcat(thread_, Symbols::InitPrefix(), name); |
1392 return name; | 1413 return name; |
1393 } | 1414 } |
1394 | 1415 |
1395 | 1416 |
1396 const dart::String& TranslationHelper::DartMethodName(CanonicalName* method) { | 1417 const dart::String& TranslationHelper::DartMethodName(intptr_t method) { |
1397 return DartMethodName(method->parent(), method->name()); | 1418 return DartMethodName(CanonicalNameParent(method), |
| 1419 CanonicalNameString(method)); |
1398 } | 1420 } |
1399 | 1421 |
1400 | 1422 |
1401 const dart::String& TranslationHelper::DartMethodName(Name* method_name) { | 1423 const dart::String& TranslationHelper::DartMethodName(Name* method_name) { |
1402 return DartMethodName(method_name->library(), method_name->string_index()); | 1424 return DartMethodName(method_name->library(), method_name->string_index()); |
1403 } | 1425 } |
1404 | 1426 |
1405 | 1427 |
1406 const dart::String& TranslationHelper::DartMethodName(CanonicalName* parent, | 1428 const dart::String& TranslationHelper::DartMethodName(intptr_t parent, |
1407 intptr_t method) { | 1429 intptr_t method) { |
1408 dart::String& name = DartString(method); | 1430 dart::String& name = DartString(method); |
1409 return ManglePrivateName(parent, &name); | 1431 return ManglePrivateName(parent, &name); |
1410 } | 1432 } |
1411 | 1433 |
1412 | 1434 |
1413 const dart::String& TranslationHelper::DartFactoryName(CanonicalName* factory) { | 1435 const dart::String& TranslationHelper::DartFactoryName(intptr_t factory) { |
1414 ASSERT(IsConstructor(factory) || IsFactory(factory)); | 1436 ASSERT(IsConstructor(factory) || IsFactory(factory)); |
1415 GrowableHandlePtrArray<const dart::String> pieces(Z, 3); | 1437 GrowableHandlePtrArray<const dart::String> pieces(Z, 3); |
1416 pieces.Add(DartClassName(EnclosingName(factory))); | 1438 pieces.Add(DartClassName(EnclosingName(factory))); |
1417 pieces.Add(Symbols::Dot()); | 1439 pieces.Add(Symbols::Dot()); |
1418 // [DartMethodName] will mangle the name. | 1440 // [DartMethodName] will mangle the name. |
1419 pieces.Add(DartMethodName(factory)); | 1441 pieces.Add(DartMethodName(factory)); |
1420 return dart::String::ZoneHandle( | 1442 return dart::String::ZoneHandle(Z, Symbols::FromConcatAll(thread_, pieces)); |
1421 Z, dart::Symbols::FromConcatAll(thread_, pieces)); | |
1422 } | 1443 } |
1423 | 1444 |
1424 | 1445 |
1425 dart::RawLibrary* TranslationHelper::LookupLibraryByKernelLibrary( | 1446 RawLibrary* TranslationHelper::LookupLibraryByKernelLibrary( |
1426 CanonicalName* kernel_library) { | 1447 intptr_t kernel_library) { |
1427 // We only use the string and don't rely on having any particular parent. | 1448 // We only use the string and don't rely on having any particular parent. |
1428 // This ASSERT is just a sanity check. | 1449 // This ASSERT is just a sanity check. |
1429 ASSERT(IsLibrary(kernel_library) || | 1450 ASSERT(IsLibrary(kernel_library) || |
1430 IsAdministrative(kernel_library->parent())); | 1451 IsAdministrative(CanonicalNameParent(kernel_library))); |
1431 const dart::String& library_name = DartSymbol(kernel_library->name()); | 1452 const dart::String& library_name = |
| 1453 DartSymbol(CanonicalNameString(kernel_library)); |
1432 ASSERT(!library_name.IsNull()); | 1454 ASSERT(!library_name.IsNull()); |
1433 dart::RawLibrary* library = | 1455 RawLibrary* library = dart::Library::LookupLibrary(thread_, library_name); |
1434 dart::Library::LookupLibrary(thread_, library_name); | |
1435 ASSERT(library != Object::null()); | 1456 ASSERT(library != Object::null()); |
1436 return library; | 1457 return library; |
1437 } | 1458 } |
1438 | 1459 |
1439 | 1460 |
1440 dart::RawClass* TranslationHelper::LookupClassByKernelClass( | 1461 RawClass* TranslationHelper::LookupClassByKernelClass(intptr_t kernel_class) { |
1441 CanonicalName* kernel_class) { | |
1442 ASSERT(IsClass(kernel_class)); | 1462 ASSERT(IsClass(kernel_class)); |
1443 dart::RawClass* klass = NULL; | |
1444 const dart::String& class_name = DartClassName(kernel_class); | 1463 const dart::String& class_name = DartClassName(kernel_class); |
1445 CanonicalName* kernel_library = kernel_class->parent(); | 1464 intptr_t kernel_library = CanonicalNameParent(kernel_class); |
1446 dart::Library& library = | 1465 dart::Library& library = |
1447 dart::Library::Handle(Z, LookupLibraryByKernelLibrary(kernel_library)); | 1466 dart::Library::Handle(Z, LookupLibraryByKernelLibrary(kernel_library)); |
1448 klass = library.LookupClassAllowPrivate(class_name); | 1467 RawClass* klass = library.LookupClassAllowPrivate(class_name); |
1449 | 1468 |
1450 ASSERT(klass != Object::null()); | 1469 ASSERT(klass != Object::null()); |
1451 return klass; | 1470 return klass; |
1452 } | 1471 } |
1453 | 1472 |
1454 | 1473 |
1455 dart::RawField* TranslationHelper::LookupFieldByKernelField( | 1474 RawField* TranslationHelper::LookupFieldByKernelField(intptr_t kernel_field) { |
1456 CanonicalName* kernel_field) { | |
1457 ASSERT(IsField(kernel_field)); | 1475 ASSERT(IsField(kernel_field)); |
1458 CanonicalName* enclosing = EnclosingName(kernel_field); | 1476 intptr_t enclosing = EnclosingName(kernel_field); |
1459 | 1477 |
1460 dart::Class& klass = dart::Class::Handle(Z); | 1478 dart::Class& klass = dart::Class::Handle(Z); |
1461 if (IsLibrary(enclosing)) { | 1479 if (IsLibrary(enclosing)) { |
1462 dart::Library& library = | 1480 dart::Library& library = |
1463 dart::Library::Handle(Z, LookupLibraryByKernelLibrary(enclosing)); | 1481 dart::Library::Handle(Z, LookupLibraryByKernelLibrary(enclosing)); |
1464 klass = library.toplevel_class(); | 1482 klass = library.toplevel_class(); |
1465 } else { | 1483 } else { |
1466 ASSERT(IsClass(enclosing)); | 1484 ASSERT(IsClass(enclosing)); |
1467 klass = LookupClassByKernelClass(enclosing); | 1485 klass = LookupClassByKernelClass(enclosing); |
1468 } | 1486 } |
1469 dart::RawField* field = | 1487 RawField* field = klass.LookupFieldAllowPrivate( |
1470 klass.LookupFieldAllowPrivate(DartSymbol(kernel_field->name())); | 1488 DartSymbol(CanonicalNameString(kernel_field))); |
1471 ASSERT(field != Object::null()); | 1489 ASSERT(field != Object::null()); |
1472 return field; | 1490 return field; |
1473 } | 1491 } |
1474 | 1492 |
1475 | 1493 |
1476 dart::RawFunction* TranslationHelper::LookupStaticMethodByKernelProcedure( | 1494 RawFunction* TranslationHelper::LookupStaticMethodByKernelProcedure( |
1477 CanonicalName* procedure) { | 1495 intptr_t procedure) { |
1478 const dart::String& procedure_name = DartProcedureName(procedure); | 1496 const dart::String& procedure_name = DartProcedureName(procedure); |
1479 | 1497 |
1480 // The parent is either a library or a class (in which case the procedure is a | 1498 // The parent is either a library or a class (in which case the procedure is a |
1481 // static method). | 1499 // static method). |
1482 CanonicalName* enclosing = EnclosingName(procedure); | 1500 intptr_t enclosing = EnclosingName(procedure); |
1483 if (IsLibrary(enclosing)) { | 1501 if (IsLibrary(enclosing)) { |
1484 dart::Library& library = | 1502 dart::Library& library = |
1485 dart::Library::Handle(Z, LookupLibraryByKernelLibrary(enclosing)); | 1503 dart::Library::Handle(Z, LookupLibraryByKernelLibrary(enclosing)); |
1486 dart::RawFunction* function = | 1504 RawFunction* function = library.LookupFunctionAllowPrivate(procedure_name); |
1487 library.LookupFunctionAllowPrivate(procedure_name); | |
1488 ASSERT(function != Object::null()); | 1505 ASSERT(function != Object::null()); |
1489 return function; | 1506 return function; |
1490 } else { | 1507 } else { |
1491 ASSERT(IsClass(enclosing)); | 1508 ASSERT(IsClass(enclosing)); |
1492 dart::Class& klass = | 1509 dart::Class& klass = |
1493 dart::Class::Handle(Z, LookupClassByKernelClass(enclosing)); | 1510 dart::Class::Handle(Z, LookupClassByKernelClass(enclosing)); |
1494 dart::RawFunction* raw_function = | 1511 Function& function = Function::ZoneHandle( |
1495 klass.LookupFunctionAllowPrivate(procedure_name); | 1512 Z, klass.LookupFunctionAllowPrivate(procedure_name)); |
1496 ASSERT(raw_function != Object::null()); | 1513 ASSERT(!function.IsNull()); |
1497 | 1514 |
1498 // TODO(27590): We can probably get rid of this after no longer using | 1515 // TODO(27590): We can probably get rid of this after no longer using |
1499 // core libraries from the source. | 1516 // core libraries from the source. |
1500 dart::Function& function = dart::Function::ZoneHandle(Z, raw_function); | |
1501 if (function.IsRedirectingFactory()) { | 1517 if (function.IsRedirectingFactory()) { |
1502 ClassFinalizer::ResolveRedirectingFactory(klass, function); | 1518 ClassFinalizer::ResolveRedirectingFactory(klass, function); |
1503 function = function.RedirectionTarget(); | 1519 function = function.RedirectionTarget(); |
1504 } | 1520 } |
1505 return function.raw(); | 1521 return function.raw(); |
1506 } | 1522 } |
1507 } | 1523 } |
1508 | 1524 |
1509 | 1525 |
1510 dart::RawFunction* TranslationHelper::LookupConstructorByKernelConstructor( | 1526 RawFunction* TranslationHelper::LookupConstructorByKernelConstructor( |
1511 CanonicalName* constructor) { | 1527 intptr_t constructor) { |
1512 ASSERT(IsConstructor(constructor)); | 1528 ASSERT(IsConstructor(constructor)); |
1513 dart::Class& klass = dart::Class::Handle( | 1529 dart::Class& klass = dart::Class::Handle( |
1514 Z, LookupClassByKernelClass(EnclosingName(constructor))); | 1530 Z, LookupClassByKernelClass(EnclosingName(constructor))); |
1515 return LookupConstructorByKernelConstructor(klass, constructor); | 1531 return LookupConstructorByKernelConstructor(klass, constructor); |
1516 } | 1532 } |
1517 | 1533 |
1518 | 1534 |
1519 dart::RawFunction* TranslationHelper::LookupConstructorByKernelConstructor( | 1535 RawFunction* TranslationHelper::LookupConstructorByKernelConstructor( |
1520 const dart::Class& owner, | 1536 const dart::Class& owner, |
1521 CanonicalName* constructor) { | 1537 intptr_t constructor) { |
1522 ASSERT(IsConstructor(constructor)); | 1538 ASSERT(IsConstructor(constructor)); |
1523 dart::RawFunction* function = | 1539 RawFunction* function = |
1524 owner.LookupConstructorAllowPrivate(DartConstructorName(constructor)); | 1540 owner.LookupConstructorAllowPrivate(DartConstructorName(constructor)); |
1525 ASSERT(function != Object::null()); | 1541 ASSERT(function != Object::null()); |
1526 return function; | 1542 return function; |
1527 } | 1543 } |
1528 | 1544 |
1529 | 1545 |
1530 dart::Type& TranslationHelper::GetCanonicalType(const dart::Class& klass) { | 1546 dart::Type& TranslationHelper::GetCanonicalType(const dart::Class& klass) { |
1531 ASSERT(!klass.IsNull()); | 1547 ASSERT(!klass.IsNull()); |
1532 // Note that if cls is _Closure, the returned type will be _Closure, | 1548 // Note that if cls is _Closure, the returned type will be _Closure, |
1533 // and not the signature type. | 1549 // and not the signature type. |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1565 | 1581 |
1566 va_list args; | 1582 va_list args; |
1567 va_start(args, format); | 1583 va_start(args, format); |
1568 Report::LongJumpV(prev_error, null_script, TokenPosition::kNoSource, format, | 1584 Report::LongJumpV(prev_error, null_script, TokenPosition::kNoSource, format, |
1569 args); | 1585 args); |
1570 va_end(args); | 1586 va_end(args); |
1571 UNREACHABLE(); | 1587 UNREACHABLE(); |
1572 } | 1588 } |
1573 | 1589 |
1574 | 1590 |
1575 dart::String& TranslationHelper::ManglePrivateName(CanonicalName* parent, | 1591 dart::String& TranslationHelper::ManglePrivateName(intptr_t parent, |
1576 dart::String* name_to_modify, | 1592 dart::String* name_to_modify, |
1577 bool symbolize) { | 1593 bool symbolize) { |
1578 if (name_to_modify->Length() >= 1 && name_to_modify->CharAt(0) == '_') { | 1594 if (name_to_modify->Length() >= 1 && name_to_modify->CharAt(0) == '_') { |
1579 const dart::Library& library = | 1595 const dart::Library& library = |
1580 dart::Library::Handle(Z, LookupLibraryByKernelLibrary(parent)); | 1596 dart::Library::Handle(Z, LookupLibraryByKernelLibrary(parent)); |
1581 *name_to_modify = library.PrivateName(*name_to_modify); | 1597 *name_to_modify = library.PrivateName(*name_to_modify); |
1582 } else if (symbolize) { | 1598 } else if (symbolize) { |
1583 *name_to_modify = Symbols::New(thread_, *name_to_modify); | 1599 *name_to_modify = Symbols::New(thread_, *name_to_modify); |
1584 } | 1600 } |
1585 return *name_to_modify; | 1601 return *name_to_modify; |
(...skipping 27 matching lines...) Expand all Loading... |
1613 result_(Instance::Handle(zone)) {} | 1629 result_(Instance::Handle(zone)) {} |
1614 | 1630 |
1615 | 1631 |
1616 Instance& ConstantEvaluator::EvaluateExpression(Expression* expression) { | 1632 Instance& ConstantEvaluator::EvaluateExpression(Expression* expression) { |
1617 if (!GetCachedConstant(expression, &result_)) { | 1633 if (!GetCachedConstant(expression, &result_)) { |
1618 expression->AcceptExpressionVisitor(this); | 1634 expression->AcceptExpressionVisitor(this); |
1619 CacheConstantValue(expression, result_); | 1635 CacheConstantValue(expression, result_); |
1620 } | 1636 } |
1621 // We return a new `ZoneHandle` here on purpose: The intermediate language | 1637 // We return a new `ZoneHandle` here on purpose: The intermediate language |
1622 // instructions do not make a copy of the handle, so we do it. | 1638 // instructions do not make a copy of the handle, so we do it. |
1623 return dart::Instance::ZoneHandle(Z, result_.raw()); | 1639 return Instance::ZoneHandle(Z, result_.raw()); |
1624 } | 1640 } |
1625 | 1641 |
1626 | 1642 |
1627 Object& ConstantEvaluator::EvaluateExpressionSafe(Expression* expression) { | 1643 Object& ConstantEvaluator::EvaluateExpressionSafe(Expression* expression) { |
1628 LongJumpScope jump; | 1644 LongJumpScope jump; |
1629 if (setjmp(*jump.Set()) == 0) { | 1645 if (setjmp(*jump.Set()) == 0) { |
1630 return EvaluateExpression(expression); | 1646 return EvaluateExpression(expression); |
1631 } else { | 1647 } else { |
1632 Thread* thread = H.thread(); | 1648 Thread* thread = H.thread(); |
1633 Error& error = Error::Handle(Z); | 1649 Error& error = Error::Handle(Z); |
1634 error = thread->sticky_error(); | 1650 error = thread->sticky_error(); |
1635 thread->clear_sticky_error(); | 1651 thread->clear_sticky_error(); |
1636 return error; | 1652 return error; |
1637 } | 1653 } |
1638 } | 1654 } |
1639 | 1655 |
1640 | 1656 |
1641 Instance& ConstantEvaluator::EvaluateConstructorInvocation( | 1657 Instance& ConstantEvaluator::EvaluateConstructorInvocation( |
1642 ConstructorInvocation* node) { | 1658 ConstructorInvocation* node) { |
1643 if (!GetCachedConstant(node, &result_)) { | 1659 if (!GetCachedConstant(node, &result_)) { |
1644 VisitConstructorInvocation(node); | 1660 VisitConstructorInvocation(node); |
1645 CacheConstantValue(node, result_); | 1661 CacheConstantValue(node, result_); |
1646 } | 1662 } |
1647 // We return a new `ZoneHandle` here on purpose: The intermediate language | 1663 // We return a new `ZoneHandle` here on purpose: The intermediate language |
1648 // instructions do not make a copy of the handle, so we do it. | 1664 // instructions do not make a copy of the handle, so we do it. |
1649 return dart::Instance::ZoneHandle(Z, result_.raw()); | 1665 return Instance::ZoneHandle(Z, result_.raw()); |
1650 } | 1666 } |
1651 | 1667 |
1652 | 1668 |
1653 Instance& ConstantEvaluator::EvaluateListLiteral(ListLiteral* node) { | 1669 Instance& ConstantEvaluator::EvaluateListLiteral(ListLiteral* node) { |
1654 if (!GetCachedConstant(node, &result_)) { | 1670 if (!GetCachedConstant(node, &result_)) { |
1655 VisitListLiteral(node); | 1671 VisitListLiteral(node); |
1656 CacheConstantValue(node, result_); | 1672 CacheConstantValue(node, result_); |
1657 } | 1673 } |
1658 // We return a new `ZoneHandle` here on purpose: The intermediate language | 1674 // We return a new `ZoneHandle` here on purpose: The intermediate language |
1659 // instructions do not make a copy of the handle, so we do it. | 1675 // instructions do not make a copy of the handle, so we do it. |
1660 return dart::Instance::ZoneHandle(Z, result_.raw()); | 1676 return Instance::ZoneHandle(Z, result_.raw()); |
1661 } | 1677 } |
1662 | 1678 |
1663 | 1679 |
1664 Instance& ConstantEvaluator::EvaluateMapLiteral(MapLiteral* node) { | 1680 Instance& ConstantEvaluator::EvaluateMapLiteral(MapLiteral* node) { |
1665 if (!GetCachedConstant(node, &result_)) { | 1681 if (!GetCachedConstant(node, &result_)) { |
1666 VisitMapLiteral(node); | 1682 VisitMapLiteral(node); |
1667 CacheConstantValue(node, result_); | 1683 CacheConstantValue(node, result_); |
1668 } | 1684 } |
1669 // We return a new `ZoneHandle` here on purpose: The intermediate language | 1685 // We return a new `ZoneHandle` here on purpose: The intermediate language |
1670 // instructions do not make a copy of the handle, so we do it. | 1686 // instructions do not make a copy of the handle, so we do it. |
1671 return dart::Instance::ZoneHandle(Z, result_.raw()); | 1687 return Instance::ZoneHandle(Z, result_.raw()); |
1672 } | 1688 } |
1673 | 1689 |
1674 | 1690 |
1675 void ConstantEvaluator::VisitBigintLiteral(BigintLiteral* node) { | 1691 void ConstantEvaluator::VisitBigintLiteral(BigintLiteral* node) { |
1676 const dart::String& value = H.DartString(node->value()); | 1692 const dart::String& value = H.DartString(node->value()); |
1677 result_ = Integer::New(value, Heap::kOld); | 1693 result_ = Integer::New(value, Heap::kOld); |
1678 result_ = H.Canonicalize(result_); | 1694 result_ = H.Canonicalize(result_); |
1679 } | 1695 } |
1680 | 1696 |
1681 | 1697 |
1682 void ConstantEvaluator::VisitBoolLiteral(BoolLiteral* node) { | 1698 void ConstantEvaluator::VisitBoolLiteral(BoolLiteral* node) { |
1683 result_ = dart::Bool::Get(node->value()).raw(); | 1699 result_ = Bool::Get(node->value()).raw(); |
1684 } | 1700 } |
1685 | 1701 |
1686 | 1702 |
1687 void ConstantEvaluator::VisitDoubleLiteral(DoubleLiteral* node) { | 1703 void ConstantEvaluator::VisitDoubleLiteral(DoubleLiteral* node) { |
1688 result_ = dart::Double::New(H.DartString(node->value()), Heap::kOld); | 1704 result_ = Double::New(H.DartString(node->value()), Heap::kOld); |
1689 result_ = H.Canonicalize(result_); | 1705 result_ = H.Canonicalize(result_); |
1690 } | 1706 } |
1691 | 1707 |
1692 | 1708 |
1693 void ConstantEvaluator::VisitIntLiteral(IntLiteral* node) { | 1709 void ConstantEvaluator::VisitIntLiteral(IntLiteral* node) { |
1694 result_ = dart::Integer::New(node->value(), Heap::kOld); | 1710 result_ = Integer::New(node->value(), Heap::kOld); |
1695 result_ = H.Canonicalize(result_); | 1711 result_ = H.Canonicalize(result_); |
1696 } | 1712 } |
1697 | 1713 |
1698 | 1714 |
1699 void ConstantEvaluator::VisitNullLiteral(NullLiteral* node) { | 1715 void ConstantEvaluator::VisitNullLiteral(NullLiteral* node) { |
1700 result_ = dart::Instance::null(); | 1716 result_ = Instance::null(); |
1701 } | 1717 } |
1702 | 1718 |
1703 | 1719 |
1704 void ConstantEvaluator::VisitStringLiteral(StringLiteral* node) { | 1720 void ConstantEvaluator::VisitStringLiteral(StringLiteral* node) { |
1705 result_ = H.DartSymbol(node->value()).raw(); | 1721 result_ = H.DartSymbol(node->value()).raw(); |
1706 } | 1722 } |
1707 | 1723 |
1708 | 1724 |
1709 void ConstantEvaluator::VisitTypeLiteral(TypeLiteral* node) { | 1725 void ConstantEvaluator::VisitTypeLiteral(TypeLiteral* node) { |
1710 const AbstractType& type = T.TranslateType(node->type()); | 1726 const AbstractType& type = T.TranslateType(node->type()); |
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1807 script_.set_compile_time_constants(constants.Release()); | 1823 script_.set_compile_time_constants(constants.Release()); |
1808 } | 1824 } |
1809 | 1825 |
1810 | 1826 |
1811 void ConstantEvaluator::VisitSymbolLiteral(SymbolLiteral* node) { | 1827 void ConstantEvaluator::VisitSymbolLiteral(SymbolLiteral* node) { |
1812 const dart::String& symbol_value = H.DartSymbol(node->value()); | 1828 const dart::String& symbol_value = H.DartSymbol(node->value()); |
1813 | 1829 |
1814 const dart::Class& symbol_class = | 1830 const dart::Class& symbol_class = |
1815 dart::Class::ZoneHandle(Z, I->object_store()->symbol_class()); | 1831 dart::Class::ZoneHandle(Z, I->object_store()->symbol_class()); |
1816 ASSERT(!symbol_class.IsNull()); | 1832 ASSERT(!symbol_class.IsNull()); |
1817 const dart::Function& symbol_constructor = Function::ZoneHandle( | 1833 const Function& symbol_constructor = Function::ZoneHandle( |
1818 Z, symbol_class.LookupConstructor(Symbols::SymbolCtor())); | 1834 Z, symbol_class.LookupConstructor(Symbols::SymbolCtor())); |
1819 ASSERT(!symbol_constructor.IsNull()); | 1835 ASSERT(!symbol_constructor.IsNull()); |
1820 result_ ^= EvaluateConstConstructorCall( | 1836 result_ ^= EvaluateConstConstructorCall( |
1821 symbol_class, TypeArguments::Handle(Z), symbol_constructor, symbol_value); | 1837 symbol_class, TypeArguments::Handle(Z), symbol_constructor, symbol_value); |
1822 } | 1838 } |
1823 | 1839 |
1824 | 1840 |
1825 void ConstantEvaluator::VisitListLiteral(ListLiteral* node) { | 1841 void ConstantEvaluator::VisitListLiteral(ListLiteral* node) { |
1826 DartType* types[] = {node->type()}; | 1842 DartType* types[] = {node->type()}; |
1827 const TypeArguments& type_arguments = T.TranslateTypeArguments(types, 1); | 1843 const TypeArguments& type_arguments = T.TranslateTypeArguments(types, 1); |
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1912 } | 1928 } |
1913 } | 1929 } |
1914 | 1930 |
1915 | 1931 |
1916 void ConstantEvaluator::VisitMethodInvocation(MethodInvocation* node) { | 1932 void ConstantEvaluator::VisitMethodInvocation(MethodInvocation* node) { |
1917 Arguments* kernel_arguments = node->arguments(); | 1933 Arguments* kernel_arguments = node->arguments(); |
1918 | 1934 |
1919 // Dart does not support generic methods yet. | 1935 // Dart does not support generic methods yet. |
1920 ASSERT(kernel_arguments->types().length() == 0); | 1936 ASSERT(kernel_arguments->types().length() == 0); |
1921 | 1937 |
1922 const dart::Instance& receiver = EvaluateExpression(node->receiver()); | 1938 const Instance& receiver = EvaluateExpression(node->receiver()); |
1923 dart::Class& klass = dart::Class::Handle( | 1939 dart::Class& klass = dart::Class::Handle( |
1924 Z, isolate_->class_table()->At(receiver.GetClassId())); | 1940 Z, isolate_->class_table()->At(receiver.GetClassId())); |
1925 ASSERT(!klass.IsNull()); | 1941 ASSERT(!klass.IsNull()); |
1926 | 1942 |
1927 // Search the superclass chain for the selector. | 1943 // Search the superclass chain for the selector. |
1928 dart::Function& function = dart::Function::Handle(Z); | 1944 Function& function = Function::Handle(Z); |
1929 const dart::String& method_name = H.DartMethodName(node->name()); | 1945 const dart::String& method_name = H.DartMethodName(node->name()); |
1930 while (!klass.IsNull()) { | 1946 while (!klass.IsNull()) { |
1931 function = klass.LookupDynamicFunctionAllowPrivate(method_name); | 1947 function = klass.LookupDynamicFunctionAllowPrivate(method_name); |
1932 if (!function.IsNull()) break; | 1948 if (!function.IsNull()) break; |
1933 klass = klass.SuperClass(); | 1949 klass = klass.SuperClass(); |
1934 } | 1950 } |
1935 | 1951 |
1936 // The frontend should guarantee that [MethodInvocation]s inside constant | 1952 // The frontend should guarantee that [MethodInvocation]s inside constant |
1937 // expressions are always valid. | 1953 // expressions are always valid. |
1938 ASSERT(!function.IsNull()); | 1954 ASSERT(!function.IsNull()); |
1939 | 1955 |
1940 // Run the method and canonicalize the result. | 1956 // Run the method and canonicalize the result. |
1941 const Object& result = RunFunction(function, kernel_arguments, &receiver); | 1957 const Object& result = RunFunction(function, kernel_arguments, &receiver); |
1942 result_ ^= result.raw(); | 1958 result_ ^= result.raw(); |
1943 result_ = H.Canonicalize(result_); | 1959 result_ = H.Canonicalize(result_); |
1944 } | 1960 } |
1945 | 1961 |
1946 | 1962 |
1947 void ConstantEvaluator::VisitStaticGet(StaticGet* node) { | 1963 void ConstantEvaluator::VisitStaticGet(StaticGet* node) { |
1948 CanonicalName* target = node->target(); | 1964 intptr_t target = node->target(); |
1949 if (H.IsField(target)) { | 1965 if (H.IsField(target)) { |
1950 const dart::Field& field = | 1966 const dart::Field& field = |
1951 dart::Field::Handle(Z, H.LookupFieldByKernelField(target)); | 1967 dart::Field::Handle(Z, H.LookupFieldByKernelField(target)); |
1952 if (field.StaticValue() == Object::sentinel().raw() || | 1968 if (field.StaticValue() == Object::sentinel().raw() || |
1953 field.StaticValue() == Object::transition_sentinel().raw()) { | 1969 field.StaticValue() == Object::transition_sentinel().raw()) { |
1954 field.EvaluateInitializer(); | 1970 field.EvaluateInitializer(); |
1955 result_ = field.StaticValue(); | 1971 result_ = field.StaticValue(); |
1956 result_ = H.Canonicalize(result_); | 1972 result_ = H.Canonicalize(result_); |
1957 field.SetStaticValue(result_, true); | 1973 field.SetStaticValue(result_, true); |
1958 } else { | 1974 } else { |
(...skipping 240 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2199 next_used_try_index_(0), | 2215 next_used_try_index_(0), |
2200 catch_block_(NULL), | 2216 catch_block_(NULL), |
2201 type_translator_(&translation_helper_, | 2217 type_translator_(&translation_helper_, |
2202 &active_class_, | 2218 &active_class_, |
2203 /* finalize= */ true), | 2219 /* finalize= */ true), |
2204 constant_evaluator_(this, zone_, &translation_helper_, &type_translator_), | 2220 constant_evaluator_(this, zone_, &translation_helper_, &type_translator_), |
2205 streaming_flow_graph_builder_(NULL) { | 2221 streaming_flow_graph_builder_(NULL) { |
2206 Script& script = Script::Handle(Z, parsed_function->function().script()); | 2222 Script& script = Script::Handle(Z, parsed_function->function().script()); |
2207 H.SetStringOffsets(TypedData::Handle(Z, script.kernel_string_offsets())); | 2223 H.SetStringOffsets(TypedData::Handle(Z, script.kernel_string_offsets())); |
2208 H.SetStringData(TypedData::Handle(Z, script.kernel_string_data())); | 2224 H.SetStringData(TypedData::Handle(Z, script.kernel_string_data())); |
| 2225 H.SetCanonicalNames(TypedData::Handle(Z, script.kernel_canonical_names())); |
2209 } | 2226 } |
2210 | 2227 |
2211 | 2228 |
2212 FlowGraphBuilder::~FlowGraphBuilder() { | 2229 FlowGraphBuilder::~FlowGraphBuilder() { |
2213 if (streaming_flow_graph_builder_ != NULL) { | 2230 if (streaming_flow_graph_builder_ != NULL) { |
2214 delete streaming_flow_graph_builder_; | 2231 delete streaming_flow_graph_builder_; |
2215 } | 2232 } |
2216 } | 2233 } |
2217 | 2234 |
2218 | 2235 |
(...skipping 802 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3021 return Fragment(interpolate); | 3038 return Fragment(interpolate); |
3022 } | 3039 } |
3023 | 3040 |
3024 | 3041 |
3025 Fragment FlowGraphBuilder::StringInterpolateSingle(TokenPosition position) { | 3042 Fragment FlowGraphBuilder::StringInterpolateSingle(TokenPosition position) { |
3026 const int kNumberOfArguments = 1; | 3043 const int kNumberOfArguments = 1; |
3027 const Array& kNoArgumentNames = Object::null_array(); | 3044 const Array& kNoArgumentNames = Object::null_array(); |
3028 const dart::Class& cls = dart::Class::Handle( | 3045 const dart::Class& cls = dart::Class::Handle( |
3029 dart::Library::LookupCoreClass(Symbols::StringBase())); | 3046 dart::Library::LookupCoreClass(Symbols::StringBase())); |
3030 ASSERT(!cls.IsNull()); | 3047 ASSERT(!cls.IsNull()); |
3031 const Function& function = dart::Function::ZoneHandle( | 3048 const Function& function = Function::ZoneHandle( |
3032 Z, dart::Resolver::ResolveStatic(cls, dart::Library::PrivateCoreLibName( | 3049 Z, Resolver::ResolveStatic(cls, dart::Library::PrivateCoreLibName( |
3033 Symbols::InterpolateSingle()), | 3050 Symbols::InterpolateSingle()), |
3034 kNumberOfArguments, kNoArgumentNames)); | 3051 kNumberOfArguments, kNoArgumentNames)); |
3035 Fragment instructions; | 3052 Fragment instructions; |
3036 instructions += PushArgument(); | 3053 instructions += PushArgument(); |
3037 instructions += StaticCall(position, function, 1); | 3054 instructions += StaticCall(position, function, 1); |
3038 return instructions; | 3055 return instructions; |
3039 } | 3056 } |
3040 | 3057 |
3041 | 3058 |
3042 Fragment FlowGraphBuilder::ThrowTypeError() { | 3059 Fragment FlowGraphBuilder::ThrowTypeError() { |
3043 const dart::Class& klass = dart::Class::ZoneHandle( | 3060 const dart::Class& klass = dart::Class::ZoneHandle( |
3044 Z, dart::Library::LookupCoreClass(Symbols::TypeError())); | 3061 Z, dart::Library::LookupCoreClass(Symbols::TypeError())); |
3045 ASSERT(!klass.IsNull()); | 3062 ASSERT(!klass.IsNull()); |
3046 const dart::Function& constructor = dart::Function::ZoneHandle( | 3063 const Function& constructor = Function::ZoneHandle( |
3047 Z, | 3064 Z, |
3048 klass.LookupConstructorAllowPrivate(H.DartSymbol("_TypeError._create"))); | 3065 klass.LookupConstructorAllowPrivate(H.DartSymbol("_TypeError._create"))); |
3049 ASSERT(!constructor.IsNull()); | 3066 ASSERT(!constructor.IsNull()); |
3050 | 3067 |
3051 const dart::String& url = H.DartString( | 3068 const dart::String& url = H.DartString( |
3052 parsed_function_->function().ToLibNamePrefixedQualifiedCString(), | 3069 parsed_function_->function().ToLibNamePrefixedQualifiedCString(), |
3053 Heap::kOld); | 3070 Heap::kOld); |
3054 | 3071 |
3055 Fragment instructions; | 3072 Fragment instructions; |
3056 | 3073 |
(...skipping 25 matching lines...) Expand all Loading... |
3082 instructions += ThrowException(TokenPosition::kNoSource); | 3099 instructions += ThrowException(TokenPosition::kNoSource); |
3083 | 3100 |
3084 return instructions; | 3101 return instructions; |
3085 } | 3102 } |
3086 | 3103 |
3087 | 3104 |
3088 Fragment FlowGraphBuilder::ThrowNoSuchMethodError() { | 3105 Fragment FlowGraphBuilder::ThrowNoSuchMethodError() { |
3089 const dart::Class& klass = dart::Class::ZoneHandle( | 3106 const dart::Class& klass = dart::Class::ZoneHandle( |
3090 Z, dart::Library::LookupCoreClass(Symbols::NoSuchMethodError())); | 3107 Z, dart::Library::LookupCoreClass(Symbols::NoSuchMethodError())); |
3091 ASSERT(!klass.IsNull()); | 3108 ASSERT(!klass.IsNull()); |
3092 const dart::Function& throw_function = dart::Function::ZoneHandle( | 3109 const Function& throw_function = Function::ZoneHandle( |
3093 Z, klass.LookupStaticFunctionAllowPrivate(Symbols::ThrowNew())); | 3110 Z, klass.LookupStaticFunctionAllowPrivate(Symbols::ThrowNew())); |
3094 ASSERT(!throw_function.IsNull()); | 3111 ASSERT(!throw_function.IsNull()); |
3095 | 3112 |
3096 Fragment instructions; | 3113 Fragment instructions; |
3097 | 3114 |
3098 // Call NoSuchMethodError._throwNew static function. | 3115 // Call NoSuchMethodError._throwNew static function. |
3099 instructions += NullConstant(); | 3116 instructions += NullConstant(); |
3100 instructions += PushArgument(); // receiver | 3117 instructions += PushArgument(); // receiver |
3101 | 3118 |
3102 instructions += Constant(H.DartString("<unknown>", Heap::kOld)); | 3119 instructions += Constant(H.DartString("<unknown>", Heap::kOld)); |
(...skipping 12 matching lines...) Expand all Loading... |
3115 instructions += PushArgument(); // existingArgumentNames | 3132 instructions += PushArgument(); // existingArgumentNames |
3116 | 3133 |
3117 instructions += StaticCall(TokenPosition::kNoSource, throw_function, 6); | 3134 instructions += StaticCall(TokenPosition::kNoSource, throw_function, 6); |
3118 // Leave "result" on the stack since callers expect it to be there (even | 3135 // Leave "result" on the stack since callers expect it to be there (even |
3119 // though the function will result in an exception). | 3136 // though the function will result in an exception). |
3120 | 3137 |
3121 return instructions; | 3138 return instructions; |
3122 } | 3139 } |
3123 | 3140 |
3124 | 3141 |
3125 dart::RawFunction* FlowGraphBuilder::LookupMethodByMember( | 3142 RawFunction* FlowGraphBuilder::LookupMethodByMember( |
3126 CanonicalName* target, | 3143 intptr_t target, |
3127 const dart::String& method_name) { | 3144 const dart::String& method_name) { |
3128 CanonicalName* kernel_class = H.EnclosingName(target); | 3145 intptr_t kernel_class = H.EnclosingName(target); |
3129 dart::Class& klass = | 3146 dart::Class& klass = |
3130 dart::Class::Handle(Z, H.LookupClassByKernelClass(kernel_class)); | 3147 dart::Class::Handle(Z, H.LookupClassByKernelClass(kernel_class)); |
3131 | 3148 |
3132 dart::RawFunction* function = klass.LookupFunctionAllowPrivate(method_name); | 3149 RawFunction* function = klass.LookupFunctionAllowPrivate(method_name); |
3133 ASSERT(function != Object::null()); | 3150 ASSERT(function != Object::null()); |
3134 return function; | 3151 return function; |
3135 } | 3152 } |
3136 | 3153 |
3137 | 3154 |
3138 LocalVariable* FlowGraphBuilder::MakeTemporary() { | 3155 LocalVariable* FlowGraphBuilder::MakeTemporary() { |
3139 char name[64]; | 3156 char name[64]; |
3140 intptr_t index = stack_->definition()->temp_index(); | 3157 intptr_t index = stack_->definition()->temp_index(); |
3141 OS::SNPrint(name, 64, ":temp%" Pd, index); | 3158 OS::SNPrint(name, 64, ":temp%" Pd, index); |
3142 LocalVariable* variable = | 3159 LocalVariable* variable = |
(...skipping 16 matching lines...) Expand all Loading... |
3159 | 3176 |
3160 intptr_t FlowGraphBuilder::CurrentTryIndex() { | 3177 intptr_t FlowGraphBuilder::CurrentTryIndex() { |
3161 if (try_catch_block_ == NULL) { | 3178 if (try_catch_block_ == NULL) { |
3162 return CatchClauseNode::kInvalidTryIndex; | 3179 return CatchClauseNode::kInvalidTryIndex; |
3163 } else { | 3180 } else { |
3164 return try_catch_block_->try_index(); | 3181 return try_catch_block_->try_index(); |
3165 } | 3182 } |
3166 } | 3183 } |
3167 | 3184 |
3168 | 3185 |
3169 dart::LocalVariable* FlowGraphBuilder::LookupVariable( | 3186 LocalVariable* FlowGraphBuilder::LookupVariable(VariableDeclaration* var) { |
3170 VariableDeclaration* var) { | |
3171 LocalVariable* local = scopes_->locals.Lookup(var->kernel_offset()); | 3187 LocalVariable* local = scopes_->locals.Lookup(var->kernel_offset()); |
3172 ASSERT(local != NULL); | 3188 ASSERT(local != NULL); |
3173 return local; | 3189 return local; |
3174 } | 3190 } |
3175 | 3191 |
3176 | 3192 |
3177 void FlowGraphBuilder::SetTempIndex(Definition* definition) { | 3193 void FlowGraphBuilder::SetTempIndex(Definition* definition) { |
3178 definition->set_temp_index( | 3194 definition->set_temp_index( |
3179 stack_ == NULL ? 0 : stack_->definition()->temp_index() + 1); | 3195 stack_ == NULL ? 0 : stack_->definition()->temp_index() + 1); |
3180 } | 3196 } |
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3270 void FlowGraphBuilder::InlineBailout(const char* reason) { | 3286 void FlowGraphBuilder::InlineBailout(const char* reason) { |
3271 bool is_inlining = exit_collector_ != NULL; | 3287 bool is_inlining = exit_collector_ != NULL; |
3272 if (is_inlining) { | 3288 if (is_inlining) { |
3273 parsed_function_->function().set_is_inlinable(false); | 3289 parsed_function_->function().set_is_inlinable(false); |
3274 parsed_function_->Bailout("kernel::FlowGraphBuilder", reason); | 3290 parsed_function_->Bailout("kernel::FlowGraphBuilder", reason); |
3275 } | 3291 } |
3276 } | 3292 } |
3277 | 3293 |
3278 | 3294 |
3279 FlowGraph* FlowGraphBuilder::BuildGraph() { | 3295 FlowGraph* FlowGraphBuilder::BuildGraph() { |
3280 const dart::Function& function = parsed_function_->function(); | 3296 const Function& function = parsed_function_->function(); |
3281 | 3297 |
3282 if (function.IsConstructorClosureFunction()) return NULL; | 3298 if (function.IsConstructorClosureFunction()) return NULL; |
3283 | 3299 |
3284 TreeNode* library_node = node_; | 3300 TreeNode* library_node = node_; |
3285 if (node_ != NULL) { | 3301 if (node_ != NULL) { |
3286 const dart::Function* parent = &function; | 3302 const Function* parent = &function; |
3287 while (true) { | 3303 while (true) { |
3288 library_node = static_cast<kernel::TreeNode*>(parent->kernel_function()); | 3304 library_node = static_cast<kernel::TreeNode*>(parent->kernel_function()); |
3289 while (library_node != NULL && !library_node->IsLibrary()) { | 3305 while (library_node != NULL && !library_node->IsLibrary()) { |
3290 if (library_node->IsMember()) { | 3306 if (library_node->IsMember()) { |
3291 library_node = Member::Cast(library_node)->parent(); | 3307 library_node = Member::Cast(library_node)->parent(); |
3292 } else if (library_node->IsClass()) { | 3308 } else if (library_node->IsClass()) { |
3293 library_node = Class::Cast(library_node)->parent(); | 3309 library_node = Class::Cast(library_node)->parent(); |
3294 break; | 3310 break; |
3295 } else { | 3311 } else { |
3296 library_node = NULL; | 3312 library_node = NULL; |
3297 break; | 3313 break; |
3298 } | 3314 } |
3299 } | 3315 } |
3300 if (library_node != NULL) break; | 3316 if (library_node != NULL) break; |
3301 parent = &dart::Function::Handle(parent->parent_function()); | 3317 parent = &Function::Handle(parent->parent_function()); |
3302 } | 3318 } |
3303 } | 3319 } |
3304 if (streaming_flow_graph_builder_ != NULL) { | 3320 if (streaming_flow_graph_builder_ != NULL) { |
3305 delete streaming_flow_graph_builder_; | 3321 delete streaming_flow_graph_builder_; |
3306 streaming_flow_graph_builder_ = NULL; | 3322 streaming_flow_graph_builder_ = NULL; |
3307 } | 3323 } |
3308 if (library_node != NULL && library_node->IsLibrary()) { | 3324 if (library_node != NULL && library_node->IsLibrary()) { |
3309 Library* library = Library::Cast(library_node); | 3325 Library* library = Library::Cast(library_node); |
3310 streaming_flow_graph_builder_ = new StreamingFlowGraphBuilder( | 3326 streaming_flow_graph_builder_ = new StreamingFlowGraphBuilder( |
3311 this, library->kernel_data(), library->kernel_data_size()); | 3327 this, library->kernel_data(), library->kernel_data_size()); |
(...skipping 518 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3830 break; | 3846 break; |
3831 } | 3847 } |
3832 } | 3848 } |
3833 return body + Return(TokenPosition::kNoSource); | 3849 return body + Return(TokenPosition::kNoSource); |
3834 } | 3850 } |
3835 | 3851 |
3836 | 3852 |
3837 FlowGraph* FlowGraphBuilder::BuildGraphOfFieldAccessor( | 3853 FlowGraph* FlowGraphBuilder::BuildGraphOfFieldAccessor( |
3838 Field* kernel_field, | 3854 Field* kernel_field, |
3839 LocalVariable* setter_value) { | 3855 LocalVariable* setter_value) { |
3840 const dart::Function& function = parsed_function_->function(); | 3856 const Function& function = parsed_function_->function(); |
3841 | 3857 |
3842 bool is_setter = function.IsImplicitSetterFunction(); | 3858 bool is_setter = function.IsImplicitSetterFunction(); |
3843 bool is_method = !function.IsStaticFunction(); | 3859 bool is_method = !function.IsStaticFunction(); |
3844 dart::Field& field = dart::Field::ZoneHandle( | 3860 dart::Field& field = dart::Field::ZoneHandle( |
3845 Z, H.LookupFieldByKernelField(kernel_field->canonical_name())); | 3861 Z, H.LookupFieldByKernelField(kernel_field->canonical_name())); |
3846 | 3862 |
3847 TargetEntryInstr* normal_entry = BuildTargetEntry(); | 3863 TargetEntryInstr* normal_entry = BuildTargetEntry(); |
3848 graph_entry_ = new (Z) | 3864 graph_entry_ = new (Z) |
3849 GraphEntryInstr(*parsed_function_, normal_entry, Compiler::kNoOSRDeoptId); | 3865 GraphEntryInstr(*parsed_function_, normal_entry, Compiler::kNoOSRDeoptId); |
3850 | 3866 |
(...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3992 Fragment FlowGraphBuilder::DebugStepCheck(TokenPosition position) { | 4008 Fragment FlowGraphBuilder::DebugStepCheck(TokenPosition position) { |
3993 return Fragment( | 4009 return Fragment( |
3994 new (Z) DebugStepCheckInstr(position, RawPcDescriptors::kRuntimeCall)); | 4010 new (Z) DebugStepCheckInstr(position, RawPcDescriptors::kRuntimeCall)); |
3995 } | 4011 } |
3996 | 4012 |
3997 | 4013 |
3998 Fragment FlowGraphBuilder::EvaluateAssertion() { | 4014 Fragment FlowGraphBuilder::EvaluateAssertion() { |
3999 const dart::Class& klass = dart::Class::ZoneHandle( | 4015 const dart::Class& klass = dart::Class::ZoneHandle( |
4000 Z, dart::Library::LookupCoreClass(Symbols::AssertionError())); | 4016 Z, dart::Library::LookupCoreClass(Symbols::AssertionError())); |
4001 ASSERT(!klass.IsNull()); | 4017 ASSERT(!klass.IsNull()); |
4002 const dart::Function& target = | 4018 const Function& target = |
4003 dart::Function::ZoneHandle(Z, klass.LookupStaticFunctionAllowPrivate( | 4019 Function::ZoneHandle(Z, klass.LookupStaticFunctionAllowPrivate( |
4004 H.DartSymbol("_evaluateAssertion"))); | 4020 H.DartSymbol("_evaluateAssertion"))); |
4005 ASSERT(!target.IsNull()); | 4021 ASSERT(!target.IsNull()); |
4006 return StaticCall(TokenPosition::kNoSource, target, 1); | 4022 return StaticCall(TokenPosition::kNoSource, target, 1); |
4007 } | 4023 } |
4008 | 4024 |
4009 | 4025 |
4010 Fragment FlowGraphBuilder::CheckReturnTypeInCheckedMode() { | 4026 Fragment FlowGraphBuilder::CheckReturnTypeInCheckedMode() { |
4011 if (I->type_checks()) { | 4027 if (I->type_checks()) { |
4012 const AbstractType& return_type = | 4028 const AbstractType& return_type = |
4013 AbstractType::Handle(Z, parsed_function_->function().result_type()); | 4029 AbstractType::Handle(Z, parsed_function_->function().result_type()); |
4014 return CheckAssignableInCheckedMode(return_type, Symbols::FunctionResult()); | 4030 return CheckAssignableInCheckedMode(return_type, Symbols::FunctionResult()); |
4015 } | 4031 } |
4016 return Fragment(); | 4032 return Fragment(); |
4017 } | 4033 } |
4018 | 4034 |
4019 | 4035 |
4020 Fragment FlowGraphBuilder::CheckBooleanInCheckedMode() { | 4036 Fragment FlowGraphBuilder::CheckBooleanInCheckedMode() { |
4021 Fragment instructions; | 4037 Fragment instructions; |
4022 if (I->type_checks()) { | 4038 if (I->type_checks()) { |
4023 LocalVariable* top_of_stack = MakeTemporary(); | 4039 LocalVariable* top_of_stack = MakeTemporary(); |
4024 instructions += LoadLocal(top_of_stack); | 4040 instructions += LoadLocal(top_of_stack); |
4025 instructions += AssertBool(); | 4041 instructions += AssertBool(); |
4026 instructions += Drop(); | 4042 instructions += Drop(); |
4027 } | 4043 } |
4028 return instructions; | 4044 return instructions; |
4029 } | 4045 } |
4030 | 4046 |
4031 | 4047 |
4032 Fragment FlowGraphBuilder::CheckAssignableInCheckedMode( | 4048 Fragment FlowGraphBuilder::CheckAssignableInCheckedMode( |
4033 const dart::AbstractType& dst_type, | 4049 const AbstractType& dst_type, |
4034 const dart::String& dst_name) { | 4050 const dart::String& dst_name) { |
4035 Fragment instructions; | 4051 Fragment instructions; |
4036 if (I->type_checks() && !dst_type.IsDynamicType() && | 4052 if (I->type_checks() && !dst_type.IsDynamicType() && |
4037 !dst_type.IsObjectType()) { | 4053 !dst_type.IsObjectType()) { |
4038 LocalVariable* top_of_stack = MakeTemporary(); | 4054 LocalVariable* top_of_stack = MakeTemporary(); |
4039 instructions += LoadLocal(top_of_stack); | 4055 instructions += LoadLocal(top_of_stack); |
4040 instructions += AssertAssignable(dst_type, dst_name); | 4056 instructions += AssertAssignable(dst_type, dst_name); |
4041 instructions += Drop(); | 4057 instructions += Drop(); |
4042 } | 4058 } |
4043 return instructions; | 4059 return instructions; |
4044 } | 4060 } |
4045 | 4061 |
4046 | 4062 |
4047 Fragment FlowGraphBuilder::AssertBool() { | 4063 Fragment FlowGraphBuilder::AssertBool() { |
4048 Value* value = Pop(); | 4064 Value* value = Pop(); |
4049 AssertBooleanInstr* instr = | 4065 AssertBooleanInstr* instr = |
4050 new (Z) AssertBooleanInstr(TokenPosition::kNoSource, value); | 4066 new (Z) AssertBooleanInstr(TokenPosition::kNoSource, value); |
4051 Push(instr); | 4067 Push(instr); |
4052 return Fragment(instr); | 4068 return Fragment(instr); |
4053 } | 4069 } |
4054 | 4070 |
4055 | 4071 |
4056 Fragment FlowGraphBuilder::AssertAssignable(const dart::AbstractType& dst_type, | 4072 Fragment FlowGraphBuilder::AssertAssignable(const AbstractType& dst_type, |
4057 const dart::String& dst_name) { | 4073 const dart::String& dst_name) { |
4058 Fragment instructions; | 4074 Fragment instructions; |
4059 Value* value = Pop(); | 4075 Value* value = Pop(); |
4060 | 4076 |
4061 if (!dst_type.IsInstantiated(kCurrentClass)) { | 4077 if (!dst_type.IsInstantiated(kCurrentClass)) { |
4062 instructions += LoadInstantiatorTypeArguments(); | 4078 instructions += LoadInstantiatorTypeArguments(); |
4063 } else { | 4079 } else { |
4064 instructions += NullConstant(); | 4080 instructions += NullConstant(); |
4065 } | 4081 } |
4066 Value* instantiator_type_args = Pop(); | 4082 Value* instantiator_type_args = Pop(); |
(...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4204 body += LoadLocal(array); | 4220 body += LoadLocal(array); |
4205 body += IntConstant(i); | 4221 body += IntConstant(i); |
4206 body += LoadLocal(scope->VariableAt(i)); | 4222 body += LoadLocal(scope->VariableAt(i)); |
4207 body += StoreIndexed(kArrayCid); | 4223 body += StoreIndexed(kArrayCid); |
4208 body += Drop(); | 4224 body += Drop(); |
4209 } | 4225 } |
4210 dart::String& name = dart::String::Handle(Z); | 4226 dart::String& name = dart::String::Handle(Z); |
4211 for (intptr_t i = 0; i < descriptor.NamedCount(); ++i) { | 4227 for (intptr_t i = 0; i < descriptor.NamedCount(); ++i) { |
4212 intptr_t parameter_index = descriptor.PositionalCount() + i; | 4228 intptr_t parameter_index = descriptor.PositionalCount() + i; |
4213 name = descriptor.NameAt(i); | 4229 name = descriptor.NameAt(i); |
4214 name = dart::Symbols::New(H.thread(), name); | 4230 name = Symbols::New(H.thread(), name); |
4215 body += LoadLocal(array); | 4231 body += LoadLocal(array); |
4216 body += IntConstant(descriptor.PositionAt(i)); | 4232 body += IntConstant(descriptor.PositionAt(i)); |
4217 body += LoadLocal(scope->VariableAt(parameter_index)); | 4233 body += LoadLocal(scope->VariableAt(parameter_index)); |
4218 body += StoreIndexed(kArrayCid); | 4234 body += StoreIndexed(kArrayCid); |
4219 body += Drop(); | 4235 body += Drop(); |
4220 } | 4236 } |
4221 body += PushArgument(); | 4237 body += PushArgument(); |
4222 | 4238 |
4223 // Fourth, false indicating this is not a super NoSuchMethod. | 4239 // Fourth, false indicating this is not a super NoSuchMethod. |
4224 body += Constant(Bool::False()); | 4240 body += Constant(Bool::False()); |
(...skipping 165 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4390 JoinEntryInstr* FlowGraphBuilder::BuildJoinEntry(intptr_t try_index) { | 4406 JoinEntryInstr* FlowGraphBuilder::BuildJoinEntry(intptr_t try_index) { |
4391 return new (Z) JoinEntryInstr(AllocateBlockId(), try_index); | 4407 return new (Z) JoinEntryInstr(AllocateBlockId(), try_index); |
4392 } | 4408 } |
4393 | 4409 |
4394 | 4410 |
4395 JoinEntryInstr* FlowGraphBuilder::BuildJoinEntry() { | 4411 JoinEntryInstr* FlowGraphBuilder::BuildJoinEntry() { |
4396 return new (Z) JoinEntryInstr(AllocateBlockId(), CurrentTryIndex()); | 4412 return new (Z) JoinEntryInstr(AllocateBlockId(), CurrentTryIndex()); |
4397 } | 4413 } |
4398 | 4414 |
4399 | 4415 |
4400 Fragment FlowGraphBuilder::TranslateFieldInitializer( | 4416 Fragment FlowGraphBuilder::TranslateFieldInitializer(intptr_t canonical_name, |
4401 CanonicalName* canonical_name, | 4417 Expression* init) { |
4402 Expression* init) { | |
4403 dart::Field& field = | 4418 dart::Field& field = |
4404 dart::Field::ZoneHandle(Z, H.LookupFieldByKernelField(canonical_name)); | 4419 dart::Field::ZoneHandle(Z, H.LookupFieldByKernelField(canonical_name)); |
4405 if (init->IsNullLiteral()) { | 4420 if (init->IsNullLiteral()) { |
4406 field.RecordStore(Object::null_object()); | 4421 field.RecordStore(Object::null_object()); |
4407 return Fragment(); | 4422 return Fragment(); |
4408 } | 4423 } |
4409 Fragment instructions; | 4424 Fragment instructions; |
4410 instructions += LoadLocal(scopes_->this_variable); | 4425 instructions += LoadLocal(scopes_->this_variable); |
4411 instructions += TranslateExpression(init); | 4426 instructions += TranslateExpression(init); |
4412 instructions += StoreInstanceFieldGuarded(field, true); | 4427 instructions += StoreInstanceFieldGuarded(field, true); |
(...skipping 190 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4603 void FlowGraphBuilder::VisitSymbolLiteral(SymbolLiteral* node) { | 4618 void FlowGraphBuilder::VisitSymbolLiteral(SymbolLiteral* node) { |
4604 fragment_ = streaming_flow_graph_builder_->BuildAt(node->kernel_offset()); | 4619 fragment_ = streaming_flow_graph_builder_->BuildAt(node->kernel_offset()); |
4605 } | 4620 } |
4606 | 4621 |
4607 | 4622 |
4608 AbstractType& DartTypeTranslator::TranslateType(DartType* node) { | 4623 AbstractType& DartTypeTranslator::TranslateType(DartType* node) { |
4609 node->AcceptDartTypeVisitor(this); | 4624 node->AcceptDartTypeVisitor(this); |
4610 | 4625 |
4611 // We return a new `ZoneHandle` here on purpose: The intermediate language | 4626 // We return a new `ZoneHandle` here on purpose: The intermediate language |
4612 // instructions do not make a copy of the handle, so we do it. | 4627 // instructions do not make a copy of the handle, so we do it. |
4613 return dart::AbstractType::ZoneHandle(Z, result_.raw()); | 4628 return AbstractType::ZoneHandle(Z, result_.raw()); |
4614 } | 4629 } |
4615 | 4630 |
4616 | 4631 |
4617 AbstractType& DartTypeTranslator::TranslateTypeWithoutFinalization( | 4632 AbstractType& DartTypeTranslator::TranslateTypeWithoutFinalization( |
4618 DartType* node) { | 4633 DartType* node) { |
4619 bool saved_finalize = finalize_; | 4634 bool saved_finalize = finalize_; |
4620 finalize_ = false; | 4635 finalize_ = false; |
4621 AbstractType& result = TranslateType(node); | 4636 AbstractType& result = TranslateType(node); |
4622 finalize_ = saved_finalize; | 4637 finalize_ = saved_finalize; |
4623 return result; | 4638 return result; |
(...skipping 14 matching lines...) Expand all Loading... |
4638 type = result_.raw(); | 4653 type = result_.raw(); |
4639 } | 4654 } |
4640 | 4655 |
4641 return type; | 4656 return type; |
4642 } | 4657 } |
4643 | 4658 |
4644 | 4659 |
4645 void DartTypeTranslator::VisitInvalidType(InvalidType* node) { | 4660 void DartTypeTranslator::VisitInvalidType(InvalidType* node) { |
4646 result_ = ClassFinalizer::NewFinalizedMalformedType( | 4661 result_ = ClassFinalizer::NewFinalizedMalformedType( |
4647 Error::Handle(Z), // No previous error. | 4662 Error::Handle(Z), // No previous error. |
4648 dart::Script::Handle(Z, dart::Script::null()), TokenPosition::kNoSource, | 4663 Script::Handle(Z, Script::null()), TokenPosition::kNoSource, |
4649 "[InvalidType] in Kernel IR."); | 4664 "[InvalidType] in Kernel IR."); |
4650 } | 4665 } |
4651 | 4666 |
4652 | 4667 |
4653 void DartTypeTranslator::VisitFunctionType(FunctionType* node) { | 4668 void DartTypeTranslator::VisitFunctionType(FunctionType* node) { |
4654 // The spec describes in section "19.1 Static Types": | 4669 // The spec describes in section "19.1 Static Types": |
4655 // | 4670 // |
4656 // Any use of a malformed type gives rise to a static warning. A | 4671 // Any use of a malformed type gives rise to a static warning. A |
4657 // malformed type is then interpreted as dynamic by the static type | 4672 // malformed type is then interpreted as dynamic by the static type |
4658 // checker and the runtime unless explicitly specified otherwise. | 4673 // checker and the runtime unless explicitly specified otherwise. |
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4767 // class A<T> { | 4782 // class A<T> { |
4768 // static A.x<T'>() { return new B<T'>(); } | 4783 // static A.x<T'>() { return new B<T'>(); } |
4769 // } | 4784 // } |
4770 // | 4785 // |
4771 const intptr_t index = FindTypeParameterIndex( | 4786 const intptr_t index = FindTypeParameterIndex( |
4772 &procedure->function()->type_parameters(), node->parameter()); | 4787 &procedure->function()->type_parameters(), node->parameter()); |
4773 if (index >= 0) { | 4788 if (index >= 0) { |
4774 if (procedure->kind() == Procedure::kFactory) { | 4789 if (procedure->kind() == Procedure::kFactory) { |
4775 // The index of the type parameter in [parameters] is | 4790 // The index of the type parameter in [parameters] is |
4776 // the same index into the `klass->type_parameters()` array. | 4791 // the same index into the `klass->type_parameters()` array. |
4777 result_ ^= dart::TypeArguments::Handle( | 4792 result_ ^= |
4778 Z, active_class_->klass->type_parameters()) | 4793 TypeArguments::Handle(Z, active_class_->klass->type_parameters()) |
4779 .TypeAt(index); | 4794 .TypeAt(index); |
4780 } else { | 4795 } else { |
4781 result_ ^= dart::Type::DynamicType(); | 4796 result_ ^= dart::Type::DynamicType(); |
4782 } | 4797 } |
4783 return; | 4798 return; |
4784 } | 4799 } |
4785 } | 4800 } |
4786 } | 4801 } |
4787 | 4802 |
4788 ASSERT(active_class_->kernel_class != NULL); | 4803 ASSERT(active_class_->kernel_class != NULL); |
4789 List<TypeParameter>* parameters = | 4804 List<TypeParameter>* parameters = |
4790 &active_class_->kernel_class->type_parameters(); | 4805 &active_class_->kernel_class->type_parameters(); |
4791 const intptr_t index = FindTypeParameterIndex(parameters, node->parameter()); | 4806 const intptr_t index = FindTypeParameterIndex(parameters, node->parameter()); |
4792 if (index >= 0) { | 4807 if (index >= 0) { |
4793 // The index of the type parameter in [parameters] is | 4808 // The index of the type parameter in [parameters] is |
4794 // the same index into the `klass->type_parameters()` array. | 4809 // the same index into the `klass->type_parameters()` array. |
4795 result_ ^= | 4810 result_ ^= TypeArguments::Handle(Z, active_class_->klass->type_parameters()) |
4796 dart::TypeArguments::Handle(Z, active_class_->klass->type_parameters()) | 4811 .TypeAt(index); |
4797 .TypeAt(index); | |
4798 return; | 4812 return; |
4799 } | 4813 } |
4800 | 4814 |
4801 UNREACHABLE(); | 4815 UNREACHABLE(); |
4802 } | 4816 } |
4803 | 4817 |
4804 | 4818 |
4805 void DartTypeTranslator::VisitInterfaceType(InterfaceType* node) { | 4819 void DartTypeTranslator::VisitInterfaceType(InterfaceType* node) { |
4806 // NOTE: That an interface type like `T<A, B>` is considered to be | 4820 // NOTE: That an interface type like `T<A, B>` is considered to be |
4807 // malformed iff `T` is malformed. | 4821 // malformed iff `T` is malformed. |
4808 // => We therefore ignore errors in `A` or `B`. | 4822 // => We therefore ignore errors in `A` or `B`. |
4809 const TypeArguments& type_arguments = TranslateTypeArguments( | 4823 const TypeArguments& type_arguments = TranslateTypeArguments( |
4810 node->type_arguments().raw_array(), node->type_arguments().length()); | 4824 node->type_arguments().raw_array(), node->type_arguments().length()); |
4811 | 4825 |
4812 | 4826 |
4813 dart::Object& klass = | 4827 Object& klass = Object::Handle(Z, H.LookupClassByKernelClass(node->klass())); |
4814 dart::Object::Handle(Z, H.LookupClassByKernelClass(node->klass())); | |
4815 result_ = Type::New(klass, type_arguments, TokenPosition::kNoSource); | 4828 result_ = Type::New(klass, type_arguments, TokenPosition::kNoSource); |
4816 if (finalize_) { | 4829 if (finalize_) { |
4817 ASSERT(active_class_->klass != NULL); | 4830 ASSERT(active_class_->klass != NULL); |
4818 result_ = ClassFinalizer::FinalizeType(*active_class_->klass, result_); | 4831 result_ = ClassFinalizer::FinalizeType(*active_class_->klass, result_); |
4819 } | 4832 } |
4820 } | 4833 } |
4821 | 4834 |
4822 | 4835 |
4823 void DartTypeTranslator::VisitDynamicType(DynamicType* node) { | 4836 void DartTypeTranslator::VisitDynamicType(DynamicType* node) { |
4824 result_ = Object::dynamic_type().raw(); | 4837 result_ = Object::dynamic_type().raw(); |
(...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4969 } else { | 4982 } else { |
4970 UNIMPLEMENTED(); | 4983 UNIMPLEMENTED(); |
4971 } | 4984 } |
4972 } else { | 4985 } else { |
4973 UNIMPLEMENTED(); | 4986 UNIMPLEMENTED(); |
4974 } | 4987 } |
4975 } | 4988 } |
4976 | 4989 |
4977 | 4990 |
4978 void FlowGraphBuilder::VisitStaticSet(StaticSet* node) { | 4991 void FlowGraphBuilder::VisitStaticSet(StaticSet* node) { |
4979 CanonicalName* target = node->target(); | 4992 intptr_t target = node->target(); |
4980 if (H.IsField(target)) { | 4993 if (H.IsField(target)) { |
4981 const dart::Field& field = | 4994 const dart::Field& field = |
4982 dart::Field::ZoneHandle(Z, H.LookupFieldByKernelField(target)); | 4995 dart::Field::ZoneHandle(Z, H.LookupFieldByKernelField(target)); |
4983 const AbstractType& dst_type = AbstractType::ZoneHandle(Z, field.type()); | 4996 const AbstractType& dst_type = AbstractType::ZoneHandle(Z, field.type()); |
4984 Fragment instructions = TranslateExpression(node->expression()); | 4997 Fragment instructions = TranslateExpression(node->expression()); |
4985 if (NeedsDebugStepCheck(stack_, node->position())) { | 4998 if (NeedsDebugStepCheck(stack_, node->position())) { |
4986 instructions = DebugStepCheck(node->position()) + instructions; | 4999 instructions = DebugStepCheck(node->position()) + instructions; |
4987 } | 5000 } |
4988 instructions += CheckAssignableInCheckedMode( | 5001 instructions += CheckAssignableInCheckedMode( |
4989 dst_type, dart::String::ZoneHandle(Z, field.name())); | 5002 dst_type, dart::String::ZoneHandle(Z, field.name())); |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5031 instructions += PushArgument(); | 5044 instructions += PushArgument(); |
5032 | 5045 |
5033 const dart::String& setter_name = H.DartSetterName(node->name()); | 5046 const dart::String& setter_name = H.DartSetterName(node->name()); |
5034 instructions += InstanceCall(node->position(), setter_name, Token::kSET, 2); | 5047 instructions += InstanceCall(node->position(), setter_name, Token::kSET, 2); |
5035 fragment_ = instructions + Drop(); | 5048 fragment_ = instructions + Drop(); |
5036 } | 5049 } |
5037 | 5050 |
5038 | 5051 |
5039 void FlowGraphBuilder::VisitDirectPropertyGet(DirectPropertyGet* node) { | 5052 void FlowGraphBuilder::VisitDirectPropertyGet(DirectPropertyGet* node) { |
5040 Function& target = Function::ZoneHandle(Z); | 5053 Function& target = Function::ZoneHandle(Z); |
5041 CanonicalName* kernel_name = node->target(); | 5054 intptr_t kernel_name = node->target(); |
5042 if (H.IsProcedure(kernel_name)) { | 5055 if (H.IsProcedure(kernel_name)) { |
5043 if (H.IsGetter(kernel_name)) { | 5056 if (H.IsGetter(kernel_name)) { |
5044 target = LookupMethodByMember(kernel_name, H.DartGetterName(kernel_name)); | 5057 target = LookupMethodByMember(kernel_name, H.DartGetterName(kernel_name)); |
5045 } else { | 5058 } else { |
5046 target = LookupMethodByMember(kernel_name, H.DartMethodName(kernel_name)); | 5059 target = LookupMethodByMember(kernel_name, H.DartMethodName(kernel_name)); |
5047 target = target.ImplicitClosureFunction(); | 5060 target = target.ImplicitClosureFunction(); |
5048 ASSERT(!target.IsNull()); | 5061 ASSERT(!target.IsNull()); |
5049 fragment_ = BuildImplicitClosureCreation(target); | 5062 fragment_ = BuildImplicitClosureCreation(target); |
5050 return; | 5063 return; |
5051 } | 5064 } |
(...skipping 1054 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6106 body_fragment += Drop(); | 6119 body_fragment += Drop(); |
6107 } | 6120 } |
6108 | 6121 |
6109 // The Dart language specification mandates fall-throughs in [SwitchCase]es | 6122 // The Dart language specification mandates fall-throughs in [SwitchCase]es |
6110 // to be runtime errors. | 6123 // to be runtime errors. |
6111 if (!switch_case->is_default() && body_fragment.is_open() && | 6124 if (!switch_case->is_default() && body_fragment.is_open() && |
6112 (i < (node->cases().length() - 1))) { | 6125 (i < (node->cases().length() - 1))) { |
6113 const dart::Class& klass = dart::Class::ZoneHandle( | 6126 const dart::Class& klass = dart::Class::ZoneHandle( |
6114 Z, dart::Library::LookupCoreClass(Symbols::FallThroughError())); | 6127 Z, dart::Library::LookupCoreClass(Symbols::FallThroughError())); |
6115 ASSERT(!klass.IsNull()); | 6128 ASSERT(!klass.IsNull()); |
6116 const dart::Function& constructor = dart::Function::ZoneHandle( | 6129 const Function& constructor = Function::ZoneHandle( |
6117 Z, klass.LookupConstructorAllowPrivate( | 6130 Z, klass.LookupConstructorAllowPrivate( |
6118 H.DartSymbol("FallThroughError._create"))); | 6131 H.DartSymbol("FallThroughError._create"))); |
6119 ASSERT(!constructor.IsNull()); | 6132 ASSERT(!constructor.IsNull()); |
6120 const dart::String& url = H.DartString( | 6133 const dart::String& url = H.DartString( |
6121 parsed_function_->function().ToLibNamePrefixedQualifiedCString(), | 6134 parsed_function_->function().ToLibNamePrefixedQualifiedCString(), |
6122 Heap::kOld); | 6135 Heap::kOld); |
6123 | 6136 |
6124 // Create instance of _FallThroughError | 6137 // Create instance of _FallThroughError |
6125 body_fragment += AllocateObject(klass, 0); | 6138 body_fragment += AllocateObject(klass, 0); |
6126 LocalVariable* instance = MakeTemporary(); | 6139 LocalVariable* instance = MakeTemporary(); |
(...skipping 171 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6298 instructions += TranslateExpression(node->condition()); | 6311 instructions += TranslateExpression(node->condition()); |
6299 instructions += PushArgument(); | 6312 instructions += PushArgument(); |
6300 instructions += EvaluateAssertion(); | 6313 instructions += EvaluateAssertion(); |
6301 instructions += CheckBooleanInCheckedMode(); | 6314 instructions += CheckBooleanInCheckedMode(); |
6302 instructions += Constant(Bool::True()); | 6315 instructions += Constant(Bool::True()); |
6303 instructions += BranchIfEqual(&then, &otherwise, false); | 6316 instructions += BranchIfEqual(&then, &otherwise, false); |
6304 | 6317 |
6305 const dart::Class& klass = dart::Class::ZoneHandle( | 6318 const dart::Class& klass = dart::Class::ZoneHandle( |
6306 Z, dart::Library::LookupCoreClass(Symbols::AssertionError())); | 6319 Z, dart::Library::LookupCoreClass(Symbols::AssertionError())); |
6307 ASSERT(!klass.IsNull()); | 6320 ASSERT(!klass.IsNull()); |
6308 const dart::Function& constructor = dart::Function::ZoneHandle( | 6321 const Function& constructor = |
6309 Z, klass.LookupConstructorAllowPrivate( | 6322 Function::ZoneHandle(Z, klass.LookupConstructorAllowPrivate( |
6310 H.DartSymbol("_AssertionError._create"))); | 6323 H.DartSymbol("_AssertionError._create"))); |
6311 ASSERT(!constructor.IsNull()); | 6324 ASSERT(!constructor.IsNull()); |
6312 | 6325 |
6313 const dart::String& url = H.DartString( | 6326 const dart::String& url = H.DartString( |
6314 parsed_function_->function().ToLibNamePrefixedQualifiedCString(), | 6327 parsed_function_->function().ToLibNamePrefixedQualifiedCString(), |
6315 Heap::kOld); | 6328 Heap::kOld); |
6316 | 6329 |
6317 // Create instance of _AssertionError | 6330 // Create instance of _AssertionError |
6318 Fragment otherwise_fragment(otherwise); | 6331 Fragment otherwise_fragment(otherwise); |
6319 otherwise_fragment += AllocateObject(klass, 0); | 6332 otherwise_fragment += AllocateObject(klass, 0); |
6320 LocalVariable* instance = MakeTemporary(); | 6333 LocalVariable* instance = MakeTemporary(); |
(...skipping 426 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6747 } else { | 6760 } else { |
6748 FATAL1("No support for metadata on this type of kernel node %p\n", | 6761 FATAL1("No support for metadata on this type of kernel node %p\n", |
6749 kernel_node); | 6762 kernel_node); |
6750 } | 6763 } |
6751 | 6764 |
6752 TranslationHelper helper(thread); | 6765 TranslationHelper helper(thread); |
6753 Script& script = Script::Handle(Z, metadata_field.Script()); | 6766 Script& script = Script::Handle(Z, metadata_field.Script()); |
6754 helper.SetStringOffsets( | 6767 helper.SetStringOffsets( |
6755 TypedData::Handle(Z, script.kernel_string_offsets())); | 6768 TypedData::Handle(Z, script.kernel_string_offsets())); |
6756 helper.SetStringData(TypedData::Handle(Z, script.kernel_string_data())); | 6769 helper.SetStringData(TypedData::Handle(Z, script.kernel_string_data())); |
| 6770 helper.SetCanonicalNames( |
| 6771 TypedData::Handle(Z, script.kernel_canonical_names())); |
6757 DartTypeTranslator type_translator(&helper, NULL, true); | 6772 DartTypeTranslator type_translator(&helper, NULL, true); |
6758 ConstantEvaluator constant_evaluator(/* flow_graph_builder = */ NULL, Z, | 6773 ConstantEvaluator constant_evaluator(/* flow_graph_builder = */ NULL, Z, |
6759 &helper, &type_translator); | 6774 &helper, &type_translator); |
6760 | 6775 |
6761 const Array& metadata_values = | 6776 const Array& metadata_values = |
6762 Array::Handle(Z, Array::New(metadata_expressions->length())); | 6777 Array::Handle(Z, Array::New(metadata_expressions->length())); |
6763 | 6778 |
6764 for (intptr_t i = 0; i < metadata_expressions->length(); i++) { | 6779 for (intptr_t i = 0; i < metadata_expressions->length(); i++) { |
6765 const Instance& value = | 6780 const Instance& value = |
6766 constant_evaluator.EvaluateExpression((*metadata_expressions)[i]); | 6781 constant_evaluator.EvaluateExpression((*metadata_expressions)[i]); |
(...skipping 28 matching lines...) Expand all Loading... |
6795 return NULL; | 6810 return NULL; |
6796 } | 6811 } |
6797 | 6812 |
6798 Thread* thread = Thread::Current(); | 6813 Thread* thread = Thread::Current(); |
6799 Zone* zone_ = thread->zone(); | 6814 Zone* zone_ = thread->zone(); |
6800 TranslationHelper helper(thread); | 6815 TranslationHelper helper(thread); |
6801 Script& script = Script::Handle(Z, function.script()); | 6816 Script& script = Script::Handle(Z, function.script()); |
6802 helper.SetStringOffsets( | 6817 helper.SetStringOffsets( |
6803 TypedData::Handle(Z, script.kernel_string_offsets())); | 6818 TypedData::Handle(Z, script.kernel_string_offsets())); |
6804 helper.SetStringData(TypedData::Handle(Z, script.kernel_string_data())); | 6819 helper.SetStringData(TypedData::Handle(Z, script.kernel_string_data())); |
| 6820 helper.SetCanonicalNames( |
| 6821 TypedData::Handle(Z, script.kernel_canonical_names())); |
6805 DartTypeTranslator type_translator(&helper, NULL, true); | 6822 DartTypeTranslator type_translator(&helper, NULL, true); |
6806 ConstantEvaluator constant_evaluator(/* flow_graph_builder = */ NULL, Z, | 6823 ConstantEvaluator constant_evaluator(/* flow_graph_builder = */ NULL, Z, |
6807 &helper, &type_translator); | 6824 &helper, &type_translator); |
6808 | 6825 |
6809 const intptr_t positional_count = | 6826 const intptr_t positional_count = |
6810 function_node->positional_parameters().length(); | 6827 function_node->positional_parameters().length(); |
6811 const intptr_t param_count = | 6828 const intptr_t param_count = |
6812 positional_count + function_node->named_parameters().length(); | 6829 positional_count + function_node->named_parameters().length(); |
6813 const Array& param_descriptor = Array::Handle( | 6830 const Array& param_descriptor = Array::Handle( |
6814 Array::New(param_count * Parser::kParameterEntrySize, Heap::kOld)); | 6831 Array::New(param_count * Parser::kParameterEntrySize, Heap::kOld)); |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6848 thread->clear_sticky_error(); | 6865 thread->clear_sticky_error(); |
6849 return error.raw(); | 6866 return error.raw(); |
6850 } | 6867 } |
6851 } | 6868 } |
6852 | 6869 |
6853 | 6870 |
6854 } // namespace kernel | 6871 } // namespace kernel |
6855 } // namespace dart | 6872 } // namespace dart |
6856 | 6873 |
6857 #endif // !defined(DART_PRECOMPILED_RUNTIME) | 6874 #endif // !defined(DART_PRECOMPILED_RUNTIME) |
OLD | NEW |