Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(3281)

Unified Diff: src/parsing/parser.cc

Issue 2201423002: Don't dereference handles in DoParseLazy (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@parse-lazy
Patch Set: rebase Created 4 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/parsing/parser.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/parsing/parser.cc
diff --git a/src/parsing/parser.cc b/src/parsing/parser.cc
index b54c611472a6cab24a8628e39932fa1c686b7727..f49fd1f95f1845661d76c41c68e28238d14ad653 100644
--- a/src/parsing/parser.cc
+++ b/src/parsing/parser.cc
@@ -52,6 +52,9 @@ ParseInfo::ParseInfo(Zone* zone)
unicode_cache_(nullptr),
stack_limit_(0),
hash_seed_(0),
+ compiler_hints_(0),
+ start_position_(0),
+ end_position_(0),
isolate_(nullptr),
cached_data_(nullptr),
ast_value_factory_(nullptr),
@@ -70,6 +73,11 @@ ParseInfo::ParseInfo(Zone* zone, Handle<SharedFunctionInfo> shared)
set_lazy();
set_hash_seed(isolate_->heap()->HashSeed());
+ set_is_named_expression(shared->is_named_expression());
+ set_calls_eval(shared->scope_info()->CallsEval());
+ set_compiler_hints(shared->compiler_hints());
+ set_start_position(shared->start_position());
+ set_end_position(shared->end_position());
set_stack_limit(isolate_->stack_guard()->real_climit());
set_unicode_cache(isolate_->unicode_cache());
set_language_mode(shared->language_mode());
@@ -96,6 +104,26 @@ ParseInfo::ParseInfo(Zone* zone, Handle<Script> script) : ParseInfo(zone) {
}
}
+bool ParseInfo::is_declaration() const {
+ return (compiler_hints_ & (1 << SharedFunctionInfo::kIsDeclaration)) != 0;
+}
+
+bool ParseInfo::is_arrow() const {
+ return (compiler_hints_ & (1 << SharedFunctionInfo::kIsArrow)) != 0;
+}
+
+bool ParseInfo::is_async() const {
+ return (compiler_hints_ & (1 << SharedFunctionInfo::kIsAsyncFunction)) != 0;
+}
+
+bool ParseInfo::is_default_constructor() const {
+ return (compiler_hints_ & (1 << SharedFunctionInfo::kIsDefaultConstructor)) !=
+ 0;
+}
+
+FunctionKind ParseInfo::function_kind() const {
+ return SharedFunctionInfo::FunctionKindBits::decode(compiler_hints_);
+}
FunctionEntry ParseData::GetFunctionEntry(int start) {
// The current pre-data entry must be a FunctionEntry with the given
@@ -1080,7 +1108,13 @@ FunctionLiteral* Parser::ParseLazy(Isolate* isolate, ParseInfo* info) {
stream.reset(new GenericStringUtf16CharacterStream(
source, shared_info->start_position(), shared_info->end_position()));
}
- result = DoParseLazy(isolate, info, stream.get());
+ Handle<String> name(String::cast(shared_info->name()));
+ result = DoParseLazy(isolate, info, ast_value_factory()->GetString(name),
+ stream.get());
+ if (result != nullptr) {
+ Handle<String> inferred_name(shared_info->inferred_name());
+ result->set_inferred_name(inferred_name);
+ }
}
if (FLAG_trace_parse && result != NULL) {
@@ -1091,30 +1125,27 @@ FunctionLiteral* Parser::ParseLazy(Isolate* isolate, ParseInfo* info) {
return result;
}
-static FunctionLiteral::FunctionType ComputeFunctionType(
- Handle<SharedFunctionInfo> shared_info) {
- if (shared_info->is_declaration()) {
+static FunctionLiteral::FunctionType ComputeFunctionType(ParseInfo* info) {
+ if (info->is_declaration()) {
return FunctionLiteral::kDeclaration;
- } else if (shared_info->is_named_expression()) {
+ } else if (info->is_named_expression()) {
return FunctionLiteral::kNamedExpression;
- } else if (IsConciseMethod(shared_info->kind()) ||
- IsAccessorFunction(shared_info->kind())) {
+ } else if (IsConciseMethod(info->function_kind()) ||
+ IsAccessorFunction(info->function_kind())) {
return FunctionLiteral::kAccessorOrMethod;
}
return FunctionLiteral::kAnonymousExpression;
}
FunctionLiteral* Parser::DoParseLazy(Isolate* isolate, ParseInfo* info,
+ const AstRawString* raw_name,
Utf16CharacterStream* source) {
- Handle<SharedFunctionInfo> shared_info = info->shared_info();
scanner_.Initialize(source);
DCHECK_NULL(scope_state_);
DCHECK_NULL(target_stack_);
- Handle<String> name(String::cast(shared_info->name()));
DCHECK(ast_value_factory());
fni_ = new (zone()) FuncNameInferrer(ast_value_factory(), zone());
- const AstRawString* raw_name = ast_value_factory()->GetString(name);
fni_->PushEnclosingName(raw_name);
ParsingModeScope parsing_mode(this, PARSE_EAGERLY);
@@ -1127,16 +1158,14 @@ FunctionLiteral* Parser::DoParseLazy(Isolate* isolate, ParseInfo* info,
Scope* scope = original_scope_;
DCHECK(scope);
FunctionState function_state(&function_state_, &scope_state_, scope,
- shared_info->kind());
+ info->function_kind());
DCHECK(is_sloppy(scope->language_mode()) ||
is_strict(info->language_mode()));
- DCHECK(info->language_mode() == shared_info->language_mode());
- FunctionLiteral::FunctionType function_type =
- ComputeFunctionType(shared_info);
+ FunctionLiteral::FunctionType function_type = ComputeFunctionType(info);
bool ok = true;
- if (shared_info->is_arrow()) {
- bool is_async = allow_harmony_async_await() && shared_info->is_async();
+ if (info->is_arrow()) {
+ bool is_async = allow_harmony_async_await() && info->is_async();
if (is_async) {
DCHECK(!scanner()->HasAnyLineTerminatorAfterNext());
if (!Check(Token::ASYNC)) {
@@ -1156,12 +1185,12 @@ FunctionLiteral* Parser::DoParseLazy(Isolate* isolate, ParseInfo* info,
// not passing the ScopeInfo to the Scope constructor.
// TODO(adamk): Remove these calls once the above NewScope call
// passes the ScopeInfo.
- if (shared_info->scope_info()->CallsEval()) {
+ if (info->calls_eval()) {
scope->RecordEvalCall();
}
- SetLanguageMode(scope, shared_info->language_mode());
+ SetLanguageMode(scope, info->language_mode());
- scope->set_start_position(shared_info->start_position());
+ scope->set_start_position(info->start_position());
ExpressionClassifier formals_classifier(this);
ParserFormalParameters formals(scope);
Checkpoint checkpoint(this);
@@ -1197,7 +1226,7 @@ FunctionLiteral* Parser::DoParseLazy(Isolate* isolate, ParseInfo* info,
// concise body happens to be a valid expression. This is a problem
// only for arrow functions with single expression bodies, since there
// is no end token such as "}" for normal functions.
- if (scanner()->location().end_pos == shared_info->end_position()) {
+ if (scanner()->location().end_pos == info->end_position()) {
// The pre-parser saw an arrow function here, so the full parser
// must produce a FunctionLiteral.
DCHECK(expression->IsFunctionLiteral());
@@ -1207,17 +1236,16 @@ FunctionLiteral* Parser::DoParseLazy(Isolate* isolate, ParseInfo* info,
}
}
}
- } else if (shared_info->is_default_constructor()) {
+ } else if (info->is_default_constructor()) {
DCHECK_EQ(this->scope(), scope);
result = DefaultConstructor(
- raw_name, IsSubclassConstructor(shared_info->kind()),
- shared_info->start_position(), shared_info->end_position(),
- shared_info->language_mode());
+ raw_name, IsSubclassConstructor(info->function_kind()),
+ info->start_position(), info->end_position(), info->language_mode());
} else {
result = ParseFunctionLiteral(raw_name, Scanner::Location::invalid(),
- kSkipFunctionNameCheck, shared_info->kind(),
- kNoSourcePosition, function_type,
- shared_info->language_mode(), &ok);
+ kSkipFunctionNameCheck,
+ info->function_kind(), kNoSourcePosition,
+ function_type, info->language_mode(), &ok);
}
// Make sure the results agree.
DCHECK(ok == (result != nullptr));
@@ -1225,11 +1253,6 @@ FunctionLiteral* Parser::DoParseLazy(Isolate* isolate, ParseInfo* info,
// Make sure the target stack is empty.
DCHECK_NULL(target_stack_);
-
- if (result != nullptr) {
- Handle<String> inferred_name(shared_info->inferred_name());
- result->set_inferred_name(inferred_name);
- }
return result;
}
« no previous file with comments | « src/parsing/parser.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698