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 #include <string> | |
7 | 6 |
8 #include "vm/kernel_to_il.h" | 7 #include "vm/kernel_to_il.h" |
9 | 8 |
10 #include "vm/compiler.h" | 9 #include "vm/compiler.h" |
11 #include "vm/intermediate_language.h" | 10 #include "vm/intermediate_language.h" |
12 #include "vm/kernel_reader.h" | 11 #include "vm/kernel_reader.h" |
13 #include "vm/kernel_binary_flowgraph.h" | 12 #include "vm/kernel_binary_flowgraph.h" |
14 #include "vm/longjump.h" | 13 #include "vm/longjump.h" |
15 #include "vm/method_recognizer.h" | 14 #include "vm/method_recognizer.h" |
16 #include "vm/object_store.h" | 15 #include "vm/object_store.h" |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
64 node_(node), | 63 node_(node), |
65 translation_helper_(Thread::Current()), | 64 translation_helper_(Thread::Current()), |
66 zone_(translation_helper_.zone()), | 65 zone_(translation_helper_.zone()), |
67 type_translator_(&translation_helper_, &active_class_, /*finalize=*/true), | 66 type_translator_(&translation_helper_, &active_class_, /*finalize=*/true), |
68 current_function_scope_(NULL), | 67 current_function_scope_(NULL), |
69 scope_(NULL), | 68 scope_(NULL), |
70 depth_(0), | 69 depth_(0), |
71 name_index_(0), | 70 name_index_(0), |
72 needs_expr_temp_(false) { | 71 needs_expr_temp_(false) { |
73 Script& script = Script::Handle(Z, parsed_function->function().script()); | 72 Script& script = Script::Handle(Z, parsed_function->function().script()); |
74 H.SetStringData(TypedData::Handle(Z, script.kernel_strings())); | 73 H.SetStringOffsets(TypedData::Handle(Z, script.kernel_string_offsets())); |
| 74 H.SetStringData(TypedData::Handle(Z, script.kernel_string_data())); |
75 } | 75 } |
76 | 76 |
77 | 77 |
78 void ScopeBuilder::EnterScope(TreeNode* node, TokenPosition start_position) { | 78 void ScopeBuilder::EnterScope(TreeNode* node, TokenPosition start_position) { |
79 scope_ = new (Z) LocalScope(scope_, depth_.function_, depth_.loop_); | 79 scope_ = new (Z) LocalScope(scope_, depth_.function_, depth_.loop_); |
80 scope_->set_begin_token_pos(start_position); | 80 scope_->set_begin_token_pos(start_position); |
81 ASSERT(node->kernel_offset() >= 0); | 81 ASSERT(node->kernel_offset() >= 0); |
82 result_->scopes.Insert(node->kernel_offset(), scope_); | 82 result_->scopes.Insert(node->kernel_offset(), scope_); |
83 } | 83 } |
84 | 84 |
(...skipping 169 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
254 char name[64]; | 254 char name[64]; |
255 OS::SNPrint(name, 64, "%s%" Pd "", prefix, suffix); | 255 OS::SNPrint(name, 64, "%s%" Pd "", prefix, suffix); |
256 return H.DartSymbol(name); | 256 return H.DartSymbol(name); |
257 } | 257 } |
258 | 258 |
259 | 259 |
260 void ScopeBuilder::AddVariable(VariableDeclaration* declaration) { | 260 void ScopeBuilder::AddVariable(VariableDeclaration* declaration) { |
261 // In case `declaration->IsConst()` the flow graph building will take care of | 261 // In case `declaration->IsConst()` the flow graph building will take care of |
262 // evaluating the constant and setting it via | 262 // evaluating the constant and setting it via |
263 // `declaration->SetConstantValue()`. | 263 // `declaration->SetConstantValue()`. |
264 const dart::String& name = declaration->name()->is_empty() | 264 const dart::String& name = (H.StringSize(declaration->name()) == 0) |
265 ? GenerateName(":var", name_index_++) | 265 ? GenerateName(":var", name_index_++) |
266 : H.DartSymbol(declaration->name()); | 266 : H.DartSymbol(declaration->name()); |
267 LocalVariable* variable = | 267 LocalVariable* variable = |
268 MakeVariable(declaration->position(), declaration->end_position(), name, | 268 MakeVariable(declaration->position(), declaration->end_position(), name, |
269 T.TranslateVariableType(declaration)); | 269 T.TranslateVariableType(declaration)); |
270 if (declaration->IsFinal()) { | 270 if (declaration->IsFinal()) { |
271 variable->set_is_final(); | 271 variable->set_is_final(); |
272 } | 272 } |
273 scope_->AddVariable(variable); | 273 scope_->AddVariable(variable); |
274 result_->locals.Insert(declaration->kernel_offset(), variable); | 274 result_->locals.Insert(declaration->kernel_offset(), variable); |
(...skipping 761 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1036 result <<= next; | 1036 result <<= next; |
1037 return result; | 1037 return result; |
1038 } | 1038 } |
1039 | 1039 |
1040 | 1040 |
1041 TranslationHelper::TranslationHelper(dart::Thread* thread) | 1041 TranslationHelper::TranslationHelper(dart::Thread* thread) |
1042 : thread_(thread), | 1042 : thread_(thread), |
1043 zone_(thread->zone()), | 1043 zone_(thread->zone()), |
1044 isolate_(thread->isolate()), | 1044 isolate_(thread->isolate()), |
1045 allocation_space_(thread->IsMutatorThread() ? Heap::kNew : Heap::kOld), | 1045 allocation_space_(thread->IsMutatorThread() ? Heap::kNew : Heap::kOld), |
1046 string_data_(TypedData::Handle(zone_)) {} | 1046 string_offsets_(TypedData::Handle(Z)), |
| 1047 string_data_(TypedData::Handle(Z)) {} |
| 1048 |
| 1049 |
| 1050 void TranslationHelper::SetStringOffsets(const TypedData& string_offsets) { |
| 1051 ASSERT(string_offsets_.IsNull()); |
| 1052 string_offsets_ = string_offsets.raw(); |
| 1053 } |
1047 | 1054 |
1048 | 1055 |
1049 void TranslationHelper::SetStringData(const TypedData& string_data) { | 1056 void TranslationHelper::SetStringData(const TypedData& string_data) { |
1050 ASSERT(string_data_.IsNull()); | 1057 ASSERT(string_data_.IsNull()); |
1051 string_data_ = string_data.raw(); | 1058 string_data_ = string_data.raw(); |
1052 } | 1059 } |
1053 | 1060 |
1054 | 1061 |
1055 uint8_t TranslationHelper::CharacterAt(String* string, intptr_t index) { | 1062 intptr_t TranslationHelper::StringOffset(intptr_t string_index) const { |
1056 ASSERT(index < string->size()); | 1063 return string_offsets_.GetUint32(string_index << 2); |
1057 return string_data_.GetUint8(string->offset() + index); | |
1058 } | 1064 } |
1059 | 1065 |
1060 | 1066 |
1061 bool TranslationHelper::StringEquals(String* string, const char* other) { | 1067 intptr_t TranslationHelper::StringSize(intptr_t string_index) const { |
| 1068 return StringOffset(string_index + 1) - StringOffset(string_index); |
| 1069 } |
| 1070 |
| 1071 |
| 1072 uint8_t TranslationHelper::CharacterAt(intptr_t string_index, intptr_t index) { |
| 1073 ASSERT(index < StringSize(string_index)); |
| 1074 return string_data_.GetUint8(StringOffset(string_index) + index); |
| 1075 } |
| 1076 |
| 1077 |
| 1078 bool TranslationHelper::StringEquals(intptr_t string_index, const char* other) { |
1062 NoSafepointScope no_safepoint; | 1079 NoSafepointScope no_safepoint; |
1063 intptr_t length = strlen(other); | 1080 intptr_t length = strlen(other); |
1064 return (length == string->size()) && | 1081 return (length == StringSize(string_index)) && |
1065 memcmp(string_data_.DataAddr(string->offset()), other, length) == 0; | 1082 (memcmp(string_data_.DataAddr(StringOffset(string_index)), other, |
| 1083 length) == 0); |
1066 } | 1084 } |
1067 | 1085 |
1068 | 1086 |
1069 bool TranslationHelper::IsAdministrative(CanonicalName* name) { | 1087 bool TranslationHelper::IsAdministrative(CanonicalName* name) { |
1070 // Administrative names start with '@'. | 1088 // Administrative names start with '@'. |
1071 return (name->name()->size() > 0) && (CharacterAt(name->name(), 0) == '@'); | 1089 return (StringSize(name->name()) > 0) && |
| 1090 (CharacterAt(name->name(), 0) == '@'); |
1072 } | 1091 } |
1073 | 1092 |
1074 | 1093 |
1075 bool TranslationHelper::IsPrivate(CanonicalName* name) { | 1094 bool TranslationHelper::IsPrivate(CanonicalName* name) { |
1076 // Private names start with '_'. | 1095 // Private names start with '_'. |
1077 return (name->name()->size() > 0) && (CharacterAt(name->name(), 0) == '_'); | 1096 return (StringSize(name->name()) > 0) && |
| 1097 (CharacterAt(name->name(), 0) == '_'); |
1078 } | 1098 } |
1079 | 1099 |
1080 | 1100 |
1081 bool TranslationHelper::IsRoot(CanonicalName* name) { | 1101 bool TranslationHelper::IsRoot(CanonicalName* name) { |
1082 // The root is the only canonical name with no parent. | 1102 // The root is the only canonical name with no parent. |
1083 return name->parent() == NULL; | 1103 return name->parent() == NULL; |
1084 } | 1104 } |
1085 | 1105 |
1086 | 1106 |
1087 bool TranslationHelper::IsLibrary(CanonicalName* name) { | 1107 bool TranslationHelper::IsLibrary(CanonicalName* name) { |
(...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1221 return result; | 1241 return result; |
1222 } | 1242 } |
1223 | 1243 |
1224 | 1244 |
1225 const dart::String& TranslationHelper::DartString(const char* content, | 1245 const dart::String& TranslationHelper::DartString(const char* content, |
1226 Heap::Space space) { | 1246 Heap::Space space) { |
1227 return dart::String::ZoneHandle(Z, dart::String::New(content, space)); | 1247 return dart::String::ZoneHandle(Z, dart::String::New(content, space)); |
1228 } | 1248 } |
1229 | 1249 |
1230 | 1250 |
1231 dart::String& TranslationHelper::DartString(String* content, | 1251 dart::String& TranslationHelper::DartString(intptr_t string_index, |
1232 Heap::Space space) { | 1252 Heap::Space space) { |
1233 intptr_t length = content->size(); | 1253 intptr_t length = StringSize(string_index); |
1234 uint8_t* buffer = Z->Alloc<uint8_t>(length); | 1254 uint8_t* buffer = Z->Alloc<uint8_t>(length); |
1235 { | 1255 { |
1236 NoSafepointScope no_safepoint; | 1256 NoSafepointScope no_safepoint; |
1237 memmove(buffer, string_data_.DataAddr(content->offset()), length); | 1257 memmove(buffer, string_data_.DataAddr(StringOffset(string_index)), length); |
1238 } | 1258 } |
1239 return dart::String::ZoneHandle( | 1259 return dart::String::ZoneHandle( |
1240 Z, dart::String::FromUTF8(buffer, length, space)); | 1260 Z, dart::String::FromUTF8(buffer, length, space)); |
1241 } | 1261 } |
1242 | 1262 |
1243 | 1263 |
1244 dart::String& TranslationHelper::DartString(const uint8_t* utf8_array, | 1264 dart::String& TranslationHelper::DartString(const uint8_t* utf8_array, |
1245 intptr_t len, | 1265 intptr_t len, |
1246 Heap::Space space) { | 1266 Heap::Space space) { |
1247 return dart::String::ZoneHandle( | 1267 return dart::String::ZoneHandle( |
1248 Z, dart::String::FromUTF8(utf8_array, len, space)); | 1268 Z, dart::String::FromUTF8(utf8_array, len, space)); |
1249 } | 1269 } |
1250 | 1270 |
1251 | 1271 |
1252 const dart::String& TranslationHelper::DartSymbol(const char* content) const { | 1272 const dart::String& TranslationHelper::DartSymbol(const char* content) const { |
1253 return dart::String::ZoneHandle(Z, Symbols::New(thread_, content)); | 1273 return dart::String::ZoneHandle(Z, Symbols::New(thread_, content)); |
1254 } | 1274 } |
1255 | 1275 |
1256 | 1276 |
1257 dart::String& TranslationHelper::DartSymbol(String* content) const { | 1277 dart::String& TranslationHelper::DartSymbol(intptr_t string_index) const { |
1258 intptr_t length = content->size(); | 1278 intptr_t length = StringSize(string_index); |
1259 uint8_t* buffer = Z->Alloc<uint8_t>(length); | 1279 uint8_t* buffer = Z->Alloc<uint8_t>(length); |
1260 { | 1280 { |
1261 NoSafepointScope no_safepoint; | 1281 NoSafepointScope no_safepoint; |
1262 memmove(buffer, string_data_.DataAddr(content->offset()), length); | 1282 memmove(buffer, string_data_.DataAddr(StringOffset(string_index)), length); |
1263 } | 1283 } |
1264 return dart::String::ZoneHandle( | 1284 return dart::String::ZoneHandle( |
1265 Z, dart::Symbols::FromUTF8(thread_, buffer, length)); | 1285 Z, dart::Symbols::FromUTF8(thread_, buffer, length)); |
1266 } | 1286 } |
1267 | 1287 |
1268 dart::String& TranslationHelper::DartSymbol(const uint8_t* utf8_array, | 1288 dart::String& TranslationHelper::DartSymbol(const uint8_t* utf8_array, |
1269 intptr_t len) const { | 1289 intptr_t len) const { |
1270 return dart::String::ZoneHandle( | 1290 return dart::String::ZoneHandle( |
1271 Z, dart::Symbols::FromUTF8(thread_, utf8_array, len)); | 1291 Z, dart::Symbols::FromUTF8(thread_, utf8_array, len)); |
1272 } | 1292 } |
(...skipping 27 matching lines...) Expand all Loading... |
1300 } | 1320 } |
1301 } | 1321 } |
1302 | 1322 |
1303 | 1323 |
1304 const dart::String& TranslationHelper::DartSetterName(CanonicalName* setter) { | 1324 const dart::String& TranslationHelper::DartSetterName(CanonicalName* setter) { |
1305 return DartSetterName(setter->parent(), setter->name()); | 1325 return DartSetterName(setter->parent(), setter->name()); |
1306 } | 1326 } |
1307 | 1327 |
1308 | 1328 |
1309 const dart::String& TranslationHelper::DartSetterName(Name* setter_name) { | 1329 const dart::String& TranslationHelper::DartSetterName(Name* setter_name) { |
1310 return DartSetterName(setter_name->library(), setter_name->string()); | 1330 return DartSetterName(setter_name->library(), setter_name->string_index()); |
1311 } | 1331 } |
1312 | 1332 |
1313 | 1333 |
1314 const dart::String& TranslationHelper::DartSetterName(CanonicalName* parent, | 1334 const dart::String& TranslationHelper::DartSetterName(CanonicalName* parent, |
1315 String* setter) { | 1335 intptr_t setter) { |
1316 // The names flowing into [setter] are coming from the Kernel file: | 1336 // The names flowing into [setter] are coming from the Kernel file: |
1317 // * user-defined setters: `fieldname=` | 1337 // * user-defined setters: `fieldname=` |
1318 // * property-set expressions: `fieldname` | 1338 // * property-set expressions: `fieldname` |
1319 // | 1339 // |
1320 // The VM uses `get:fieldname` and `set:fieldname`. | 1340 // The VM uses `get:fieldname` and `set:fieldname`. |
1321 // | 1341 // |
1322 // => In order to be consistent, we remove the `=` always and adopt the VM | 1342 // => In order to be consistent, we remove the `=` always and adopt the VM |
1323 // conventions. | 1343 // conventions. |
1324 ASSERT(setter->size() > 0); | 1344 intptr_t size = StringSize(setter); |
1325 intptr_t skip = 0; | 1345 ASSERT(size > 0); |
1326 if (CharacterAt(setter, setter->size() - 1) == '=') { | 1346 if (CharacterAt(setter, size - 1) == '=') { |
1327 skip = 1; | 1347 --size; |
1328 } | 1348 } |
1329 intptr_t length = setter->size() - skip; | 1349 uint8_t* buffer = Z->Alloc<uint8_t>(size); |
1330 uint8_t* buffer = Z->Alloc<uint8_t>(length); | |
1331 { | 1350 { |
1332 NoSafepointScope no_safepoint; | 1351 NoSafepointScope no_safepoint; |
1333 memmove(buffer, string_data_.DataAddr(setter->offset()), length); | 1352 memmove(buffer, string_data_.DataAddr(StringOffset(setter)), size); |
1334 } | 1353 } |
1335 dart::String& name = dart::String::ZoneHandle( | 1354 dart::String& name = dart::String::ZoneHandle( |
1336 Z, dart::String::FromUTF8(buffer, length, allocation_space_)); | 1355 Z, dart::String::FromUTF8(buffer, size, allocation_space_)); |
1337 ManglePrivateName(parent, &name, false); | 1356 ManglePrivateName(parent, &name, false); |
1338 name = dart::Field::SetterSymbol(name); | 1357 name = dart::Field::SetterSymbol(name); |
1339 return name; | 1358 return name; |
1340 } | 1359 } |
1341 | 1360 |
1342 | 1361 |
1343 const dart::String& TranslationHelper::DartGetterName(CanonicalName* getter) { | 1362 const dart::String& TranslationHelper::DartGetterName(CanonicalName* getter) { |
1344 return DartGetterName(getter->parent(), getter->name()); | 1363 return DartGetterName(getter->parent(), getter->name()); |
1345 } | 1364 } |
1346 | 1365 |
1347 | 1366 |
1348 const dart::String& TranslationHelper::DartGetterName(Name* getter_name) { | 1367 const dart::String& TranslationHelper::DartGetterName(Name* getter_name) { |
1349 return DartGetterName(getter_name->library(), getter_name->string()); | 1368 return DartGetterName(getter_name->library(), getter_name->string_index()); |
1350 } | 1369 } |
1351 | 1370 |
1352 | 1371 |
1353 const dart::String& TranslationHelper::DartGetterName(CanonicalName* parent, | 1372 const dart::String& TranslationHelper::DartGetterName(CanonicalName* parent, |
1354 String* getter) { | 1373 intptr_t getter) { |
1355 dart::String& name = DartString(getter); | 1374 dart::String& name = DartString(getter); |
1356 ManglePrivateName(parent, &name, false); | 1375 ManglePrivateName(parent, &name, false); |
1357 name = dart::Field::GetterSymbol(name); | 1376 name = dart::Field::GetterSymbol(name); |
1358 return name; | 1377 return name; |
1359 } | 1378 } |
1360 | 1379 |
1361 | 1380 |
1362 const dart::String& TranslationHelper::DartFieldName(Name* kernel_name) { | 1381 const dart::String& TranslationHelper::DartFieldName(Name* kernel_name) { |
1363 dart::String& name = DartString(kernel_name->string()); | 1382 dart::String& name = DartString(kernel_name->string_index()); |
1364 return ManglePrivateName(kernel_name->library(), &name); | 1383 return ManglePrivateName(kernel_name->library(), &name); |
1365 } | 1384 } |
1366 | 1385 |
1367 | 1386 |
1368 const dart::String& TranslationHelper::DartInitializerName(Name* kernel_name) { | 1387 const dart::String& TranslationHelper::DartInitializerName(Name* kernel_name) { |
1369 // The [DartFieldName] will take care of mangling the name. | 1388 // The [DartFieldName] will take care of mangling the name. |
1370 dart::String& name = | 1389 dart::String& name = |
1371 dart::String::Handle(Z, DartFieldName(kernel_name).raw()); | 1390 dart::String::Handle(Z, DartFieldName(kernel_name).raw()); |
1372 name = Symbols::FromConcat(thread_, Symbols::InitPrefix(), name); | 1391 name = Symbols::FromConcat(thread_, Symbols::InitPrefix(), name); |
1373 return name; | 1392 return name; |
1374 } | 1393 } |
1375 | 1394 |
1376 | 1395 |
1377 const dart::String& TranslationHelper::DartMethodName(CanonicalName* method) { | 1396 const dart::String& TranslationHelper::DartMethodName(CanonicalName* method) { |
1378 return DartMethodName(method->parent(), method->name()); | 1397 return DartMethodName(method->parent(), method->name()); |
1379 } | 1398 } |
1380 | 1399 |
1381 | 1400 |
1382 const dart::String& TranslationHelper::DartMethodName(Name* method_name) { | 1401 const dart::String& TranslationHelper::DartMethodName(Name* method_name) { |
1383 return DartMethodName(method_name->library(), method_name->string()); | 1402 return DartMethodName(method_name->library(), method_name->string_index()); |
1384 } | 1403 } |
1385 | 1404 |
1386 | 1405 |
1387 const dart::String& TranslationHelper::DartMethodName(CanonicalName* parent, | 1406 const dart::String& TranslationHelper::DartMethodName(CanonicalName* parent, |
1388 String* method) { | 1407 intptr_t method) { |
1389 dart::String& name = DartString(method); | 1408 dart::String& name = DartString(method); |
1390 return ManglePrivateName(parent, &name); | 1409 return ManglePrivateName(parent, &name); |
1391 } | 1410 } |
1392 | 1411 |
1393 | 1412 |
1394 const dart::String& TranslationHelper::DartFactoryName(CanonicalName* factory) { | 1413 const dart::String& TranslationHelper::DartFactoryName(CanonicalName* factory) { |
1395 ASSERT(IsConstructor(factory) || IsFactory(factory)); | 1414 ASSERT(IsConstructor(factory) || IsFactory(factory)); |
1396 GrowableHandlePtrArray<const dart::String> pieces(Z, 3); | 1415 GrowableHandlePtrArray<const dart::String> pieces(Z, 3); |
1397 pieces.Add(DartClassName(EnclosingName(factory))); | 1416 pieces.Add(DartClassName(EnclosingName(factory))); |
1398 pieces.Add(Symbols::Dot()); | 1417 pieces.Add(Symbols::Dot()); |
(...skipping 651 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2050 } | 2069 } |
2051 } | 2070 } |
2052 | 2071 |
2053 | 2072 |
2054 void ConstantEvaluator::VisitNot(Not* node) { | 2073 void ConstantEvaluator::VisitNot(Not* node) { |
2055 result_ ^= Bool::Get(!EvaluateBooleanExpression(node->expression())).raw(); | 2074 result_ ^= Bool::Get(!EvaluateBooleanExpression(node->expression())).raw(); |
2056 } | 2075 } |
2057 | 2076 |
2058 | 2077 |
2059 void ConstantEvaluator::VisitPropertyGet(PropertyGet* node) { | 2078 void ConstantEvaluator::VisitPropertyGet(PropertyGet* node) { |
2060 const intptr_t kLengthLen = sizeof("length") - 1; | 2079 intptr_t string_index = node->name()->string_index(); |
2061 | 2080 if (H.StringEquals(string_index, "length")) { |
2062 String* string = node->name()->string(); | |
2063 if ((string->size() == kLengthLen) && H.StringEquals(string, "length")) { | |
2064 node->receiver()->AcceptExpressionVisitor(this); | 2081 node->receiver()->AcceptExpressionVisitor(this); |
2065 if (result_.IsString()) { | 2082 if (result_.IsString()) { |
2066 const dart::String& str = | 2083 const dart::String& str = |
2067 dart::String::Handle(Z, dart::String::RawCast(result_.raw())); | 2084 dart::String::Handle(Z, dart::String::RawCast(result_.raw())); |
2068 result_ = Integer::New(str.Length()); | 2085 result_ = Integer::New(str.Length()); |
2069 } else { | 2086 } else { |
2070 H.ReportError( | 2087 H.ReportError( |
2071 "Constant expressions can only call " | 2088 "Constant expressions can only call " |
2072 "'length' on string constants."); | 2089 "'length' on string constants."); |
2073 } | 2090 } |
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2180 try_finally_block_(NULL), | 2197 try_finally_block_(NULL), |
2181 try_catch_block_(NULL), | 2198 try_catch_block_(NULL), |
2182 next_used_try_index_(0), | 2199 next_used_try_index_(0), |
2183 catch_block_(NULL), | 2200 catch_block_(NULL), |
2184 type_translator_(&translation_helper_, | 2201 type_translator_(&translation_helper_, |
2185 &active_class_, | 2202 &active_class_, |
2186 /* finalize= */ true), | 2203 /* finalize= */ true), |
2187 constant_evaluator_(this, zone_, &translation_helper_, &type_translator_), | 2204 constant_evaluator_(this, zone_, &translation_helper_, &type_translator_), |
2188 streaming_flow_graph_builder_(NULL) { | 2205 streaming_flow_graph_builder_(NULL) { |
2189 Script& script = Script::Handle(Z, parsed_function->function().script()); | 2206 Script& script = Script::Handle(Z, parsed_function->function().script()); |
2190 H.SetStringData(TypedData::Handle(Z, script.kernel_strings())); | 2207 H.SetStringOffsets(TypedData::Handle(Z, script.kernel_string_offsets())); |
| 2208 H.SetStringData(TypedData::Handle(Z, script.kernel_string_data())); |
2191 } | 2209 } |
2192 | 2210 |
2193 | 2211 |
2194 FlowGraphBuilder::~FlowGraphBuilder() { | 2212 FlowGraphBuilder::~FlowGraphBuilder() { |
2195 if (streaming_flow_graph_builder_ != NULL) { | 2213 if (streaming_flow_graph_builder_ != NULL) { |
2196 delete streaming_flow_graph_builder_; | 2214 delete streaming_flow_graph_builder_; |
2197 } | 2215 } |
2198 } | 2216 } |
2199 | 2217 |
2200 | 2218 |
(...skipping 2474 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4675 pos++; | 4693 pos++; |
4676 for (intptr_t i = 0; i < positional_count; i++, pos++) { | 4694 for (intptr_t i = 0; i < positional_count; i++, pos++) { |
4677 node->positional_parameters()[i]->AcceptDartTypeVisitor(this); | 4695 node->positional_parameters()[i]->AcceptDartTypeVisitor(this); |
4678 if (result_.IsMalformed()) { | 4696 if (result_.IsMalformed()) { |
4679 result_ = AbstractType::dynamic_type().raw(); | 4697 result_ = AbstractType::dynamic_type().raw(); |
4680 } | 4698 } |
4681 parameter_types.SetAt(pos, result_); | 4699 parameter_types.SetAt(pos, result_); |
4682 parameter_names.SetAt(pos, H.DartSymbol("noname")); | 4700 parameter_names.SetAt(pos, H.DartSymbol("noname")); |
4683 } | 4701 } |
4684 for (intptr_t i = 0; i < named_count; i++, pos++) { | 4702 for (intptr_t i = 0; i < named_count; i++, pos++) { |
4685 Tuple<String, DartType>* tuple = node->named_parameters()[i]; | 4703 NamedParameter* parameter = node->named_parameters()[i]; |
4686 tuple->second()->AcceptDartTypeVisitor(this); | 4704 parameter->type()->AcceptDartTypeVisitor(this); |
4687 if (result_.IsMalformed()) { | 4705 if (result_.IsMalformed()) { |
4688 result_ = AbstractType::dynamic_type().raw(); | 4706 result_ = AbstractType::dynamic_type().raw(); |
4689 } | 4707 } |
4690 parameter_types.SetAt(pos, result_); | 4708 parameter_types.SetAt(pos, result_); |
4691 parameter_names.SetAt(pos, H.DartSymbol(tuple->first())); | 4709 parameter_names.SetAt(pos, H.DartSymbol(parameter->name())); |
4692 } | 4710 } |
4693 | 4711 |
4694 Type& signature_type = | 4712 Type& signature_type = |
4695 Type::ZoneHandle(Z, signature_function.SignatureType()); | 4713 Type::ZoneHandle(Z, signature_function.SignatureType()); |
4696 | 4714 |
4697 if (finalize_) { | 4715 if (finalize_) { |
4698 signature_type ^= | 4716 signature_type ^= |
4699 ClassFinalizer::FinalizeType(*active_class_->klass, signature_type); | 4717 ClassFinalizer::FinalizeType(*active_class_->klass, signature_type); |
4700 // Do not refer to signature_function anymore, since it may have been | 4718 // Do not refer to signature_function anymore, since it may have been |
4701 // replaced during canonicalization. | 4719 // replaced during canonicalization. |
(...skipping 2024 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6726 metadata_expressions = &Field::Cast(kernel_node)->annotations(); | 6744 metadata_expressions = &Field::Cast(kernel_node)->annotations(); |
6727 } else if (kernel_node->IsConstructor()) { | 6745 } else if (kernel_node->IsConstructor()) { |
6728 metadata_expressions = &Constructor::Cast(kernel_node)->annotations(); | 6746 metadata_expressions = &Constructor::Cast(kernel_node)->annotations(); |
6729 } else { | 6747 } else { |
6730 FATAL1("No support for metadata on this type of kernel node %p\n", | 6748 FATAL1("No support for metadata on this type of kernel node %p\n", |
6731 kernel_node); | 6749 kernel_node); |
6732 } | 6750 } |
6733 | 6751 |
6734 TranslationHelper helper(thread); | 6752 TranslationHelper helper(thread); |
6735 Script& script = Script::Handle(Z, metadata_field.Script()); | 6753 Script& script = Script::Handle(Z, metadata_field.Script()); |
6736 helper.SetStringData(TypedData::Handle(Z, script.kernel_strings())); | 6754 helper.SetStringOffsets( |
| 6755 TypedData::Handle(Z, script.kernel_string_offsets())); |
| 6756 helper.SetStringData(TypedData::Handle(Z, script.kernel_string_data())); |
6737 DartTypeTranslator type_translator(&helper, NULL, true); | 6757 DartTypeTranslator type_translator(&helper, NULL, true); |
6738 ConstantEvaluator constant_evaluator(/* flow_graph_builder = */ NULL, Z, | 6758 ConstantEvaluator constant_evaluator(/* flow_graph_builder = */ NULL, Z, |
6739 &helper, &type_translator); | 6759 &helper, &type_translator); |
6740 | 6760 |
6741 const Array& metadata_values = | 6761 const Array& metadata_values = |
6742 Array::Handle(Z, Array::New(metadata_expressions->length())); | 6762 Array::Handle(Z, Array::New(metadata_expressions->length())); |
6743 | 6763 |
6744 for (intptr_t i = 0; i < metadata_expressions->length(); i++) { | 6764 for (intptr_t i = 0; i < metadata_expressions->length(); i++) { |
6745 const Instance& value = | 6765 const Instance& value = |
6746 constant_evaluator.EvaluateExpression((*metadata_expressions)[i]); | 6766 constant_evaluator.EvaluateExpression((*metadata_expressions)[i]); |
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6823 thread->clear_sticky_error(); | 6843 thread->clear_sticky_error(); |
6824 return error.raw(); | 6844 return error.raw(); |
6825 } | 6845 } |
6826 } | 6846 } |
6827 | 6847 |
6828 | 6848 |
6829 } // namespace kernel | 6849 } // namespace kernel |
6830 } // namespace dart | 6850 } // namespace dart |
6831 | 6851 |
6832 #endif // !defined(DART_PRECOMPILED_RUNTIME) | 6852 #endif // !defined(DART_PRECOMPILED_RUNTIME) |
OLD | NEW |