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

Side by Side Diff: runtime/vm/kernel_to_il.cc

Issue 2762213002: Use canonical names for some name-based lookup. (Closed)
Patch Set: Do not use the import URI to name libraries Created 3 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « runtime/vm/kernel_to_il.h ('k') | runtime/vm/symbols.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 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
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
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
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
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
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
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
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)
OLDNEW
« no previous file with comments | « runtime/vm/kernel_to_il.h ('k') | runtime/vm/symbols.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698