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 <map> | 5 #include <map> |
6 #include <set> | 6 #include <set> |
7 #include <string> | 7 #include <string> |
8 | 8 |
9 #include "vm/kernel_to_il.h" | 9 #include "vm/kernel_to_il.h" |
10 | 10 |
(...skipping 1050 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1061 } | 1061 } |
1062 | 1062 |
1063 | 1063 |
1064 dart::String& TranslationHelper::DartSymbol(String* content) const { | 1064 dart::String& TranslationHelper::DartSymbol(String* content) const { |
1065 return dart::String::ZoneHandle( | 1065 return dart::String::ZoneHandle( |
1066 Z, dart::Symbols::FromUTF8(thread_, content->buffer(), content->size())); | 1066 Z, dart::Symbols::FromUTF8(thread_, content->buffer(), content->size())); |
1067 } | 1067 } |
1068 | 1068 |
1069 | 1069 |
1070 const dart::String& TranslationHelper::DartClassName( | 1070 const dart::String& TranslationHelper::DartClassName( |
1071 kernel::Class* kernel_klass) { | 1071 CanonicalName* kernel_klass) { |
1072 ASSERT(kernel_klass->IsNormalClass()); | |
1073 dart::String& name = DartString(kernel_klass->name()); | 1072 dart::String& name = DartString(kernel_klass->name()); |
1074 return ManglePrivateName(kernel_klass->parent(), &name); | 1073 return ManglePrivateName(kernel_klass->parent(), &name); |
1075 } | 1074 } |
1076 | 1075 |
1077 | 1076 |
1078 const dart::String& TranslationHelper::DartConstructorName(Constructor* node) { | 1077 const dart::String& TranslationHelper::DartConstructorName(Constructor* node) { |
1079 Class* klass = Class::Cast(node->parent()); | 1078 Class* klass = Class::Cast(node->parent()); |
1080 return DartFactoryName(klass, node->name()); | 1079 return DartFactoryName(klass, node->name()); |
1081 } | 1080 } |
1082 | 1081 |
(...skipping 22 matching lines...) Expand all Loading... |
1105 // conventions. | 1104 // conventions. |
1106 String* content = kernel_name->string(); | 1105 String* content = kernel_name->string(); |
1107 ASSERT(content->size() > 0); | 1106 ASSERT(content->size() > 0); |
1108 intptr_t skip = 0; | 1107 intptr_t skip = 0; |
1109 if (content->buffer()[content->size() - 1] == '=') { | 1108 if (content->buffer()[content->size() - 1] == '=') { |
1110 skip = 1; | 1109 skip = 1; |
1111 } | 1110 } |
1112 dart::String& name = dart::String::ZoneHandle( | 1111 dart::String& name = dart::String::ZoneHandle( |
1113 Z, dart::String::FromUTF8(content->buffer(), content->size() - skip, | 1112 Z, dart::String::FromUTF8(content->buffer(), content->size() - skip, |
1114 allocation_space_)); | 1113 allocation_space_)); |
1115 ManglePrivateName(kernel_name->library(), &name, false); | 1114 ManglePrivateName(kernel_name->library_reference(), &name, false); |
1116 name = dart::Field::SetterSymbol(name); | 1115 name = dart::Field::SetterSymbol(name); |
1117 return name; | 1116 return name; |
1118 } | 1117 } |
1119 | 1118 |
1120 | 1119 |
1121 const dart::String& TranslationHelper::DartGetterName(Name* kernel_name) { | 1120 const dart::String& TranslationHelper::DartGetterName(Name* kernel_name) { |
1122 dart::String& name = DartString(kernel_name->string()); | 1121 dart::String& name = DartString(kernel_name->string()); |
1123 ManglePrivateName(kernel_name->library(), &name, false); | 1122 ManglePrivateName(kernel_name->library_reference(), &name, false); |
1124 name = dart::Field::GetterSymbol(name); | 1123 name = dart::Field::GetterSymbol(name); |
1125 return name; | 1124 return name; |
1126 } | 1125 } |
1127 | 1126 |
1128 | 1127 |
1129 const dart::String& TranslationHelper::DartFieldName(Name* kernel_name) { | 1128 const dart::String& TranslationHelper::DartFieldName(Name* kernel_name) { |
1130 dart::String& name = DartString(kernel_name->string()); | 1129 dart::String& name = DartString(kernel_name->string()); |
1131 return ManglePrivateName(kernel_name->library(), &name); | 1130 return ManglePrivateName(kernel_name->library_reference(), &name); |
1132 } | 1131 } |
1133 | 1132 |
1134 | 1133 |
1135 const dart::String& TranslationHelper::DartInitializerName(Name* kernel_name) { | 1134 const dart::String& TranslationHelper::DartInitializerName(Name* kernel_name) { |
1136 // The [DartFieldName] will take care of mangling the name. | 1135 // The [DartFieldName] will take care of mangling the name. |
1137 dart::String& name = | 1136 dart::String& name = |
1138 dart::String::Handle(Z, DartFieldName(kernel_name).raw()); | 1137 dart::String::Handle(Z, DartFieldName(kernel_name).raw()); |
1139 name = Symbols::FromConcat(thread_, Symbols::InitPrefix(), name); | 1138 name = Symbols::FromConcat(thread_, Symbols::InitPrefix(), name); |
1140 return name; | 1139 return name; |
1141 } | 1140 } |
1142 | 1141 |
1143 | 1142 |
1144 const dart::String& TranslationHelper::DartMethodName(Name* kernel_name) { | 1143 const dart::String& TranslationHelper::DartMethodName(Name* kernel_name) { |
1145 dart::String& name = DartString(kernel_name->string()); | 1144 dart::String& name = DartString(kernel_name->string()); |
1146 return ManglePrivateName(kernel_name->library(), &name); | 1145 return ManglePrivateName(kernel_name->library_reference(), &name); |
1147 } | 1146 } |
1148 | 1147 |
1149 | 1148 |
1150 const dart::String& TranslationHelper::DartFactoryName(Class* klass, | 1149 const dart::String& TranslationHelper::DartFactoryName(Class* klass, |
1151 Name* method_name) { | 1150 Name* method_name) { |
1152 // [DartMethodName] will mangle the name. | 1151 // [DartMethodName] will mangle the name. |
1153 GrowableHandlePtrArray<const dart::String> pieces(Z, 3); | 1152 GrowableHandlePtrArray<const dart::String> pieces(Z, 3); |
1154 pieces.Add(DartClassName(klass)); | 1153 pieces.Add(DartClassName(klass->canonical_name())); |
1155 pieces.Add(Symbols::Dot()); | 1154 pieces.Add(Symbols::Dot()); |
1156 pieces.Add(DartMethodName(method_name)); | 1155 pieces.Add(DartMethodName(method_name)); |
1157 return dart::String::ZoneHandle( | 1156 return dart::String::ZoneHandle( |
1158 Z, dart::Symbols::FromConcatAll(thread_, pieces)); | 1157 Z, dart::Symbols::FromConcatAll(thread_, pieces)); |
1159 } | 1158 } |
1160 | 1159 |
1161 | 1160 |
1162 dart::RawLibrary* TranslationHelper::LookupLibraryByKernelLibrary( | 1161 dart::RawLibrary* TranslationHelper::LookupLibraryByKernelLibrary( |
1163 Library* kernel_library) { | 1162 CanonicalName* kernel_library) { |
1164 const dart::String& library_name = DartSymbol(kernel_library->import_uri()); | 1163 const dart::String& library_name = DartSymbol(kernel_library->name()); |
1165 ASSERT(!library_name.IsNull()); | 1164 ASSERT(!library_name.IsNull()); |
1166 dart::RawLibrary* library = | 1165 dart::RawLibrary* library = |
1167 dart::Library::LookupLibrary(thread_, library_name); | 1166 dart::Library::LookupLibrary(thread_, library_name); |
1168 ASSERT(library != Object::null()); | 1167 ASSERT(library != Object::null()); |
1169 return library; | 1168 return library; |
1170 } | 1169 } |
1171 | 1170 |
1172 | 1171 |
1173 dart::RawClass* TranslationHelper::LookupClassByKernelClass( | 1172 dart::RawClass* TranslationHelper::LookupClassByKernelClass( |
1174 Class* kernel_klass) { | 1173 CanonicalName* kernel_klass) { |
1175 dart::RawClass* klass = NULL; | 1174 dart::RawClass* klass = NULL; |
1176 | 1175 |
1177 const dart::String& class_name = DartClassName(kernel_klass); | 1176 const dart::String& class_name = DartClassName(kernel_klass); |
1178 Library* kernel_library = Library::Cast(kernel_klass->parent()); | 1177 CanonicalName* kernel_library = kernel_klass->parent(); |
1179 dart::Library& library = | 1178 dart::Library& library = |
1180 dart::Library::Handle(Z, LookupLibraryByKernelLibrary(kernel_library)); | 1179 dart::Library::Handle(Z, LookupLibraryByKernelLibrary(kernel_library)); |
1181 klass = library.LookupClassAllowPrivate(class_name); | 1180 klass = library.LookupClassAllowPrivate(class_name); |
1182 | 1181 |
1183 ASSERT(klass != Object::null()); | 1182 ASSERT(klass != Object::null()); |
1184 return klass; | 1183 return klass; |
1185 } | 1184 } |
1186 | 1185 |
1187 | 1186 |
1188 dart::RawField* TranslationHelper::LookupFieldByKernelField( | 1187 dart::RawField* TranslationHelper::LookupFieldByKernelField( |
1189 Field* kernel_field) { | 1188 Field* kernel_field) { |
1190 TreeNode* node = kernel_field->parent(); | 1189 TreeNode* node = kernel_field->parent(); |
1191 | 1190 |
1192 dart::Class& klass = dart::Class::Handle(Z); | 1191 dart::Class& klass = dart::Class::Handle(Z); |
1193 if (node->IsClass()) { | 1192 if (node->IsClass()) { |
1194 klass = LookupClassByKernelClass(Class::Cast(node)); | 1193 klass = LookupClassByKernelClass(Class::Cast(node)->canonical_name()); |
1195 } else { | 1194 } else { |
1196 ASSERT(node->IsLibrary()); | 1195 ASSERT(node->IsLibrary()); |
1197 dart::Library& library = dart::Library::Handle( | 1196 dart::Library& library = dart::Library::Handle( |
1198 Z, LookupLibraryByKernelLibrary(Library::Cast(node))); | 1197 Z, LookupLibraryByKernelLibrary(Library::Cast(node)->canonical_name())); |
1199 klass = library.toplevel_class(); | 1198 klass = library.toplevel_class(); |
1200 } | 1199 } |
1201 dart::RawField* field = | 1200 dart::RawField* field = |
1202 klass.LookupFieldAllowPrivate(DartSymbol(kernel_field->name()->string())); | 1201 klass.LookupFieldAllowPrivate(DartSymbol(kernel_field->name()->string())); |
1203 ASSERT(field != Object::null()); | 1202 ASSERT(field != Object::null()); |
1204 return field; | 1203 return field; |
1205 } | 1204 } |
1206 | 1205 |
1207 | 1206 |
1208 dart::RawFunction* TranslationHelper::LookupStaticMethodByKernelProcedure( | 1207 dart::RawFunction* TranslationHelper::LookupStaticMethodByKernelProcedure( |
1209 Procedure* procedure) { | 1208 Procedure* procedure) { |
1210 ASSERT(procedure->IsStatic()); | 1209 ASSERT(procedure->IsStatic()); |
1211 const dart::String& procedure_name = DartProcedureName(procedure); | 1210 const dart::String& procedure_name = DartProcedureName(procedure); |
1212 | 1211 |
1213 // The parent is either a library or a class (in which case the procedure is a | 1212 // The parent is either a library or a class (in which case the procedure is a |
1214 // static method). | 1213 // static method). |
1215 TreeNode* parent = procedure->parent(); | 1214 TreeNode* parent = procedure->parent(); |
1216 if (parent->IsClass()) { | 1215 if (parent->IsClass()) { |
1217 dart::Class& klass = | 1216 dart::Class& klass = dart::Class::Handle( |
1218 dart::Class::Handle(Z, LookupClassByKernelClass(Class::Cast(parent))); | 1217 Z, LookupClassByKernelClass(Class::Cast(parent)->canonical_name())); |
1219 dart::RawFunction* raw_function = | 1218 dart::RawFunction* raw_function = |
1220 klass.LookupFunctionAllowPrivate(procedure_name); | 1219 klass.LookupFunctionAllowPrivate(procedure_name); |
1221 ASSERT(raw_function != Object::null()); | 1220 ASSERT(raw_function != Object::null()); |
1222 | 1221 |
1223 // TODO(27590): We can probably get rid of this after no longer using | 1222 // TODO(27590): We can probably get rid of this after no longer using |
1224 // core libraries from the source. | 1223 // core libraries from the source. |
1225 dart::Function& function = dart::Function::ZoneHandle(Z, raw_function); | 1224 dart::Function& function = dart::Function::ZoneHandle(Z, raw_function); |
1226 if (function.IsRedirectingFactory()) { | 1225 if (function.IsRedirectingFactory()) { |
1227 ClassFinalizer::ResolveRedirectingFactory(klass, function); | 1226 ClassFinalizer::ResolveRedirectingFactory(klass, function); |
1228 function = function.RedirectionTarget(); | 1227 function = function.RedirectionTarget(); |
1229 } | 1228 } |
1230 return function.raw(); | 1229 return function.raw(); |
1231 } else { | 1230 } else { |
1232 ASSERT(parent->IsLibrary()); | 1231 ASSERT(parent->IsLibrary()); |
1233 dart::Library& library = dart::Library::Handle( | 1232 dart::Library& library = dart::Library::Handle( |
1234 Z, LookupLibraryByKernelLibrary(Library::Cast(parent))); | 1233 Z, |
| 1234 LookupLibraryByKernelLibrary(Library::Cast(parent)->canonical_name())); |
1235 dart::RawFunction* function = | 1235 dart::RawFunction* function = |
1236 library.LookupFunctionAllowPrivate(procedure_name); | 1236 library.LookupFunctionAllowPrivate(procedure_name); |
1237 ASSERT(function != Object::null()); | 1237 ASSERT(function != Object::null()); |
1238 return function; | 1238 return function; |
1239 } | 1239 } |
1240 } | 1240 } |
1241 | 1241 |
1242 | 1242 |
1243 dart::RawFunction* TranslationHelper::LookupConstructorByKernelConstructor( | 1243 dart::RawFunction* TranslationHelper::LookupConstructorByKernelConstructor( |
1244 Constructor* constructor) { | 1244 Constructor* constructor) { |
1245 Class* kernel_klass = Class::Cast(constructor->parent()); | 1245 Class* kernel_klass = Class::Cast(constructor->parent()); |
1246 dart::Class& klass = | 1246 dart::Class& klass = dart::Class::Handle( |
1247 dart::Class::Handle(Z, LookupClassByKernelClass(kernel_klass)); | 1247 Z, LookupClassByKernelClass(kernel_klass->canonical_name())); |
1248 return LookupConstructorByKernelConstructor(klass, constructor); | 1248 return LookupConstructorByKernelConstructor(klass, constructor); |
1249 } | 1249 } |
1250 | 1250 |
1251 | 1251 |
1252 dart::RawFunction* TranslationHelper::LookupConstructorByKernelConstructor( | 1252 dart::RawFunction* TranslationHelper::LookupConstructorByKernelConstructor( |
1253 const dart::Class& owner, | 1253 const dart::Class& owner, |
1254 Constructor* constructor) { | 1254 Constructor* constructor) { |
1255 dart::RawFunction* function = | 1255 dart::RawFunction* function = |
1256 owner.LookupConstructorAllowPrivate(DartConstructorName(constructor)); | 1256 owner.LookupConstructorAllowPrivate(DartConstructorName(constructor)); |
1257 ASSERT(function != Object::null()); | 1257 ASSERT(function != Object::null()); |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1297 | 1297 |
1298 va_list args; | 1298 va_list args; |
1299 va_start(args, format); | 1299 va_start(args, format); |
1300 Report::LongJumpV(prev_error, null_script, TokenPosition::kNoSource, format, | 1300 Report::LongJumpV(prev_error, null_script, TokenPosition::kNoSource, format, |
1301 args); | 1301 args); |
1302 va_end(args); | 1302 va_end(args); |
1303 UNREACHABLE(); | 1303 UNREACHABLE(); |
1304 } | 1304 } |
1305 | 1305 |
1306 | 1306 |
1307 dart::String& TranslationHelper::ManglePrivateName(Library* kernel_library, | 1307 dart::String& TranslationHelper::ManglePrivateName( |
1308 dart::String* name_to_modify, | 1308 CanonicalName* kernel_library, |
1309 bool symbolize) { | 1309 dart::String* name_to_modify, |
| 1310 bool symbolize) { |
1310 if (name_to_modify->Length() >= 1 && name_to_modify->CharAt(0) == '_') { | 1311 if (name_to_modify->Length() >= 1 && name_to_modify->CharAt(0) == '_') { |
1311 const dart::Library& library = | 1312 const dart::Library& library = |
1312 dart::Library::Handle(Z, LookupLibraryByKernelLibrary(kernel_library)); | 1313 dart::Library::Handle(Z, LookupLibraryByKernelLibrary(kernel_library)); |
1313 *name_to_modify = library.PrivateName(*name_to_modify); | 1314 *name_to_modify = library.PrivateName(*name_to_modify); |
1314 } else if (symbolize) { | 1315 } else if (symbolize) { |
1315 *name_to_modify = Symbols::New(thread_, *name_to_modify); | 1316 *name_to_modify = Symbols::New(thread_, *name_to_modify); |
1316 } | 1317 } |
1317 return *name_to_modify; | 1318 return *name_to_modify; |
1318 } | 1319 } |
1319 | 1320 |
(...skipping 1512 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2832 // though the function will result in an exception). | 2833 // though the function will result in an exception). |
2833 | 2834 |
2834 return instructions; | 2835 return instructions; |
2835 } | 2836 } |
2836 | 2837 |
2837 | 2838 |
2838 dart::RawFunction* FlowGraphBuilder::LookupMethodByMember( | 2839 dart::RawFunction* FlowGraphBuilder::LookupMethodByMember( |
2839 Member* target, | 2840 Member* target, |
2840 const dart::String& method_name) { | 2841 const dart::String& method_name) { |
2841 Class* kernel_klass = Class::Cast(target->parent()); | 2842 Class* kernel_klass = Class::Cast(target->parent()); |
2842 dart::Class& klass = | 2843 dart::Class& klass = dart::Class::Handle( |
2843 dart::Class::Handle(Z, H.LookupClassByKernelClass(kernel_klass)); | 2844 Z, H.LookupClassByKernelClass(kernel_klass->canonical_name())); |
2844 | 2845 |
2845 dart::RawFunction* function = klass.LookupFunctionAllowPrivate(method_name); | 2846 dart::RawFunction* function = klass.LookupFunctionAllowPrivate(method_name); |
2846 ASSERT(function != Object::null()); | 2847 ASSERT(function != Object::null()); |
2847 return function; | 2848 return function; |
2848 } | 2849 } |
2849 | 2850 |
2850 | 2851 |
2851 LocalVariable* FlowGraphBuilder::MakeTemporary() { | 2852 LocalVariable* FlowGraphBuilder::MakeTemporary() { |
2852 char name[64]; | 2853 char name[64]; |
2853 intptr_t index = stack_->definition()->temp_index(); | 2854 intptr_t index = stack_->definition()->temp_index(); |
(...skipping 1611 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4465 | 4466 |
4466 | 4467 |
4467 void DartTypeTranslator::VisitInterfaceType(InterfaceType* node) { | 4468 void DartTypeTranslator::VisitInterfaceType(InterfaceType* node) { |
4468 // NOTE: That an interface type like `T<A, B>` is considered to be | 4469 // NOTE: That an interface type like `T<A, B>` is considered to be |
4469 // malformed iff `T` is malformed. | 4470 // malformed iff `T` is malformed. |
4470 // => We therefore ignore errors in `A` or `B`. | 4471 // => We therefore ignore errors in `A` or `B`. |
4471 const TypeArguments& type_arguments = TranslateTypeArguments( | 4472 const TypeArguments& type_arguments = TranslateTypeArguments( |
4472 node->type_arguments().raw_array(), node->type_arguments().length()); | 4473 node->type_arguments().raw_array(), node->type_arguments().length()); |
4473 | 4474 |
4474 | 4475 |
4475 dart::Object& klass = | 4476 dart::Object& klass = dart::Object::Handle( |
4476 dart::Object::Handle(Z, H.LookupClassByKernelClass(node->klass())); | 4477 Z, H.LookupClassByKernelClass(node->class_reference())); |
4477 result_ = Type::New(klass, type_arguments, TokenPosition::kNoSource); | 4478 result_ = Type::New(klass, type_arguments, TokenPosition::kNoSource); |
4478 if (finalize_) { | 4479 if (finalize_) { |
4479 ASSERT(active_class_->klass != NULL); | 4480 ASSERT(active_class_->klass != NULL); |
4480 result_ = ClassFinalizer::FinalizeType(*active_class_->klass, result_); | 4481 result_ = ClassFinalizer::FinalizeType(*active_class_->klass, result_); |
4481 } | 4482 } |
4482 } | 4483 } |
4483 | 4484 |
4484 | 4485 |
4485 void DartTypeTranslator::VisitDynamicType(DynamicType* node) { | 4486 void DartTypeTranslator::VisitDynamicType(DynamicType* node) { |
4486 result_ = Object::dynamic_type().raw(); | 4487 result_ = Object::dynamic_type().raw(); |
(...skipping 417 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4904 | 4905 |
4905 void FlowGraphBuilder::VisitConstructorInvocation(ConstructorInvocation* node) { | 4906 void FlowGraphBuilder::VisitConstructorInvocation(ConstructorInvocation* node) { |
4906 if (node->is_const()) { | 4907 if (node->is_const()) { |
4907 fragment_ = | 4908 fragment_ = |
4908 Constant(constant_evaluator_.EvaluateConstructorInvocation(node)); | 4909 Constant(constant_evaluator_.EvaluateConstructorInvocation(node)); |
4909 return; | 4910 return; |
4910 } | 4911 } |
4911 | 4912 |
4912 Class* kernel_class = Class::Cast(node->target()->parent()); | 4913 Class* kernel_class = Class::Cast(node->target()->parent()); |
4913 | 4914 |
4914 dart::Class& klass = | 4915 dart::Class& klass = dart::Class::ZoneHandle( |
4915 dart::Class::ZoneHandle(Z, H.LookupClassByKernelClass(kernel_class)); | 4916 Z, H.LookupClassByKernelClass(kernel_class->canonical_name())); |
4916 | 4917 |
4917 Fragment instructions; | 4918 Fragment instructions; |
4918 | 4919 |
4919 // Check for malbounded-ness of type. | 4920 // Check for malbounded-ness of type. |
4920 if (I->type_checks()) { | 4921 if (I->type_checks()) { |
4921 List<DartType>& kernel_type_arguments = node->arguments()->types(); | 4922 List<DartType>& kernel_type_arguments = node->arguments()->types(); |
4922 const TypeArguments& type_arguments = T.TranslateInstantiatedTypeArguments( | 4923 const TypeArguments& type_arguments = T.TranslateInstantiatedTypeArguments( |
4923 klass, kernel_type_arguments.raw_array(), | 4924 klass, kernel_type_arguments.raw_array(), |
4924 kernel_type_arguments.length()); | 4925 kernel_type_arguments.length()); |
4925 | 4926 |
(...skipping 1517 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6443 thread->clear_sticky_error(); | 6444 thread->clear_sticky_error(); |
6444 return error.raw(); | 6445 return error.raw(); |
6445 } | 6446 } |
6446 } | 6447 } |
6447 | 6448 |
6448 | 6449 |
6449 } // namespace kernel | 6450 } // namespace kernel |
6450 } // namespace dart | 6451 } // namespace dart |
6451 | 6452 |
6452 #endif // !defined(DART_PRECOMPILED_RUNTIME) | 6453 #endif // !defined(DART_PRECOMPILED_RUNTIME) |
OLD | NEW |