Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(93)

Unified Diff: runtime/vm/kernel_binary.cc

Issue 2854393002: [kernel] [partial] Streaming of kernel binary without AST nodes (Closed)
Patch Set: Created 3 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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;

Powered by Google App Engine
This is Rietveld 408576698