Index: src/wasm/asm-wasm-builder.cc |
diff --git a/src/wasm/asm-wasm-builder.cc b/src/wasm/asm-wasm-builder.cc |
index e3c666bf7add8996a9848505da1358d3bfc11e50..7c98d4d1189d62aea0dd8accaf209794504a70ce 100644 |
--- a/src/wasm/asm-wasm-builder.cc |
+++ b/src/wasm/asm-wasm-builder.cc |
@@ -185,10 +185,7 @@ class AsmWasmBuilderImpl : public AstVisitor { |
} |
} |
- void VisitWithStatement(WithStatement* stmt) { |
- RECURSE(stmt->expression()); |
- RECURSE(stmt->statement()); |
- } |
+ void VisitWithStatement(WithStatement* stmt) { UNREACHABLE(); } |
void VisitSwitchStatement(SwitchStatement* stmt) { |
RECURSE(Visit(stmt->tag())); |
@@ -209,8 +206,23 @@ class AsmWasmBuilderImpl : public AstVisitor { |
void VisitCaseClause(CaseClause* clause) { UNREACHABLE(); } |
void VisitDoWhileStatement(DoWhileStatement* stmt) { |
+ DCHECK(in_function_); |
+ current_function_builder_->Emit(kExprLoop); |
+ uint32_t index = current_function_builder_->EmitEditableImmediate(0); |
+ int prev_block_size = block_size_; |
+ block_size_ = 0; |
+ breakable_blocks_.push_back( |
+ std::make_pair(stmt->AsBreakableStatement(), true)); |
+ block_size_++; |
RECURSE(Visit(stmt->body())); |
+ block_size_++; |
+ current_function_builder_->Emit(kExprIf); |
RECURSE(Visit(stmt->cond())); |
+ current_function_builder_->EmitWithU8(kExprBr, 0); |
+ current_function_builder_->Emit(kExprNop); |
+ current_function_builder_->EditImmediate(index, block_size_); |
+ block_size_ = prev_block_size; |
+ breakable_blocks_.pop_back(); |
} |
void VisitWhileStatement(WhileStatement* stmt) { |
@@ -261,27 +273,15 @@ class AsmWasmBuilderImpl : public AstVisitor { |
breakable_blocks_.pop_back(); |
} |
- void VisitForInStatement(ForInStatement* stmt) { |
- RECURSE(Visit(stmt->enumerable())); |
- RECURSE(Visit(stmt->body())); |
- } |
+ void VisitForInStatement(ForInStatement* stmt) { UNREACHABLE(); } |
- void VisitForOfStatement(ForOfStatement* stmt) { |
- RECURSE(Visit(stmt->iterable())); |
- RECURSE(Visit(stmt->body())); |
- } |
+ void VisitForOfStatement(ForOfStatement* stmt) { UNREACHABLE(); } |
- void VisitTryCatchStatement(TryCatchStatement* stmt) { |
- RECURSE(Visit(stmt->try_block())); |
- RECURSE(Visit(stmt->catch_block())); |
- } |
+ void VisitTryCatchStatement(TryCatchStatement* stmt) { UNREACHABLE(); } |
- void VisitTryFinallyStatement(TryFinallyStatement* stmt) { |
- RECURSE(Visit(stmt->try_block())); |
- RECURSE(Visit(stmt->finally_block())); |
- } |
+ void VisitTryFinallyStatement(TryFinallyStatement* stmt) { UNREACHABLE(); } |
- void VisitDebuggerStatement(DebuggerStatement* stmt) {} |
+ void VisitDebuggerStatement(DebuggerStatement* stmt) { UNREACHABLE(); } |
void VisitFunctionLiteral(FunctionLiteral* expr) { |
Scope* scope = expr->scope(); |
@@ -303,9 +303,13 @@ class AsmWasmBuilderImpl : public AstVisitor { |
RECURSE(VisitStatements(expr->body())); |
} |
- void VisitNativeFunctionLiteral(NativeFunctionLiteral* expr) {} |
+ void VisitNativeFunctionLiteral(NativeFunctionLiteral* expr) { |
+ UNREACHABLE(); |
+ } |
void VisitConditional(Conditional* expr) { |
+ DCHECK(in_function_); |
+ current_function_builder_->Emit(kExprIfElse); |
RECURSE(Visit(expr->condition())); |
RECURSE(Visit(expr->then_expression())); |
RECURSE(Visit(expr->else_expression())); |
@@ -382,7 +386,7 @@ class AsmWasmBuilderImpl : public AstVisitor { |
} |
} |
- void VisitRegExpLiteral(RegExpLiteral* expr) {} |
+ void VisitRegExpLiteral(RegExpLiteral* expr) { UNREACHABLE(); } |
void VisitObjectLiteral(ObjectLiteral* expr) { |
ZoneList<ObjectLiteralProperty*>* props = expr->properties(); |
@@ -392,13 +396,7 @@ class AsmWasmBuilderImpl : public AstVisitor { |
} |
} |
- void VisitArrayLiteral(ArrayLiteral* expr) { |
- ZoneList<Expression*>* values = expr->values(); |
- for (int i = 0; i < values->length(); ++i) { |
- Expression* value = values->at(i); |
- RECURSE(Visit(value)); |
- } |
- } |
+ void VisitArrayLiteral(ArrayLiteral* expr) { UNREACHABLE(); } |
void LoadInitFunction() { |
if (!init_function_initialized) { |
@@ -450,12 +448,9 @@ class AsmWasmBuilderImpl : public AstVisitor { |
} |
} |
- void VisitYield(Yield* expr) { |
- RECURSE(Visit(expr->generator_object())); |
- RECURSE(Visit(expr->expression())); |
- } |
+ void VisitYield(Yield* expr) { UNREACHABLE(); } |
- void VisitThrow(Throw* expr) { RECURSE(Visit(expr->exception())); } |
+ void VisitThrow(Throw* expr) { UNREACHABLE(); } |
void VisitProperty(Property* expr) { |
Expression* obj = expr->obj(); |
@@ -560,9 +555,7 @@ class AsmWasmBuilderImpl : public AstVisitor { |
RECURSE(Visit(expr->expression())); |
} |
- void VisitCountOperation(CountOperation* expr) { |
- RECURSE(Visit(expr->expression())); |
- } |
+ void VisitCountOperation(CountOperation* expr) { UNREACHABLE(); } |
bool MatchIntBinaryOperation(BinaryOperation* expr, Token::Value op, |
int32_t val) { |
@@ -865,7 +858,7 @@ class AsmWasmBuilderImpl : public AstVisitor { |
#undef SIGNED |
#undef NON_SIGNED |
- void VisitThisFunction(ThisFunction* expr) {} |
+ void VisitThisFunction(ThisFunction* expr) { UNREACHABLE(); } |
void VisitDeclarations(ZoneList<Declaration*>* decls) { |
for (int i = 0; i < decls->length(); ++i) { |
@@ -874,20 +867,26 @@ class AsmWasmBuilderImpl : public AstVisitor { |
} |
} |
- void VisitClassLiteral(ClassLiteral* expr) {} |
+ void VisitClassLiteral(ClassLiteral* expr) { UNREACHABLE(); } |
- void VisitSpread(Spread* expr) {} |
+ void VisitSpread(Spread* expr) { UNREACHABLE(); } |
- void VisitSuperPropertyReference(SuperPropertyReference* expr) {} |
+ void VisitSuperPropertyReference(SuperPropertyReference* expr) { |
+ UNREACHABLE(); |
+ } |
- void VisitSuperCallReference(SuperCallReference* expr) {} |
+ void VisitSuperCallReference(SuperCallReference* expr) { UNREACHABLE(); } |
- void VisitSloppyBlockFunctionStatement(SloppyBlockFunctionStatement* expr) {} |
+ void VisitSloppyBlockFunctionStatement(SloppyBlockFunctionStatement* expr) { |
+ UNREACHABLE(); |
+ } |
- void VisitDoExpression(DoExpression* expr) {} |
+ void VisitDoExpression(DoExpression* expr) { UNREACHABLE(); } |
void VisitRewritableAssignmentExpression( |
- RewritableAssignmentExpression* expr) {} |
+ RewritableAssignmentExpression* expr) { |
+ UNREACHABLE(); |
+ } |
struct IndexContainer : public ZoneObject { |
uint16_t index; |