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

Side by Side Diff: src/asmjs/asm-wasm-builder.cc

Issue 2693993002: [asm-wasm] Fix continue target of do-while loops (Closed)
Patch Set: Fix comment Created 3 years, 10 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 unified diff | Download patch
« no previous file with comments | « no previous file | test/mjsunit/wasm/asm-wasm.js » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2015 the V8 project authors. All rights reserved. 1 // Copyright 2015 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "src/v8.h" 5 #include "src/v8.h"
6 6
7 // Required to get M_E etc. in MSVC. 7 // Required to get M_E etc. in MSVC.
8 #if defined(_WIN32) 8 #if defined(_WIN32)
9 #define _USE_MATH_DEFINES 9 #define _USE_MATH_DEFINES
10 #endif 10 #endif
(...skipping 18 matching lines...) Expand all
29 namespace internal { 29 namespace internal {
30 namespace wasm { 30 namespace wasm {
31 31
32 #define RECURSE(call) \ 32 #define RECURSE(call) \
33 do { \ 33 do { \
34 DCHECK(!HasStackOverflow()); \ 34 DCHECK(!HasStackOverflow()); \
35 call; \ 35 call; \
36 if (HasStackOverflow()) return; \ 36 if (HasStackOverflow()) return; \
37 } while (false) 37 } while (false)
38 38
39 namespace {
40
39 enum AsmScope { kModuleScope, kInitScope, kFuncScope, kExportScope }; 41 enum AsmScope { kModuleScope, kInitScope, kFuncScope, kExportScope };
40 enum ValueFate { kDrop, kLeaveOnStack }; 42 enum ValueFate { kDrop, kLeaveOnStack };
41 43
42 struct ForeignVariable { 44 struct ForeignVariable {
43 Handle<Name> name; 45 Handle<Name> name;
44 Variable* var; 46 Variable* var;
45 ValueType type; 47 ValueType type;
46 }; 48 };
47 49
50 enum TargetType : uint8_t { NoTarget, BreakTarget, ContinueTarget };
51
52 } // namespace
53
48 class AsmWasmBuilderImpl final : public AstVisitor<AsmWasmBuilderImpl> { 54 class AsmWasmBuilderImpl final : public AstVisitor<AsmWasmBuilderImpl> {
49 public: 55 public:
50 AsmWasmBuilderImpl(Isolate* isolate, Zone* zone, CompilationInfo* info, 56 AsmWasmBuilderImpl(Isolate* isolate, Zone* zone, CompilationInfo* info,
51 AstValueFactory* ast_value_factory, Handle<Script> script, 57 AstValueFactory* ast_value_factory, Handle<Script> script,
52 FunctionLiteral* literal, AsmTyper* typer) 58 FunctionLiteral* literal, AsmTyper* typer)
53 : local_variables_(ZoneHashMap::kDefaultHashMapCapacity, 59 : local_variables_(ZoneHashMap::kDefaultHashMapCapacity,
54 ZoneAllocationPolicy(zone)), 60 ZoneAllocationPolicy(zone)),
55 functions_(ZoneHashMap::kDefaultHashMapCapacity, 61 functions_(ZoneHashMap::kDefaultHashMapCapacity,
56 ZoneAllocationPolicy(zone)), 62 ZoneAllocationPolicy(zone)),
57 global_variables_(ZoneHashMap::kDefaultHashMapCapacity, 63 global_variables_(ZoneHashMap::kDefaultHashMapCapacity,
(...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after
224 ExpressionStatement* expr = 230 ExpressionStatement* expr =
225 stmt->statements()->at(0)->AsExpressionStatement(); 231 stmt->statements()->at(0)->AsExpressionStatement();
226 if (expr != nullptr) { 232 if (expr != nullptr) {
227 if (expr->expression()->IsAssignment()) { 233 if (expr->expression()->IsAssignment()) {
228 RECURSE(VisitExpressionStatement(expr)); 234 RECURSE(VisitExpressionStatement(expr));
229 return; 235 return;
230 } 236 }
231 } 237 }
232 } 238 }
233 if (scope_ == kFuncScope) { 239 if (scope_ == kFuncScope) {
234 BlockVisitor visitor(this, stmt->AsBreakableStatement(), kExprBlock); 240 BlockVisitor visitor(this, stmt->AsBreakableStatement(), kExprBlock,
241 BreakTarget);
235 RECURSE(VisitStatements(stmt->statements())); 242 RECURSE(VisitStatements(stmt->statements()));
236 } else { 243 } else {
237 RECURSE(VisitStatements(stmt->statements())); 244 RECURSE(VisitStatements(stmt->statements()));
238 } 245 }
239 } 246 }
240 247
241 class BlockVisitor { 248 class BlockVisitor {
242 private: 249 private:
243 AsmWasmBuilderImpl* builder_; 250 AsmWasmBuilderImpl* builder_;
244 251
245 public: 252 public:
246 BlockVisitor(AsmWasmBuilderImpl* builder, BreakableStatement* stmt, 253 BlockVisitor(AsmWasmBuilderImpl* builder, BreakableStatement* stmt,
247 WasmOpcode opcode) 254 WasmOpcode opcode, TargetType target_type = NoTarget)
248 : builder_(builder) { 255 : builder_(builder) {
249 builder_->breakable_blocks_.push_back( 256 builder_->breakable_blocks_.emplace_back(stmt, target_type);
250 std::make_pair(stmt, opcode == kExprLoop));
251 // block and loops have a type immediate. 257 // block and loops have a type immediate.
252 builder_->current_function_builder_->EmitWithU8(opcode, kLocalVoid); 258 builder_->current_function_builder_->EmitWithU8(opcode, kLocalVoid);
253 } 259 }
254 ~BlockVisitor() { 260 ~BlockVisitor() {
255 builder_->current_function_builder_->Emit(kExprEnd); 261 builder_->current_function_builder_->Emit(kExprEnd);
256 builder_->breakable_blocks_.pop_back(); 262 builder_->breakable_blocks_.pop_back();
257 } 263 }
258 }; 264 };
259 265
260 void VisitExpressionStatement(ExpressionStatement* stmt) { 266 void VisitExpressionStatement(ExpressionStatement* stmt) {
(...skipping 27 matching lines...) Expand all
288 294
289 void VisitEmptyStatement(EmptyStatement* stmt) {} 295 void VisitEmptyStatement(EmptyStatement* stmt) {}
290 296
291 void VisitEmptyParentheses(EmptyParentheses* paren) { UNREACHABLE(); } 297 void VisitEmptyParentheses(EmptyParentheses* paren) { UNREACHABLE(); }
292 298
293 void VisitGetIterator(GetIterator* expr) { UNREACHABLE(); } 299 void VisitGetIterator(GetIterator* expr) { UNREACHABLE(); }
294 300
295 void VisitIfStatement(IfStatement* stmt) { 301 void VisitIfStatement(IfStatement* stmt) {
296 DCHECK_EQ(kFuncScope, scope_); 302 DCHECK_EQ(kFuncScope, scope_);
297 RECURSE(Visit(stmt->condition())); 303 RECURSE(Visit(stmt->condition()));
298 current_function_builder_->EmitWithU8(kExprIf, kLocalVoid); 304 // Wasm ifs come with implicit blocks for both arms.
299 // WASM ifs come with implement blocks for both arms. 305 BlockVisitor block(this, nullptr, kExprIf);
300 breakable_blocks_.push_back(std::make_pair(nullptr, false));
301 if (stmt->HasThenStatement()) { 306 if (stmt->HasThenStatement()) {
302 RECURSE(Visit(stmt->then_statement())); 307 RECURSE(Visit(stmt->then_statement()));
303 } 308 }
304 if (stmt->HasElseStatement()) { 309 if (stmt->HasElseStatement()) {
305 current_function_builder_->Emit(kExprElse); 310 current_function_builder_->Emit(kExprElse);
306 RECURSE(Visit(stmt->else_statement())); 311 RECURSE(Visit(stmt->else_statement()));
307 } 312 }
308 current_function_builder_->Emit(kExprEnd);
309 breakable_blocks_.pop_back();
310 } 313 }
311 314
312 void DoBreakOrContinue(BreakableStatement* target, bool is_continue) { 315 void DoBreakOrContinue(BreakableStatement* target, TargetType type) {
313 DCHECK_EQ(kFuncScope, scope_); 316 DCHECK_EQ(kFuncScope, scope_);
314 for (int i = static_cast<int>(breakable_blocks_.size()) - 1; i >= 0; --i) { 317 for (int i = static_cast<int>(breakable_blocks_.size()) - 1; i >= 0; --i) {
315 auto elem = breakable_blocks_.at(i); 318 auto elem = breakable_blocks_.at(i);
316 if (elem.first == target && elem.second == is_continue) { 319 if (elem.first == target && elem.second == type) {
317 int block_distance = static_cast<int>(breakable_blocks_.size() - i - 1); 320 int block_distance = static_cast<int>(breakable_blocks_.size() - i - 1);
318 current_function_builder_->Emit(kExprBr); 321 current_function_builder_->EmitWithVarInt(kExprBr, block_distance);
319 current_function_builder_->EmitVarInt(block_distance);
320 return; 322 return;
321 } 323 }
322 } 324 }
323 UNREACHABLE(); // statement not found 325 UNREACHABLE(); // statement not found
324 } 326 }
325 327
326 void VisitContinueStatement(ContinueStatement* stmt) { 328 void VisitContinueStatement(ContinueStatement* stmt) {
327 DoBreakOrContinue(stmt->target(), true); 329 DoBreakOrContinue(stmt->target(), ContinueTarget);
328 } 330 }
329 331
330 void VisitBreakStatement(BreakStatement* stmt) { 332 void VisitBreakStatement(BreakStatement* stmt) {
331 DoBreakOrContinue(stmt->target(), false); 333 DoBreakOrContinue(stmt->target(), BreakTarget);
332 } 334 }
333 335
334 void VisitReturnStatement(ReturnStatement* stmt) { 336 void VisitReturnStatement(ReturnStatement* stmt) {
335 if (scope_ == kModuleScope) { 337 if (scope_ == kModuleScope) {
336 if (typer_finished_) { 338 if (typer_finished_) {
337 typer_->FailWithMessage("Module has multiple returns."); 339 typer_->FailWithMessage("Module has multiple returns.");
338 typer_failed_ = true; 340 typer_failed_ = true;
339 return; 341 return;
340 } 342 }
341 if (!typer_->ValidateAfterFunctionsPhase()) { 343 if (!typer_->ValidateAfterFunctionsPhase()) {
(...skipping 17 matching lines...) Expand all
359 void HandleCase(CaseNode* node, 361 void HandleCase(CaseNode* node,
360 ZoneMap<int, unsigned int>& case_to_block, 362 ZoneMap<int, unsigned int>& case_to_block,
361 VariableProxy* tag, int default_block, int if_depth) { 363 VariableProxy* tag, int default_block, int if_depth) {
362 int prev_if_depth = if_depth; 364 int prev_if_depth = if_depth;
363 if (node->left != nullptr) { 365 if (node->left != nullptr) {
364 VisitVariableProxy(tag); 366 VisitVariableProxy(tag);
365 current_function_builder_->EmitI32Const(node->begin); 367 current_function_builder_->EmitI32Const(node->begin);
366 current_function_builder_->Emit(kExprI32LtS); 368 current_function_builder_->Emit(kExprI32LtS);
367 current_function_builder_->EmitWithU8(kExprIf, kLocalVoid); 369 current_function_builder_->EmitWithU8(kExprIf, kLocalVoid);
368 if_depth++; 370 if_depth++;
369 breakable_blocks_.push_back(std::make_pair(nullptr, false)); 371 breakable_blocks_.emplace_back(nullptr, NoTarget);
370 HandleCase(node->left, case_to_block, tag, default_block, if_depth); 372 HandleCase(node->left, case_to_block, tag, default_block, if_depth);
371 current_function_builder_->Emit(kExprElse); 373 current_function_builder_->Emit(kExprElse);
372 } 374 }
373 if (node->right != nullptr) { 375 if (node->right != nullptr) {
374 VisitVariableProxy(tag); 376 VisitVariableProxy(tag);
375 current_function_builder_->EmitI32Const(node->end); 377 current_function_builder_->EmitI32Const(node->end);
376 current_function_builder_->Emit(kExprI32GtS); 378 current_function_builder_->Emit(kExprI32GtS);
377 current_function_builder_->EmitWithU8(kExprIf, kLocalVoid); 379 current_function_builder_->EmitWithU8(kExprIf, kLocalVoid);
378 if_depth++; 380 if_depth++;
379 breakable_blocks_.push_back(std::make_pair(nullptr, false)); 381 breakable_blocks_.emplace_back(nullptr, NoTarget);
380 HandleCase(node->right, case_to_block, tag, default_block, if_depth); 382 HandleCase(node->right, case_to_block, tag, default_block, if_depth);
381 current_function_builder_->Emit(kExprElse); 383 current_function_builder_->Emit(kExprElse);
382 } 384 }
383 if (node->begin == node->end) { 385 if (node->begin == node->end) {
384 VisitVariableProxy(tag); 386 VisitVariableProxy(tag);
385 current_function_builder_->EmitI32Const(node->begin); 387 current_function_builder_->EmitI32Const(node->begin);
386 current_function_builder_->Emit(kExprI32Eq); 388 current_function_builder_->Emit(kExprI32Eq);
387 current_function_builder_->EmitWithU8(kExprIf, kLocalVoid); 389 current_function_builder_->EmitWithU8(kExprIf, kLocalVoid);
388 DCHECK(case_to_block.find(node->begin) != case_to_block.end()); 390 DCHECK(case_to_block.find(node->begin) != case_to_block.end());
389 current_function_builder_->Emit(kExprBr); 391 current_function_builder_->Emit(kExprBr);
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
423 } 425 }
424 426
425 void VisitSwitchStatement(SwitchStatement* stmt) { 427 void VisitSwitchStatement(SwitchStatement* stmt) {
426 VariableProxy* tag = stmt->tag()->AsVariableProxy(); 428 VariableProxy* tag = stmt->tag()->AsVariableProxy();
427 DCHECK_NOT_NULL(tag); 429 DCHECK_NOT_NULL(tag);
428 ZoneList<CaseClause*>* clauses = stmt->cases(); 430 ZoneList<CaseClause*>* clauses = stmt->cases();
429 int case_count = clauses->length(); 431 int case_count = clauses->length();
430 if (case_count == 0) { 432 if (case_count == 0) {
431 return; 433 return;
432 } 434 }
433 BlockVisitor visitor(this, stmt->AsBreakableStatement(), kExprBlock); 435 BlockVisitor visitor(this, stmt->AsBreakableStatement(), kExprBlock,
436 BreakTarget);
434 ZoneVector<BlockVisitor*> blocks(zone_); 437 ZoneVector<BlockVisitor*> blocks(zone_);
435 ZoneVector<int32_t> cases(zone_); 438 ZoneVector<int32_t> cases(zone_);
436 ZoneMap<int, unsigned int> case_to_block(zone_); 439 ZoneMap<int, unsigned int> case_to_block(zone_);
437 bool has_default = false; 440 bool has_default = false;
438 for (int i = case_count - 1; i >= 0; --i) { 441 for (int i = case_count - 1; i >= 0; --i) {
439 CaseClause* clause = clauses->at(i); 442 CaseClause* clause = clauses->at(i);
440 blocks.push_back(new BlockVisitor(this, nullptr, kExprBlock)); 443 blocks.push_back(new BlockVisitor(this, nullptr, kExprBlock));
441 if (!clause->is_default()) { 444 if (!clause->is_default()) {
442 Literal* label = clause->label()->AsLiteral(); 445 Literal* label = clause->label()->AsLiteral();
443 Handle<Object> value = label->value(); 446 Handle<Object> value = label->value();
(...skipping 25 matching lines...) Expand all
469 BlockVisitor* v = blocks.at(case_count - i - 1); 472 BlockVisitor* v = blocks.at(case_count - i - 1);
470 blocks.pop_back(); 473 blocks.pop_back();
471 delete v; 474 delete v;
472 } 475 }
473 } 476 }
474 477
475 void VisitCaseClause(CaseClause* clause) { UNREACHABLE(); } 478 void VisitCaseClause(CaseClause* clause) { UNREACHABLE(); }
476 479
477 void VisitDoWhileStatement(DoWhileStatement* stmt) { 480 void VisitDoWhileStatement(DoWhileStatement* stmt) {
478 DCHECK_EQ(kFuncScope, scope_); 481 DCHECK_EQ(kFuncScope, scope_);
479 BlockVisitor block(this, stmt->AsBreakableStatement(), kExprBlock); 482 BlockVisitor block(this, stmt->AsBreakableStatement(), kExprBlock,
483 BreakTarget);
480 BlockVisitor loop(this, stmt->AsBreakableStatement(), kExprLoop); 484 BlockVisitor loop(this, stmt->AsBreakableStatement(), kExprLoop);
481 RECURSE(Visit(stmt->body())); 485 {
486 BlockVisitor inner_block(this, stmt->AsBreakableStatement(), kExprBlock,
487 ContinueTarget);
488 RECURSE(Visit(stmt->body()));
489 }
482 RECURSE(Visit(stmt->cond())); 490 RECURSE(Visit(stmt->cond()));
483 current_function_builder_->EmitWithU8(kExprIf, kLocalVoid); 491 current_function_builder_->EmitWithU8(kExprBrIf, 0);
484 current_function_builder_->EmitWithU8(kExprBr, 1);
485 current_function_builder_->Emit(kExprEnd);
486 } 492 }
487 493
488 void VisitWhileStatement(WhileStatement* stmt) { 494 void VisitWhileStatement(WhileStatement* stmt) {
489 DCHECK_EQ(kFuncScope, scope_); 495 DCHECK_EQ(kFuncScope, scope_);
490 BlockVisitor block(this, stmt->AsBreakableStatement(), kExprBlock); 496 BlockVisitor block(this, stmt->AsBreakableStatement(), kExprBlock,
491 BlockVisitor loop(this, stmt->AsBreakableStatement(), kExprLoop); 497 BreakTarget);
498 BlockVisitor loop(this, stmt->AsBreakableStatement(), kExprLoop,
499 ContinueTarget);
492 RECURSE(Visit(stmt->cond())); 500 RECURSE(Visit(stmt->cond()));
493 breakable_blocks_.push_back(std::make_pair(nullptr, false)); 501 BlockVisitor if_block(this, nullptr, kExprIf);
494 current_function_builder_->EmitWithU8(kExprIf, kLocalVoid);
495 RECURSE(Visit(stmt->body())); 502 RECURSE(Visit(stmt->body()));
496 current_function_builder_->EmitWithU8(kExprBr, 1); 503 current_function_builder_->EmitWithU8(kExprBr, 1);
497 current_function_builder_->Emit(kExprEnd);
498 breakable_blocks_.pop_back();
499 } 504 }
500 505
501 void VisitForStatement(ForStatement* stmt) { 506 void VisitForStatement(ForStatement* stmt) {
502 DCHECK_EQ(kFuncScope, scope_); 507 DCHECK_EQ(kFuncScope, scope_);
503 if (stmt->init() != nullptr) { 508 if (stmt->init() != nullptr) {
504 RECURSE(Visit(stmt->init())); 509 RECURSE(Visit(stmt->init()));
505 } 510 }
506 BlockVisitor block(this, stmt->AsBreakableStatement(), kExprBlock); 511 BlockVisitor block(this, stmt->AsBreakableStatement(), kExprBlock,
507 BlockVisitor loop(this, stmt->AsBreakableStatement(), kExprLoop); 512 BreakTarget);
513 BlockVisitor loop(this, stmt->AsBreakableStatement(), kExprLoop,
514 ContinueTarget);
508 if (stmt->cond() != nullptr) { 515 if (stmt->cond() != nullptr) {
509 RECURSE(Visit(stmt->cond())); 516 RECURSE(Visit(stmt->cond()));
510 current_function_builder_->Emit(kExprI32Eqz); 517 current_function_builder_->Emit(kExprI32Eqz);
511 current_function_builder_->EmitWithU8(kExprIf, kLocalVoid); 518 current_function_builder_->EmitWithU8(kExprIf, kLocalVoid);
512 current_function_builder_->EmitWithU8(kExprBr, 2); 519 current_function_builder_->EmitWithU8(kExprBr, 2);
513 current_function_builder_->Emit(kExprEnd); 520 current_function_builder_->Emit(kExprEnd);
514 } 521 }
515 if (stmt->body() != nullptr) { 522 if (stmt->body() != nullptr) {
516 RECURSE(Visit(stmt->body())); 523 RECURSE(Visit(stmt->body()));
517 } 524 }
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
555 } 562 }
556 } 563 }
557 564
558 void VisitNativeFunctionLiteral(NativeFunctionLiteral* expr) { 565 void VisitNativeFunctionLiteral(NativeFunctionLiteral* expr) {
559 UNREACHABLE(); 566 UNREACHABLE();
560 } 567 }
561 568
562 void VisitConditional(Conditional* expr) { 569 void VisitConditional(Conditional* expr) {
563 DCHECK_EQ(kFuncScope, scope_); 570 DCHECK_EQ(kFuncScope, scope_);
564 RECURSE(Visit(expr->condition())); 571 RECURSE(Visit(expr->condition()));
565 // WASM ifs come with implicit blocks for both arms. 572 // Wasm ifs come with implicit blocks for both arms.
566 breakable_blocks_.push_back(std::make_pair(nullptr, false)); 573 breakable_blocks_.emplace_back(nullptr, NoTarget);
567 ValueTypeCode type; 574 ValueTypeCode type;
568 switch (TypeOf(expr)) { 575 switch (TypeOf(expr)) {
569 case kWasmI32: 576 case kWasmI32:
570 type = kLocalI32; 577 type = kLocalI32;
571 break; 578 break;
572 case kWasmI64: 579 case kWasmI64:
573 type = kLocalI64; 580 type = kLocalI64;
574 break; 581 break;
575 case kWasmF32: 582 case kWasmF32:
576 type = kLocalF32; 583 type = kLocalF32;
(...skipping 1385 matching lines...) Expand 10 before | Expand all | Expand 10 after
1962 WasmFunctionBuilder* current_function_builder_; 1969 WasmFunctionBuilder* current_function_builder_;
1963 FunctionLiteral* literal_; 1970 FunctionLiteral* literal_;
1964 Isolate* isolate_; 1971 Isolate* isolate_;
1965 Zone* zone_; 1972 Zone* zone_;
1966 CompilationInfo* info_; 1973 CompilationInfo* info_;
1967 AstValueFactory* ast_value_factory_; 1974 AstValueFactory* ast_value_factory_;
1968 Handle<Script> script_; 1975 Handle<Script> script_;
1969 AsmTyper* typer_; 1976 AsmTyper* typer_;
1970 bool typer_failed_; 1977 bool typer_failed_;
1971 bool typer_finished_; 1978 bool typer_finished_;
1972 ZoneVector<std::pair<BreakableStatement*, bool>> breakable_blocks_; 1979 ZoneVector<std::pair<BreakableStatement*, TargetType>> breakable_blocks_;
1973 ZoneVector<ForeignVariable> foreign_variables_; 1980 ZoneVector<ForeignVariable> foreign_variables_;
1974 WasmFunctionBuilder* init_function_; 1981 WasmFunctionBuilder* init_function_;
1975 WasmFunctionBuilder* foreign_init_function_; 1982 WasmFunctionBuilder* foreign_init_function_;
1976 uint32_t next_table_index_; 1983 uint32_t next_table_index_;
1977 ZoneHashMap function_tables_; 1984 ZoneHashMap function_tables_;
1978 ImportedFunctionTable imported_function_table_; 1985 ImportedFunctionTable imported_function_table_;
1979 // Remember the parent node for reporting the correct location for ToNumber 1986 // Remember the parent node for reporting the correct location for ToNumber
1980 // conversions after calls. 1987 // conversions after calls.
1981 BinaryOperation* parent_binop_; 1988 BinaryOperation* parent_binop_;
1982 1989
(...skipping 25 matching lines...) Expand all
2008 impl.builder_->WriteAsmJsOffsetTable(*asm_offsets_buffer); 2015 impl.builder_->WriteAsmJsOffsetTable(*asm_offsets_buffer);
2009 return {module_buffer, asm_offsets_buffer, success}; 2016 return {module_buffer, asm_offsets_buffer, success};
2010 } 2017 }
2011 2018
2012 const char* AsmWasmBuilder::foreign_init_name = "__foreign_init__"; 2019 const char* AsmWasmBuilder::foreign_init_name = "__foreign_init__";
2013 const char* AsmWasmBuilder::single_function_name = "__single_function__"; 2020 const char* AsmWasmBuilder::single_function_name = "__single_function__";
2014 2021
2015 } // namespace wasm 2022 } // namespace wasm
2016 } // namespace internal 2023 } // namespace internal
2017 } // namespace v8 2024 } // namespace v8
OLDNEW
« no previous file with comments | « no previous file | test/mjsunit/wasm/asm-wasm.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698