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

Side by Side Diff: src/parser.cc

Issue 2840018: [Isolates] Moved more compilation-related globals (builtins, runtime, &c.)... (Closed) Base URL: http://v8.googlecode.com/svn/branches/experimental/isolates/
Patch Set: rebase Created 10 years, 6 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright 2010 the V8 project authors. All rights reserved. 1 // Copyright 2010 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without 2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are 3 // modification, are permitted provided that the following conditions are
4 // met: 4 // met:
5 // 5 //
6 // * Redistributions of source code must retain the above copyright 6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer. 7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above 8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following 9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided 10 // disclaimer in the documentation and/or other materials provided
(...skipping 799 matching lines...) Expand 10 before | Expand all | Expand 10 after
810 810
811 virtual Handle<String> LookupSymbol(const char* string, int length) { 811 virtual Handle<String> LookupSymbol(const char* string, int length) {
812 return Handle<String>(); 812 return Handle<String>();
813 } 813 }
814 814
815 virtual Handle<String> EmptySymbol() { 815 virtual Handle<String> EmptySymbol() {
816 return Handle<String>(); 816 return Handle<String>();
817 } 817 }
818 818
819 virtual Expression* NewProperty(Expression* obj, Expression* key, int pos) { 819 virtual Expression* NewProperty(Expression* obj, Expression* key, int pos) {
820 if (obj == VariableProxySentinel::this_proxy()) { 820 Isolate* isolate = Isolate::Current();
821 return Property::this_property(); 821 if (obj == isolate->ast_sentinels()->this_proxy()) {
822 return isolate->ast_sentinels()->this_property();
822 } else { 823 } else {
823 return ValidLeftHandSideSentinel::instance(); 824 return isolate->ast_sentinels()->valid_left_hand_side_sentinel();
824 } 825 }
825 } 826 }
826 827
827 virtual Expression* NewCall(Expression* expression, 828 virtual Expression* NewCall(Expression* expression,
828 ZoneList<Expression*>* arguments, 829 ZoneList<Expression*>* arguments,
829 int pos) { 830 int pos) {
830 return Call::sentinel(); 831 return Isolate::Current()->ast_sentinels()->call_sentinel();
831 } 832 }
832 833
833 virtual Statement* EmptyStatement() { 834 virtual Statement* EmptyStatement() {
834 return NULL; 835 return NULL;
835 } 836 }
836 837
837 template <typename T> ZoneListWrapper<T> NewList(int size) { 838 template <typename T> ZoneListWrapper<T> NewList(int size) {
838 return is_pre_parsing_ ? ZoneListWrapper<T>() : ZoneListWrapper<T>(size); 839 return is_pre_parsing_ ? ZoneListWrapper<T>() : ZoneListWrapper<T>(size);
839 } 840 }
840 841
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
873 virtual Expression* NewProperty(Expression* obj, Expression* key, int pos) { 874 virtual Expression* NewProperty(Expression* obj, Expression* key, int pos) {
874 return new Property(obj, key, pos); 875 return new Property(obj, key, pos);
875 } 876 }
876 877
877 virtual Expression* NewCall(Expression* expression, 878 virtual Expression* NewCall(Expression* expression,
878 ZoneList<Expression*>* arguments, 879 ZoneList<Expression*>* arguments,
879 int pos) { 880 int pos) {
880 return new Call(expression, arguments, pos); 881 return new Call(expression, arguments, pos);
881 } 882 }
882 883
883 virtual Statement* EmptyStatement(); 884 virtual Statement* EmptyStatement() {
885 return Isolate::Current()->ast_sentinels()->empty_statement();
886 }
884 }; 887 };
885 888
886 889
887 class ParserRecorder: public ParserLog { 890 class ParserRecorder: public ParserLog {
888 public: 891 public:
889 ParserRecorder(); 892 ParserRecorder();
890 virtual FunctionEntry LogFunction(int start); 893 virtual FunctionEntry LogFunction(int start);
891 virtual void LogError() { } 894 virtual void LogError() { }
892 virtual void LogMessage(Scanner::Location loc, 895 virtual void LogMessage(Scanner::Location loc,
893 const char* message, 896 const char* message,
(...skipping 172 matching lines...) Expand 10 before | Expand all | Expand 10 after
1066 1069
1067 1070
1068 Scope* AstBuildingParserFactory::NewScope(Scope* parent, Scope::Type type, 1071 Scope* AstBuildingParserFactory::NewScope(Scope* parent, Scope::Type type,
1069 bool inside_with) { 1072 bool inside_with) {
1070 Scope* result = new Scope(parent, type); 1073 Scope* result = new Scope(parent, type);
1071 result->Initialize(inside_with); 1074 result->Initialize(inside_with);
1072 return result; 1075 return result;
1073 } 1076 }
1074 1077
1075 1078
1076 Statement* AstBuildingParserFactory::EmptyStatement() {
1077 // Use a statically allocated empty statement singleton to avoid
1078 // allocating lots and lots of empty statements.
1079 static v8::internal::EmptyStatement empty;
1080 return &empty;
1081 }
1082
1083
1084 Scope* ParserFactory::NewScope(Scope* parent, Scope::Type type, 1079 Scope* ParserFactory::NewScope(Scope* parent, Scope::Type type,
1085 bool inside_with) { 1080 bool inside_with) {
1086 ASSERT(parent != NULL); 1081 ASSERT(parent != NULL);
1087 parent->type_ = type; 1082 parent->type_ = type;
1088 return parent; 1083 return parent;
1089 } 1084 }
1090 1085
1091 1086
1092 VariableProxy* PreParser::Declare(Handle<String> name, Variable::Mode mode, 1087 VariableProxy* PreParser::Declare(Handle<String> name, Variable::Mode mode,
1093 FunctionLiteral* fun, bool resolve, 1088 FunctionLiteral* fun, bool resolve,
(...skipping 942 matching lines...) Expand 10 before | Expand all | Expand 10 after
2036 2031
2037 2032
2038 // If the variable declaration declares exactly one non-const 2033 // If the variable declaration declares exactly one non-const
2039 // variable, then *var is set to that variable. In all other cases, 2034 // variable, then *var is set to that variable. In all other cases,
2040 // *var is untouched; in particular, it is the caller's responsibility 2035 // *var is untouched; in particular, it is the caller's responsibility
2041 // to initialize it properly. This mechanism is used for the parsing 2036 // to initialize it properly. This mechanism is used for the parsing
2042 // of 'for-in' loops. 2037 // of 'for-in' loops.
2043 Block* Parser::ParseVariableDeclarations(bool accept_IN, 2038 Block* Parser::ParseVariableDeclarations(bool accept_IN,
2044 Expression** var, 2039 Expression** var,
2045 bool* ok) { 2040 bool* ok) {
2041 Isolate* isolate = Isolate::Current();
2046 // VariableDeclarations :: 2042 // VariableDeclarations ::
2047 // ('var' | 'const') (Identifier ('=' AssignmentExpression)?)+[','] 2043 // ('var' | 'const') (Identifier ('=' AssignmentExpression)?)+[',']
2048 2044
2049 Variable::Mode mode = Variable::VAR; 2045 Variable::Mode mode = Variable::VAR;
2050 bool is_const = false; 2046 bool is_const = false;
2051 if (peek() == Token::VAR) { 2047 if (peek() == Token::VAR) {
2052 Consume(Token::VAR); 2048 Consume(Token::VAR);
2053 } else if (peek() == Token::CONST) { 2049 } else if (peek() == Token::CONST) {
2054 Consume(Token::CONST); 2050 Consume(Token::CONST);
2055 mode = Variable::CONST; 2051 mode = Variable::CONST;
(...skipping 149 matching lines...) Expand 10 before | Expand all | Expand 10 after
2205 Assignment* assignment = NEW(Assignment(op, last_var, value, position)); 2201 Assignment* assignment = NEW(Assignment(op, last_var, value, position));
2206 if (block) block->AddStatement(NEW(ExpressionStatement(assignment))); 2202 if (block) block->AddStatement(NEW(ExpressionStatement(assignment)));
2207 } 2203 }
2208 } while (peek() == Token::COMMA); 2204 } while (peek() == Token::COMMA);
2209 2205
2210 if (!is_const && nvars == 1) { 2206 if (!is_const && nvars == 1) {
2211 // We have a single, non-const variable. 2207 // We have a single, non-const variable.
2212 if (is_pre_parsing_) { 2208 if (is_pre_parsing_) {
2213 // If we're preparsing then we need to set the var to something 2209 // If we're preparsing then we need to set the var to something
2214 // in order for for-in loops to parse correctly. 2210 // in order for for-in loops to parse correctly.
2215 *var = ValidLeftHandSideSentinel::instance(); 2211 *var = isolate->ast_sentinels()->valid_left_hand_side_sentinel();
2216 } else { 2212 } else {
2217 ASSERT(last_var != NULL); 2213 ASSERT(last_var != NULL);
2218 *var = last_var; 2214 *var = last_var;
2219 } 2215 }
2220 } 2216 }
2221 2217
2222 return block; 2218 return block;
2223 } 2219 }
2224 2220
2225 2221
(...skipping 1031 matching lines...) Expand 10 before | Expand all | Expand 10 after
3257 Vector<const char*>::empty()); 3253 Vector<const char*>::empty());
3258 default: 3254 default:
3259 const char* name = Token::String(token); 3255 const char* name = Token::String(token);
3260 ASSERT(name != NULL); 3256 ASSERT(name != NULL);
3261 ReportMessage("unexpected_token", Vector<const char*>(&name, 1)); 3257 ReportMessage("unexpected_token", Vector<const char*>(&name, 1));
3262 } 3258 }
3263 } 3259 }
3264 3260
3265 3261
3266 Expression* Parser::ParsePrimaryExpression(bool* ok) { 3262 Expression* Parser::ParsePrimaryExpression(bool* ok) {
3263 Isolate* isolate = Isolate::Current();
3267 // PrimaryExpression :: 3264 // PrimaryExpression ::
3268 // 'this' 3265 // 'this'
3269 // 'null' 3266 // 'null'
3270 // 'true' 3267 // 'true'
3271 // 'false' 3268 // 'false'
3272 // Identifier 3269 // Identifier
3273 // Number 3270 // Number
3274 // String 3271 // String
3275 // ArrayLiteral 3272 // ArrayLiteral
3276 // ObjectLiteral 3273 // ObjectLiteral
3277 // RegExpLiteral 3274 // RegExpLiteral
3278 // '(' Expression ')' 3275 // '(' Expression ')'
3279 3276
3280 Expression* result = NULL; 3277 Expression* result = NULL;
3281 switch (peek()) { 3278 switch (peek()) {
3282 case Token::THIS: { 3279 case Token::THIS: {
3283 Consume(Token::THIS); 3280 Consume(Token::THIS);
3284 if (is_pre_parsing_) { 3281 if (is_pre_parsing_) {
3285 result = VariableProxySentinel::this_proxy(); 3282 result = isolate->ast_sentinels()->this_proxy();
3286 } else { 3283 } else {
3287 VariableProxy* recv = top_scope_->receiver(); 3284 VariableProxy* recv = top_scope_->receiver();
3288 result = recv; 3285 result = recv;
3289 } 3286 }
3290 break; 3287 break;
3291 } 3288 }
3292 3289
3293 case Token::NULL_LITERAL: 3290 case Token::NULL_LITERAL:
3294 Consume(Token::NULL_LITERAL); 3291 Consume(Token::NULL_LITERAL);
3295 result = NEW(Literal(Factory::null_value())); 3292 result = NEW(Literal(Factory::null_value()));
3296 break; 3293 break;
3297 3294
3298 case Token::TRUE_LITERAL: 3295 case Token::TRUE_LITERAL:
3299 Consume(Token::TRUE_LITERAL); 3296 Consume(Token::TRUE_LITERAL);
3300 result = NEW(Literal(Factory::true_value())); 3297 result = NEW(Literal(Factory::true_value()));
3301 break; 3298 break;
3302 3299
3303 case Token::FALSE_LITERAL: 3300 case Token::FALSE_LITERAL:
3304 Consume(Token::FALSE_LITERAL); 3301 Consume(Token::FALSE_LITERAL);
3305 result = NEW(Literal(Factory::false_value())); 3302 result = NEW(Literal(Factory::false_value()));
3306 break; 3303 break;
3307 3304
3308 case Token::IDENTIFIER: { 3305 case Token::IDENTIFIER: {
3309 Handle<String> name = ParseIdentifier(CHECK_OK); 3306 Handle<String> name = ParseIdentifier(CHECK_OK);
3310 if (is_pre_parsing_) { 3307 if (is_pre_parsing_) {
3311 result = VariableProxySentinel::identifier_proxy(); 3308 result = isolate->ast_sentinels()->identifier_proxy();
3312 } else { 3309 } else {
3313 result = top_scope_->NewUnresolved(name, inside_with()); 3310 result = top_scope_->NewUnresolved(name, inside_with());
3314 } 3311 }
3315 break; 3312 break;
3316 } 3313 }
3317 3314
3318 case Token::NUMBER: { 3315 case Token::NUMBER: {
3319 Consume(Token::NUMBER); 3316 Consume(Token::NUMBER);
3320 double value = 3317 double value =
3321 StringToDouble(scanner_.literal_string(), ALLOW_HEX | ALLOW_OCTALS); 3318 StringToDouble(scanner_.literal_string(), ALLOW_HEX | ALLOW_OCTALS);
(...skipping 539 matching lines...) Expand 10 before | Expand all | Expand 10 after
3861 } 3858 }
3862 } 3859 }
3863 3860
3864 3861
3865 Expression* Parser::ParseV8Intrinsic(bool* ok) { 3862 Expression* Parser::ParseV8Intrinsic(bool* ok) {
3866 // CallRuntime :: 3863 // CallRuntime ::
3867 // '%' Identifier Arguments 3864 // '%' Identifier Arguments
3868 3865
3869 Expect(Token::MOD, CHECK_OK); 3866 Expect(Token::MOD, CHECK_OK);
3870 Handle<String> name = ParseIdentifier(CHECK_OK); 3867 Handle<String> name = ParseIdentifier(CHECK_OK);
3871 Runtime::Function* function = 3868 const Runtime::Function* function =
3872 Runtime::FunctionForName(scanner_.literal_string()); 3869 Runtime::FunctionForName(scanner_.literal_string());
3873 ZoneList<Expression*>* args = ParseArguments(CHECK_OK); 3870 ZoneList<Expression*>* args = ParseArguments(CHECK_OK);
3874 if (function == NULL && extension_ != NULL) { 3871 if (function == NULL && extension_ != NULL) {
3875 // The extension structures are only accessible while parsing the 3872 // The extension structures are only accessible while parsing the
3876 // very first time not when reparsing because of lazy compilation. 3873 // very first time not when reparsing because of lazy compilation.
3877 top_scope_->ForceEagerCompilation(); 3874 top_scope_->ForceEagerCompilation();
3878 } 3875 }
3879 3876
3880 // Check for built-in macros. 3877 // Check for built-in macros.
3881 if (!is_pre_parsing_) { 3878 if (!is_pre_parsing_) {
(...skipping 778 matching lines...) Expand 10 before | Expand all | Expand 10 after
4660 Advance(); 4657 Advance();
4661 } else if (FLAG_regexp_possessive_quantifier && current() == '+') { 4658 } else if (FLAG_regexp_possessive_quantifier && current() == '+') {
4662 // FLAG_regexp_possessive_quantifier is a debug-only flag. 4659 // FLAG_regexp_possessive_quantifier is a debug-only flag.
4663 type = RegExpQuantifier::POSSESSIVE; 4660 type = RegExpQuantifier::POSSESSIVE;
4664 Advance(); 4661 Advance();
4665 } 4662 }
4666 builder->AddQuantifierToAtom(min, max, type); 4663 builder->AddQuantifierToAtom(min, max, type);
4667 } 4664 }
4668 } 4665 }
4669 4666
4670 class SourceCharacter {
4671 public:
4672 static bool Is(uc32 c) {
4673 switch (c) {
4674 // case ']': case '}':
4675 // In spidermonkey and jsc these are treated as source characters
4676 // so we do too.
4677 case '^': case '$': case '\\': case '.': case '*': case '+':
4678 case '?': case '(': case ')': case '[': case '{': case '|':
4679 case RegExpParser::kEndMarker:
4680 return false;
4681 default:
4682 return true;
4683 }
4684 }
4685 };
4686
4687
4688 static unibrow::Predicate<SourceCharacter> source_character;
4689
4690
4691 static inline bool IsSourceCharacter(uc32 c) {
4692 return source_character.get(c);
4693 }
4694 4667
4695 #ifdef DEBUG 4668 #ifdef DEBUG
4696 // Currently only used in an ASSERT. 4669 // Currently only used in an ASSERT.
4697 static bool IsSpecialClassEscape(uc32 c) { 4670 static bool IsSpecialClassEscape(uc32 c) {
4698 switch (c) { 4671 switch (c) {
4699 case 'd': case 'D': 4672 case 'd': case 'D':
4700 case 's': case 'S': 4673 case 's': case 'S':
4701 case 'w': case 'W': 4674 case 'w': case 'W':
4702 return true; 4675 return true;
4703 default: 4676 default:
(...skipping 349 matching lines...) Expand 10 before | Expand all | Expand 10 after
5053 return new RegExpCharacterClass(ranges, is_negated); 5026 return new RegExpCharacterClass(ranges, is_negated);
5054 } 5027 }
5055 5028
5056 5029
5057 // ---------------------------------------------------------------------------- 5030 // ----------------------------------------------------------------------------
5058 // The Parser interface. 5031 // The Parser interface.
5059 5032
5060 // MakeAST() is just a wrapper for the corresponding Parser calls 5033 // MakeAST() is just a wrapper for the corresponding Parser calls
5061 // so we don't have to expose the entire Parser class in the .h file. 5034 // so we don't have to expose the entire Parser class in the .h file.
5062 5035
5063 static bool always_allow_natives_syntax = false;
5064
5065 5036
5066 ParserMessage::~ParserMessage() { 5037 ParserMessage::~ParserMessage() {
5067 for (int i = 0; i < args().length(); i++) 5038 for (int i = 0; i < args().length(); i++)
5068 DeleteArray(args()[i]); 5039 DeleteArray(args()[i]);
5069 DeleteArray(args().start()); 5040 DeleteArray(args().start());
5070 } 5041 }
5071 5042
5072 5043
5073 ScriptDataImpl::~ScriptDataImpl() { 5044 ScriptDataImpl::~ScriptDataImpl() {
5074 store_.Dispose(); 5045 store_.Dispose();
(...skipping 13 matching lines...) Expand all
5088 bool ScriptDataImpl::HasError() { 5059 bool ScriptDataImpl::HasError() {
5089 return has_error(); 5060 return has_error();
5090 } 5061 }
5091 5062
5092 5063
5093 ScriptDataImpl* PreParse(Handle<String> source, 5064 ScriptDataImpl* PreParse(Handle<String> source,
5094 unibrow::CharacterStream* stream, 5065 unibrow::CharacterStream* stream,
5095 v8::Extension* extension) { 5066 v8::Extension* extension) {
5096 Handle<Script> no_script; 5067 Handle<Script> no_script;
5097 bool allow_natives_syntax = 5068 bool allow_natives_syntax =
5098 always_allow_natives_syntax || 5069 Isolate::Current()->always_allow_natives_syntax() ||
5099 FLAG_allow_natives_syntax || 5070 FLAG_allow_natives_syntax ||
5100 Isolate::Current()->bootstrapper()->IsActive(); 5071 Isolate::Current()->bootstrapper()->IsActive();
5101 PreParser parser(no_script, allow_natives_syntax, extension); 5072 PreParser parser(no_script, allow_natives_syntax, extension);
5102 if (!parser.PreParseProgram(source, stream)) return NULL; 5073 if (!parser.PreParseProgram(source, stream)) return NULL;
5103 // The list owns the backing store so we need to clone the vector. 5074 // The list owns the backing store so we need to clone the vector.
5104 // That way, the result will be exactly the right size rather than 5075 // That way, the result will be exactly the right size rather than
5105 // the expected 50% too large. 5076 // the expected 50% too large.
5106 Vector<unsigned> store = parser.recorder()->store()->ToVector().Clone(); 5077 Vector<unsigned> store = parser.recorder()->store()->ToVector().Clone();
5107 return new ScriptDataImpl(store); 5078 return new ScriptDataImpl(store);
5108 } 5079 }
(...skipping 20 matching lines...) Expand all
5129 return !parser.failed(); 5100 return !parser.failed();
5130 } 5101 }
5131 5102
5132 5103
5133 FunctionLiteral* MakeAST(bool compile_in_global_context, 5104 FunctionLiteral* MakeAST(bool compile_in_global_context,
5134 Handle<Script> script, 5105 Handle<Script> script,
5135 v8::Extension* extension, 5106 v8::Extension* extension,
5136 ScriptDataImpl* pre_data, 5107 ScriptDataImpl* pre_data,
5137 bool is_json) { 5108 bool is_json) {
5138 bool allow_natives_syntax = 5109 bool allow_natives_syntax =
5139 always_allow_natives_syntax || 5110 Isolate::Current()->always_allow_natives_syntax() ||
5140 FLAG_allow_natives_syntax || 5111 FLAG_allow_natives_syntax ||
5141 Isolate::Current()->bootstrapper()->IsActive(); 5112 Isolate::Current()->bootstrapper()->IsActive();
5142 AstBuildingParser parser(script, allow_natives_syntax, extension, pre_data); 5113 AstBuildingParser parser(script, allow_natives_syntax, extension, pre_data);
5143 if (pre_data != NULL && pre_data->has_error()) { 5114 if (pre_data != NULL && pre_data->has_error()) {
5144 Scanner::Location loc = pre_data->MessageLocation(); 5115 Scanner::Location loc = pre_data->MessageLocation();
5145 const char* message = pre_data->BuildMessage(); 5116 const char* message = pre_data->BuildMessage();
5146 Vector<const char*> args = pre_data->BuildArgs(); 5117 Vector<const char*> args = pre_data->BuildArgs();
5147 parser.ReportMessageAt(loc, message, args); 5118 parser.ReportMessageAt(loc, message, args);
5148 DeleteArray(message); 5119 DeleteArray(message);
5149 for (int i = 0; i < args.length(); i++) { 5120 for (int i = 0; i < args.length(); i++) {
(...skipping 12 matching lines...) Expand all
5162 } 5133 }
5163 return result; 5134 return result;
5164 } 5135 }
5165 5136
5166 5137
5167 FunctionLiteral* MakeLazyAST(Handle<Script> script, 5138 FunctionLiteral* MakeLazyAST(Handle<Script> script,
5168 Handle<String> name, 5139 Handle<String> name,
5169 int start_position, 5140 int start_position,
5170 int end_position, 5141 int end_position,
5171 bool is_expression) { 5142 bool is_expression) {
5172 bool allow_natives_syntax_before = always_allow_natives_syntax; 5143 bool allow_natives_syntax_before =
5173 always_allow_natives_syntax = true; 5144 Isolate::Current()->always_allow_natives_syntax();
5145 Isolate::Current()->set_always_allow_natives_syntax(true);
5174 AstBuildingParser parser(script, true, NULL, NULL); // always allow 5146 AstBuildingParser parser(script, true, NULL, NULL); // always allow
5175 always_allow_natives_syntax = allow_natives_syntax_before; 5147 Isolate::Current()->set_always_allow_natives_syntax(
5148 allow_natives_syntax_before);
5176 // Parse the function by pointing to the function source in the script source. 5149 // Parse the function by pointing to the function source in the script source.
5177 Handle<String> script_source(String::cast(script->source())); 5150 Handle<String> script_source(String::cast(script->source()));
5178 FunctionLiteral* result = 5151 FunctionLiteral* result =
5179 parser.ParseLazy(script_source, name, 5152 parser.ParseLazy(script_source, name,
5180 start_position, end_position, is_expression); 5153 start_position, end_position, is_expression);
5181 return result; 5154 return result;
5182 } 5155 }
5183 5156
5184 5157
5185 #undef NEW 5158 #undef NEW
5186 5159
5187 5160
5188 } } // namespace v8::internal 5161 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/messages.cc ('k') | src/prettyprinter.h » ('j') | src/runtime.h » ('J')

Powered by Google App Engine
This is Rietveld 408576698