OLD | NEW |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |