5 #include "src/parsing/parsing.h" 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 #include "src/parsing/scanner-character-streams.h" 14 #include "src/vm-state-inl.h" 20 bool ParseProgram(ParseInfo* info, Isolate* isolate) {
21 DCHECK(info->is_toplevel());
22 DCHECK_NULL(info->literal());
24 VMState<PARSER> state(isolate);
27 Handle<String> source(String::cast(info->script()->source()), isolate);
28 isolate->counters()->total_parse_size()->Increment(source->length());
29 std::unique_ptr<Utf16CharacterStream> stream(
30 ScannerStream::For(isolate, source));
31 info->set_character_stream(std::move(stream));
35 FunctionLiteral* result =
nullptr;
37 DCHECK(parser.parsing_on_main_thread_);
39 result = parser.ParseProgram(isolate, info);
40 info->set_literal(result);
41 if (result ==
nullptr) {
42 info->pending_error_handler()->ReportErrors(isolate, info->script(),
43 info->ast_value_factory());
45 result->scope()->AttachOuterScopeInfo(info, isolate);
46 info->set_language_mode(info->literal()->language_mode());
47 if (info->is_eval()) {
48 info->set_allow_eval_cache(parser.allow_eval_cache());
51 parser.UpdateStatistics(isolate, info->script());
52 return (result !=
nullptr);
55 bool ParseFunction(ParseInfo* info, Handle<SharedFunctionInfo> shared_info,
57 DCHECK(!info->is_toplevel());
58 DCHECK(!shared_info.is_null());
59 DCHECK_NULL(info->literal());
62 Handle<String> source(String::cast(info->script()->source()), isolate);
63 isolate->counters()->total_parse_size()->Increment(source->length());
64 std::unique_ptr<Utf16CharacterStream> stream(
65 ScannerStream::For(isolate, source, shared_info->StartPosition(),
66 shared_info->EndPosition()));
67 info->set_character_stream(std::move(stream));
69 VMState<PARSER> state(isolate);
73 FunctionLiteral* result =
nullptr;
75 DCHECK(parser.parsing_on_main_thread_);
77 result = parser.ParseFunction(isolate, info, shared_info);
78 info->set_literal(result);
79 if (result ==
nullptr) {
80 info->pending_error_handler()->ReportErrors(isolate, info->script(),
81 info->ast_value_factory());
83 result->scope()->AttachOuterScopeInfo(info, isolate);
84 if (info->is_eval()) {
85 info->set_allow_eval_cache(parser.allow_eval_cache());
88 parser.UpdateStatistics(isolate, info->script());
89 return (result !=
nullptr);
92 bool ParseAny(ParseInfo* info, Handle<SharedFunctionInfo> shared_info,
94 DCHECK(!shared_info.is_null());
95 return info->is_toplevel() ? ParseProgram(info, isolate)
96 : ParseFunction(info, shared_info, isolate);