1 // Copyright 2016 the V8 project authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "src/parsing/parsing.h" 6 7 #include <memory> 8 9 #include "src/ast/ast.h" 10 #include "src/objects-inl.h" 11 #include "src/parsing/parse-info.h" 12 #include "src/parsing/parser.h" 13 14 namespace v8 { 15 namespace internal { 16 namespace parsing { 17 18 bool ParseProgram(ParseInfo* info, bool internalize) { 19 DCHECK(info->is_toplevel()); 20 DCHECK_NULL(info->literal()); 21 22 Parser parser(info); 23 24 FunctionLiteral* result = nullptr; 25 // Ok to use Isolate here; this function is only called in the main thread. 26 DCHECK(parser.parsing_on_main_thread_); 27 Isolate* isolate = info->isolate(); 28 29 parser.SetCachedData(info); 30 result = parser.ParseProgram(isolate, info); 31 info->set_literal(result); 32 if (result == nullptr) { 33 parser.ReportErrors(isolate, info->script()); 34 } else { 35 info->set_language_mode(info->literal()->language_mode()); 36 } 37 parser.UpdateStatistics(isolate, info->script()); 38 if (internalize) { 39 info->ast_value_factory()->Internalize(isolate); 40 } 41 return (result != nullptr); 42 } 43 44 bool ParseFunction(ParseInfo* info, bool internalize) { 45 DCHECK(!info->is_toplevel()); 46 DCHECK_NULL(info->literal()); 47 48 Parser parser(info); 49 50 FunctionLiteral* result = nullptr; 51 // Ok to use Isolate here; this function is only called in the main thread. 52 DCHECK(parser.parsing_on_main_thread_); 53 Isolate* isolate = info->isolate(); 54 55 result = parser.ParseFunction(isolate, info); 56 info->set_literal(result); 57 if (result == nullptr) { 58 parser.ReportErrors(isolate, info->script()); 59 } 60 parser.UpdateStatistics(isolate, info->script()); 61 if (internalize) { 62 info->ast_value_factory()->Internalize(isolate); 63 } 64 return (result != nullptr); 65 } 66 67 bool ParseAny(ParseInfo* info, bool internalize) { 68 return info->is_toplevel() ? ParseProgram(info, internalize) 69 : ParseFunction(info, internalize); 70 } 71 72 } // namespace parsing 73 } // namespace internal 74 } // namespace v8 75