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 builder_(new (zone) WasmModuleBuilder(zone)), | 60 builder_(new (zone) WasmModuleBuilder(zone)), |
61 current_function_builder_(nullptr), | 61 current_function_builder_(nullptr), |
62 literal_(literal), | 62 literal_(literal), |
63 isolate_(isolate), | 63 isolate_(isolate), |
64 zone_(zone), | 64 zone_(zone), |
65 info_(info), | 65 info_(info), |
66 ast_value_factory_(ast_value_factory), | 66 ast_value_factory_(ast_value_factory), |
67 script_(script), | 67 script_(script), |
68 typer_(typer), | 68 typer_(typer), |
69 typer_failed_(false), | 69 typer_failed_(false), |
| 70 typer_finished_(false), |
70 breakable_blocks_(zone), | 71 breakable_blocks_(zone), |
71 foreign_variables_(zone), | 72 foreign_variables_(zone), |
72 init_function_(nullptr), | 73 init_function_(nullptr), |
73 foreign_init_function_(nullptr), | 74 foreign_init_function_(nullptr), |
74 function_tables_(ZoneHashMap::kDefaultHashMapCapacity, | 75 function_tables_(ZoneHashMap::kDefaultHashMapCapacity, |
75 ZoneAllocationPolicy(zone)), | 76 ZoneAllocationPolicy(zone)), |
76 imported_function_table_(this), | 77 imported_function_table_(this), |
77 parent_binop_(nullptr) { | 78 parent_binop_(nullptr) { |
78 InitializeAstVisitor(isolate); | 79 InitializeAstVisitor(isolate); |
79 } | 80 } |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
115 bool Build() { | 116 bool Build() { |
116 InitializeInitFunction(); | 117 InitializeInitFunction(); |
117 if (!typer_->ValidateBeforeFunctionsPhase()) { | 118 if (!typer_->ValidateBeforeFunctionsPhase()) { |
118 return false; | 119 return false; |
119 } | 120 } |
120 DCHECK(!HasStackOverflow()); | 121 DCHECK(!HasStackOverflow()); |
121 VisitFunctionLiteral(literal_); | 122 VisitFunctionLiteral(literal_); |
122 if (HasStackOverflow()) { | 123 if (HasStackOverflow()) { |
123 return false; | 124 return false; |
124 } | 125 } |
| 126 if (!typer_finished_) { |
| 127 typer_->FailWithMessage("Module missing export section."); |
| 128 typer_failed_ = true; |
| 129 } |
125 if (typer_failed_) { | 130 if (typer_failed_) { |
126 return false; | 131 return false; |
127 } | 132 } |
128 BuildForeignInitFunction(); | 133 BuildForeignInitFunction(); |
129 return true; | 134 return true; |
130 } | 135 } |
131 | 136 |
132 void VisitVariableDeclaration(VariableDeclaration* decl) {} | 137 void VisitVariableDeclaration(VariableDeclaration* decl) {} |
133 | 138 |
134 void VisitFunctionDeclaration(FunctionDeclaration* decl) { | 139 void VisitFunctionDeclaration(FunctionDeclaration* decl) { |
(...skipping 180 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
315 void VisitContinueStatement(ContinueStatement* stmt) { | 320 void VisitContinueStatement(ContinueStatement* stmt) { |
316 DoBreakOrContinue(stmt->target(), true); | 321 DoBreakOrContinue(stmt->target(), true); |
317 } | 322 } |
318 | 323 |
319 void VisitBreakStatement(BreakStatement* stmt) { | 324 void VisitBreakStatement(BreakStatement* stmt) { |
320 DoBreakOrContinue(stmt->target(), false); | 325 DoBreakOrContinue(stmt->target(), false); |
321 } | 326 } |
322 | 327 |
323 void VisitReturnStatement(ReturnStatement* stmt) { | 328 void VisitReturnStatement(ReturnStatement* stmt) { |
324 if (scope_ == kModuleScope) { | 329 if (scope_ == kModuleScope) { |
| 330 if (typer_finished_) { |
| 331 typer_->FailWithMessage("Module has multiple returns."); |
| 332 typer_failed_ = true; |
| 333 return; |
| 334 } |
325 if (!typer_->ValidateAfterFunctionsPhase()) { | 335 if (!typer_->ValidateAfterFunctionsPhase()) { |
326 typer_failed_ = true; | 336 typer_failed_ = true; |
327 return; | 337 return; |
328 } | 338 } |
| 339 typer_finished_ = true; |
329 scope_ = kExportScope; | 340 scope_ = kExportScope; |
330 RECURSE(Visit(stmt->expression())); | 341 RECURSE(Visit(stmt->expression())); |
331 scope_ = kModuleScope; | 342 scope_ = kModuleScope; |
332 } else if (scope_ == kFuncScope) { | 343 } else if (scope_ == kFuncScope) { |
333 RECURSE(Visit(stmt->expression())); | 344 RECURSE(Visit(stmt->expression())); |
334 current_function_builder_->Emit(kExprReturn); | 345 current_function_builder_->Emit(kExprReturn); |
335 } else { | 346 } else { |
336 UNREACHABLE(); | 347 UNREACHABLE(); |
337 } | 348 } |
338 } | 349 } |
(...skipping 1601 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1940 WasmModuleBuilder* builder_; | 1951 WasmModuleBuilder* builder_; |
1941 WasmFunctionBuilder* current_function_builder_; | 1952 WasmFunctionBuilder* current_function_builder_; |
1942 FunctionLiteral* literal_; | 1953 FunctionLiteral* literal_; |
1943 Isolate* isolate_; | 1954 Isolate* isolate_; |
1944 Zone* zone_; | 1955 Zone* zone_; |
1945 CompilationInfo* info_; | 1956 CompilationInfo* info_; |
1946 AstValueFactory* ast_value_factory_; | 1957 AstValueFactory* ast_value_factory_; |
1947 Handle<Script> script_; | 1958 Handle<Script> script_; |
1948 AsmTyper* typer_; | 1959 AsmTyper* typer_; |
1949 bool typer_failed_; | 1960 bool typer_failed_; |
| 1961 bool typer_finished_; |
1950 ZoneVector<std::pair<BreakableStatement*, bool>> breakable_blocks_; | 1962 ZoneVector<std::pair<BreakableStatement*, bool>> breakable_blocks_; |
1951 ZoneVector<ForeignVariable> foreign_variables_; | 1963 ZoneVector<ForeignVariable> foreign_variables_; |
1952 WasmFunctionBuilder* init_function_; | 1964 WasmFunctionBuilder* init_function_; |
1953 WasmFunctionBuilder* foreign_init_function_; | 1965 WasmFunctionBuilder* foreign_init_function_; |
1954 uint32_t next_table_index_; | 1966 uint32_t next_table_index_; |
1955 ZoneHashMap function_tables_; | 1967 ZoneHashMap function_tables_; |
1956 ImportedFunctionTable imported_function_table_; | 1968 ImportedFunctionTable imported_function_table_; |
1957 // Remember the parent node for reporting the correct location for ToNumber | 1969 // Remember the parent node for reporting the correct location for ToNumber |
1958 // conversions after calls. | 1970 // conversions after calls. |
1959 BinaryOperation* parent_binop_; | 1971 BinaryOperation* parent_binop_; |
(...skipping 23 matching lines...) Expand all Loading... |
1983 impl.builder_->WriteAsmJsOffsetTable(*asm_offsets_buffer); | 1995 impl.builder_->WriteAsmJsOffsetTable(*asm_offsets_buffer); |
1984 return {module_buffer, asm_offsets_buffer, success}; | 1996 return {module_buffer, asm_offsets_buffer, success}; |
1985 } | 1997 } |
1986 | 1998 |
1987 const char* AsmWasmBuilder::foreign_init_name = "__foreign_init__"; | 1999 const char* AsmWasmBuilder::foreign_init_name = "__foreign_init__"; |
1988 const char* AsmWasmBuilder::single_function_name = "__single_function__"; | 2000 const char* AsmWasmBuilder::single_function_name = "__single_function__"; |
1989 | 2001 |
1990 } // namespace wasm | 2002 } // namespace wasm |
1991 } // namespace internal | 2003 } // namespace internal |
1992 } // namespace v8 | 2004 } // namespace v8 |
OLD | NEW |