Chromium Code Reviews| Index: runtime/vm/kernel_binary_flowgraph.cc |
| diff --git a/runtime/vm/kernel_binary_flowgraph.cc b/runtime/vm/kernel_binary_flowgraph.cc |
| index 671b8d6b0cd672d971b30ef0a8a20ddc1d3dd0f1..cd7f16b03d4d5893e29192695dfb7ff4959e377a 100644 |
| --- a/runtime/vm/kernel_binary_flowgraph.cc |
| +++ b/runtime/vm/kernel_binary_flowgraph.cc |
| @@ -63,7 +63,7 @@ void StreamingConstantEvaluator::EvaluateStaticGet() { |
| int canonical_name_index = builder_->ReadUInt(); |
| CanonicalName* target = builder_->GetCanonicalName(canonical_name_index); |
| - if (target->IsField()) { |
| + if (H.IsField(target)) { |
| const dart::Field& field = |
| dart::Field::Handle(Z, H.LookupFieldByKernelField(target)); |
| if (field.StaticValue() == Object::sentinel().raw() || |
| @@ -75,17 +75,17 @@ void StreamingConstantEvaluator::EvaluateStaticGet() { |
| } else { |
| result_ = field.StaticValue(); |
| } |
| - } else if (target->IsProcedure()) { |
| + } else if (H.IsProcedure(target)) { |
| const Function& function = |
| Function::ZoneHandle(Z, H.LookupStaticMethodByKernelProcedure(target)); |
| - if (target->IsMethod()) { |
| + if (H.IsMethod(target)) { |
| Function& closure_function = |
| Function::ZoneHandle(Z, function.ImplicitClosureFunction()); |
| closure_function.set_kernel_function(function.kernel_function()); |
| result_ = closure_function.ImplicitStaticClosure(); |
| result_ = H.Canonicalize(result_); |
| - } else if (target->IsGetter()) { |
| + } else if (H.IsGetter(target)) { |
| UNIMPLEMENTED(); |
| } else { |
| UNIMPLEMENTED(); |
| @@ -307,6 +307,7 @@ Fragment StreamingFlowGraphBuilder::BuildAt(intptr_t kernel_offset) { |
| return Fragment(); |
| } |
| + |
| intptr_t StreamingFlowGraphBuilder::GetStringOffset(intptr_t index) { |
| if (string_offsets_ == NULL) { |
| intptr_t saved_offset = ReaderOffset(); |
| @@ -319,18 +320,14 @@ intptr_t StreamingFlowGraphBuilder::GetStringOffset(intptr_t index) { |
| for (intptr_t i = 1; i < string_offset_count_; ++i) { |
| string_offsets_[i] = ReadUInt(); |
| } |
| - // And adjust the offsets now that we know the start offset of the first |
| - // string relative to the start of the binary. |
| - intptr_t base = ReaderOffset(); |
| - for (intptr_t i = 0; i < string_offset_count_; ++i) { |
| - string_offsets_[i] += base; |
| - } |
| - |
| + // Mark the start of the string data to use for decoding strings. |
| + reader_->MarkStringDataOffset(); |
| SetOffset(saved_offset); |
| } |
| return string_offsets_[index]; |
| } |
| + |
| CanonicalName* StreamingFlowGraphBuilder::GetCanonicalName(intptr_t index) { |
| if (index == 0) return NULL; |
| --index; |
| @@ -343,15 +340,11 @@ CanonicalName* StreamingFlowGraphBuilder::GetCanonicalName(intptr_t index) { |
| if (canonical_names_ == NULL) { |
| // Find offset from where to read canonical names table. |
| - // First skip the string table. The last offset is the end offset of the |
| - // last string. |
| - if (string_offsets_ == NULL) { |
| - // Ensure that the length and all the offsets are available. |
| - GetStringOffset(0); |
| - } |
| - SetOffset(GetStringOffset(string_offset_count_ - 1)); |
| + // Skip the magic number. |
| + reader_->set_offset(4); |
| - // There is another string table for the source URIs. Skip it as well. |
| + // Skip the string table. The last offset is the end offset of the last |
| + // string which gives the length of the string data. |
| intptr_t list_length = ReadListLength(); |
| intptr_t end_offset = 0; |
| for (intptr_t i = 0; i < list_length; ++i) { |
|
jensj
2017/04/19 06:41:01
Maybe we should look at how much it would cost in
Kevin Millikin (Google)
2017/04/21 08:22:11
Acknowledged.
|
| @@ -359,6 +352,14 @@ CanonicalName* StreamingFlowGraphBuilder::GetCanonicalName(intptr_t index) { |
| } |
| SkipBytes(end_offset); |
| + // There is another string table for the source URIs. Skip it as well. |
| + list_length = ReadListLength(); |
| + end_offset = 0; |
| + for (intptr_t i = 0; i < list_length; ++i) { |
| + end_offset = ReadUInt(); |
| + } |
| + SkipBytes(end_offset); |
| + |
| // Source code table |
| for (intptr_t i = 0; i < list_length; ++i) { |
| // Source code |
| @@ -405,103 +406,128 @@ CanonicalName* StreamingFlowGraphBuilder::GetCanonicalName(intptr_t index) { |
| return canonical_names_[index]; |
| } |
| + |
| intptr_t StreamingFlowGraphBuilder::ReaderOffset() { |
| return reader_->offset(); |
| } |
| + |
| void StreamingFlowGraphBuilder::SetOffset(intptr_t offset) { |
| reader_->set_offset(offset); |
| } |
| + |
| void StreamingFlowGraphBuilder::SkipBytes(intptr_t bytes) { |
| reader_->set_offset(ReaderOffset() + bytes); |
| } |
| + |
| uint32_t StreamingFlowGraphBuilder::ReadUInt() { |
| return reader_->ReadUInt(); |
| } |
| + |
| intptr_t StreamingFlowGraphBuilder::ReadListLength() { |
| return reader_->ReadListLength(); |
| } |
| + |
| TokenPosition StreamingFlowGraphBuilder::ReadPosition(bool record) { |
| return reader_->ReadPosition(record); |
| } |
| + |
| Tag StreamingFlowGraphBuilder::ReadTag(uint8_t* payload) { |
| return reader_->ReadTag(payload); |
| } |
| + |
| CatchBlock* StreamingFlowGraphBuilder::catch_block() { |
| return flow_graph_builder_->catch_block_; |
| } |
| + |
| ScopeBuildingResult* StreamingFlowGraphBuilder::scopes() { |
| return flow_graph_builder_->scopes_; |
| } |
| + |
| ParsedFunction* StreamingFlowGraphBuilder::parsed_function() { |
| return flow_graph_builder_->parsed_function_; |
| } |
| + |
| dart::String& StreamingFlowGraphBuilder::DartSymbol(intptr_t index) { |
| intptr_t start = GetStringOffset(index); |
| intptr_t end = GetStringOffset(index + 1); |
| - return H.DartSymbol(reader_->buffer() + start, end - start); |
| + return H.DartSymbol(reader_->buffer() + reader_->string_data_offset() + start, |
| + end - start); |
| } |
| + |
| dart::String& StreamingFlowGraphBuilder::DartString(intptr_t index) { |
| intptr_t start = GetStringOffset(index); |
| intptr_t end = GetStringOffset(index + 1); |
| - return H.DartString(reader_->buffer() + start, end - start); |
| + return H.DartString(reader_->buffer() + reader_->string_data_offset() + start, |
| + end - start); |
| } |
| + |
| String* StreamingFlowGraphBuilder::KernelString(intptr_t index) { |
| intptr_t start = GetStringOffset(index); |
| intptr_t end = GetStringOffset(index + 1); |
| - return new String(reader_->buffer() + start, end - start); |
| + return new String(start, end - start); |
| } |
| + |
| Fragment StreamingFlowGraphBuilder::DebugStepCheck(TokenPosition position) { |
| return flow_graph_builder_->DebugStepCheck(position); |
| } |
| + |
| Fragment StreamingFlowGraphBuilder::LoadLocal(LocalVariable* variable) { |
| return flow_graph_builder_->LoadLocal(variable); |
| } |
| + |
| Fragment StreamingFlowGraphBuilder::PushArgument() { |
| return flow_graph_builder_->PushArgument(); |
| } |
| + |
| Fragment StreamingFlowGraphBuilder::RethrowException(TokenPosition position, |
| int catch_try_index) { |
| return flow_graph_builder_->RethrowException(position, catch_try_index); |
| } |
| + |
| Fragment StreamingFlowGraphBuilder::ThrowNoSuchMethodError() { |
| return flow_graph_builder_->ThrowNoSuchMethodError(); |
| } |
| + |
| Fragment StreamingFlowGraphBuilder::Constant(const Object& value) { |
| return flow_graph_builder_->Constant(value); |
| } |
| + |
| Fragment StreamingFlowGraphBuilder::IntConstant(int64_t value) { |
| return flow_graph_builder_->IntConstant(value); |
| } |
| + |
| Fragment StreamingFlowGraphBuilder::LoadStaticField() { |
| return flow_graph_builder_->LoadStaticField(); |
| } |
| + |
| Fragment StreamingFlowGraphBuilder::StaticCall(TokenPosition position, |
| const Function& target, |
| intptr_t argument_count) { |
| return flow_graph_builder_->StaticCall(position, target, argument_count); |
| } |
| + |
| Fragment StreamingFlowGraphBuilder::BuildInvalidExpression() { |
| // The frontend will take care of emitting normal errors (like |
| // [NoSuchMethodError]s) and only emit [InvalidExpression]s in very special |
| @@ -509,13 +535,14 @@ Fragment StreamingFlowGraphBuilder::BuildInvalidExpression() { |
| return ThrowNoSuchMethodError(); |
| } |
| + |
| Fragment StreamingFlowGraphBuilder::BuildStaticGet() { |
| intptr_t saved_offset = ReaderOffset() - 1; // Include the tag. |
| TokenPosition position = ReadPosition(); |
| int canonical_name_index = ReadUInt(); |
| CanonicalName* target = GetCanonicalName(canonical_name_index); |
| - if (target->IsField()) { |
| + if (H.IsField(target)) { |
| const dart::Field& field = |
| dart::Field::ZoneHandle(Z, H.LookupFieldByKernelField(target)); |
| if (field.is_const()) { |
| @@ -537,9 +564,9 @@ Fragment StreamingFlowGraphBuilder::BuildStaticGet() { |
| const Function& function = |
| Function::ZoneHandle(Z, H.LookupStaticMethodByKernelProcedure(target)); |
| - if (target->IsGetter()) { |
| + if (H.IsGetter(target)) { |
| return StaticCall(position, function, 0); |
| - } else if (target->IsMethod()) { |
| + } else if (H.IsMethod(target)) { |
| SetOffset(saved_offset); // EvaluateExpression needs the tag. |
| return Constant(constant_evaluator_.EvaluateExpression()); |
| } else { |
| @@ -550,15 +577,18 @@ Fragment StreamingFlowGraphBuilder::BuildStaticGet() { |
| return Fragment(); |
| } |
| + |
| Fragment StreamingFlowGraphBuilder::BuildSymbolLiteral() { |
| SkipBytes(-1); // EvaluateExpression needs the tag. |
| return Constant(constant_evaluator_.EvaluateExpression()); |
| } |
| + |
| Fragment StreamingFlowGraphBuilder::BuildThisExpression() { |
| return LoadLocal(scopes()->this_variable); |
| } |
| + |
| Fragment StreamingFlowGraphBuilder::BuildRethrow() { |
| TokenPosition position = ReadPosition(); |
| Fragment instructions = DebugStepCheck(position); |
| @@ -571,39 +601,47 @@ Fragment StreamingFlowGraphBuilder::BuildRethrow() { |
| return instructions; |
| } |
| + |
| Fragment StreamingFlowGraphBuilder::BuildBigIntLiteral() { |
| const dart::String& value = DartString(ReadUInt()); |
| return Constant(Integer::ZoneHandle(Z, Integer::New(value, Heap::kOld))); |
| } |
| + |
| Fragment StreamingFlowGraphBuilder::BuildStringLiteral() { |
| intptr_t str_index = ReadUInt(); |
| return Constant(DartSymbol(str_index)); |
| } |
| + |
| Fragment StreamingFlowGraphBuilder::BuildIntLiteral(uint8_t payload) { |
| int64_t value = static_cast<int32_t>(payload) - SpecializedIntLiteralBias; |
| return IntConstant(value); |
| } |
| + |
| Fragment StreamingFlowGraphBuilder::BuildIntLiteral(bool is_negative) { |
| int64_t value = is_negative ? -static_cast<int64_t>(ReadUInt()) : ReadUInt(); |
| return IntConstant(value); |
| } |
| + |
| Fragment StreamingFlowGraphBuilder::BuildDoubleLiteral() { |
| SkipBytes(-1); // EvaluateExpression needs the tag. |
| return Constant(constant_evaluator_.EvaluateExpression()); |
| } |
| + |
| Fragment StreamingFlowGraphBuilder::BuildBoolLiteral(bool value) { |
| return Constant(Bool::Get(value)); |
| } |
| + |
| Fragment StreamingFlowGraphBuilder::BuildNullLiteral() { |
| return Constant(Instance::ZoneHandle(Z, Instance::null())); |
| } |
| + |
| } // namespace kernel |
| } // namespace dart |