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

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

Issue 2762213002: Use canonical names for some name-based lookup. (Closed)
Patch Set: 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
« runtime/vm/kernel.h ('K') | « runtime/vm/kernel_to_il.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 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 1510 matching lines...) Expand 10 before | Expand all | Expand 10 after
2830 // though the function will result in an exception). 2831 // though the function will result in an exception).
2831 2832
2832 return instructions; 2833 return instructions;
2833 } 2834 }
2834 2835
2835 2836
2836 dart::RawFunction* FlowGraphBuilder::LookupMethodByMember( 2837 dart::RawFunction* FlowGraphBuilder::LookupMethodByMember(
2837 Member* target, 2838 Member* target,
2838 const dart::String& method_name) { 2839 const dart::String& method_name) {
2839 Class* kernel_klass = Class::Cast(target->parent()); 2840 Class* kernel_klass = Class::Cast(target->parent());
2840 dart::Class& klass = 2841 dart::Class& klass = dart::Class::Handle(
2841 dart::Class::Handle(Z, H.LookupClassByKernelClass(kernel_klass)); 2842 Z, H.LookupClassByKernelClass(kernel_klass->canonical_name()));
2842 2843
2843 dart::RawFunction* function = klass.LookupFunctionAllowPrivate(method_name); 2844 dart::RawFunction* function = klass.LookupFunctionAllowPrivate(method_name);
2844 ASSERT(function != Object::null()); 2845 ASSERT(function != Object::null());
2845 return function; 2846 return function;
2846 } 2847 }
2847 2848
2848 2849
2849 LocalVariable* FlowGraphBuilder::MakeTemporary() { 2850 LocalVariable* FlowGraphBuilder::MakeTemporary() {
2850 char name[64]; 2851 char name[64];
2851 intptr_t index = stack_->definition()->temp_index(); 2852 intptr_t index = stack_->definition()->temp_index();
(...skipping 1610 matching lines...) Expand 10 before | Expand all | Expand 10 after
4462 4463
4463 4464
4464 void DartTypeTranslator::VisitInterfaceType(InterfaceType* node) { 4465 void DartTypeTranslator::VisitInterfaceType(InterfaceType* node) {
4465 // NOTE: That an interface type like `T<A, B>` is considered to be 4466 // NOTE: That an interface type like `T<A, B>` is considered to be
4466 // malformed iff `T` is malformed. 4467 // malformed iff `T` is malformed.
4467 // => We therefore ignore errors in `A` or `B`. 4468 // => We therefore ignore errors in `A` or `B`.
4468 const TypeArguments& type_arguments = TranslateTypeArguments( 4469 const TypeArguments& type_arguments = TranslateTypeArguments(
4469 node->type_arguments().raw_array(), node->type_arguments().length()); 4470 node->type_arguments().raw_array(), node->type_arguments().length());
4470 4471
4471 4472
4472 dart::Object& klass = 4473 dart::Object& klass = dart::Object::Handle(
4473 dart::Object::Handle(Z, H.LookupClassByKernelClass(node->klass())); 4474 Z, H.LookupClassByKernelClass(node->class_reference()));
4474 result_ = Type::New(klass, type_arguments, TokenPosition::kNoSource); 4475 result_ = Type::New(klass, type_arguments, TokenPosition::kNoSource);
4475 if (finalize_) { 4476 if (finalize_) {
4476 ASSERT(active_class_->klass != NULL); 4477 ASSERT(active_class_->klass != NULL);
4477 result_ = ClassFinalizer::FinalizeType(*active_class_->klass, result_); 4478 result_ = ClassFinalizer::FinalizeType(*active_class_->klass, result_);
4478 } 4479 }
4479 } 4480 }
4480 4481
4481 4482
4482 void DartTypeTranslator::VisitDynamicType(DynamicType* node) { 4483 void DartTypeTranslator::VisitDynamicType(DynamicType* node) {
4483 result_ = Object::dynamic_type().raw(); 4484 result_ = Object::dynamic_type().raw();
(...skipping 417 matching lines...) Expand 10 before | Expand all | Expand 10 after
4901 4902
4902 void FlowGraphBuilder::VisitConstructorInvocation(ConstructorInvocation* node) { 4903 void FlowGraphBuilder::VisitConstructorInvocation(ConstructorInvocation* node) {
4903 if (node->is_const()) { 4904 if (node->is_const()) {
4904 fragment_ = 4905 fragment_ =
4905 Constant(constant_evaluator_.EvaluateConstructorInvocation(node)); 4906 Constant(constant_evaluator_.EvaluateConstructorInvocation(node));
4906 return; 4907 return;
4907 } 4908 }
4908 4909
4909 Class* kernel_class = Class::Cast(node->target()->parent()); 4910 Class* kernel_class = Class::Cast(node->target()->parent());
4910 4911
4911 dart::Class& klass = 4912 dart::Class& klass = dart::Class::ZoneHandle(
4912 dart::Class::ZoneHandle(Z, H.LookupClassByKernelClass(kernel_class)); 4913 Z, H.LookupClassByKernelClass(kernel_class->canonical_name()));
4913 4914
4914 Fragment instructions; 4915 Fragment instructions;
4915 4916
4916 // Check for malbounded-ness of type. 4917 // Check for malbounded-ness of type.
4917 if (I->type_checks()) { 4918 if (I->type_checks()) {
4918 List<DartType>& kernel_type_arguments = node->arguments()->types(); 4919 List<DartType>& kernel_type_arguments = node->arguments()->types();
4919 const TypeArguments& type_arguments = T.TranslateInstantiatedTypeArguments( 4920 const TypeArguments& type_arguments = T.TranslateInstantiatedTypeArguments(
4920 klass, kernel_type_arguments.raw_array(), 4921 klass, kernel_type_arguments.raw_array(),
4921 kernel_type_arguments.length()); 4922 kernel_type_arguments.length());
4922 4923
(...skipping 1517 matching lines...) Expand 10 before | Expand all | Expand 10 after
6440 thread->clear_sticky_error(); 6441 thread->clear_sticky_error();
6441 return error.raw(); 6442 return error.raw();
6442 } 6443 }
6443 } 6444 }
6444 6445
6445 6446
6446 } // namespace kernel 6447 } // namespace kernel
6447 } // namespace dart 6448 } // namespace dart
6448 6449
6449 #endif // !defined(DART_PRECOMPILED_RUNTIME) 6450 #endif // !defined(DART_PRECOMPILED_RUNTIME)
OLDNEW
« runtime/vm/kernel.h ('K') | « runtime/vm/kernel_to_il.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698