Index: runtime/vm/kernel_to_il.cc |
diff --git a/runtime/vm/kernel_to_il.cc b/runtime/vm/kernel_to_il.cc |
index dbdc84646d694079295e28969e23839f445fdffc..fb9a6aee1e9a32c861a26361141445e4692612a7 100644 |
--- a/runtime/vm/kernel_to_il.cc |
+++ b/runtime/vm/kernel_to_il.cc |
@@ -383,11 +383,6 @@ const dart::String& TranslationHelper::DartSetterName(NameIndex setter) { |
} |
-const dart::String& TranslationHelper::DartSetterName(Name* setter_name) { |
- return DartSetterName(setter_name->library(), setter_name->string_index()); |
-} |
- |
- |
const dart::String& TranslationHelper::DartSetterName(NameIndex parent, |
StringIndex setter) { |
// The names flowing into [setter] are coming from the Kernel file: |
@@ -422,11 +417,6 @@ const dart::String& TranslationHelper::DartGetterName(NameIndex getter) { |
} |
-const dart::String& TranslationHelper::DartGetterName(Name* getter_name) { |
- return DartGetterName(getter_name->library(), getter_name->string_index()); |
-} |
- |
- |
const dart::String& TranslationHelper::DartGetterName(NameIndex parent, |
StringIndex getter) { |
dart::String& name = DartString(getter); |
@@ -436,12 +426,6 @@ const dart::String& TranslationHelper::DartGetterName(NameIndex parent, |
} |
-const dart::String& TranslationHelper::DartFieldName(Name* kernel_name) { |
- dart::String& name = DartString(kernel_name->string_index()); |
- return ManglePrivateName(kernel_name->library(), &name); |
-} |
- |
- |
const dart::String& TranslationHelper::DartFieldName(NameIndex parent, |
StringIndex field) { |
dart::String& name = DartString(field); |
@@ -449,26 +433,12 @@ const dart::String& TranslationHelper::DartFieldName(NameIndex parent, |
} |
-const dart::String& TranslationHelper::DartInitializerName(Name* kernel_name) { |
- // The [DartFieldName] will take care of mangling the name. |
- dart::String& name = |
- dart::String::Handle(Z, DartFieldName(kernel_name).raw()); |
- name = Symbols::FromConcat(thread_, Symbols::InitPrefix(), name); |
- return name; |
-} |
- |
- |
const dart::String& TranslationHelper::DartMethodName(NameIndex method) { |
return DartMethodName(CanonicalNameParent(method), |
CanonicalNameString(method)); |
} |
-const dart::String& TranslationHelper::DartMethodName(Name* method_name) { |
- return DartMethodName(method_name->library(), method_name->string_index()); |
-} |
- |
- |
const dart::String& TranslationHelper::DartMethodName(NameIndex parent, |
StringIndex method) { |
dart::String& name = DartString(method); |
@@ -646,18 +616,6 @@ dart::String& TranslationHelper::ManglePrivateName(NameIndex parent, |
} |
-const Array& TranslationHelper::ArgumentNames(List<NamedExpression>* named) { |
- if (named->length() == 0) return Array::ZoneHandle(Z); |
- |
- const Array& names = |
- Array::ZoneHandle(Z, Array::New(named->length(), Heap::kOld)); |
- for (intptr_t i = 0; i < named->length(); ++i) { |
- names.SetAt(i, DartSymbol((*named)[i]->name())); |
- } |
- return names; |
-} |
- |
- |
FlowGraphBuilder::FlowGraphBuilder( |
intptr_t kernel_offset, |
ParsedFunction* parsed_function, |
@@ -1155,9 +1113,9 @@ Fragment FlowGraphBuilder::InstanceCall(TokenPosition position, |
const dart::String& name, |
Token::Kind kind, |
intptr_t argument_count, |
- intptr_t num_args_checked) { |
+ intptr_t checked_argument_count) { |
return InstanceCall(position, name, kind, argument_count, Array::null_array(), |
- num_args_checked); |
+ checked_argument_count); |
} |
@@ -1166,12 +1124,12 @@ Fragment FlowGraphBuilder::InstanceCall(TokenPosition position, |
Token::Kind kind, |
intptr_t argument_count, |
const Array& argument_names, |
- intptr_t num_args_checked) { |
+ intptr_t checked_argument_count) { |
ArgumentArray arguments = GetArguments(argument_count); |
const intptr_t kTypeArgsLen = 0; // Generic instance calls not yet supported. |
InstanceCallInstr* call = new (Z) InstanceCallInstr( |
position, name, kind, arguments, kTypeArgsLen, argument_names, |
- num_args_checked, ic_data_array_, GetNextDeoptId()); |
+ checked_argument_count, ic_data_array_, GetNextDeoptId()); |
Push(call); |
return Fragment(call); |
} |
@@ -1670,13 +1628,6 @@ intptr_t FlowGraphBuilder::CurrentTryIndex() { |
} |
-LocalVariable* FlowGraphBuilder::LookupVariable(VariableDeclaration* var) { |
- LocalVariable* local = scopes_->locals.Lookup(var->kernel_offset_no_tag()); |
- ASSERT(local != NULL); |
- return local; |
-} |
- |
- |
dart::LocalVariable* FlowGraphBuilder::LookupVariable(intptr_t kernel_offset) { |
LocalVariable* local = scopes_->locals.Lookup(kernel_offset); |
ASSERT(local != NULL); |
@@ -2446,6 +2397,96 @@ RawObject* BuildParameterDescriptor(const Function& function) { |
} |
} |
+static int LowestFirst(const intptr_t* a, const intptr_t* b) { |
+ return *a - *b; |
+} |
+ |
+/** |
+ * If index exists as sublist in list, sort the sublist from lowest to highest, |
+ * then copy it, as Smis and without duplicates, |
+ * to a new Array in Heap::kOld which is returned. |
+ * Note that the source list is both sorted and de-duplicated as well, but will |
+ * possibly contain duplicate and unsorted data at the end. |
+ * Otherwise (when sublist doesn't exist in list) return new empty array. |
+ */ |
+static RawArray* AsSortedDuplicateFreeArray(GrowableArray<intptr_t>* source) { |
+ intptr_t size = source->length(); |
+ if (size == 0) { |
+ return Array::New(0); |
+ } |
+ |
+ source->Sort(LowestFirst); |
+ |
+ intptr_t last = 0; |
+ for (intptr_t current = 1; current < size; ++current) { |
+ if (source->At(last) != source->At(current)) { |
+ (*source)[++last] = source->At(current); |
+ } |
+ } |
+ Array& array_object = Array::Handle(); |
+ array_object = Array::New(last + 1, Heap::kOld); |
+ Smi& smi_value = Smi::Handle(); |
+ for (intptr_t i = 0; i <= last; ++i) { |
+ smi_value = Smi::New(source->At(i)); |
+ array_object.SetAt(i, smi_value); |
+ } |
+ return array_object.raw(); |
+} |
+ |
+void CollectTokenPositionsFor(const Script& const_script) { |
+ Thread* thread = Thread::Current(); |
+ Zone* zone_ = thread->zone(); |
+ Script& script = Script::Handle(Z, const_script.raw()); |
+ TranslationHelper helper(thread); |
+ helper.SetStringOffsets(TypedData::Handle(Z, script.kernel_string_offsets())); |
+ helper.SetStringData(TypedData::Handle(Z, script.kernel_string_data())); |
+ helper.SetCanonicalNames( |
+ TypedData::Handle(Z, script.kernel_canonical_names())); |
+ |
+ GrowableArray<intptr_t> token_positions(10); |
+ GrowableArray<intptr_t> yield_positions(1); |
+ StreamingFlowGraphBuilder streaming_flow_graph_builder( |
+ &helper, zone_, script.kernel_data(), script.kernel_data_size()); |
+ streaming_flow_graph_builder.CollectTokenPositionsFor( |
+ script.kernel_script_index(), &token_positions, &yield_positions); |
+ Array& array_object = Array::Handle(Z); |
+ array_object = AsSortedDuplicateFreeArray(&token_positions); |
+ script.set_debug_positions(array_object); |
+ array_object = AsSortedDuplicateFreeArray(&yield_positions); |
+ script.set_yield_positions(array_object); |
+} |
+ |
+String& GetSourceFor(const Script& const_script) { |
+ Thread* thread = Thread::Current(); |
+ Zone* zone_ = thread->zone(); |
+ Script& script = Script::Handle(Z, const_script.raw()); |
+ TranslationHelper helper(thread); |
+ helper.SetStringOffsets(TypedData::Handle(Z, script.kernel_string_offsets())); |
+ helper.SetStringData(TypedData::Handle(Z, script.kernel_string_data())); |
+ helper.SetCanonicalNames( |
+ TypedData::Handle(Z, script.kernel_canonical_names())); |
+ |
+ StreamingFlowGraphBuilder streaming_flow_graph_builder( |
+ &helper, zone_, script.kernel_data(), script.kernel_data_size()); |
+ return streaming_flow_graph_builder.GetSourceFor( |
+ script.kernel_script_index()); |
+} |
+ |
+Array& GetLineStartsFor(const Script& const_script) { |
+ Thread* thread = Thread::Current(); |
+ Zone* zone_ = thread->zone(); |
+ Script& script = Script::Handle(Z, const_script.raw()); |
+ TranslationHelper helper(thread); |
+ helper.SetStringOffsets(TypedData::Handle(Z, script.kernel_string_offsets())); |
+ helper.SetStringData(TypedData::Handle(Z, script.kernel_string_data())); |
+ helper.SetCanonicalNames( |
+ TypedData::Handle(Z, script.kernel_canonical_names())); |
+ |
+ StreamingFlowGraphBuilder streaming_flow_graph_builder( |
+ &helper, zone_, script.kernel_data(), script.kernel_data_size()); |
+ return streaming_flow_graph_builder.GetLineStartsFor( |
+ script.kernel_script_index()); |
+} |
} // namespace kernel |
} // namespace dart |