| 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 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 60 function_tables_(HashMap::PointersMatch, | 60 function_tables_(HashMap::PointersMatch, |
| 61 ZoneHashMap::kDefaultHashMapCapacity, | 61 ZoneHashMap::kDefaultHashMapCapacity, |
| 62 ZoneAllocationPolicy(zone)), | 62 ZoneAllocationPolicy(zone)), |
| 63 imported_function_table_(this), | 63 imported_function_table_(this), |
| 64 bounds_(typer->bounds()) { | 64 bounds_(typer->bounds()) { |
| 65 InitializeAstVisitor(isolate); | 65 InitializeAstVisitor(isolate); |
| 66 } | 66 } |
| 67 | 67 |
| 68 void InitializeInitFunction() { | 68 void InitializeInitFunction() { |
| 69 init_function_index_ = builder_->AddFunction(); | 69 init_function_index_ = builder_->AddFunction(); |
| 70 FunctionSig::Builder b(zone(), 0, 0); |
| 70 current_function_builder_ = builder_->FunctionAt(init_function_index_); | 71 current_function_builder_ = builder_->FunctionAt(init_function_index_); |
| 71 current_function_builder_->ReturnType(kAstStmt); | 72 current_function_builder_->SetSignature(b.Build()); |
| 72 builder_->MarkStartFunction(init_function_index_); | 73 builder_->MarkStartFunction(init_function_index_); |
| 73 current_function_builder_ = nullptr; | 74 current_function_builder_ = nullptr; |
| 74 } | 75 } |
| 75 | 76 |
| 76 void Compile() { | 77 void Compile() { |
| 77 InitializeInitFunction(); | 78 InitializeInitFunction(); |
| 78 RECURSE(VisitFunctionLiteral(literal_)); | 79 RECURSE(VisitFunctionLiteral(literal_)); |
| 79 } | 80 } |
| 80 | 81 |
| 81 void VisitVariableDeclaration(VariableDeclaration* decl) {} | 82 void VisitVariableDeclaration(VariableDeclaration* decl) {} |
| 82 | 83 |
| 83 void VisitFunctionDeclaration(FunctionDeclaration* decl) { | 84 void VisitFunctionDeclaration(FunctionDeclaration* decl) { |
| 84 DCHECK_EQ(kModuleScope, scope_); | 85 DCHECK_EQ(kModuleScope, scope_); |
| 85 DCHECK_NULL(current_function_builder_); | 86 DCHECK_NULL(current_function_builder_); |
| 86 uint16_t index = LookupOrInsertFunction(decl->proxy()->var()); | 87 uint32_t index = LookupOrInsertFunction(decl->proxy()->var()); |
| 87 current_function_builder_ = builder_->FunctionAt(index); | 88 current_function_builder_ = builder_->FunctionAt(index); |
| 88 scope_ = kFuncScope; | 89 scope_ = kFuncScope; |
| 89 RECURSE(Visit(decl->fun())); | 90 RECURSE(Visit(decl->fun())); |
| 90 scope_ = kModuleScope; | 91 scope_ = kModuleScope; |
| 91 current_function_builder_ = nullptr; | 92 current_function_builder_ = nullptr; |
| 92 local_variables_.Clear(); | 93 local_variables_.Clear(); |
| 93 } | 94 } |
| 94 | 95 |
| 95 void VisitImportDeclaration(ImportDeclaration* decl) {} | 96 void VisitImportDeclaration(ImportDeclaration* decl) {} |
| 96 | 97 |
| (...skipping 307 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 404 void VisitTryCatchStatement(TryCatchStatement* stmt) { UNREACHABLE(); } | 405 void VisitTryCatchStatement(TryCatchStatement* stmt) { UNREACHABLE(); } |
| 405 | 406 |
| 406 void VisitTryFinallyStatement(TryFinallyStatement* stmt) { UNREACHABLE(); } | 407 void VisitTryFinallyStatement(TryFinallyStatement* stmt) { UNREACHABLE(); } |
| 407 | 408 |
| 408 void VisitDebuggerStatement(DebuggerStatement* stmt) { UNREACHABLE(); } | 409 void VisitDebuggerStatement(DebuggerStatement* stmt) { UNREACHABLE(); } |
| 409 | 410 |
| 410 void VisitFunctionLiteral(FunctionLiteral* expr) { | 411 void VisitFunctionLiteral(FunctionLiteral* expr) { |
| 411 Scope* scope = expr->scope(); | 412 Scope* scope = expr->scope(); |
| 412 if (scope_ == kFuncScope) { | 413 if (scope_ == kFuncScope) { |
| 413 if (bounds_->get(expr).lower->IsFunction()) { | 414 if (bounds_->get(expr).lower->IsFunction()) { |
| 415 // Build the signature for the function. |
| 414 FunctionType* func_type = bounds_->get(expr).lower->AsFunction(); | 416 FunctionType* func_type = bounds_->get(expr).lower->AsFunction(); |
| 415 LocalType return_type = TypeFrom(func_type->Result()); | 417 LocalType return_type = TypeFrom(func_type->Result()); |
| 416 current_function_builder_->ReturnType(return_type); | 418 FunctionSig::Builder b(zone(), return_type == kAstStmt ? 0 : 1, |
| 419 func_type->Arity()); |
| 420 if (return_type != kAstStmt) b.AddReturn(return_type); |
| 417 for (int i = 0; i < expr->parameter_count(); i++) { | 421 for (int i = 0; i < expr->parameter_count(); i++) { |
| 418 LocalType type = TypeFrom(func_type->Parameter(i)); | 422 LocalType type = TypeFrom(func_type->Parameter(i)); |
| 419 DCHECK_NE(kAstStmt, type); | 423 DCHECK_NE(kAstStmt, type); |
| 420 LookupOrInsertLocal(scope->parameter(i), type); | 424 b.AddParam(type); |
| 425 InsertParameter(scope->parameter(i), type, i); |
| 421 } | 426 } |
| 427 current_function_builder_->SetSignature(b.Build()); |
| 422 } else { | 428 } else { |
| 423 UNREACHABLE(); | 429 UNREACHABLE(); |
| 424 } | 430 } |
| 425 } | 431 } |
| 426 RECURSE(VisitStatements(expr->body())); | 432 RECURSE(VisitStatements(expr->body())); |
| 427 RECURSE(VisitDeclarations(scope->declarations())); | 433 RECURSE(VisitDeclarations(scope->declarations())); |
| 428 } | 434 } |
| 429 | 435 |
| 430 void VisitNativeFunctionLiteral(NativeFunctionLiteral* expr) { | 436 void VisitNativeFunctionLiteral(NativeFunctionLiteral* expr) { |
| 431 UNREACHABLE(); | 437 UNREACHABLE(); |
| (...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 552 ObjectLiteralProperty* prop = props->at(i); | 558 ObjectLiteralProperty* prop = props->at(i); |
| 553 DCHECK_EQ(kExportScope, scope_); | 559 DCHECK_EQ(kExportScope, scope_); |
| 554 VariableProxy* expr = prop->value()->AsVariableProxy(); | 560 VariableProxy* expr = prop->value()->AsVariableProxy(); |
| 555 DCHECK_NOT_NULL(expr); | 561 DCHECK_NOT_NULL(expr); |
| 556 Variable* var = expr->var(); | 562 Variable* var = expr->var(); |
| 557 Literal* name = prop->key()->AsLiteral(); | 563 Literal* name = prop->key()->AsLiteral(); |
| 558 DCHECK_NOT_NULL(name); | 564 DCHECK_NOT_NULL(name); |
| 559 DCHECK(name->IsPropertyName()); | 565 DCHECK(name->IsPropertyName()); |
| 560 const AstRawString* raw_name = name->AsRawPropertyName(); | 566 const AstRawString* raw_name = name->AsRawPropertyName(); |
| 561 if (var->is_function()) { | 567 if (var->is_function()) { |
| 562 uint16_t index = LookupOrInsertFunction(var); | 568 uint32_t index = LookupOrInsertFunction(var); |
| 563 builder_->FunctionAt(index)->Exported(1); | 569 builder_->FunctionAt(index)->Exported(1); |
| 564 builder_->FunctionAt(index)->SetName( | 570 builder_->FunctionAt(index)->SetName( |
| 565 reinterpret_cast<const char*>(raw_name->raw_data()), | 571 reinterpret_cast<const char*>(raw_name->raw_data()), |
| 566 raw_name->length()); | 572 raw_name->length()); |
| 567 } | 573 } |
| 568 } | 574 } |
| 569 } | 575 } |
| 570 | 576 |
| 571 void VisitArrayLiteral(ArrayLiteral* expr) { UNREACHABLE(); } | 577 void VisitArrayLiteral(ArrayLiteral* expr) { UNREACHABLE(); } |
| 572 | 578 |
| (...skipping 12 matching lines...) Expand all Loading... |
| 585 bounds_->get(funcs).lower->AsArray()->Element()->AsFunction(); | 591 bounds_->get(funcs).lower->AsArray()->Element()->AsFunction(); |
| 586 LocalType return_type = TypeFrom(func_type->Result()); | 592 LocalType return_type = TypeFrom(func_type->Result()); |
| 587 FunctionSig::Builder sig(zone(), return_type == kAstStmt ? 0 : 1, | 593 FunctionSig::Builder sig(zone(), return_type == kAstStmt ? 0 : 1, |
| 588 func_type->Arity()); | 594 func_type->Arity()); |
| 589 if (return_type != kAstStmt) { | 595 if (return_type != kAstStmt) { |
| 590 sig.AddReturn(static_cast<LocalType>(return_type)); | 596 sig.AddReturn(static_cast<LocalType>(return_type)); |
| 591 } | 597 } |
| 592 for (int i = 0; i < func_type->Arity(); i++) { | 598 for (int i = 0; i < func_type->Arity(); i++) { |
| 593 sig.AddParam(TypeFrom(func_type->Parameter(i))); | 599 sig.AddParam(TypeFrom(func_type->Parameter(i))); |
| 594 } | 600 } |
| 595 uint16_t signature_index = builder_->AddSignature(sig.Build()); | 601 uint32_t signature_index = builder_->AddSignature(sig.Build()); |
| 596 InsertFunctionTable(table->var(), next_table_index_, signature_index); | 602 InsertFunctionTable(table->var(), next_table_index_, signature_index); |
| 597 next_table_index_ += funcs->values()->length(); | 603 next_table_index_ += funcs->values()->length(); |
| 598 for (int i = 0; i < funcs->values()->length(); i++) { | 604 for (int i = 0; i < funcs->values()->length(); i++) { |
| 599 VariableProxy* func = funcs->values()->at(i)->AsVariableProxy(); | 605 VariableProxy* func = funcs->values()->at(i)->AsVariableProxy(); |
| 600 DCHECK_NOT_NULL(func); | 606 DCHECK_NOT_NULL(func); |
| 601 builder_->AddIndirectFunction(LookupOrInsertFunction(func->var())); | 607 builder_->AddIndirectFunction(LookupOrInsertFunction(func->var())); |
| 602 } | 608 } |
| 603 } | 609 } |
| 604 | 610 |
| 605 struct FunctionTableIndices : public ZoneObject { | 611 struct FunctionTableIndices : public ZoneObject { |
| 606 uint32_t start_index; | 612 uint32_t start_index; |
| 607 uint16_t signature_index; | 613 uint32_t signature_index; |
| 608 }; | 614 }; |
| 609 | 615 |
| 610 void InsertFunctionTable(Variable* v, uint32_t start_index, | 616 void InsertFunctionTable(Variable* v, uint32_t start_index, |
| 611 uint16_t signature_index) { | 617 uint32_t signature_index) { |
| 612 FunctionTableIndices* container = new (zone()) FunctionTableIndices(); | 618 FunctionTableIndices* container = new (zone()) FunctionTableIndices(); |
| 613 container->start_index = start_index; | 619 container->start_index = start_index; |
| 614 container->signature_index = signature_index; | 620 container->signature_index = signature_index; |
| 615 ZoneHashMap::Entry* entry = function_tables_.LookupOrInsert( | 621 ZoneHashMap::Entry* entry = function_tables_.LookupOrInsert( |
| 616 v, ComputePointerHash(v), ZoneAllocationPolicy(zone())); | 622 v, ComputePointerHash(v), ZoneAllocationPolicy(zone())); |
| 617 entry->value = container; | 623 entry->value = container; |
| 618 } | 624 } |
| 619 | 625 |
| 620 FunctionTableIndices* LookupFunctionTable(Variable* v) { | 626 FunctionTableIndices* LookupFunctionTable(Variable* v) { |
| 621 ZoneHashMap::Entry* entry = | 627 ZoneHashMap::Entry* entry = |
| (...skipping 23 matching lines...) Expand all Loading... |
| 645 builder_(builder) {} | 651 builder_(builder) {} |
| 646 | 652 |
| 647 void AddImport(Variable* v, const char* name, int name_length) { | 653 void AddImport(Variable* v, const char* name, int name_length) { |
| 648 ImportedFunctionIndices* indices = new (builder_->zone()) | 654 ImportedFunctionIndices* indices = new (builder_->zone()) |
| 649 ImportedFunctionIndices(name, name_length, builder_->zone()); | 655 ImportedFunctionIndices(name, name_length, builder_->zone()); |
| 650 ZoneHashMap::Entry* entry = table_.LookupOrInsert( | 656 ZoneHashMap::Entry* entry = table_.LookupOrInsert( |
| 651 v, ComputePointerHash(v), ZoneAllocationPolicy(builder_->zone())); | 657 v, ComputePointerHash(v), ZoneAllocationPolicy(builder_->zone())); |
| 652 entry->value = indices; | 658 entry->value = indices; |
| 653 } | 659 } |
| 654 | 660 |
| 655 uint16_t GetFunctionIndex(Variable* v, FunctionSig* sig) { | 661 uint32_t GetFunctionIndex(Variable* v, FunctionSig* sig) { |
| 656 ZoneHashMap::Entry* entry = table_.Lookup(v, ComputePointerHash(v)); | 662 ZoneHashMap::Entry* entry = table_.Lookup(v, ComputePointerHash(v)); |
| 657 DCHECK_NOT_NULL(entry); | 663 DCHECK_NOT_NULL(entry); |
| 658 ImportedFunctionIndices* indices = | 664 ImportedFunctionIndices* indices = |
| 659 reinterpret_cast<ImportedFunctionIndices*>(entry->value); | 665 reinterpret_cast<ImportedFunctionIndices*>(entry->value); |
| 660 WasmModuleBuilder::SignatureMap::iterator pos = | 666 WasmModuleBuilder::SignatureMap::iterator pos = |
| 661 indices->signature_to_index_.find(sig); | 667 indices->signature_to_index_.find(sig); |
| 662 if (pos != indices->signature_to_index_.end()) { | 668 if (pos != indices->signature_to_index_.end()) { |
| 663 return pos->second; | 669 return pos->second; |
| 664 } else { | 670 } else { |
| 665 uint32_t index = builder_->builder_->AddImport( | 671 uint32_t index = builder_->builder_->AddImport( |
| (...skipping 396 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1062 current_function_builder_->Emit(kExprF32Sqrt); | 1068 current_function_builder_->Emit(kExprF32Sqrt); |
| 1063 } else if (call_type == kAstF64) { | 1069 } else if (call_type == kAstF64) { |
| 1064 current_function_builder_->Emit(kExprF64Sqrt); | 1070 current_function_builder_->Emit(kExprF64Sqrt); |
| 1065 } else { | 1071 } else { |
| 1066 UNREACHABLE(); | 1072 UNREACHABLE(); |
| 1067 } | 1073 } |
| 1068 break; | 1074 break; |
| 1069 } | 1075 } |
| 1070 case AsmTyper::kMathAbs: { | 1076 case AsmTyper::kMathAbs: { |
| 1071 if (call_type == kAstI32) { | 1077 if (call_type == kAstI32) { |
| 1072 uint16_t tmp = current_function_builder_->AddLocal(kAstI32); | 1078 uint32_t tmp = current_function_builder_->AddLocal(kAstI32); |
| 1073 | 1079 |
| 1074 // if set_local(tmp, x) < 0 | 1080 // if set_local(tmp, x) < 0 |
| 1075 Visit(call->arguments()->at(0)); | 1081 Visit(call->arguments()->at(0)); |
| 1076 current_function_builder_->EmitSetLocal(tmp); | 1082 current_function_builder_->EmitSetLocal(tmp); |
| 1077 byte code[] = {WASM_I8(0)}; | 1083 byte code[] = {WASM_I8(0)}; |
| 1078 current_function_builder_->EmitCode(code, sizeof(code)); | 1084 current_function_builder_->EmitCode(code, sizeof(code)); |
| 1079 current_function_builder_->Emit(kExprI32LtS); | 1085 current_function_builder_->Emit(kExprI32LtS); |
| 1080 current_function_builder_->Emit(kExprIf); | 1086 current_function_builder_->Emit(kExprIf); |
| 1081 | 1087 |
| 1082 // then (0 - tmp) | 1088 // then (0 - tmp) |
| (...skipping 14 matching lines...) Expand all Loading... |
| 1097 VisitCallArgs(call); | 1103 VisitCallArgs(call); |
| 1098 current_function_builder_->Emit(kExprF64Abs); | 1104 current_function_builder_->Emit(kExprF64Abs); |
| 1099 } else { | 1105 } else { |
| 1100 UNREACHABLE(); | 1106 UNREACHABLE(); |
| 1101 } | 1107 } |
| 1102 break; | 1108 break; |
| 1103 } | 1109 } |
| 1104 case AsmTyper::kMathMin: { | 1110 case AsmTyper::kMathMin: { |
| 1105 // TODO(bradnelson): Change wasm to match Math.min in asm.js mode. | 1111 // TODO(bradnelson): Change wasm to match Math.min in asm.js mode. |
| 1106 if (call_type == kAstI32) { | 1112 if (call_type == kAstI32) { |
| 1107 uint16_t tmp_x = current_function_builder_->AddLocal(kAstI32); | 1113 uint32_t tmp_x = current_function_builder_->AddLocal(kAstI32); |
| 1108 uint16_t tmp_y = current_function_builder_->AddLocal(kAstI32); | 1114 uint32_t tmp_y = current_function_builder_->AddLocal(kAstI32); |
| 1109 | 1115 |
| 1110 // if set_local(tmp_x, x) < set_local(tmp_y, y) | 1116 // if set_local(tmp_x, x) < set_local(tmp_y, y) |
| 1111 Visit(call->arguments()->at(0)); | 1117 Visit(call->arguments()->at(0)); |
| 1112 current_function_builder_->EmitSetLocal(tmp_x); | 1118 current_function_builder_->EmitSetLocal(tmp_x); |
| 1113 | 1119 |
| 1114 Visit(call->arguments()->at(1)); | 1120 Visit(call->arguments()->at(1)); |
| 1115 current_function_builder_->EmitSetLocal(tmp_y); | 1121 current_function_builder_->EmitSetLocal(tmp_y); |
| 1116 | 1122 |
| 1117 current_function_builder_->Emit(kExprI32LeS); | 1123 current_function_builder_->Emit(kExprI32LeS); |
| 1118 current_function_builder_->Emit(kExprIf); | 1124 current_function_builder_->Emit(kExprIf); |
| (...skipping 13 matching lines...) Expand all Loading... |
| 1132 VisitCallArgs(call); | 1138 VisitCallArgs(call); |
| 1133 current_function_builder_->Emit(kExprF64Min); | 1139 current_function_builder_->Emit(kExprF64Min); |
| 1134 } else { | 1140 } else { |
| 1135 UNREACHABLE(); | 1141 UNREACHABLE(); |
| 1136 } | 1142 } |
| 1137 break; | 1143 break; |
| 1138 } | 1144 } |
| 1139 case AsmTyper::kMathMax: { | 1145 case AsmTyper::kMathMax: { |
| 1140 // TODO(bradnelson): Change wasm to match Math.max in asm.js mode. | 1146 // TODO(bradnelson): Change wasm to match Math.max in asm.js mode. |
| 1141 if (call_type == kAstI32) { | 1147 if (call_type == kAstI32) { |
| 1142 uint16_t tmp_x = current_function_builder_->AddLocal(kAstI32); | 1148 uint32_t tmp_x = current_function_builder_->AddLocal(kAstI32); |
| 1143 uint16_t tmp_y = current_function_builder_->AddLocal(kAstI32); | 1149 uint32_t tmp_y = current_function_builder_->AddLocal(kAstI32); |
| 1144 | 1150 |
| 1145 // if set_local(tmp_x, x) < set_local(tmp_y, y) | 1151 // if set_local(tmp_x, x) < set_local(tmp_y, y) |
| 1146 Visit(call->arguments()->at(0)); | 1152 Visit(call->arguments()->at(0)); |
| 1147 | 1153 |
| 1148 current_function_builder_->EmitSetLocal(tmp_x); | 1154 current_function_builder_->EmitSetLocal(tmp_x); |
| 1149 | 1155 |
| 1150 Visit(call->arguments()->at(1)); | 1156 Visit(call->arguments()->at(1)); |
| 1151 current_function_builder_->EmitSetLocal(tmp_y); | 1157 current_function_builder_->EmitSetLocal(tmp_y); |
| 1152 | 1158 |
| 1153 current_function_builder_->Emit(kExprI32LeS); | 1159 current_function_builder_->Emit(kExprI32LeS); |
| (...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1240 Call::CallType call_type = expr->GetCallType(isolate_); | 1246 Call::CallType call_type = expr->GetCallType(isolate_); |
| 1241 switch (call_type) { | 1247 switch (call_type) { |
| 1242 case Call::OTHER_CALL: { | 1248 case Call::OTHER_CALL: { |
| 1243 DCHECK_EQ(kFuncScope, scope_); | 1249 DCHECK_EQ(kFuncScope, scope_); |
| 1244 VariableProxy* proxy = expr->expression()->AsVariableProxy(); | 1250 VariableProxy* proxy = expr->expression()->AsVariableProxy(); |
| 1245 if (proxy != nullptr) { | 1251 if (proxy != nullptr) { |
| 1246 if (VisitStdlibFunction(expr, proxy)) { | 1252 if (VisitStdlibFunction(expr, proxy)) { |
| 1247 return; | 1253 return; |
| 1248 } | 1254 } |
| 1249 } | 1255 } |
| 1250 uint16_t index; | 1256 uint32_t index; |
| 1251 VariableProxy* vp = expr->expression()->AsVariableProxy(); | 1257 VariableProxy* vp = expr->expression()->AsVariableProxy(); |
| 1252 if (vp != nullptr && | 1258 if (vp != nullptr && |
| 1253 Type::Any()->Is(bounds_->get(vp).lower->AsFunction()->Result())) { | 1259 Type::Any()->Is(bounds_->get(vp).lower->AsFunction()->Result())) { |
| 1254 LocalType return_type = TypeOf(expr); | 1260 LocalType return_type = TypeOf(expr); |
| 1255 ZoneList<Expression*>* args = expr->arguments(); | 1261 ZoneList<Expression*>* args = expr->arguments(); |
| 1256 FunctionSig::Builder sig(zone(), return_type == kAstStmt ? 0 : 1, | 1262 FunctionSig::Builder sig(zone(), return_type == kAstStmt ? 0 : 1, |
| 1257 args->length()); | 1263 args->length()); |
| 1258 if (return_type != kAstStmt) { | 1264 if (return_type != kAstStmt) { |
| 1259 sig.AddReturn(return_type); | 1265 sig.AddReturn(return_type); |
| 1260 } | 1266 } |
| (...skipping 360 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1621 | 1627 |
| 1622 void VisitSloppyBlockFunctionStatement(SloppyBlockFunctionStatement* expr) { | 1628 void VisitSloppyBlockFunctionStatement(SloppyBlockFunctionStatement* expr) { |
| 1623 UNREACHABLE(); | 1629 UNREACHABLE(); |
| 1624 } | 1630 } |
| 1625 | 1631 |
| 1626 void VisitDoExpression(DoExpression* expr) { UNREACHABLE(); } | 1632 void VisitDoExpression(DoExpression* expr) { UNREACHABLE(); } |
| 1627 | 1633 |
| 1628 void VisitRewritableExpression(RewritableExpression* expr) { UNREACHABLE(); } | 1634 void VisitRewritableExpression(RewritableExpression* expr) { UNREACHABLE(); } |
| 1629 | 1635 |
| 1630 struct IndexContainer : public ZoneObject { | 1636 struct IndexContainer : public ZoneObject { |
| 1631 uint16_t index; | 1637 uint32_t index; |
| 1632 }; | 1638 }; |
| 1633 | 1639 |
| 1634 uint16_t LookupOrInsertLocal(Variable* v, LocalType type) { | 1640 uint32_t LookupOrInsertLocal(Variable* v, LocalType type) { |
| 1635 DCHECK_NOT_NULL(current_function_builder_); | 1641 DCHECK_NOT_NULL(current_function_builder_); |
| 1636 ZoneHashMap::Entry* entry = | 1642 ZoneHashMap::Entry* entry = |
| 1637 local_variables_.Lookup(v, ComputePointerHash(v)); | 1643 local_variables_.Lookup(v, ComputePointerHash(v)); |
| 1638 if (entry == nullptr) { | 1644 if (entry == nullptr) { |
| 1639 uint16_t index; | 1645 uint32_t index; |
| 1640 if (v->IsParameter()) { | 1646 DCHECK(!v->IsParameter()); |
| 1641 index = current_function_builder_->AddParam(type); | 1647 index = current_function_builder_->AddLocal(type); |
| 1642 } else { | |
| 1643 index = current_function_builder_->AddLocal(type); | |
| 1644 } | |
| 1645 IndexContainer* container = new (zone()) IndexContainer(); | 1648 IndexContainer* container = new (zone()) IndexContainer(); |
| 1646 container->index = index; | 1649 container->index = index; |
| 1647 entry = local_variables_.LookupOrInsert(v, ComputePointerHash(v), | 1650 entry = local_variables_.LookupOrInsert(v, ComputePointerHash(v), |
| 1648 ZoneAllocationPolicy(zone())); | 1651 ZoneAllocationPolicy(zone())); |
| 1649 entry->value = container; | 1652 entry->value = container; |
| 1650 } | 1653 } |
| 1651 return (reinterpret_cast<IndexContainer*>(entry->value))->index; | 1654 return (reinterpret_cast<IndexContainer*>(entry->value))->index; |
| 1652 } | 1655 } |
| 1653 | 1656 |
| 1654 uint16_t LookupOrInsertGlobal(Variable* v, LocalType type) { | 1657 void InsertParameter(Variable* v, LocalType type, uint32_t index) { |
| 1658 DCHECK(v->IsParameter()); |
| 1659 DCHECK_NOT_NULL(current_function_builder_); |
| 1660 ZoneHashMap::Entry* entry = |
| 1661 local_variables_.Lookup(v, ComputePointerHash(v)); |
| 1662 DCHECK_NULL(entry); |
| 1663 IndexContainer* container = new (zone()) IndexContainer(); |
| 1664 container->index = index; |
| 1665 entry = local_variables_.LookupOrInsert(v, ComputePointerHash(v), |
| 1666 ZoneAllocationPolicy(zone())); |
| 1667 entry->value = container; |
| 1668 } |
| 1669 |
| 1670 uint32_t LookupOrInsertGlobal(Variable* v, LocalType type) { |
| 1655 ZoneHashMap::Entry* entry = | 1671 ZoneHashMap::Entry* entry = |
| 1656 global_variables_.Lookup(v, ComputePointerHash(v)); | 1672 global_variables_.Lookup(v, ComputePointerHash(v)); |
| 1657 if (entry == nullptr) { | 1673 if (entry == nullptr) { |
| 1658 uint16_t index = | 1674 uint32_t index = |
| 1659 builder_->AddGlobal(WasmOpcodes::MachineTypeFor(type), 0); | 1675 builder_->AddGlobal(WasmOpcodes::MachineTypeFor(type), 0); |
| 1660 IndexContainer* container = new (zone()) IndexContainer(); | 1676 IndexContainer* container = new (zone()) IndexContainer(); |
| 1661 container->index = index; | 1677 container->index = index; |
| 1662 entry = global_variables_.LookupOrInsert(v, ComputePointerHash(v), | 1678 entry = global_variables_.LookupOrInsert(v, ComputePointerHash(v), |
| 1663 ZoneAllocationPolicy(zone())); | 1679 ZoneAllocationPolicy(zone())); |
| 1664 entry->value = container; | 1680 entry->value = container; |
| 1665 } | 1681 } |
| 1666 return (reinterpret_cast<IndexContainer*>(entry->value))->index; | 1682 return (reinterpret_cast<IndexContainer*>(entry->value))->index; |
| 1667 } | 1683 } |
| 1668 | 1684 |
| 1669 uint16_t LookupOrInsertFunction(Variable* v) { | 1685 uint32_t LookupOrInsertFunction(Variable* v) { |
| 1670 DCHECK_NOT_NULL(builder_); | 1686 DCHECK_NOT_NULL(builder_); |
| 1671 ZoneHashMap::Entry* entry = functions_.Lookup(v, ComputePointerHash(v)); | 1687 ZoneHashMap::Entry* entry = functions_.Lookup(v, ComputePointerHash(v)); |
| 1672 if (entry == nullptr) { | 1688 if (entry == nullptr) { |
| 1673 uint16_t index = builder_->AddFunction(); | 1689 uint32_t index = builder_->AddFunction(); |
| 1674 IndexContainer* container = new (zone()) IndexContainer(); | 1690 IndexContainer* container = new (zone()) IndexContainer(); |
| 1675 container->index = index; | 1691 container->index = index; |
| 1676 entry = functions_.LookupOrInsert(v, ComputePointerHash(v), | 1692 entry = functions_.LookupOrInsert(v, ComputePointerHash(v), |
| 1677 ZoneAllocationPolicy(zone())); | 1693 ZoneAllocationPolicy(zone())); |
| 1678 entry->value = container; | 1694 entry->value = container; |
| 1679 } | 1695 } |
| 1680 return (reinterpret_cast<IndexContainer*>(entry->value))->index; | 1696 return (reinterpret_cast<IndexContainer*>(entry->value))->index; |
| 1681 } | 1697 } |
| 1682 | 1698 |
| 1683 LocalType TypeOf(Expression* expr) { | 1699 LocalType TypeOf(Expression* expr) { |
| (...skipping 21 matching lines...) Expand all Loading... |
| 1705 AsmScope scope_; | 1721 AsmScope scope_; |
| 1706 WasmModuleBuilder* builder_; | 1722 WasmModuleBuilder* builder_; |
| 1707 WasmFunctionBuilder* current_function_builder_; | 1723 WasmFunctionBuilder* current_function_builder_; |
| 1708 FunctionLiteral* literal_; | 1724 FunctionLiteral* literal_; |
| 1709 Isolate* isolate_; | 1725 Isolate* isolate_; |
| 1710 Zone* zone_; | 1726 Zone* zone_; |
| 1711 Handle<Object> foreign_; | 1727 Handle<Object> foreign_; |
| 1712 AsmTyper* typer_; | 1728 AsmTyper* typer_; |
| 1713 TypeCache const& cache_; | 1729 TypeCache const& cache_; |
| 1714 ZoneVector<std::pair<BreakableStatement*, bool>> breakable_blocks_; | 1730 ZoneVector<std::pair<BreakableStatement*, bool>> breakable_blocks_; |
| 1715 uint16_t init_function_index_; | 1731 uint32_t init_function_index_; |
| 1716 uint32_t next_table_index_; | 1732 uint32_t next_table_index_; |
| 1717 ZoneHashMap function_tables_; | 1733 ZoneHashMap function_tables_; |
| 1718 ImportedFunctionTable imported_function_table_; | 1734 ImportedFunctionTable imported_function_table_; |
| 1719 const AstTypeBounds* bounds_; | 1735 const AstTypeBounds* bounds_; |
| 1720 | 1736 |
| 1721 DEFINE_AST_VISITOR_SUBCLASS_MEMBERS(); | 1737 DEFINE_AST_VISITOR_SUBCLASS_MEMBERS(); |
| 1722 | 1738 |
| 1723 private: | 1739 private: |
| 1724 DISALLOW_COPY_AND_ASSIGN(AsmWasmBuilderImpl); | 1740 DISALLOW_COPY_AND_ASSIGN(AsmWasmBuilderImpl); |
| 1725 }; | 1741 }; |
| (...skipping 11 matching lines...) Expand all Loading... |
| 1737 // that zone in constructor may be thrown away once wasm module is written. | 1753 // that zone in constructor may be thrown away once wasm module is written. |
| 1738 WasmModuleIndex* AsmWasmBuilder::Run() { | 1754 WasmModuleIndex* AsmWasmBuilder::Run() { |
| 1739 AsmWasmBuilderImpl impl(isolate_, zone_, literal_, foreign_, typer_); | 1755 AsmWasmBuilderImpl impl(isolate_, zone_, literal_, foreign_, typer_); |
| 1740 impl.Compile(); | 1756 impl.Compile(); |
| 1741 WasmModuleWriter* writer = impl.builder_->Build(zone_); | 1757 WasmModuleWriter* writer = impl.builder_->Build(zone_); |
| 1742 return writer->WriteTo(zone_); | 1758 return writer->WriteTo(zone_); |
| 1743 } | 1759 } |
| 1744 } // namespace wasm | 1760 } // namespace wasm |
| 1745 } // namespace internal | 1761 } // namespace internal |
| 1746 } // namespace v8 | 1762 } // namespace v8 |
| OLD | NEW |