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

Unified Diff: src/parser.h

Issue 231073002: WIP: Parser: delay string internalization. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: internalizing better Created 6 years, 7 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
Index: src/parser.h
diff --git a/src/parser.h b/src/parser.h
index 71bbfd195d01b590be438503f4978d3e104ac289..c04d045f692399fd1fa115d2698e02a91ce1d273 100644
--- a/src/parser.h
+++ b/src/parser.h
@@ -89,7 +89,7 @@ class ScriptData {
Scanner::Location MessageLocation() const;
bool IsReferenceError() const;
const char* BuildMessage() const;
- Vector<const char*> BuildArgs() const;
+ const char* BuildArg() const;
int function_count() {
int functions_size =
@@ -389,7 +389,7 @@ class ParserTraits {
typedef v8::internal::Zone Zone;
// Return types for traversing functions.
- typedef Handle<String> Identifier;
+ typedef ParserSymbolTable::Symbol* Identifier;
typedef v8::internal::Expression* Expression;
typedef Yield* YieldExpression;
typedef v8::internal::FunctionLiteral* FunctionLiteral;
@@ -421,29 +421,30 @@ class ParserTraits {
}
// Helper functions for recursive descent.
- bool IsEvalOrArguments(Handle<String> identifier) const;
+ bool IsEvalOrArguments(ParserSymbolTable::Symbol* identifier) const;
// Returns true if the expression is of type "this.foo".
static bool IsThisProperty(Expression* expression);
static bool IsIdentifier(Expression* expression);
- static Handle<String> AsIdentifier(Expression* expression) {
+ static ParserSymbolTable::Symbol* AsIdentifier(Expression* expression) {
ASSERT(IsIdentifier(expression));
- return expression->AsVariableProxy()->name();
+ return expression->AsVariableProxy()->raw_name();
}
static bool IsBoilerplateProperty(ObjectLiteral::Property* property) {
return ObjectLiteral::IsBoilerplateProperty(property);
}
- static bool IsArrayIndex(Handle<String> string, uint32_t* index) {
- return !string.is_null() && string->AsArrayIndex(index);
+ static bool IsArrayIndex(ParserSymbolTable::Symbol* string, uint32_t* index) {
+ return string != NULL && ParserSymbolTable::IsArrayIndexSlow(string, index);
}
// Functions for encapsulating the differences between parsing and preparsing;
// operations interleaved with the recursive descent.
- static void PushLiteralName(FuncNameInferrer* fni, Handle<String> id) {
+ static void PushLiteralName(FuncNameInferrer* fni,
+ ParserSymbolTable::Symbol* id) {
fni->PushLiteralName(id);
}
void PushPropertyName(FuncNameInferrer* fni, Expression* expression);
@@ -501,33 +502,37 @@ class ParserTraits {
// type. The first argument may be null (in the handle sense) in
// which case no arguments are passed to the constructor.
Expression* NewThrowSyntaxError(
- const char* type, Handle<Object> arg, int pos);
+ const char* type, ParserSymbolTable::Symbol* arg, int pos);
// Generate AST node that throws a TypeError with the given
// type. Both arguments must be non-null (in the handle sense).
- Expression* NewThrowTypeError(const char* type, Handle<Object> arg, int pos);
+ Expression* NewThrowTypeError(const char* type,
+ ParserSymbolTable::Symbol* arg, int pos);
// Generic AST generator for throwing errors from compiled code.
Expression* NewThrowError(
- Handle<String> constructor, const char* type,
- Vector<Handle<Object> > arguments, int pos);
+ ParserSymbolTable::Symbol* constructor, const char* type,
+ ParserSymbolTable::Symbol* arg, int pos);
// Reporting errors.
void ReportMessageAt(Scanner::Location source_location,
const char* message,
- Vector<const char*> args,
+ const char* arg = NULL,
bool is_reference_error = false);
void ReportMessage(const char* message,
- Vector<Handle<String> > args,
+ const char* arg = NULL,
bool is_reference_error = false);
void ReportMessageAt(Scanner::Location source_location,
const char* message,
- Vector<Handle<String> > args,
+ ParserSymbolTable::Symbol* arg,
bool is_reference_error = false);
+ void ReportMessage(const char* message,
+ ParserSymbolTable::Symbol* arg,
+ bool is_reference_error = false);
// "null" return type creators.
- static Handle<String> EmptyIdentifier() {
- return Handle<String>();
+ static ParserSymbolTable::Symbol* EmptyIdentifier() {
+ return NULL;
}
static Expression* EmptyExpression() {
return NULL;
@@ -545,16 +550,16 @@ class ParserTraits {
AstNodeFactory<AstConstructionVisitor>* factory);
// Producing data during the recursive descent.
- Handle<String> GetSymbol(Scanner* scanner = NULL);
- Handle<String> NextLiteralString(Scanner* scanner,
- PretenureFlag tenured);
+ ParserSymbolTable::Symbol* GetSymbol(Scanner* scanner);
+ ParserSymbolTable::Symbol* GetNextSymbol(Scanner* scanner);
+
Expression* ThisExpression(Scope* scope,
AstNodeFactory<AstConstructionVisitor>* factory);
Literal* ExpressionFromLiteral(
Token::Value token, int pos, Scanner* scanner,
AstNodeFactory<AstConstructionVisitor>* factory);
Expression* ExpressionFromIdentifier(
- Handle<String> name, int pos, Scope* scope,
+ ParserSymbolTable::Symbol* name, int pos, Scope* scope,
AstNodeFactory<AstConstructionVisitor>* factory);
Expression* ExpressionFromString(
int pos, Scanner* scanner,
@@ -572,7 +577,7 @@ class ParserTraits {
// Temporary glue; these functions will move to ParserBase.
Expression* ParseV8Intrinsic(bool* ok);
FunctionLiteral* ParseFunctionLiteral(
- Handle<String> name,
+ ParserSymbolTable::Symbol* name,
Scanner::Location function_name_location,
bool name_is_strict_reserved,
bool is_generator,
@@ -643,7 +648,7 @@ class Parser : public ParserBase<ParserTraits> {
Handle<String> source);
// Report syntax error
- void ReportInvalidCachedData(Handle<String> name, bool* ok);
+ void ReportInvalidCachedData(ParserSymbolTable::Symbol* name, bool* ok);
void SetCachedData(ScriptData** data,
CachedDataMode cached_data_mode) {
@@ -670,8 +675,10 @@ class Parser : public ParserBase<ParserTraits> {
// for failure at the call sites.
void* ParseSourceElements(ZoneList<Statement*>* processor, int end_token,
bool is_eval, bool is_global, bool* ok);
- Statement* ParseModuleElement(ZoneStringList* labels, bool* ok);
- Statement* ParseModuleDeclaration(ZoneStringList* names, bool* ok);
+ Statement* ParseModuleElement(ZoneList<ParserSymbolTable::Symbol*>* labels,
+ bool* ok);
+ Statement* ParseModuleDeclaration(ZoneList<ParserSymbolTable::Symbol*>* names,
+ bool* ok);
Module* ParseModule(bool* ok);
Module* ParseModuleLiteral(bool* ok);
Module* ParseModulePath(bool* ok);
@@ -680,38 +687,49 @@ class Parser : public ParserBase<ParserTraits> {
Module* ParseModuleSpecifier(bool* ok);
Block* ParseImportDeclaration(bool* ok);
Statement* ParseExportDeclaration(bool* ok);
- Statement* ParseBlockElement(ZoneStringList* labels, bool* ok);
- Statement* ParseStatement(ZoneStringList* labels, bool* ok);
- Statement* ParseFunctionDeclaration(ZoneStringList* names, bool* ok);
+ Statement* ParseBlockElement(ZoneList<ParserSymbolTable::Symbol*>* labels,
+ bool* ok);
+ Statement* ParseStatement(ZoneList<ParserSymbolTable::Symbol*>* labels,
+ bool* ok);
+ Statement* ParseFunctionDeclaration(
+ ZoneList<ParserSymbolTable::Symbol*>* names, bool* ok);
Statement* ParseNativeDeclaration(bool* ok);
- Block* ParseBlock(ZoneStringList* labels, bool* ok);
+ Block* ParseBlock(ZoneList<ParserSymbolTable::Symbol*>* labels, bool* ok);
Block* ParseVariableStatement(VariableDeclarationContext var_context,
- ZoneStringList* names,
+ ZoneList<ParserSymbolTable::Symbol*>* names,
bool* ok);
Block* ParseVariableDeclarations(VariableDeclarationContext var_context,
VariableDeclarationProperties* decl_props,
- ZoneStringList* names,
- Handle<String>* out,
+ ZoneList<ParserSymbolTable::Symbol*>* names,
+ ParserSymbolTable::Symbol** out,
bool* ok);
- Statement* ParseExpressionOrLabelledStatement(ZoneStringList* labels,
- bool* ok);
- IfStatement* ParseIfStatement(ZoneStringList* labels, bool* ok);
+ Statement* ParseExpressionOrLabelledStatement(
+ ZoneList<ParserSymbolTable::Symbol*>* labels, bool* ok);
+ IfStatement* ParseIfStatement(ZoneList<ParserSymbolTable::Symbol*>* labels,
+ bool* ok);
Statement* ParseContinueStatement(bool* ok);
- Statement* ParseBreakStatement(ZoneStringList* labels, bool* ok);
+ Statement* ParseBreakStatement(ZoneList<ParserSymbolTable::Symbol*>* labels,
+ bool* ok);
Statement* ParseReturnStatement(bool* ok);
- Statement* ParseWithStatement(ZoneStringList* labels, bool* ok);
+ Statement* ParseWithStatement(ZoneList<ParserSymbolTable::Symbol*>* labels,
+ bool* ok);
CaseClause* ParseCaseClause(bool* default_seen_ptr, bool* ok);
- SwitchStatement* ParseSwitchStatement(ZoneStringList* labels, bool* ok);
- DoWhileStatement* ParseDoWhileStatement(ZoneStringList* labels, bool* ok);
- WhileStatement* ParseWhileStatement(ZoneStringList* labels, bool* ok);
- Statement* ParseForStatement(ZoneStringList* labels, bool* ok);
+ SwitchStatement* ParseSwitchStatement(
+ ZoneList<ParserSymbolTable::Symbol*>* labels, bool* ok);
+ DoWhileStatement* ParseDoWhileStatement(
+ ZoneList<ParserSymbolTable::Symbol*>* labels, bool* ok);
+ WhileStatement* ParseWhileStatement(
+ ZoneList<ParserSymbolTable::Symbol*>* labels, bool* ok);
+ Statement* ParseForStatement(ZoneList<ParserSymbolTable::Symbol*>* labels,
+ bool* ok);
Statement* ParseThrowStatement(bool* ok);
Expression* MakeCatchContext(Handle<String> id, VariableProxy* value);
TryStatement* ParseTryStatement(bool* ok);
DebuggerStatement* ParseDebuggerStatement(bool* ok);
// Support for hamony block scoped bindings.
- Block* ParseScopedBlock(ZoneStringList* labels, bool* ok);
+ Block* ParseScopedBlock(ZoneList<ParserSymbolTable::Symbol*>* labels,
+ bool* ok);
// Initialize the components of a for-in / for-of statement.
void InitializeForEachStatement(ForEachStatement* stmt,
@@ -720,7 +738,7 @@ class Parser : public ParserBase<ParserTraits> {
Statement* body);
FunctionLiteral* ParseFunctionLiteral(
- Handle<String> name,
+ ParserSymbolTable::Symbol* name,
Scanner::Location function_name_location,
bool name_is_strict_reserved,
bool is_generator,
@@ -748,14 +766,17 @@ class Parser : public ParserBase<ParserTraits> {
void CheckConflictingVarDeclarations(Scope* scope, bool* ok);
// Parser support
- VariableProxy* NewUnresolved(Handle<String> name,
+ template<class SymbolType>
+ VariableProxy* NewUnresolved(SymbolType name,
VariableMode mode,
Interface* interface);
void Declare(Declaration* declaration, bool resolve, bool* ok);
- bool TargetStackContainsLabel(Handle<String> label);
- BreakableStatement* LookupBreakTarget(Handle<String> label, bool* ok);
- IterationStatement* LookupContinueTarget(Handle<String> label, bool* ok);
+ bool TargetStackContainsLabel(ParserSymbolTable::Symbol* label);
+ BreakableStatement* LookupBreakTarget(ParserSymbolTable::Symbol* label,
+ bool* ok);
+ IterationStatement* LookupContinueTarget(ParserSymbolTable::Symbol* label,
+ bool* ok);
void RegisterTargetUse(Label* target, Target* stop);
@@ -765,7 +786,7 @@ class Parser : public ParserBase<ParserTraits> {
// Skip over a lazy function, either using cached data if we have it, or
// by parsing the function with PreParser. Consumes the ending }.
- void SkipLazyFunctionBody(Handle<String> function_name,
+ void SkipLazyFunctionBody(ParserSymbolTable::Symbol* function_name,
int* materialized_literal_count,
int* expected_property_count,
bool* ok);
@@ -774,12 +795,11 @@ class Parser : public ParserBase<ParserTraits> {
SingletonLogger* logger);
// Consumes the ending }.
- ZoneList<Statement*>* ParseEagerFunctionBody(Handle<String> function_name,
- int pos,
- Variable* fvar,
- Token::Value fvar_init_op,
- bool is_generator,
- bool* ok);
+ ZoneList<Statement*>* ParseEagerFunctionBody(
+ ParserSymbolTable::Symbol* function_name, int pos, Variable* fvar,
+ Token::Value fvar_init_op, bool is_generator, bool* ok);
+
+ void CheckPendingError();
Isolate* isolate_;
@@ -790,8 +810,17 @@ class Parser : public ParserBase<ParserTraits> {
Target* target_stack_; // for break, continue statements
ScriptData** cached_data_;
CachedDataMode cached_data_mode_;
+ ParserSymbolTable* symbol_table_;
CompilationInfo* info_;
+
+ // Pending error
+ bool has_pending_error_;
+ Scanner::Location pending_location_;
+ const char* pending_message_;
+ ParserSymbolTable::Symbol* pending_arg_;
+ const char* pending_char_arg_;
+ bool pending_is_reference_error_;
};

Powered by Google App Engine
This is Rietveld 408576698