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 548 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
559 VariableProxy* expr = prop->value()->AsVariableProxy(); | 559 VariableProxy* expr = prop->value()->AsVariableProxy(); |
560 DCHECK_NOT_NULL(expr); | 560 DCHECK_NOT_NULL(expr); |
561 Variable* var = expr->var(); | 561 Variable* var = expr->var(); |
562 Literal* name = prop->key()->AsLiteral(); | 562 Literal* name = prop->key()->AsLiteral(); |
563 DCHECK_NOT_NULL(name); | 563 DCHECK_NOT_NULL(name); |
564 DCHECK(name->IsPropertyName()); | 564 DCHECK(name->IsPropertyName()); |
565 const AstRawString* raw_name = name->AsRawPropertyName(); | 565 const AstRawString* raw_name = name->AsRawPropertyName(); |
566 if (var->is_function()) { | 566 if (var->is_function()) { |
567 uint16_t index = LookupOrInsertFunction(var); | 567 uint16_t index = LookupOrInsertFunction(var); |
568 builder_->FunctionAt(index)->Exported(1); | 568 builder_->FunctionAt(index)->Exported(1); |
569 builder_->FunctionAt(index) | 569 builder_->FunctionAt(index)->SetName( |
570 ->SetName(raw_name->raw_data(), raw_name->length()); | 570 reinterpret_cast<const char*>(raw_name->raw_data()), |
| 571 raw_name->length()); |
571 } | 572 } |
572 } | 573 } |
573 } | 574 } |
574 | 575 |
575 void VisitArrayLiteral(ArrayLiteral* expr) { UNREACHABLE(); } | 576 void VisitArrayLiteral(ArrayLiteral* expr) { UNREACHABLE(); } |
576 | 577 |
577 void LoadInitFunction() { | 578 void LoadInitFunction() { |
578 current_function_builder_ = builder_->FunctionAt(init_function_index_); | 579 current_function_builder_ = builder_->FunctionAt(init_function_index_); |
579 scope_ = kInitScope; | 580 scope_ = kInitScope; |
580 } | 581 } |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
625 ZoneHashMap::Entry* entry = | 626 ZoneHashMap::Entry* entry = |
626 function_tables_.Lookup(v, ComputePointerHash(v)); | 627 function_tables_.Lookup(v, ComputePointerHash(v)); |
627 DCHECK_NOT_NULL(entry); | 628 DCHECK_NOT_NULL(entry); |
628 return reinterpret_cast<FunctionTableIndices*>(entry->value); | 629 return reinterpret_cast<FunctionTableIndices*>(entry->value); |
629 } | 630 } |
630 | 631 |
631 class ImportedFunctionTable { | 632 class ImportedFunctionTable { |
632 private: | 633 private: |
633 class ImportedFunctionIndices : public ZoneObject { | 634 class ImportedFunctionIndices : public ZoneObject { |
634 public: | 635 public: |
635 const unsigned char* name_; | 636 const char* name_; |
636 int name_length_; | 637 int name_length_; |
637 WasmModuleBuilder::SignatureMap signature_to_index_; | 638 WasmModuleBuilder::SignatureMap signature_to_index_; |
638 | 639 |
639 ImportedFunctionIndices(const unsigned char* name, int name_length, | 640 ImportedFunctionIndices(const char* name, int name_length, Zone* zone) |
640 Zone* zone) | |
641 : name_(name), name_length_(name_length), signature_to_index_(zone) {} | 641 : name_(name), name_length_(name_length), signature_to_index_(zone) {} |
642 }; | 642 }; |
643 ZoneHashMap table_; | 643 ZoneHashMap table_; |
644 AsmWasmBuilderImpl* builder_; | 644 AsmWasmBuilderImpl* builder_; |
645 | 645 |
646 public: | 646 public: |
647 explicit ImportedFunctionTable(AsmWasmBuilderImpl* builder) | 647 explicit ImportedFunctionTable(AsmWasmBuilderImpl* builder) |
648 : table_(HashMap::PointersMatch, ZoneHashMap::kDefaultHashMapCapacity, | 648 : table_(HashMap::PointersMatch, ZoneHashMap::kDefaultHashMapCapacity, |
649 ZoneAllocationPolicy(builder->zone())), | 649 ZoneAllocationPolicy(builder->zone())), |
650 builder_(builder) {} | 650 builder_(builder) {} |
651 | 651 |
652 void AddImport(Variable* v, const unsigned char* name, int name_length) { | 652 void AddImport(Variable* v, const char* name, int name_length) { |
653 ImportedFunctionIndices* indices = new (builder_->zone()) | 653 ImportedFunctionIndices* indices = new (builder_->zone()) |
654 ImportedFunctionIndices(name, name_length, builder_->zone()); | 654 ImportedFunctionIndices(name, name_length, builder_->zone()); |
655 ZoneHashMap::Entry* entry = table_.LookupOrInsert( | 655 ZoneHashMap::Entry* entry = table_.LookupOrInsert( |
656 v, ComputePointerHash(v), ZoneAllocationPolicy(builder_->zone())); | 656 v, ComputePointerHash(v), ZoneAllocationPolicy(builder_->zone())); |
657 entry->value = indices; | 657 entry->value = indices; |
658 } | 658 } |
659 | 659 |
660 uint16_t GetFunctionIndex(Variable* v, FunctionSig* sig) { | 660 uint16_t GetFunctionIndex(Variable* v, FunctionSig* sig) { |
661 ZoneHashMap::Entry* entry = table_.Lookup(v, ComputePointerHash(v)); | 661 ZoneHashMap::Entry* entry = table_.Lookup(v, ComputePointerHash(v)); |
662 DCHECK_NOT_NULL(entry); | 662 DCHECK_NOT_NULL(entry); |
663 ImportedFunctionIndices* indices = | 663 ImportedFunctionIndices* indices = |
664 reinterpret_cast<ImportedFunctionIndices*>(entry->value); | 664 reinterpret_cast<ImportedFunctionIndices*>(entry->value); |
665 WasmModuleBuilder::SignatureMap::iterator pos = | 665 WasmModuleBuilder::SignatureMap::iterator pos = |
666 indices->signature_to_index_.find(sig); | 666 indices->signature_to_index_.find(sig); |
667 if (pos != indices->signature_to_index_.end()) { | 667 if (pos != indices->signature_to_index_.end()) { |
668 return pos->second; | 668 return pos->second; |
669 } else { | 669 } else { |
670 uint16_t index = builder_->builder_->AddFunction(); | 670 uint32_t index = builder_->builder_->AddImport( |
| 671 indices->name_, indices->name_length_, sig); |
671 indices->signature_to_index_[sig] = index; | 672 indices->signature_to_index_[sig] = index; |
672 WasmFunctionBuilder* function = builder_->builder_->FunctionAt(index); | |
673 function->External(1); | |
674 function->SetName(indices->name_, indices->name_length_); | |
675 if (sig->return_count() > 0) { | |
676 function->ReturnType(sig->GetReturn()); | |
677 } | |
678 for (size_t i = 0; i < sig->parameter_count(); i++) { | |
679 function->AddParam(sig->GetParam(i)); | |
680 } | |
681 return index; | 673 return index; |
682 } | 674 } |
683 } | 675 } |
684 }; | 676 }; |
685 | 677 |
686 void EmitAssignmentLhs(Expression* target, MachineType* mtype) { | 678 void EmitAssignmentLhs(Expression* target, MachineType* mtype) { |
687 // Match the left hand side of the assignment. | 679 // Match the left hand side of the assignment. |
688 VariableProxy* target_var = target->AsVariableProxy(); | 680 VariableProxy* target_var = target->AsVariableProxy(); |
689 if (target_var != nullptr) { | 681 if (target_var != nullptr) { |
690 // Left hand side is a local or a global variable, no code on LHS. | 682 // Left hand side is a local or a global variable, no code on LHS. |
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
796 if (scope_ == kModuleScope) { | 788 if (scope_ == kModuleScope) { |
797 Property* prop = expr->value()->AsProperty(); | 789 Property* prop = expr->value()->AsProperty(); |
798 if (prop != nullptr) { | 790 if (prop != nullptr) { |
799 VariableProxy* vp = prop->obj()->AsVariableProxy(); | 791 VariableProxy* vp = prop->obj()->AsVariableProxy(); |
800 if (vp != nullptr && vp->var()->IsParameter() && | 792 if (vp != nullptr && vp->var()->IsParameter() && |
801 vp->var()->index() == 1) { | 793 vp->var()->index() == 1) { |
802 VariableProxy* target = expr->target()->AsVariableProxy(); | 794 VariableProxy* target = expr->target()->AsVariableProxy(); |
803 if (bounds_->get(target).lower->Is(Type::Function())) { | 795 if (bounds_->get(target).lower->Is(Type::Function())) { |
804 const AstRawString* name = | 796 const AstRawString* name = |
805 prop->key()->AsLiteral()->AsRawPropertyName(); | 797 prop->key()->AsLiteral()->AsRawPropertyName(); |
806 imported_function_table_.AddImport(target->var(), name->raw_data(), | 798 imported_function_table_.AddImport( |
807 name->length()); | 799 target->var(), reinterpret_cast<const char*>(name->raw_data()), |
| 800 name->length()); |
808 } | 801 } |
809 } | 802 } |
810 // Property values in module scope don't emit code, so return. | 803 // Property values in module scope don't emit code, so return. |
811 return; | 804 return; |
812 } | 805 } |
813 ArrayLiteral* funcs = expr->value()->AsArrayLiteral(); | 806 ArrayLiteral* funcs = expr->value()->AsArrayLiteral(); |
814 if (funcs != nullptr && | 807 if (funcs != nullptr && |
815 bounds_->get(funcs).lower->AsArray()->Element()->IsFunction()) { | 808 bounds_->get(funcs).lower->AsArray()->Element()->IsFunction()) { |
816 VariableProxy* target = expr->target()->AsVariableProxy(); | 809 VariableProxy* target = expr->target()->AsVariableProxy(); |
817 DCHECK_NOT_NULL(target); | 810 DCHECK_NOT_NULL(target); |
(...skipping 450 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1268 FunctionSig::Builder sig(zone(), return_type == kAstStmt ? 0 : 1, | 1261 FunctionSig::Builder sig(zone(), return_type == kAstStmt ? 0 : 1, |
1269 args->length()); | 1262 args->length()); |
1270 if (return_type != kAstStmt) { | 1263 if (return_type != kAstStmt) { |
1271 sig.AddReturn(return_type); | 1264 sig.AddReturn(return_type); |
1272 } | 1265 } |
1273 for (int i = 0; i < args->length(); i++) { | 1266 for (int i = 0; i < args->length(); i++) { |
1274 sig.AddParam(TypeOf(args->at(i))); | 1267 sig.AddParam(TypeOf(args->at(i))); |
1275 } | 1268 } |
1276 index = | 1269 index = |
1277 imported_function_table_.GetFunctionIndex(vp->var(), sig.Build()); | 1270 imported_function_table_.GetFunctionIndex(vp->var(), sig.Build()); |
| 1271 VisitCallArgs(expr); |
| 1272 current_function_builder_->Emit(kExprCallImport); |
| 1273 current_function_builder_->EmitVarInt(expr->arguments()->length()); |
| 1274 current_function_builder_->EmitVarInt(index); |
1278 } else { | 1275 } else { |
1279 index = LookupOrInsertFunction(vp->var()); | 1276 index = LookupOrInsertFunction(vp->var()); |
| 1277 VisitCallArgs(expr); |
| 1278 current_function_builder_->Emit(kExprCallFunction); |
| 1279 current_function_builder_->EmitVarInt(expr->arguments()->length()); |
| 1280 current_function_builder_->EmitVarInt(index); |
1280 } | 1281 } |
1281 VisitCallArgs(expr); | |
1282 current_function_builder_->Emit(kExprCallFunction); | |
1283 current_function_builder_->EmitVarInt(expr->arguments()->length()); | |
1284 current_function_builder_->EmitVarInt(index); | |
1285 break; | 1282 break; |
1286 } | 1283 } |
1287 case Call::KEYED_PROPERTY_CALL: { | 1284 case Call::KEYED_PROPERTY_CALL: { |
1288 DCHECK_EQ(kFuncScope, scope_); | 1285 DCHECK_EQ(kFuncScope, scope_); |
1289 Property* p = expr->expression()->AsProperty(); | 1286 Property* p = expr->expression()->AsProperty(); |
1290 DCHECK_NOT_NULL(p); | 1287 DCHECK_NOT_NULL(p); |
1291 VariableProxy* var = p->obj()->AsVariableProxy(); | 1288 VariableProxy* var = p->obj()->AsVariableProxy(); |
1292 DCHECK_NOT_NULL(var); | 1289 DCHECK_NOT_NULL(var); |
1293 FunctionTableIndices* indices = LookupFunctionTable(var->var()); | 1290 FunctionTableIndices* indices = LookupFunctionTable(var->var()); |
1294 RECURSE(Visit(p->key())); | 1291 RECURSE(Visit(p->key())); |
(...skipping 450 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1745 // that zone in constructor may be thrown away once wasm module is written. | 1742 // that zone in constructor may be thrown away once wasm module is written. |
1746 WasmModuleIndex* AsmWasmBuilder::Run() { | 1743 WasmModuleIndex* AsmWasmBuilder::Run() { |
1747 AsmWasmBuilderImpl impl(isolate_, zone_, literal_, foreign_, typer_); | 1744 AsmWasmBuilderImpl impl(isolate_, zone_, literal_, foreign_, typer_); |
1748 impl.Compile(); | 1745 impl.Compile(); |
1749 WasmModuleWriter* writer = impl.builder_->Build(zone_); | 1746 WasmModuleWriter* writer = impl.builder_->Build(zone_); |
1750 return writer->WriteTo(zone_); | 1747 return writer->WriteTo(zone_); |
1751 } | 1748 } |
1752 } // namespace wasm | 1749 } // namespace wasm |
1753 } // namespace internal | 1750 } // namespace internal |
1754 } // namespace v8 | 1751 } // namespace v8 |
OLD | NEW |