Index: runtime/vm/kernel_binary.cc |
diff --git a/runtime/vm/kernel_binary.cc b/runtime/vm/kernel_binary.cc |
index 8f63e6b05ee5ce69871239d7e100ee50294c587c..3af19156227ddbd92ed4d12b23a0b531dfe6f503 100644 |
--- a/runtime/vm/kernel_binary.cc |
+++ b/runtime/vm/kernel_binary.cc |
@@ -194,6 +194,10 @@ Library* Library::ReadFrom(Reader* reader) { |
fields().ReadFrom<Field>(reader, this); |
procedures().ReadFrom<Procedure>(reader, this); |
+ |
+ cannot_stream_ = classes().cannot_stream() || fields().cannot_stream() || |
+ procedures().cannot_stream(); |
+ |
return this; |
} |
@@ -224,6 +228,8 @@ Class* Class::ReadFrom(Reader* reader) { |
reader->record_token_position(position_); |
annotations_.ReadFromStatic<Expression>(reader); |
+ cannot_stream_ = annotations_.cannot_stream(); |
+ |
return this; |
} |
@@ -244,6 +250,9 @@ NormalClass* NormalClass::ReadFrom(Reader* reader) { |
constructors_.ReadFrom<Constructor>(reader, this); |
procedures_.ReadFrom<Procedure>(reader, this); |
+ cannot_stream_ = fields_.cannot_stream() || constructors_.cannot_stream() || |
Kevin Millikin (Google)
2017/05/11 10:38:35
This is overwriting cannot_stream_ which might hav
jensj
2017/05/11 12:59:25
Done.
|
+ procedures_.cannot_stream(); |
+ |
return this; |
} |
@@ -259,6 +268,9 @@ MixinClass* MixinClass::ReadFrom(Reader* reader) { |
implemented_classes_.ReadFromStatic<DowncastReader<DartType, InterfaceType> >( |
reader); |
constructors_.ReadFrom<Constructor>(reader, this); |
+ |
+ cannot_stream_ = constructors_.cannot_stream(); |
+ |
return this; |
} |
@@ -327,6 +339,10 @@ Field* Field::ReadFrom(Reader* reader) { |
annotations_.ReadFromStatic<Expression>(reader); |
type_ = DartType::ReadFrom(reader); |
initializer_ = reader->ReadOptional<Expression>(); |
+ |
+ cannot_stream_ = (initializer_ != NULL && initializer_->cannot_stream()) || |
+ annotations_.cannot_stream(); |
+ |
return this; |
} |
@@ -345,6 +361,10 @@ Constructor* Constructor::ReadFrom(Reader* reader) { |
annotations_.ReadFromStatic<Expression>(reader); |
function_ = FunctionNode::ReadFrom(reader); |
initializers_.ReadFromStatic<Initializer>(reader); |
+ |
+ cannot_stream_ = annotations_.cannot_stream() || function_->cannot_stream() || |
+ initializers_.cannot_stream(); |
+ |
return this; |
} |
@@ -367,6 +387,10 @@ Procedure* Procedure::ReadFrom(Reader* reader) { |
reader->record_token_position(end_position_); |
annotations_.ReadFromStatic<Expression>(reader); |
function_ = reader->ReadOptional<FunctionNode>(); |
+ |
+ cannot_stream_ = annotations_.cannot_stream() || |
+ (function_ != NULL && function_->cannot_stream()); |
+ |
return this; |
} |
@@ -403,6 +427,9 @@ FieldInitializer* FieldInitializer::ReadFromImpl(Reader* reader) { |
FieldInitializer* initializer = new FieldInitializer(); |
initializer->field_reference_ = Reference::ReadMemberFrom(reader); |
initializer->value_ = Expression::ReadFrom(reader); |
+ |
+ initializer->cannot_stream_ = initializer->value_->cannot_stream(); |
+ |
return initializer; |
} |
@@ -412,6 +439,9 @@ SuperInitializer* SuperInitializer::ReadFromImpl(Reader* reader) { |
SuperInitializer* init = new SuperInitializer(); |
init->target_reference_ = Reference::ReadMemberFrom(reader); |
init->arguments_ = Arguments::ReadFrom(reader); |
+ |
+ init->cannot_stream_ = init->arguments_->cannot_stream(); |
+ |
return init; |
} |
@@ -421,6 +451,9 @@ RedirectingInitializer* RedirectingInitializer::ReadFromImpl(Reader* reader) { |
RedirectingInitializer* init = new RedirectingInitializer(); |
init->target_reference_ = Reference::ReadMemberFrom(reader); |
init->arguments_ = Arguments::ReadFrom(reader); |
+ |
+ init->cannot_stream_ = init->arguments_->cannot_stream(); |
+ |
return init; |
} |
@@ -429,6 +462,9 @@ LocalInitializer* LocalInitializer::ReadFromImpl(Reader* reader) { |
TRACE_READ_OFFSET(); |
LocalInitializer* init = new LocalInitializer(); |
init->variable_ = VariableDeclaration::ReadFromImpl(reader, false); |
+ |
+ init->cannot_stream_ = init->variable_->cannot_stream(); |
+ |
return init; |
} |
@@ -557,7 +593,9 @@ VariableGet* VariableGet::ReadFrom(Reader* reader) { |
VariableGet* get = new VariableGet(); |
get->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte. |
get->position_ = reader->ReadPosition(); |
+ get->variable_kernel_offset_ = reader->ReadUInt(); |
get->variable_ = reader->helper()->variables().Lookup(reader->ReadUInt()); |
+ ASSERT(get->variable_->kernel_offset() == get->variable_kernel_offset_); |
reader->ReadOptional<DartType>(); // Unused promoted type. |
return get; |
} |
@@ -568,7 +606,9 @@ VariableGet* VariableGet::ReadFrom(Reader* reader, uint8_t payload) { |
VariableGet* get = new VariableGet(); |
get->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte. |
get->position_ = reader->ReadPosition(); |
+ get->variable_kernel_offset_ = reader->ReadUInt(); |
get->variable_ = reader->helper()->variables().Lookup(payload); |
+ ASSERT(get->variable_->kernel_offset() == get->variable_kernel_offset_); |
return get; |
} |
@@ -578,8 +618,13 @@ VariableSet* VariableSet::ReadFrom(Reader* reader) { |
VariableSet* set = new VariableSet(); |
set->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte. |
set->position_ = reader->ReadPosition(); |
+ set->variable_kernel_offset_ = reader->ReadUInt(); |
set->variable_ = reader->helper()->variables().Lookup(reader->ReadUInt()); |
+ ASSERT(set->variable_->kernel_offset() == set->variable_kernel_offset_); |
set->expression_ = Expression::ReadFrom(reader); |
+ |
+ set->cannot_stream_ = set->expression_->cannot_stream(); |
+ |
return set; |
} |
@@ -590,7 +635,12 @@ VariableSet* VariableSet::ReadFrom(Reader* reader, uint8_t payload) { |
set->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte. |
set->variable_ = reader->helper()->variables().Lookup(payload); |
set->position_ = reader->ReadPosition(); |
+ set->variable_kernel_offset_ = reader->ReadUInt(); |
+ ASSERT(set->variable_->kernel_offset() == set->variable_kernel_offset_); |
set->expression_ = Expression::ReadFrom(reader); |
+ |
+ set->cannot_stream_ = set->expression_->cannot_stream(); |
+ |
return set; |
} |
@@ -603,6 +653,9 @@ PropertyGet* PropertyGet::ReadFrom(Reader* reader) { |
get->receiver_ = Expression::ReadFrom(reader); |
get->name_ = Name::ReadFrom(reader); |
get->interface_target_reference_ = Reference::ReadMemberFrom(reader, true); |
+ |
+ get->cannot_stream_ = get->receiver_->cannot_stream(); |
+ |
return get; |
} |
@@ -616,6 +669,10 @@ PropertySet* PropertySet::ReadFrom(Reader* reader) { |
set->name_ = Name::ReadFrom(reader); |
set->value_ = Expression::ReadFrom(reader); |
set->interface_target_reference_ = Reference::ReadMemberFrom(reader, true); |
+ |
+ set->cannot_stream_ = |
+ set->receiver_->cannot_stream() || set->value_->cannot_stream(); |
+ |
return set; |
} |
@@ -627,6 +684,9 @@ DirectPropertyGet* DirectPropertyGet::ReadFrom(Reader* reader) { |
get->position_ = reader->ReadPosition(); |
get->receiver_ = Expression::ReadFrom(reader); |
get->target_reference_ = Reference::ReadMemberFrom(reader); |
+ |
+ get->cannot_stream_ = get->receiver_->cannot_stream(); |
+ |
return get; |
} |
@@ -639,6 +699,10 @@ DirectPropertySet* DirectPropertySet::ReadFrom(Reader* reader) { |
set->receiver_ = Expression::ReadFrom(reader); |
set->target_reference_ = Reference::ReadMemberFrom(reader); |
set->value_ = Expression::ReadFrom(reader); |
+ |
+ set->cannot_stream_ = |
+ set->receiver_->cannot_stream() || set->value_->cannot_stream(); |
+ |
return set; |
} |
@@ -660,6 +724,9 @@ StaticSet* StaticSet::ReadFrom(Reader* reader) { |
set->position_ = reader->ReadPosition(); |
set->target_reference_ = Reference::ReadMemberFrom(reader); |
set->expression_ = Expression::ReadFrom(reader); |
+ |
+ set->cannot_stream_ = set->expression_->cannot_stream(); |
+ |
return set; |
} |
@@ -667,9 +734,15 @@ StaticSet* StaticSet::ReadFrom(Reader* reader) { |
Arguments* Arguments::ReadFrom(Reader* reader) { |
TRACE_READ_OFFSET(); |
Arguments* arguments = new Arguments(); |
+ intptr_t num_arguments = reader->ReadUInt(); |
arguments->types().ReadFromStatic<DartType>(reader); |
arguments->positional().ReadFromStatic<Expression>(reader); |
arguments->named().ReadFromStatic<NamedExpression>(reader); |
+ ASSERT(arguments->count() == num_arguments); |
+ |
+ arguments->cannot_stream_ = arguments->positional().cannot_stream() || |
+ arguments->named().cannot_stream(); |
+ |
return arguments; |
} |
@@ -678,7 +751,11 @@ NamedExpression* NamedExpression::ReadFrom(Reader* reader) { |
TRACE_READ_OFFSET(); |
intptr_t name_index = reader->ReadUInt(); |
Expression* expression = Expression::ReadFrom(reader); |
- return new NamedExpression(name_index, expression); |
+ NamedExpression* named = new NamedExpression(name_index, expression); |
+ |
+ named->cannot_stream_ = expression->cannot_stream(); |
+ |
+ return named; |
} |
@@ -692,6 +769,10 @@ MethodInvocation* MethodInvocation::ReadFrom(Reader* reader) { |
invocation->arguments_ = Arguments::ReadFrom(reader); |
invocation->interface_target_reference_ = |
Reference::ReadMemberFrom(reader, true); |
+ |
+ invocation->cannot_stream_ = invocation->receiver_->cannot_stream() || |
+ invocation->arguments_->cannot_stream(); |
+ |
return invocation; |
} |
@@ -703,6 +784,10 @@ DirectMethodInvocation* DirectMethodInvocation::ReadFrom(Reader* reader) { |
invocation->receiver_ = Expression::ReadFrom(reader); |
invocation->target_reference_ = Reference::ReadMemberFrom(reader); |
invocation->arguments_ = Arguments::ReadFrom(reader); |
+ |
+ invocation->cannot_stream_ = invocation->receiver_->cannot_stream() || |
+ invocation->arguments_->cannot_stream(); |
+ |
return invocation; |
} |
@@ -715,6 +800,9 @@ StaticInvocation* StaticInvocation::ReadFrom(Reader* reader, bool is_const) { |
invocation->position_ = reader->ReadPosition(); |
invocation->procedure_reference_ = Reference::ReadMemberFrom(reader); |
invocation->arguments_ = Arguments::ReadFrom(reader); |
+ |
+ invocation->cannot_stream_ = invocation->arguments_->cannot_stream(); |
+ |
return invocation; |
} |
@@ -728,6 +816,9 @@ ConstructorInvocation* ConstructorInvocation::ReadFrom(Reader* reader, |
invocation->position_ = reader->ReadPosition(); |
invocation->target_reference_ = Reference::ReadMemberFrom(reader); |
invocation->arguments_ = Arguments::ReadFrom(reader); |
+ |
+ invocation->cannot_stream_ = invocation->arguments_->cannot_stream(); |
+ |
return invocation; |
} |
@@ -737,6 +828,9 @@ Not* Not::ReadFrom(Reader* reader) { |
Not* n = new Not(); |
n->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte. |
n->expression_ = Expression::ReadFrom(reader); |
+ |
+ n->cannot_stream_ = n->expression_->cannot_stream(); |
+ |
return n; |
} |
@@ -748,6 +842,10 @@ LogicalExpression* LogicalExpression::ReadFrom(Reader* reader) { |
expr->left_ = Expression::ReadFrom(reader); |
expr->operator_ = static_cast<Operator>(reader->ReadByte()); |
expr->right_ = Expression::ReadFrom(reader); |
+ |
+ expr->cannot_stream_ = |
+ expr->left_->cannot_stream() || expr->right_->cannot_stream(); |
+ |
return expr; |
} |
@@ -760,6 +858,11 @@ ConditionalExpression* ConditionalExpression::ReadFrom(Reader* reader) { |
expr->then_ = Expression::ReadFrom(reader); |
expr->otherwise_ = Expression::ReadFrom(reader); |
reader->ReadOptional<DartType>(); // Unused static type. |
+ |
+ expr->cannot_stream_ = expr->condition_->cannot_stream() || |
+ expr->then_->cannot_stream() || |
+ expr->otherwise_->cannot_stream(); |
+ |
return expr; |
} |
@@ -770,6 +873,9 @@ StringConcatenation* StringConcatenation::ReadFrom(Reader* reader) { |
concat->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte. |
concat->position_ = reader->ReadPosition(); |
concat->expressions_.ReadFromStatic<Expression>(reader); |
+ |
+ concat->cannot_stream_ = concat->expressions_.cannot_stream(); |
+ |
return concat; |
} |
@@ -781,6 +887,9 @@ IsExpression* IsExpression::ReadFrom(Reader* reader) { |
expr->position_ = reader->ReadPosition(); |
expr->operand_ = Expression::ReadFrom(reader); |
expr->type_ = DartType::ReadFrom(reader); |
+ |
+ expr->cannot_stream_ = expr->operand_->cannot_stream(); |
+ |
return expr; |
} |
@@ -792,6 +901,9 @@ AsExpression* AsExpression::ReadFrom(Reader* reader) { |
expr->position_ = reader->ReadPosition(); |
expr->operand_ = Expression::ReadFrom(reader); |
expr->type_ = DartType::ReadFrom(reader); |
+ |
+ expr->cannot_stream_ = expr->operand_->cannot_stream(); |
+ |
return expr; |
} |
@@ -900,6 +1012,9 @@ Throw* Throw::ReadFrom(Reader* reader) { |
t->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte. |
t->position_ = reader->ReadPosition(); |
t->expression_ = Expression::ReadFrom(reader); |
+ |
+ t->cannot_stream_ = t->expression_->cannot_stream(); |
+ |
return t; |
} |
@@ -912,6 +1027,9 @@ ListLiteral* ListLiteral::ReadFrom(Reader* reader, bool is_const) { |
literal->position_ = reader->ReadPosition(); |
literal->type_ = DartType::ReadFrom(reader); |
literal->expressions_.ReadFromStatic<Expression>(reader); |
+ |
+ literal->cannot_stream_ = literal->expressions_.cannot_stream(); |
+ |
return literal; |
} |
@@ -925,6 +1043,9 @@ MapLiteral* MapLiteral::ReadFrom(Reader* reader, bool is_const) { |
literal->key_type_ = DartType::ReadFrom(reader); |
literal->value_type_ = DartType::ReadFrom(reader); |
literal->entries_.ReadFromStatic<MapEntry>(reader); |
+ |
+ literal->cannot_stream_ = literal->entries_.cannot_stream(); |
+ |
return literal; |
} |
@@ -933,6 +1054,10 @@ MapEntry* MapEntry::ReadFrom(Reader* reader) { |
MapEntry* entry = new MapEntry(); |
entry->key_ = Expression::ReadFrom(reader); |
entry->value_ = Expression::ReadFrom(reader); |
+ |
+ entry->cannot_stream_ = |
+ entry->key_->cannot_stream() || entry->value_->cannot_stream(); |
+ |
return entry; |
} |
@@ -942,6 +1067,9 @@ AwaitExpression* AwaitExpression::ReadFrom(Reader* reader) { |
AwaitExpression* await = new AwaitExpression(); |
await->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte. |
await->operand_ = Expression::ReadFrom(reader); |
+ |
+ await->cannot_stream_ = await->operand_->cannot_stream(); |
+ |
return await; |
} |
@@ -952,6 +1080,9 @@ FunctionExpression* FunctionExpression::ReadFrom(Reader* reader) { |
FunctionExpression* expr = new FunctionExpression(); |
expr->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte. |
expr->function_ = FunctionNode::ReadFrom(reader); |
+ |
+ expr->cannot_stream_ = true; |
+ |
return expr; |
} |
@@ -968,6 +1099,9 @@ Let* Let::ReadFrom(Reader* reader) { |
let->position_ = reader->min_position(); |
let->end_position_ = reader->max_position(); |
+ let->cannot_stream_ = |
+ let->variable_->cannot_stream() || let->body_->cannot_stream(); |
+ |
return let; |
} |
@@ -992,6 +1126,8 @@ VectorGet* VectorGet::ReadFrom(Reader* reader) { |
vector_get->vector_expression_ = Expression::ReadFrom(reader); |
vector_get->index_ = reader->ReadUInt(); |
+ vector_get->cannot_stream_ = vector_get->vector_expression_->cannot_stream(); |
+ |
return vector_get; |
} |
@@ -1005,6 +1141,10 @@ VectorSet* VectorSet::ReadFrom(Reader* reader) { |
vector_set->index_ = reader->ReadUInt(); |
vector_set->value_ = Expression::ReadFrom(reader); |
+ vector_set->cannot_stream_ = |
+ vector_set->vector_expression_->cannot_stream() || |
+ vector_set->value_->cannot_stream(); |
+ |
return vector_set; |
} |
@@ -1017,6 +1157,9 @@ VectorCopy* VectorCopy::ReadFrom(Reader* reader) { |
reader->offset() - 1; // -1 to include tag byte. |
vector_copy->vector_expression_ = Expression::ReadFrom(reader); |
+ vector_copy->cannot_stream_ = |
+ vector_copy->vector_expression_->cannot_stream(); |
+ |
return vector_copy; |
} |
@@ -1033,6 +1176,9 @@ ClosureCreation* ClosureCreation::ReadFrom(Reader* reader) { |
closure_creation->function_type_ = |
FunctionType::Cast(DartType::ReadFrom(reader)); |
+ closure_creation->cannot_stream_ = |
+ closure_creation->context_vector_->cannot_stream(); |
+ |
return closure_creation; |
} |
@@ -1092,13 +1238,22 @@ Statement* Statement::ReadFrom(Reader* reader) { |
InvalidStatement* InvalidStatement::ReadFrom(Reader* reader) { |
TRACE_READ_OFFSET(); |
- return new InvalidStatement(); |
+ InvalidStatement* stmt = new InvalidStatement(); |
+ stmt->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte. |
+ return stmt; |
} |
ExpressionStatement* ExpressionStatement::ReadFrom(Reader* reader) { |
TRACE_READ_OFFSET(); |
- return new ExpressionStatement(Expression::ReadFrom(reader)); |
+ intptr_t offset = reader->offset() - 1; // -1 to include tag byte. |
+ ExpressionStatement* stmt = |
+ new ExpressionStatement(Expression::ReadFrom(reader)); |
+ stmt->kernel_offset_ = offset; |
+ |
+ stmt->cannot_stream_ = stmt->expression_->cannot_stream(); |
+ |
+ return stmt; |
} |
@@ -1113,21 +1268,31 @@ Block* Block::ReadFromImpl(Reader* reader) { |
block->position_ = reader->min_position(); |
block->end_position_ = reader->max_position(); |
+ block->cannot_stream_ = block->statements().cannot_stream(); |
+ |
return block; |
} |
EmptyStatement* EmptyStatement::ReadFrom(Reader* reader) { |
TRACE_READ_OFFSET(); |
- return new EmptyStatement(); |
+ EmptyStatement* stmt = new EmptyStatement(); |
+ stmt->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte. |
+ return stmt; |
} |
AssertStatement* AssertStatement::ReadFrom(Reader* reader) { |
TRACE_READ_OFFSET(); |
AssertStatement* stmt = new AssertStatement(); |
+ stmt->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte. |
stmt->condition_ = Expression::ReadFrom(reader); |
stmt->message_ = reader->ReadOptional<Expression>(); |
+ |
+ stmt->cannot_stream_ = |
+ stmt->condition_->cannot_stream() || |
+ (stmt->message_ != NULL && stmt->message_->cannot_stream()); |
+ |
return stmt; |
} |
@@ -1135,9 +1300,14 @@ AssertStatement* AssertStatement::ReadFrom(Reader* reader) { |
LabeledStatement* LabeledStatement::ReadFrom(Reader* reader) { |
TRACE_READ_OFFSET(); |
LabeledStatement* stmt = new LabeledStatement(); |
+ stmt->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte. |
+ |
reader->helper()->labels()->Push(stmt); |
stmt->body_ = Statement::ReadFrom(reader); |
reader->helper()->labels()->Pop(stmt); |
+ |
+ stmt->cannot_stream_ = stmt->body_->cannot_stream(); |
+ |
return stmt; |
} |
@@ -1145,8 +1315,9 @@ LabeledStatement* LabeledStatement::ReadFrom(Reader* reader) { |
BreakStatement* BreakStatement::ReadFrom(Reader* reader) { |
TRACE_READ_OFFSET(); |
BreakStatement* stmt = new BreakStatement(); |
+ stmt->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte. |
stmt->position_ = reader->ReadPosition(); |
- stmt->target_ = reader->helper()->labels()->Lookup(reader->ReadUInt()); |
+ stmt->target_index_ = reader->ReadUInt(); |
return stmt; |
} |
@@ -1154,8 +1325,13 @@ BreakStatement* BreakStatement::ReadFrom(Reader* reader) { |
WhileStatement* WhileStatement::ReadFrom(Reader* reader) { |
TRACE_READ_OFFSET(); |
WhileStatement* stmt = new WhileStatement(); |
+ stmt->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte. |
stmt->condition_ = Expression::ReadFrom(reader); |
stmt->body_ = Statement::ReadFrom(reader); |
+ |
+ stmt->cannot_stream_ = |
+ stmt->condition_->cannot_stream() || stmt->body_->cannot_stream(); |
+ |
return stmt; |
} |
@@ -1163,8 +1339,13 @@ WhileStatement* WhileStatement::ReadFrom(Reader* reader) { |
DoStatement* DoStatement::ReadFrom(Reader* reader) { |
TRACE_READ_OFFSET(); |
DoStatement* dostmt = new DoStatement(); |
+ dostmt->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte. |
dostmt->body_ = Statement::ReadFrom(reader); |
dostmt->condition_ = Expression::ReadFrom(reader); |
+ |
+ dostmt->cannot_stream_ = |
+ dostmt->body_->cannot_stream() || dostmt->condition_->cannot_stream(); |
+ |
return dostmt; |
} |
@@ -1183,6 +1364,11 @@ ForStatement* ForStatement::ReadFrom(Reader* reader) { |
forstmt->end_position_ = reader->max_position(); |
forstmt->position_ = reader->min_position(); |
+ forstmt->cannot_stream_ = |
+ forstmt->body_->cannot_stream() || |
+ (forstmt->condition_ != NULL && forstmt->condition_->cannot_stream()) || |
+ forstmt->variables_.cannot_stream() || forstmt->updates_.cannot_stream(); |
+ |
return forstmt; |
} |
@@ -1205,39 +1391,49 @@ ForInStatement* ForInStatement::ReadFrom(Reader* reader, bool is_async) { |
} |
forinstmt->variable_->set_end_position(forinstmt->position_); |
+ forinstmt->cannot_stream_ = forinstmt->variable_->cannot_stream() || |
+ forinstmt->iterable_->cannot_stream() || |
+ forinstmt->body_->cannot_stream(); |
+ |
return forinstmt; |
} |
SwitchStatement* SwitchStatement::ReadFrom(Reader* reader) { |
TRACE_READ_OFFSET(); |
- SwitchCaseScope<ReaderHelper> scope(reader->helper()); |
SwitchStatement* stmt = new SwitchStatement(); |
+ stmt->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte. |
stmt->condition_ = Expression::ReadFrom(reader); |
- // We need to explicitly create empty [SwitchCase]s first in order to add them |
- // to the [SwitchCaseScope]. This is necessary since a [Statement] in a switch |
- // case can refer to one defined later on. |
int count = reader->ReadUInt(); |
+ stmt->cases_.EnsureInitialized(count); |
for (intptr_t i = 0; i < count; i++) { |
SwitchCase* sc = stmt->cases_.GetOrCreate<SwitchCase>(i); |
- reader->helper()->switch_cases().Push(sc); |
- } |
- for (intptr_t i = 0; i < count; i++) { |
- SwitchCase* sc = stmt->cases_[i]; |
sc->ReadFrom(reader); |
} |
+ |
+ stmt->cannot_stream_ = |
+ stmt->condition_->cannot_stream() || stmt->cases_.cannot_stream(); |
+ |
return stmt; |
} |
SwitchCase* SwitchCase::ReadFrom(Reader* reader) { |
TRACE_READ_OFFSET(); |
- expressions_.ReadFromStatic<Expression>(reader); |
- for (intptr_t i = 0; i < expressions_.length(); ++i) { |
- expressions_[i]->set_position(reader->ReadPosition()); |
+ int length = reader->ReadListLength(); |
+ expressions_.EnsureInitialized(length); |
+ |
+ for (intptr_t i = 0; i < length; i++) { |
+ ASSERT(expressions_[i] == NULL); |
+ TokenPosition position = reader->ReadPosition(); |
+ expressions_[i] = Expression::ReadFrom(reader); |
+ expressions_[i]->set_position(position); |
} |
is_default_ = reader->ReadBool(); |
body_ = Statement::ReadFrom(reader); |
+ |
+ cannot_stream_ = expressions_.cannot_stream() || body_->cannot_stream(); |
+ |
return this; |
} |
@@ -1245,7 +1441,9 @@ SwitchCase* SwitchCase::ReadFrom(Reader* reader) { |
ContinueSwitchStatement* ContinueSwitchStatement::ReadFrom(Reader* reader) { |
TRACE_READ_OFFSET(); |
ContinueSwitchStatement* stmt = new ContinueSwitchStatement(); |
- stmt->target_ = reader->helper()->switch_cases().Lookup(reader->ReadUInt()); |
+ stmt->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte. |
+ stmt->target_index_ = reader->ReadUInt(); |
+ |
return stmt; |
} |
@@ -1253,9 +1451,15 @@ ContinueSwitchStatement* ContinueSwitchStatement::ReadFrom(Reader* reader) { |
IfStatement* IfStatement::ReadFrom(Reader* reader) { |
TRACE_READ_OFFSET(); |
IfStatement* ifstmt = new IfStatement(); |
+ ifstmt->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte. |
ifstmt->condition_ = Expression::ReadFrom(reader); |
ifstmt->then_ = Statement::ReadFrom(reader); |
ifstmt->otherwise_ = Statement::ReadFrom(reader); |
+ |
+ ifstmt->cannot_stream_ = ifstmt->condition_->cannot_stream() || |
+ ifstmt->then_->cannot_stream() || |
+ ifstmt->otherwise_->cannot_stream(); |
+ |
return ifstmt; |
} |
@@ -1263,8 +1467,13 @@ IfStatement* IfStatement::ReadFrom(Reader* reader) { |
ReturnStatement* ReturnStatement::ReadFrom(Reader* reader) { |
TRACE_READ_OFFSET(); |
ReturnStatement* ret = new ReturnStatement(); |
+ ret->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte. |
ret->position_ = reader->ReadPosition(); |
ret->expression_ = reader->ReadOptional<Expression>(); |
+ |
+ ret->cannot_stream_ = |
+ (ret->expression_ != NULL && ret->expression_->cannot_stream()); |
+ |
return ret; |
} |
@@ -1274,10 +1483,15 @@ TryCatch* TryCatch::ReadFrom(Reader* reader) { |
PositionScope scope(reader); |
TryCatch* tc = new TryCatch(); |
+ tc->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte. |
tc->body_ = Statement::ReadFrom(reader); |
+ reader->ReadBool(); // whether any catch needs a stacktrace. |
tc->catches_.ReadFromStatic<Catch>(reader); |
tc->position_ = reader->min_position(); |
+ tc->cannot_stream_ = |
+ tc->body_->cannot_stream() || tc->catches_.cannot_stream(); |
+ |
return tc; |
} |
@@ -1298,6 +1512,8 @@ Catch* Catch::ReadFrom(Reader* reader) { |
c->end_position_ = reader->max_position(); |
c->position_ = reader->min_position(); |
+ c->cannot_stream_ = c->body_->cannot_stream(); |
+ |
return c; |
} |
@@ -1305,8 +1521,13 @@ Catch* Catch::ReadFrom(Reader* reader) { |
TryFinally* TryFinally::ReadFrom(Reader* reader) { |
TRACE_READ_OFFSET(); |
TryFinally* tf = new TryFinally(); |
+ tf->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte. |
tf->body_ = Statement::ReadFrom(reader); |
tf->finalizer_ = Statement::ReadFrom(reader); |
+ |
+ tf->cannot_stream_ = |
+ tf->body_->cannot_stream() || tf->finalizer_->cannot_stream(); |
+ |
return tf; |
} |
@@ -1314,10 +1535,14 @@ TryFinally* TryFinally::ReadFrom(Reader* reader) { |
YieldStatement* YieldStatement::ReadFrom(Reader* reader) { |
TRACE_READ_OFFSET(); |
YieldStatement* stmt = new YieldStatement(); |
+ stmt->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte. |
stmt->position_ = reader->ReadPosition(); |
reader->record_yield_token_position(stmt->position_); |
stmt->flags_ = reader->ReadByte(); |
stmt->expression_ = Expression::ReadFrom(reader); |
+ |
+ stmt->cannot_stream_ = stmt->expression_->cannot_stream(); |
+ |
return stmt; |
} |
@@ -1352,6 +1577,9 @@ VariableDeclaration* VariableDeclaration::ReadFromImpl(Reader* reader, |
decl->end_position_ = position; |
reader->helper()->variables().Push(decl); |
+ decl->cannot_stream_ = |
+ decl->initializer_ != NULL && decl->initializer_->cannot_stream(); |
+ |
return decl; |
} |
@@ -1364,6 +1592,10 @@ FunctionDeclaration* FunctionDeclaration::ReadFrom(Reader* reader) { |
decl->variable_ = VariableDeclaration::ReadFromImpl(reader, false); |
VariableScope<ReaderHelper> parameters(reader->helper()); |
decl->function_ = FunctionNode::ReadFrom(reader); |
+ |
+ decl->cannot_stream_ = decl->variable_->cannot_stream() || |
+ decl->function_->cannot_stream() || true; |
+ |
return decl; |
} |
@@ -1464,8 +1696,12 @@ FunctionType* FunctionType::ReadFrom(Reader* reader) { |
TypeParameterScope<ReaderHelper> scope(reader->helper()); |
type->type_parameters().ReadFrom(reader); |
type->required_parameter_count_ = reader->ReadUInt(); |
+ intptr_t total_parameter_count = reader->ReadUInt(); |
type->positional_parameters().ReadFromStatic<DartType>(reader); |
type->named_parameters().ReadFromStatic<NamedParameter>(reader); |
+ ASSERT(type->positional_parameters().length() + |
+ type->named_parameters().length() == |
+ total_parameter_count); |
type->return_type_ = DartType::ReadFrom(reader); |
return type; |
} |
@@ -1487,6 +1723,7 @@ TypeParameterType* TypeParameterType::ReadFrom(Reader* reader) { |
TypeParameterType* type = new TypeParameterType(); |
type->parameter_ = |
reader->helper()->type_parameters().Lookup(reader->ReadUInt()); |
+ reader->ReadUInt(); // binary offset of parameter |
return type; |
} |
@@ -1550,6 +1787,8 @@ Program* Program::ReadFrom(Reader* reader) { |
program->main_method_reference_ = |
Reference::ReadMemberFrom(reader, /*allow_null=*/true); |
+ program->cannot_stream_ = true; |
+ |
return program; |
} |
@@ -1577,12 +1816,19 @@ FunctionNode* FunctionNode::ReadFrom(Reader* reader) { |
reader->helper()); |
VariableScope<ReaderHelper> vars(reader->helper()); |
function->body_ = reader->ReadOptional<Statement>(); |
+ |
+ function->cannot_stream_ = |
+ function->positional_parameters_.cannot_stream() || |
+ function->named_parameters_.cannot_stream() || |
+ (function->body_ != NULL && function->body_->cannot_stream()); |
+ |
return function; |
} |
TypeParameter* TypeParameter::ReadFrom(Reader* reader) { |
TRACE_READ_OFFSET(); |
+ kernel_offset_ = reader->offset(); |
name_index_ = reader->ReadUInt(); |
bound_ = DartType::ReadFrom(reader); |
return this; |