Index: src/parser.h |
diff --git a/src/parser.h b/src/parser.h |
index 0f0d8a254865985d96c5ebf238b026a9ec086ada..667410b3ce3e459da2862532c751bd1f7e4fcea9 100644 |
--- a/src/parser.h |
+++ b/src/parser.h |
@@ -31,13 +31,13 @@ |
#include "allocation.h" |
#include "ast.h" |
#include "scanner.h" |
+#include "scopes.h" |
namespace v8 { |
namespace internal { |
class CompilationInfo; |
class FuncNameInferrer; |
-class ParserFactory; |
class ParserLog; |
class PositionStack; |
class Target; |
@@ -177,50 +177,20 @@ class ScriptDataImpl : public ScriptData { |
}; |
-class ParserLog BASE_EMBEDDED { |
- public: |
- virtual ~ParserLog() { } |
- |
- // Records the occurrence of a function. |
- virtual void LogFunction(int start, int end, int literals, int properties) {} |
- // Records the occurrence of a symbol in the source. The vector holds the |
- // UTF-8 encoded symbol content. |
- virtual void LogSymbol(int start, Vector<const char> symbol) {} |
- // Records the occurrence of a symbol in the source. The symbol pointer |
- // points to the UTF-8 encoded symbol content. |
- virtual void LogSymbol(int start, const char* symbol, int length) {} |
- // Return the current position in the function entry log. |
- virtual int function_position() { return 0; } |
- // Return the current position in the symbol entry log. |
- // Notice: Functions and symbols are currently logged separately. |
- virtual int symbol_position() { return 0; } |
- // Return the number of distinct symbols logged. |
- virtual int symbol_ids() { return 0; } |
- // Pauses recording. The Log-functions above will do nothing during pausing. |
- // Pauses can be nested. |
- virtual void PauseRecording() {} |
- // Ends a recording pause. |
- virtual void ResumeRecording() {} |
- // Extracts a representation of the logged data that can be used by |
- // ScriptData. |
- virtual Vector<unsigned> ExtractData() { |
- return Vector<unsigned>(); |
- }; |
-}; |
- |
- |
// Record only functions. |
-class PartialParserRecorder: public ParserLog { |
+class PartialParserRecorder { |
public: |
PartialParserRecorder(); |
- virtual void LogFunction(int start, int end, int literals, int properties) { |
+ void LogFunction(int start, int end, int literals, int properties) { |
function_store_.Add(start); |
function_store_.Add(end); |
function_store_.Add(literals); |
function_store_.Add(properties); |
} |
+ void LogSymbol(int start, const char* symbol, int length) { } |
+ |
// Logs an error message and marks the log as containing an error. |
// Further logging will be ignored, and ExtractData will return a vector |
// representing the error only. |
@@ -236,24 +206,27 @@ class PartialParserRecorder: public ParserLog { |
this->LogMessage(location, message, arguments); |
} |
- virtual int function_position() { return function_store_.size(); } |
+ int function_position() { return function_store_.size(); } |
- virtual void LogMessage(Scanner::Location loc, |
- const char* message, |
- Vector<const char*> args); |
+ void LogMessage(Scanner::Location loc, |
+ const char* message, |
+ Vector<const char*> args); |
- virtual Vector<unsigned> ExtractData(); |
+ Vector<unsigned> ExtractData(); |
- virtual void PauseRecording() { |
+ void PauseRecording() { |
pause_count_++; |
is_recording_ = false; |
} |
- virtual void ResumeRecording() { |
+ void ResumeRecording() { |
ASSERT(pause_count_ > 0); |
if (--pause_count_ == 0) is_recording_ = !has_error(); |
} |
+ int symbol_position() { return 0; } |
+ int symbol_ids() { return 0; } |
+ |
protected: |
bool has_error() { |
return static_cast<bool>(preamble_[ScriptDataImpl::kHasErrorOffset]); |
@@ -281,16 +254,16 @@ class CompleteParserRecorder: public PartialParserRecorder { |
public: |
CompleteParserRecorder(); |
- virtual void LogSymbol(int start, Vector<const char> literal); |
+ void LogSymbol(int start, Vector<const char> literal); |
- virtual void LogSymbol(int start, const char* symbol, int length) { |
+ void LogSymbol(int start, const char* symbol, int length) { |
LogSymbol(start, Vector<const char>(symbol, length)); |
} |
- virtual Vector<unsigned> ExtractData(); |
+ Vector<unsigned> ExtractData(); |
- virtual int symbol_position() { return symbol_store_.size(); } |
- virtual int symbol_ids() { return symbol_id_; } |
+ int symbol_position() { return symbol_store_.size(); } |
+ int symbol_ids() { return symbol_id_; } |
private: |
static int vector_hash(Vector<const char> string) { |
@@ -342,6 +315,8 @@ class ParserApi { |
v8::Extension* extension); |
}; |
+// ---------------------------------------------------------------------------- |
+// REGEXP PARSING |
// A BuffferedZoneList is an automatically growing list, just like (and backed |
// by) a ZoneList, that is optimized for the case of adding and removing |
@@ -557,47 +532,44 @@ class RegExpParser { |
uc32 Next(); |
FlatStringReader* in() { return in_; } |
void ScanForCaptures(); |
+ |
+ Handle<String>* error_; |
+ ZoneList<RegExpCapture*>* captures_; |
+ FlatStringReader* in_; |
uc32 current_; |
+ int next_pos_; |
+ // The capture count is only valid after we have scanned for captures. |
+ int capture_count_; |
bool has_more_; |
bool multiline_; |
- int next_pos_; |
- FlatStringReader* in_; |
- Handle<String>* error_; |
bool simple_; |
bool contains_anchor_; |
- ZoneList<RegExpCapture*>* captures_; |
bool is_scanned_for_captures_; |
- // The capture count is only valid after we have scanned for captures. |
- int capture_count_; |
bool failed_; |
}; |
+// ---------------------------------------------------------------------------- |
+// JAVASCRIPT PARSING |
class Parser { |
public: |
- Parser(Handle<Script> script, bool allow_natives_syntax, |
- v8::Extension* extension, ParserMode is_pre_parsing, |
- ParserFactory* factory, ParserLog* log, ScriptDataImpl* pre_data); |
+ Parser(Handle<Script> script, |
+ bool allow_natives_syntax, |
+ v8::Extension* extension, |
+ ScriptDataImpl* pre_data); |
virtual ~Parser() { } |
- void ReportMessage(const char* message, Vector<const char*> args); |
- virtual void ReportMessageAt(Scanner::Location loc, |
- const char* message, |
- Vector<const char*> args) = 0; |
- |
- |
// Returns NULL if parsing failed. |
FunctionLiteral* ParseProgram(Handle<String> source, |
bool in_global_context); |
+ |
FunctionLiteral* ParseLazy(Handle<SharedFunctionInfo> info); |
- // The minimum number of contiguous assignment that will |
- // be treated as an initialization block. Benchmarks show that |
- // the overhead exceeds the savings below this limit. |
- static const int kMinInitializationBlock = 3; |
+ void ReportMessageAt(Scanner::Location loc, |
+ const char* message, |
+ Vector<const char*> args); |
protected: |
- |
enum Mode { |
PARSE_LAZILY, |
PARSE_EAGERLY |
@@ -606,28 +578,9 @@ class Parser { |
// Report syntax error |
void ReportUnexpectedToken(Token::Value token); |
void ReportInvalidPreparseData(Handle<String> name, bool* ok); |
- |
- Handle<Script> script_; |
- Scanner scanner_; |
- |
- Scope* top_scope_; |
- int with_nesting_level_; |
- |
- TemporaryScope* temp_scope_; |
- Mode mode_; |
- |
- Target* target_stack_; // for break, continue statements |
- bool allow_natives_syntax_; |
- v8::Extension* extension_; |
- ParserFactory* factory_; |
- ParserLog* log_; |
- bool is_pre_parsing_; |
- ScriptDataImpl* pre_data_; |
- FuncNameInferrer* fni_; |
+ void ReportMessage(const char* message, Vector<const char*> args); |
bool inside_with() const { return with_nesting_level_ > 0; } |
- ParserFactory* factory() const { return factory_; } |
- ParserLog* log() const { return log_; } |
Scanner& scanner() { return scanner_; } |
Mode mode() const { return mode_; } |
ScriptDataImpl* pre_data() const { return pre_data_; } |
@@ -636,7 +589,7 @@ class Parser { |
// which is set to false if parsing failed; it is unchanged otherwise. |
// By making the 'exception handling' explicit, we are forced to check |
// for failure at the call sites. |
- void* ParseSourceElements(ZoneListWrapper<Statement>* processor, |
+ void* ParseSourceElements(ZoneList<Statement*>* processor, |
int end_token, bool* ok); |
Statement* ParseStatement(ZoneStringList* labels, bool* ok); |
Statement* ParseFunctionDeclaration(bool* ok); |
@@ -749,10 +702,10 @@ class Parser { |
bool* ok); |
// Parser support |
- virtual VariableProxy* Declare(Handle<String> name, Variable::Mode mode, |
- FunctionLiteral* fun, |
- bool resolve, |
- bool* ok) = 0; |
+ VariableProxy* Declare(Handle<String> name, Variable::Mode mode, |
+ FunctionLiteral* fun, |
+ bool resolve, |
+ bool* ok); |
bool TargetStackContainsLabel(Handle<String> label); |
BreakableStatement* LookupBreakTarget(Handle<String> label, bool* ok); |
@@ -760,6 +713,28 @@ class Parser { |
void RegisterTargetUse(BreakTarget* target, Target* stop); |
+ // Factory methods. |
+ |
+ Statement* EmptyStatement() { |
+ static v8::internal::EmptyStatement empty; |
+ return ∅ |
+ } |
+ |
+ Scope* NewScope(Scope* parent, Scope::Type type, bool inside_with); |
+ |
+ Handle<String> LookupSymbol(int symbol_id, |
+ Vector<const char> string); |
+ |
+ Handle<String> LookupCachedSymbol(int symbol_id, |
+ Vector<const char> string); |
+ |
+ Expression* NewCall(Expression* expression, |
+ ZoneList<Expression*>* arguments, |
+ int pos) { |
+ return new Call(expression, arguments, pos); |
+ } |
+ |
+ |
// Create a number literal. |
Literal* NewNumberLiteral(double value); |
@@ -781,6 +756,24 @@ class Parser { |
Expression* NewThrowError(Handle<String> constructor, |
Handle<String> type, |
Vector< Handle<Object> > arguments); |
+ |
+ ZoneList<Handle<String> > symbol_cache_; |
+ |
+ Handle<Script> script_; |
+ Scanner scanner_; |
+ |
+ Scope* top_scope_; |
+ int with_nesting_level_; |
+ |
+ TemporaryScope* temp_scope_; |
+ Mode mode_; |
+ |
+ Target* target_stack_; // for break, continue statements |
+ bool allow_natives_syntax_; |
+ v8::Extension* extension_; |
+ bool is_pre_parsing_; |
+ ScriptDataImpl* pre_data_; |
+ FuncNameInferrer* fni_; |
}; |
@@ -815,6 +808,9 @@ class CompileTimeValue: public AllStatic { |
}; |
+// ---------------------------------------------------------------------------- |
+// JSON PARSING |
+ |
// JSON is a subset of JavaScript, as specified in, e.g., the ECMAScript 5 |
// specification section 15.12.1 (and appendix A.8). |
// The grammar is given section 15.12.1.2 (and appendix A.8.2). |