Index: runtime/vm/kernel_to_il.cc |
diff --git a/runtime/vm/kernel_to_il.cc b/runtime/vm/kernel_to_il.cc |
index 9f2d4601307fbe47a96f02a3a28c0840969d7750..001127cb58effbf73ae2f613a1aca387a704534a 100644 |
--- a/runtime/vm/kernel_to_il.cc |
+++ b/runtime/vm/kernel_to_il.cc |
@@ -3,7 +3,6 @@ |
// BSD-style license that can be found in the LICENSE file. |
#include <set> |
-#include <string> |
#include "vm/kernel_to_il.h" |
@@ -71,7 +70,8 @@ ScopeBuilder::ScopeBuilder(ParsedFunction* parsed_function, TreeNode* node) |
name_index_(0), |
needs_expr_temp_(false) { |
Script& script = Script::Handle(Z, parsed_function->function().script()); |
- H.SetStringData(TypedData::Handle(Z, script.kernel_strings())); |
+ H.SetStringOffsets(TypedData::Handle(Z, script.kernel_string_offsets())); |
+ H.SetStringData(TypedData::Handle(Z, script.kernel_string_data())); |
} |
@@ -261,7 +261,7 @@ void ScopeBuilder::AddVariable(VariableDeclaration* declaration) { |
// In case `declaration->IsConst()` the flow graph building will take care of |
// evaluating the constant and setting it via |
// `declaration->SetConstantValue()`. |
- const dart::String& name = declaration->name()->is_empty() |
+ const dart::String& name = (H.StringSize(declaration->name()) == 0) |
? GenerateName(":var", name_index_++) |
: H.DartSymbol(declaration->name()); |
LocalVariable* variable = |
@@ -1043,7 +1043,14 @@ TranslationHelper::TranslationHelper(dart::Thread* thread) |
zone_(thread->zone()), |
isolate_(thread->isolate()), |
allocation_space_(thread->IsMutatorThread() ? Heap::kNew : Heap::kOld), |
- string_data_(TypedData::Handle(zone_)) {} |
+ string_offsets_(TypedData::Handle(Z)), |
+ string_data_(TypedData::Handle(Z)) {} |
+ |
+ |
+void TranslationHelper::SetStringOffsets(const TypedData& string_offsets) { |
+ ASSERT(string_offsets_.IsNull()); |
+ string_offsets_ = string_offsets.raw(); |
+} |
void TranslationHelper::SetStringData(const TypedData& string_data) { |
@@ -1052,29 +1059,42 @@ void TranslationHelper::SetStringData(const TypedData& string_data) { |
} |
-uint8_t TranslationHelper::CharacterAt(String* string, intptr_t index) { |
- ASSERT(index < string->size()); |
- return string_data_.GetUint8(string->offset() + index); |
+intptr_t TranslationHelper::StringOffset(intptr_t string_index) const { |
+ return string_offsets_.GetUint32(string_index << 2); |
+} |
+ |
+ |
+intptr_t TranslationHelper::StringSize(intptr_t string_index) const { |
+ return StringOffset(string_index + 1) - StringOffset(string_index); |
} |
-bool TranslationHelper::StringEquals(String* string, const char* other) { |
+uint8_t TranslationHelper::CharacterAt(intptr_t string_index, intptr_t index) { |
+ ASSERT(index < StringSize(string_index)); |
+ return string_data_.GetUint8(StringOffset(string_index) + index); |
+} |
+ |
+ |
+bool TranslationHelper::StringEquals(intptr_t string_index, const char* other) { |
NoSafepointScope no_safepoint; |
intptr_t length = strlen(other); |
- return (length == string->size()) && |
- memcmp(string_data_.DataAddr(string->offset()), other, length) == 0; |
+ return (length == StringSize(string_index)) && |
+ (memcmp(string_data_.DataAddr(StringOffset(string_index)), other, |
+ length) == 0); |
} |
bool TranslationHelper::IsAdministrative(CanonicalName* name) { |
// Administrative names start with '@'. |
- return (name->name()->size() > 0) && (CharacterAt(name->name(), 0) == '@'); |
+ return (StringSize(name->name()) > 0) && |
+ (CharacterAt(name->name(), 0) == '@'); |
} |
bool TranslationHelper::IsPrivate(CanonicalName* name) { |
// Private names start with '_'. |
- return (name->name()->size() > 0) && (CharacterAt(name->name(), 0) == '_'); |
+ return (StringSize(name->name()) > 0) && |
+ (CharacterAt(name->name(), 0) == '_'); |
} |
@@ -1228,13 +1248,13 @@ const dart::String& TranslationHelper::DartString(const char* content, |
} |
-dart::String& TranslationHelper::DartString(String* content, |
+dart::String& TranslationHelper::DartString(intptr_t string_index, |
Heap::Space space) { |
- intptr_t length = content->size(); |
+ intptr_t length = StringSize(string_index); |
uint8_t* buffer = Z->Alloc<uint8_t>(length); |
{ |
NoSafepointScope no_safepoint; |
- memmove(buffer, string_data_.DataAddr(content->offset()), length); |
+ memmove(buffer, string_data_.DataAddr(StringOffset(string_index)), length); |
} |
return dart::String::ZoneHandle( |
Z, dart::String::FromUTF8(buffer, length, space)); |
@@ -1254,12 +1274,12 @@ const dart::String& TranslationHelper::DartSymbol(const char* content) const { |
} |
-dart::String& TranslationHelper::DartSymbol(String* content) const { |
- intptr_t length = content->size(); |
+dart::String& TranslationHelper::DartSymbol(intptr_t string_index) const { |
+ intptr_t length = StringSize(string_index); |
uint8_t* buffer = Z->Alloc<uint8_t>(length); |
{ |
NoSafepointScope no_safepoint; |
- memmove(buffer, string_data_.DataAddr(content->offset()), length); |
+ memmove(buffer, string_data_.DataAddr(StringOffset(string_index)), length); |
} |
return dart::String::ZoneHandle( |
Z, dart::Symbols::FromUTF8(thread_, buffer, length)); |
@@ -1307,12 +1327,12 @@ const dart::String& TranslationHelper::DartSetterName(CanonicalName* setter) { |
const dart::String& TranslationHelper::DartSetterName(Name* setter_name) { |
- return DartSetterName(setter_name->library(), setter_name->string()); |
+ return DartSetterName(setter_name->library(), setter_name->string_index()); |
} |
const dart::String& TranslationHelper::DartSetterName(CanonicalName* parent, |
- String* setter) { |
+ intptr_t setter) { |
// The names flowing into [setter] are coming from the Kernel file: |
// * user-defined setters: `fieldname=` |
// * property-set expressions: `fieldname` |
@@ -1321,19 +1341,18 @@ const dart::String& TranslationHelper::DartSetterName(CanonicalName* parent, |
// |
// => In order to be consistent, we remove the `=` always and adopt the VM |
// conventions. |
- ASSERT(setter->size() > 0); |
- intptr_t skip = 0; |
- if (CharacterAt(setter, setter->size() - 1) == '=') { |
- skip = 1; |
+ intptr_t size = StringSize(setter); |
+ ASSERT(size > 0); |
+ if (CharacterAt(setter, size - 1) == '=') { |
+ --size; |
} |
- intptr_t length = setter->size() - skip; |
- uint8_t* buffer = Z->Alloc<uint8_t>(length); |
+ uint8_t* buffer = Z->Alloc<uint8_t>(size); |
{ |
NoSafepointScope no_safepoint; |
- memmove(buffer, string_data_.DataAddr(setter->offset()), length); |
+ memmove(buffer, string_data_.DataAddr(StringOffset(setter)), size); |
} |
dart::String& name = dart::String::ZoneHandle( |
- Z, dart::String::FromUTF8(buffer, length, allocation_space_)); |
+ Z, dart::String::FromUTF8(buffer, size, allocation_space_)); |
ManglePrivateName(parent, &name, false); |
name = dart::Field::SetterSymbol(name); |
return name; |
@@ -1346,12 +1365,12 @@ const dart::String& TranslationHelper::DartGetterName(CanonicalName* getter) { |
const dart::String& TranslationHelper::DartGetterName(Name* getter_name) { |
- return DartGetterName(getter_name->library(), getter_name->string()); |
+ return DartGetterName(getter_name->library(), getter_name->string_index()); |
} |
const dart::String& TranslationHelper::DartGetterName(CanonicalName* parent, |
- String* getter) { |
+ intptr_t getter) { |
dart::String& name = DartString(getter); |
ManglePrivateName(parent, &name, false); |
name = dart::Field::GetterSymbol(name); |
@@ -1360,7 +1379,7 @@ const dart::String& TranslationHelper::DartGetterName(CanonicalName* parent, |
const dart::String& TranslationHelper::DartFieldName(Name* kernel_name) { |
- dart::String& name = DartString(kernel_name->string()); |
+ dart::String& name = DartString(kernel_name->string_index()); |
return ManglePrivateName(kernel_name->library(), &name); |
} |
@@ -1380,12 +1399,12 @@ const dart::String& TranslationHelper::DartMethodName(CanonicalName* method) { |
const dart::String& TranslationHelper::DartMethodName(Name* method_name) { |
- return DartMethodName(method_name->library(), method_name->string()); |
+ return DartMethodName(method_name->library(), method_name->string_index()); |
} |
const dart::String& TranslationHelper::DartMethodName(CanonicalName* parent, |
- String* method) { |
+ intptr_t method) { |
dart::String& name = DartString(method); |
return ManglePrivateName(parent, &name); |
} |
@@ -2057,10 +2076,8 @@ void ConstantEvaluator::VisitNot(Not* node) { |
void ConstantEvaluator::VisitPropertyGet(PropertyGet* node) { |
- const intptr_t kLengthLen = sizeof("length") - 1; |
- |
- String* string = node->name()->string(); |
- if ((string->size() == kLengthLen) && H.StringEquals(string, "length")) { |
+ intptr_t string_index = node->name()->string_index(); |
+ if (H.StringEquals(string_index, "length")) { |
node->receiver()->AcceptExpressionVisitor(this); |
if (result_.IsString()) { |
const dart::String& str = |
@@ -2187,7 +2204,8 @@ FlowGraphBuilder::FlowGraphBuilder( |
constant_evaluator_(this, zone_, &translation_helper_, &type_translator_), |
streaming_flow_graph_builder_(NULL) { |
Script& script = Script::Handle(Z, parsed_function->function().script()); |
- H.SetStringData(TypedData::Handle(Z, script.kernel_strings())); |
+ H.SetStringOffsets(TypedData::Handle(Z, script.kernel_string_offsets())); |
+ H.SetStringData(TypedData::Handle(Z, script.kernel_string_data())); |
} |
@@ -4682,13 +4700,13 @@ void DartTypeTranslator::VisitFunctionType(FunctionType* node) { |
parameter_names.SetAt(pos, H.DartSymbol("noname")); |
} |
for (intptr_t i = 0; i < named_count; i++, pos++) { |
- Tuple<String, DartType>* tuple = node->named_parameters()[i]; |
- tuple->second()->AcceptDartTypeVisitor(this); |
+ NamedParameter* parameter = node->named_parameters()[i]; |
+ parameter->type()->AcceptDartTypeVisitor(this); |
if (result_.IsMalformed()) { |
result_ = AbstractType::dynamic_type().raw(); |
} |
parameter_types.SetAt(pos, result_); |
- parameter_names.SetAt(pos, H.DartSymbol(tuple->first())); |
+ parameter_names.SetAt(pos, H.DartSymbol(parameter->name())); |
} |
Type& signature_type = |
@@ -6733,7 +6751,9 @@ RawObject* EvaluateMetadata(const dart::Field& metadata_field) { |
TranslationHelper helper(thread); |
Script& script = Script::Handle(Z, metadata_field.Script()); |
- helper.SetStringData(TypedData::Handle(Z, script.kernel_strings())); |
+ helper.SetStringOffsets( |
+ TypedData::Handle(Z, script.kernel_string_offsets())); |
+ helper.SetStringData(TypedData::Handle(Z, script.kernel_string_data())); |
DartTypeTranslator type_translator(&helper, NULL, true); |
ConstantEvaluator constant_evaluator(/* flow_graph_builder = */ NULL, Z, |
&helper, &type_translator); |