Remove old preparser option and behavior from the parser.
Review URL: http://codereview.chromium.org/4244003 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@5752 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
This commit is contained in:
parent
ef06d71229
commit
7f764978ee
@ -279,7 +279,6 @@ Handle<SharedFunctionInfo> Compiler::Compile(Handle<String> source,
|
||||
// in that case too.
|
||||
ScriptDataImpl* pre_data = input_pre_data;
|
||||
if (pre_data == NULL
|
||||
&& FLAG_lazy
|
||||
&& source_length >= FLAG_min_preparse_length) {
|
||||
pre_data = ParserApi::PartialPreParse(source, NULL, extension);
|
||||
}
|
||||
|
815
src/parser.cc
815
src/parser.cc
File diff suppressed because it is too large
Load Diff
184
src/parser.h
184
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();
|
||||
uc32 current_;
|
||||
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_;
|
||||
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_;
|
||||
bool simple_;
|
||||
bool contains_anchor_;
|
||||
bool is_scanned_for_captures_;
|
||||
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).
|
||||
|
@ -262,7 +262,6 @@ class KeywordMatcher {
|
||||
};
|
||||
|
||||
|
||||
enum ParserMode { PARSE, PREPARSE };
|
||||
enum ParserLanguage { JAVASCRIPT, JSON };
|
||||
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user