Index: runtime/vm/kernel_binary_flowgraph.cc |
diff --git a/runtime/vm/kernel_binary_flowgraph.cc b/runtime/vm/kernel_binary_flowgraph.cc |
index 9b577d0f941ccafba84d2784d4661c4dfb0dab44..cb23a871590e2b925cf7299ffcd71db0f7ded1b1 100644 |
--- a/runtime/vm/kernel_binary_flowgraph.cc |
+++ b/runtime/vm/kernel_binary_flowgraph.cc |
@@ -818,11 +818,11 @@ void StreamingScopeBuilder::VisitStatement() { |
case kSwitchStatement: { |
AddSwitchVariable(); |
VisitExpression(); // read condition. |
- int num_cases = builder_->ReadListLength(); // read number of cases. |
- for (intptr_t i = 0; i < num_cases; ++i) { |
- int num_expressions = |
+ int case_count = builder_->ReadListLength(); // read number of cases. |
+ for (intptr_t i = 0; i < case_count; ++i) { |
+ int expression_count = |
builder_->ReadListLength(); // read number of expressions. |
- for (intptr_t j = 0; j < num_expressions; ++j) { |
+ for (intptr_t j = 0; j < expression_count; ++j) { |
builder_->ReadPosition(); // read jth position. |
VisitExpression(); // read jth expression. |
} |
@@ -867,9 +867,9 @@ void StreamingScopeBuilder::VisitStatement() { |
AddCatchVariables(); |
builder_->ReadBool(); // read any_catch_needs_stack_trace. |
- intptr_t num_catches = |
+ intptr_t catch_count = |
builder_->ReadListLength(); // read number of catches. |
- for (intptr_t i = 0; i < num_catches; ++i) { |
+ for (intptr_t i = 0; i < catch_count; ++i) { |
PositionScope scope(builder_->reader_); |
intptr_t offset = builder_->ReaderOffset(); // Catch has no tag. |
@@ -944,7 +944,7 @@ void StreamingScopeBuilder::VisitStatement() { |
} |
void StreamingScopeBuilder::VisitArguments() { |
- builder_->ReadUInt(); // read num_arguments. |
+ builder_->ReadUInt(); // read argument_count. |
// Types |
intptr_t list_length = builder_->ReadListLength(); // read list length. |
@@ -2353,9 +2353,9 @@ RawObject* StreamingConstantEvaluator::EvaluateConstConstructorCall( |
const int kTypeArgsLen = 0; |
const int kNumArgs = 1; |
const int kNumExtraArgs = 1; |
- const int num_arguments = kNumArgs + kNumExtraArgs; |
+ const int argument_count = kNumArgs + kNumExtraArgs; |
const Array& arg_values = |
- Array::Handle(Z, Array::New(num_arguments, Heap::kOld)); |
+ Array::Handle(Z, Array::New(argument_count, Heap::kOld)); |
Instance& instance = Instance::Handle(Z); |
if (!constructor.IsFactory()) { |
instance = Instance::New(type_class, Heap::kOld); |
@@ -2372,7 +2372,7 @@ RawObject* StreamingConstantEvaluator::EvaluateConstConstructorCall( |
} |
arg_values.SetAt((0 + kNumExtraArgs), argument); |
const Array& args_descriptor = |
- Array::Handle(Z, ArgumentsDescriptor::New(kTypeArgsLen, num_arguments, |
+ Array::Handle(Z, ArgumentsDescriptor::New(kTypeArgsLen, argument_count, |
Object::empty_array())); |
const Object& result = Object::Handle( |
Z, DartEntry::InvokeFunction(constructor, arg_values, args_descriptor)); |
@@ -2678,11 +2678,11 @@ FlowGraph* StreamingFlowGraphBuilder::BuildGraphOfFieldAccessor( |
} |
void StreamingFlowGraphBuilder::SetupDefaultParameterValues() { |
- intptr_t num_optional_parameters = |
+ intptr_t optional_parameter_count = |
parsed_function()->function().NumOptionalParameters(); |
- if (num_optional_parameters > 0) { |
+ if (optional_parameter_count > 0) { |
ZoneGrowableArray<const Instance*>* default_values = |
- new ZoneGrowableArray<const Instance*>(Z, num_optional_parameters); |
+ new ZoneGrowableArray<const Instance*>(Z, optional_parameter_count); |
AlternativeReadingScope alt(reader_); |
FunctionNodeHelper function_node_helper(this); |
@@ -2698,7 +2698,7 @@ void StreamingFlowGraphBuilder::SetupDefaultParameterValues() { |
// List of named. |
list_length = ReadListLength(); // read list length. |
- ASSERT(num_optional_parameters == list_length); |
+ ASSERT(optional_parameter_count == list_length); |
ASSERT(!parsed_function()->function().HasOptionalPositionalParameters()); |
for (intptr_t i = 0; i < list_length; ++i) { |
Instance* default_value; |
@@ -2722,13 +2722,13 @@ void StreamingFlowGraphBuilder::SetupDefaultParameterValues() { |
// List of positional. |
intptr_t list_length = ReadListLength(); // read list length. |
ASSERT(list_length == function_node_helper.required_parameter_count_ + |
- num_optional_parameters); |
+ optional_parameter_count); |
ASSERT(parsed_function()->function().HasOptionalPositionalParameters()); |
for (intptr_t i = 0; i < function_node_helper.required_parameter_count_; |
++i) { |
SkipVariableDeclaration(); // read ith variable declaration. |
} |
- for (intptr_t i = 0; i < num_optional_parameters; ++i) { |
+ for (intptr_t i = 0; i < optional_parameter_count; ++i) { |
Instance* default_value; |
// Read ith variable declaration |
@@ -2994,17 +2994,7 @@ FlowGraph* StreamingFlowGraphBuilder::BuildGraphOfImplicitClosureFunction( |
flow_graph_builder_->next_block_id_ - 1); |
} |
-static bool IsGetMainClosure(const String& name) { |
- if (name.Length() < 16) return false; |
- const char* cstr = "_getMainClosure@"; |
- for (intptr_t i = 0; i < 16; ++i) { |
- if (name.CharAt(i) != cstr[i]) return false; |
- } |
- return true; |
-} |
- |
FlowGraph* StreamingFlowGraphBuilder::BuildGraphOfFunction( |
- bool is_in_builtin_library_toplevel, |
intptr_t constructor_class_parent_offset) { |
const Function& dart_function = parsed_function()->function(); |
TargetEntryInstr* normal_entry = flow_graph_builder_->BuildTargetEntry(); |
@@ -3166,12 +3156,7 @@ FlowGraph* StreamingFlowGraphBuilder::BuildGraphOfFunction( |
body += flow_graph_builder_->NativeFunctionBody(first_parameter_offset, |
dart_function); |
} else if (has_body) { |
- if (is_in_builtin_library_toplevel && |
- IsGetMainClosure(dart::String::Handle(Z, dart_function.name()))) { |
- body += BuildGetMainClosure(); |
- } else { |
- body += BuildStatement(); // read body. |
- } |
+ body += BuildStatement(); // read body. |
} |
if (body.is_open()) { |
body += NullConstant(); |
@@ -3293,11 +3278,11 @@ FlowGraph* StreamingFlowGraphBuilder::BuildGraphOfFunction( |
// assignments/calls/runtimecalls in the first basic block. |
// Place this check at the last parameter to ensure parameters |
// are in scope in the debugger at method entry. |
- const int num_params = dart_function.NumParameters(); |
+ const int parameter_count = dart_function.NumParameters(); |
TokenPosition check_pos = TokenPosition::kNoSource; |
- if (num_params > 0) { |
+ if (parameter_count > 0) { |
LocalScope* scope = parsed_function()->node_sequence()->scope(); |
- const LocalVariable& parameter = *scope->VariableAt(num_params - 1); |
+ const LocalVariable& parameter = *scope->VariableAt(parameter_count - 1); |
check_pos = parameter.token_pos(); |
} |
if (!check_pos.IsDebugPause()) { |
@@ -3325,34 +3310,6 @@ FlowGraph* StreamingFlowGraphBuilder::BuildGraphOfFunction( |
flow_graph_builder_->next_block_id_ - 1); |
} |
-Fragment StreamingFlowGraphBuilder::BuildGetMainClosure() { |
- // _getMainClosure in dart:_builtin. Compile that one specially here. |
- const dart::Library& builtin = |
- dart::Library::Handle(Z, I->object_store()->builtin_library()); |
- const Object& main = |
- Object::Handle(Z, builtin.LookupObjectAllowPrivate(dart::String::Handle( |
- Z, dart::String::New("main")))); |
- if (main.IsField()) { |
- UNIMPLEMENTED(); |
- } else if (main.IsFunction()) { |
- const Function& function = Function::Cast(main); |
- if (function.kind() == RawFunction::kRegularFunction) { |
- const Function& closure_function = |
- Function::Handle(Z, function.ImplicitClosureFunction()); |
- const Instance& closure = |
- Instance::ZoneHandle(Z, closure_function.ImplicitStaticClosure()); |
- Fragment instructions = Constant(closure); |
- instructions += Return(TokenPosition::kNoSource); |
- return instructions; |
- } else { |
- UNIMPLEMENTED(); |
- } |
- } else { |
- UNIMPLEMENTED(); |
- } |
- return Fragment(); |
-} |
- |
FlowGraph* StreamingFlowGraphBuilder::BuildGraph(intptr_t kernel_offset) { |
const Function& function = parsed_function()->function(); |
@@ -3360,9 +3317,6 @@ FlowGraph* StreamingFlowGraphBuilder::BuildGraph(intptr_t kernel_offset) { |
// e.g. for type translation. |
const dart::Class& klass = |
dart::Class::Handle(zone_, parsed_function()->function().Owner()); |
- bool is_in_builtin_library_toplevel = |
- klass.library() == I->object_store()->builtin_library() && |
- klass.IsTopLevel(); |
Function& outermost_function = Function::Handle(Z); |
intptr_t outermost_kernel_offset = -1; |
@@ -3412,17 +3366,16 @@ FlowGraph* StreamingFlowGraphBuilder::BuildGraph(intptr_t kernel_offset) { |
ReadUntilFunctionNode(); // read until function node. |
return function.IsImplicitClosureFunction() |
? BuildGraphOfImplicitClosureFunction(function) |
- : BuildGraphOfFunction(is_in_builtin_library_toplevel); |
+ : BuildGraphOfFunction(); |
} |
case RawFunction::kConstructor: { |
bool is_factory = function.IsFactory(); |
if (is_factory) { |
ReadUntilFunctionNode(); // read until function node. |
- return BuildGraphOfFunction(is_in_builtin_library_toplevel); |
+ return BuildGraphOfFunction(); |
} else { |
// Constructor: Pass offset to parent class. |
return BuildGraphOfFunction( |
- is_in_builtin_library_toplevel, |
ReadUntilFunctionNode()); // read until function node. |
} |
} |
@@ -4046,10 +3999,10 @@ void StreamingFlowGraphBuilder::SkipStatement() { |
return; |
case kSwitchStatement: { |
SkipExpression(); // read condition. |
- int num_cases = ReadListLength(); // read number of cases. |
- for (intptr_t i = 0; i < num_cases; ++i) { |
- int num_expressions = ReadListLength(); // read number of expressions. |
- for (intptr_t j = 0; j < num_expressions; ++j) { |
+ int case_count = ReadListLength(); // read number of cases. |
+ for (intptr_t i = 0; i < case_count; ++i) { |
+ int expression_count = ReadListLength(); // read number of expressions. |
+ for (intptr_t j = 0; j < expression_count; ++j) { |
ReadPosition(); // read jth position. |
SkipExpression(); // read jth expression. |
} |
@@ -4077,8 +4030,8 @@ void StreamingFlowGraphBuilder::SkipStatement() { |
case kTryCatch: { |
SkipStatement(); // read body. |
ReadBool(); // read any_catch_needs_stack_trace. |
- intptr_t num_catches = ReadListLength(); // read number of catches. |
- for (intptr_t i = 0; i < num_catches; ++i) { |
+ intptr_t catch_count = ReadListLength(); // read number of catches. |
+ for (intptr_t i = 0; i < catch_count; ++i) { |
SkipDartType(); // read guard. |
tag = ReadTag(); // read first part of exception. |
if (tag == kSomething) { |
@@ -4096,11 +4049,13 @@ void StreamingFlowGraphBuilder::SkipStatement() { |
SkipStatement(); // read body. |
SkipStatement(); // read finalizer. |
return; |
- case kYieldStatement: |
- ReadPosition(); // read position. |
+ case kYieldStatement: { |
+ TokenPosition position = ReadPosition(); // read position. |
+ record_yield_position(position); |
ReadByte(); // read flags. |
SkipExpression(); // read expression. |
return; |
+ } |
case kVariableDeclaration: |
SkipVariableDeclaration(); // read variable declaration. |
return; |
@@ -4145,8 +4100,54 @@ void StreamingFlowGraphBuilder::SkipVariableDeclaration() { |
helper.ReadUntilExcluding(VariableDeclarationHelper::kEnd); |
} |
+void StreamingFlowGraphBuilder::SkipLibraryCombinator() { |
+ ReadBool(); // read is_show. |
+ intptr_t name_count = ReadUInt(); // read list length. |
+ for (intptr_t j = 0; j < name_count; ++j) { |
+ ReadUInt(); // read ith entry of name_indices. |
+ } |
+} |
+ |
+void StreamingFlowGraphBuilder::SkipLibraryDependency() { |
+ ReadFlags(); // read flags. |
+ SkipListOfExpressions(); // Read annotations. |
+ ReadCanonicalNameReference(); // read target_reference. |
+ ReadStringReference(); // read name_index. |
+ intptr_t combinator_count = ReadListLength(); // read list length. |
+ for (intptr_t i = 0; i < combinator_count; ++i) { |
+ SkipLibraryCombinator(); |
+ } |
+} |
+ |
+void StreamingFlowGraphBuilder::SkipLibraryTypedef() { |
+ SkipCanonicalNameReference(); // read canonical name. |
+ ReadPosition(); // read position. |
+ SkipStringReference(); // read name index. |
+ ReadUInt(); // read source_uri_index. |
+ SkipListOfDartTypes(); // read type parameters. |
+ SkipDartType(); // read type. |
+} |
+ |
TokenPosition StreamingFlowGraphBuilder::ReadPosition(bool record) { |
- return reader_->ReadPosition(record); |
+ TokenPosition position = reader_->ReadPosition(); |
+ if (record) { |
+ record_token_position(position); |
+ } |
+ return position; |
+} |
+ |
+void StreamingFlowGraphBuilder::record_token_position(TokenPosition position) { |
+ if (record_for_script_id_ == current_script_id_ && |
+ record_token_positions_into_ != NULL) { |
+ record_token_positions_into_->Add(position.value()); |
+ } |
+} |
+ |
+void StreamingFlowGraphBuilder::record_yield_position(TokenPosition position) { |
+ if (record_for_script_id_ == current_script_id_ && |
+ record_yield_positions_into_ != NULL) { |
+ record_yield_positions_into_->Add(position.value()); |
+ } |
} |
Tag StreamingFlowGraphBuilder::ReadTag(uint8_t* payload) { |
@@ -4387,13 +4388,14 @@ Fragment StreamingFlowGraphBuilder::StaticCall(TokenPosition position, |
argument_names); |
} |
-Fragment StreamingFlowGraphBuilder::InstanceCall(TokenPosition position, |
- const dart::String& name, |
- Token::Kind kind, |
- intptr_t argument_count, |
- intptr_t num_args_checked) { |
+Fragment StreamingFlowGraphBuilder::InstanceCall( |
+ TokenPosition position, |
+ const dart::String& name, |
+ Token::Kind kind, |
+ intptr_t argument_count, |
+ intptr_t checked_argument_count) { |
return flow_graph_builder_->InstanceCall(position, name, kind, argument_count, |
- num_args_checked); |
+ checked_argument_count); |
} |
Fragment StreamingFlowGraphBuilder::ThrowException(TokenPosition position) { |
@@ -4421,14 +4423,16 @@ Fragment StreamingFlowGraphBuilder::AllocateObject(TokenPosition position, |
return flow_graph_builder_->AllocateObject(position, klass, argument_count); |
} |
-Fragment StreamingFlowGraphBuilder::InstanceCall(TokenPosition position, |
- const dart::String& name, |
- Token::Kind kind, |
- intptr_t argument_count, |
- const Array& argument_names, |
- intptr_t num_args_checked) { |
+Fragment StreamingFlowGraphBuilder::InstanceCall( |
+ TokenPosition position, |
+ const dart::String& name, |
+ Token::Kind kind, |
+ intptr_t argument_count, |
+ const Array& argument_names, |
+ intptr_t checked_argument_count) { |
return flow_graph_builder_->InstanceCall(position, name, kind, argument_count, |
- argument_names, num_args_checked); |
+ argument_names, |
+ checked_argument_count); |
} |
Fragment StreamingFlowGraphBuilder::StoreLocal(TokenPosition position, |
@@ -4958,16 +4962,16 @@ Fragment StreamingFlowGraphBuilder::BuildMethodInvocation(TokenPosition* p) { |
BuildArguments(&argument_names, &argument_count); // read arguments. |
++argument_count; |
- intptr_t num_args_checked = 1; |
+ intptr_t checked_argument_count = 1; |
// If we have a special operation (e.g. +/-/==) we mark both arguments as |
// to be checked. |
if (token_kind != Token::kILLEGAL) { |
ASSERT(argument_count <= 2); |
- num_args_checked = argument_count; |
+ checked_argument_count = argument_count; |
} |
instructions += InstanceCall(position, name, token_kind, argument_count, |
- argument_names, num_args_checked); |
+ argument_names, checked_argument_count); |
// Later optimization passes assume that result of a x.[]=(...) call is not |
// used. We must guarantee this invariant because violation will lead to an |
// illegal IL once we replace x.[]=(...) with a sequence that does not |
@@ -6013,10 +6017,10 @@ Fragment StreamingFlowGraphBuilder::BuildSwitchStatement() { |
// We need the number of cases. So start by getting that, then go back. |
intptr_t offset = ReaderOffset(); |
SkipExpression(); // temporarily skip condition |
- int num_cases = ReadListLength(); // read number of cases. |
+ int case_count = ReadListLength(); // read number of cases. |
SetOffset(offset); |
- SwitchBlock block(flow_graph_builder_, num_cases); |
+ SwitchBlock block(flow_graph_builder_, case_count); |
// Instead of using a variable we should reuse the expression on the stack, |
// since it won't be assigned again, we don't need phi nodes. |
@@ -6025,20 +6029,20 @@ Fragment StreamingFlowGraphBuilder::BuildSwitchStatement() { |
StoreLocal(TokenPosition::kNoSource, scopes()->switch_variable); |
head_instructions += Drop(); |
- num_cases = ReadListLength(); // read number of cases. |
+ case_count = ReadListLength(); // read number of cases. |
// Phase 1: Generate bodies and try to find out whether a body will be target |
// of a jump due to: |
// * `continue case_label` |
// * `case e1: case e2: body` |
- Fragment* body_fragments = new Fragment[num_cases]; |
- intptr_t* case_expression_offsets = new intptr_t[num_cases]; |
+ Fragment* body_fragments = new Fragment[case_count]; |
+ intptr_t* case_expression_offsets = new intptr_t[case_count]; |
int default_case = -1; |
- for (intptr_t i = 0; i < num_cases; ++i) { |
+ for (intptr_t i = 0; i < case_count; ++i) { |
case_expression_offsets[i] = ReaderOffset(); |
- int num_expressions = ReadListLength(); // read number of expressions. |
- for (intptr_t j = 0; j < num_expressions; ++j) { |
+ int expression_count = ReadListLength(); // read number of expressions. |
+ for (intptr_t j = 0; j < expression_count; ++j) { |
ReadPosition(); // read jth position. |
SkipExpression(); // read jth expression. |
} |
@@ -6055,7 +6059,7 @@ Fragment StreamingFlowGraphBuilder::BuildSwitchStatement() { |
// The Dart language specification mandates fall-throughs in [SwitchCase]es |
// to be runtime errors. |
- if (!is_default && body_fragment.is_open() && (i < (num_cases - 1))) { |
+ if (!is_default && body_fragment.is_open() && (i < (case_count - 1))) { |
const dart::Class& klass = dart::Class::ZoneHandle( |
Z, dart::Library::LookupCoreClass(Symbols::FallThroughError())); |
ASSERT(!klass.IsNull()); |
@@ -6102,7 +6106,7 @@ Fragment StreamingFlowGraphBuilder::BuildSwitchStatement() { |
// This means that the <stmt-body> will have more than 1 incoming edge (one |
// from `a == expr` and one from `a != expr && b == expr`). The |
// `block.Destination()` records the additional jump. |
- if (num_expressions > 1) { |
+ if (expression_count > 1) { |
block.DestinationDirect(i); |
} |
} |
@@ -6113,17 +6117,17 @@ Fragment StreamingFlowGraphBuilder::BuildSwitchStatement() { |
// * jump directly to a body (if there is no jumper) |
// * jump to a wrapper block which jumps to the body (if there is a jumper) |
Fragment current_instructions = head_instructions; |
- for (intptr_t i = 0; i < num_cases; ++i) { |
+ for (intptr_t i = 0; i < case_count; ++i) { |
SetOffset(case_expression_offsets[i]); |
- int num_expressions = ReadListLength(); // read length of expressions. |
+ int expression_count = ReadListLength(); // read length of expressions. |
if (i == default_case) { |
- ASSERT(i == (num_cases - 1)); |
+ ASSERT(i == (case_count - 1)); |
// Evaluate the conditions for the default [SwitchCase] just for the |
// purpose of potentially triggering a compile-time error. |
- for (intptr_t j = 0; j < num_expressions; ++j) { |
+ for (intptr_t j = 0; j < expression_count; ++j) { |
ReadPosition(); // read jth position. |
// this reads the expression, but doesn't skip past it. |
constant_evaluator_.EvaluateExpression(ReaderOffset()); |
@@ -6148,7 +6152,7 @@ Fragment StreamingFlowGraphBuilder::BuildSwitchStatement() { |
body_fragments[i] = Fragment(body_join) + body_fragments[i]; |
} |
- for (intptr_t j = 0; j < num_expressions; ++j) { |
+ for (intptr_t j = 0; j < expression_count; ++j) { |
TargetEntryInstr* then; |
TargetEntryInstr* otherwise; |
@@ -6162,7 +6166,7 @@ Fragment StreamingFlowGraphBuilder::BuildSwitchStatement() { |
current_instructions += |
InstanceCall(position, Symbols::EqualOperator(), Token::kEQ, |
/*argument_count=*/2, |
- /*num_args_checked=*/2); |
+ /*checked_argument_count=*/2); |
current_instructions += BranchIfTrue(&then, &otherwise, false); |
Fragment then_fragment(then); |
@@ -6183,13 +6187,13 @@ Fragment StreamingFlowGraphBuilder::BuildSwitchStatement() { |
} |
} |
- if (num_cases > 0 && default_case < 0) { |
+ if (case_count > 0 && default_case < 0) { |
// There is no default, which means we have an open [current_instructions] |
// (which is a [TargetEntryInstruction] for the last "otherwise" branch). |
// |
// Furthermore the last [SwitchCase] can be open as well. If so, we need |
// to join these two. |
- Fragment& last_body = body_fragments[num_cases - 1]; |
+ Fragment& last_body = body_fragments[case_count - 1]; |
if (last_body.is_open()) { |
ASSERT(current_instructions.is_open()); |
ASSERT(current_instructions.current->IsTargetEntry()); |
@@ -6313,13 +6317,13 @@ Fragment StreamingFlowGraphBuilder::BuildTryCatch() { |
bool needs_stacktrace = ReadBool(); // read any_catch_needs_stack_trace |
catch_depth_inc(); |
- intptr_t num_catches = ReadListLength(); // read number of catches. |
+ intptr_t catch_count = ReadListLength(); // read number of catches. |
const Array& handler_types = |
- Array::ZoneHandle(Z, Array::New(num_catches, Heap::kOld)); |
+ Array::ZoneHandle(Z, Array::New(catch_count, Heap::kOld)); |
Fragment catch_body = |
CatchBlockEntry(handler_types, try_handler_index, needs_stacktrace); |
// Fill in the body of the catch. |
- for (intptr_t i = 0; i < num_catches; ++i) { |
+ for (intptr_t i = 0; i < catch_count; ++i) { |
intptr_t catch_offset = ReaderOffset(); // Catch has no tag. |
Tag tag = PeekTag(); // peek guard type. |
AbstractType* type_guard = NULL; |
@@ -6792,11 +6796,11 @@ void StreamingFlowGraphBuilder::SetupFunctionParameters( |
function.SetNumOptionalParameters( |
positional_parameters_count - required_parameter_count, true); |
} |
- intptr_t num_parameters = extra_parameters + total_parameter_count; |
+ intptr_t parameter_count = extra_parameters + total_parameter_count; |
function.set_parameter_types( |
- Array::Handle(Z, Array::New(num_parameters, Heap::kOld))); |
+ Array::Handle(Z, Array::New(parameter_count, Heap::kOld))); |
function.set_parameter_names( |
- Array::Handle(Z, Array::New(num_parameters, Heap::kOld))); |
+ Array::Handle(Z, Array::New(parameter_count, Heap::kOld))); |
intptr_t pos = 0; |
if (is_method) { |
ASSERT(!klass.IsNull()); |
@@ -6938,6 +6942,133 @@ RawObject* StreamingFlowGraphBuilder::EvaluateMetadata(intptr_t kernel_offset) { |
return metadata_values.raw(); |
} |
+void StreamingFlowGraphBuilder::CollectTokenPositionsFor( |
+ intptr_t script_index, |
+ GrowableArray<intptr_t>* record_token_positions_in, |
+ GrowableArray<intptr_t>* record_yield_positions_in) { |
+ record_token_positions_into_ = record_token_positions_in; |
+ record_yield_positions_into_ = record_yield_positions_in; |
+ record_for_script_id_ = script_index; |
+ |
+ // Get offset for 1st library. |
+ SetOffset(reader_->size() - 4); |
+ intptr_t library_count = reader_->ReadUInt32(); |
+ |
+ SetOffset(reader_->size() - 4 - 4 * library_count); |
+ intptr_t offset = reader_->ReadUInt32(); |
+ |
+ SetOffset(offset); |
+ for (intptr_t i = 0; i < library_count; ++i) { |
+ LibraryHelper library_helper(this); |
+ library_helper.ReadUntilExcluding(LibraryHelper::kEnd); |
+ } |
+ |
+ record_token_positions_into_ = NULL; |
+ record_yield_positions_into_ = NULL; |
+ record_for_script_id_ = -1; |
+} |
+ |
+intptr_t StreamingFlowGraphBuilder::SourceTableSize() { |
+ AlternativeReadingScope alt(reader_); |
+ SetOffset(reader_->size() - 4); |
+ intptr_t library_count = reader_->ReadUInt32(); |
+ SetOffset(reader_->size() - 4 - 4 * library_count - 3 * 4); |
+ SetOffset(reader_->ReadUInt32()); // read source table offset. |
+ return ReadUInt(); // read source table size. |
+} |
+ |
+String& StreamingFlowGraphBuilder::SourceTableUriFor(intptr_t index) { |
+ AlternativeReadingScope alt(reader_); |
+ SetOffset(reader_->size() - 4); |
+ intptr_t library_count = reader_->ReadUInt32(); |
+ SetOffset(reader_->size() - 4 - 4 * library_count - 3 * 4); |
+ SetOffset(reader_->ReadUInt32()); // read source table offset. |
+ intptr_t size = ReadUInt(); // read source table size. |
+ intptr_t start = 0; |
+ intptr_t end = -1; |
+ for (intptr_t i = 0; i < size; ++i) { |
+ intptr_t offset = ReadUInt(); |
+ if (i == index - 1) { |
+ start = offset; |
+ } else if (i == index) { |
+ end = offset; |
+ } |
+ } |
+ intptr_t end_offset = ReaderOffset(); |
+ return H.DartString(reader_->buffer() + end_offset + start, end - start, |
+ Heap::kOld); |
+} |
+ |
+String& StreamingFlowGraphBuilder::GetSourceFor(intptr_t index) { |
+ AlternativeReadingScope alt(reader_); |
+ SetOffset(reader_->size() - 4); |
+ intptr_t library_count = reader_->ReadUInt32(); |
+ SetOffset(reader_->size() - 4 - 4 * library_count - 3 * 4); |
+ SetOffset(reader_->ReadUInt32()); // read source table offset. |
+ intptr_t size = ReadUInt(); // read source table size. |
+ intptr_t uris_size = 0; |
+ for (intptr_t i = 0; i < size; ++i) { |
+ uris_size = ReadUInt(); |
+ } |
+ SkipBytes(uris_size); |
+ |
+ // Read the source code strings and line starts. |
+ for (intptr_t i = 0; i < size; ++i) { |
+ intptr_t length = ReadUInt(); |
+ if (index == i) { |
+ return H.DartString(reader_->buffer() + ReaderOffset(), length, |
+ Heap::kOld); |
+ } |
+ SkipBytes(length); |
+ intptr_t line_count = ReadUInt(); |
+ for (intptr_t j = 0; j < line_count; ++j) { |
+ ReadUInt(); |
+ } |
+ } |
+ |
+ return String::Handle(String::null()); |
+} |
+ |
+Array& StreamingFlowGraphBuilder::GetLineStartsFor(intptr_t index) { |
+ AlternativeReadingScope alt(reader_); |
+ SetOffset(reader_->size() - 4); |
+ intptr_t library_count = reader_->ReadUInt32(); |
+ SetOffset(reader_->size() - 4 - 4 * library_count - 3 * 4); |
+ SetOffset(reader_->ReadUInt32()); // read source table offset. |
+ intptr_t size = ReadUInt(); // read source table size. |
+ intptr_t uris_size = 0; |
+ for (intptr_t i = 0; i < size; ++i) { |
+ uris_size = ReadUInt(); |
+ } |
+ SkipBytes(uris_size); |
+ |
+ // Read the source code strings and line starts. |
+ for (intptr_t i = 0; i < size; ++i) { |
+ intptr_t length = ReadUInt(); |
+ SkipBytes(length); |
+ intptr_t line_count = ReadUInt(); |
+ if (i == index) { |
+ Array& array_object = |
+ Array::Handle(Z, Array::New(line_count, Heap::kOld)); |
+ Smi& value = Smi::Handle(Z); |
+ intptr_t previous_line_start = 0; |
+ for (intptr_t j = 0; j < line_count; ++j) { |
+ intptr_t line_start = ReadUInt() + previous_line_start; |
+ value = Smi::New(line_start); |
+ array_object.SetAt(j, value); |
+ previous_line_start = line_start; |
+ } |
+ return array_object; |
+ } else { |
+ for (intptr_t j = 0; j < line_count; ++j) { |
+ ReadUInt(); |
+ } |
+ } |
+ } |
+ |
+ return Array::Handle(Array::null()); |
+} |
+ |
} // namespace kernel |
} // namespace dart |