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

Side by Side Diff: src/parser.cc

Issue 6713074: Require an isolate parameter for most external reference creation to (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Further cleanup Created 9 years, 9 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
« no previous file with comments | « src/parser.h ('k') | src/serialize.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 234 matching lines...) Expand 10 before | Expand all | Expand 10 after
245 LAST(ADD_TERM); 245 LAST(ADD_TERM);
246 } 246 }
247 247
248 248
249 // A temporary scope stores information during parsing, just like 249 // A temporary scope stores information during parsing, just like
250 // a plain scope. However, temporary scopes are not kept around 250 // a plain scope. However, temporary scopes are not kept around
251 // after parsing or referenced by syntax trees so they can be stack- 251 // after parsing or referenced by syntax trees so they can be stack-
252 // allocated and hence used by the pre-parser. 252 // allocated and hence used by the pre-parser.
253 class TemporaryScope BASE_EMBEDDED { 253 class TemporaryScope BASE_EMBEDDED {
254 public: 254 public:
255 explicit TemporaryScope(TemporaryScope** variable); 255 TemporaryScope(TemporaryScope** variable, Isolate* isolate);
256 ~TemporaryScope(); 256 ~TemporaryScope();
257 257
258 int NextMaterializedLiteralIndex() { 258 int NextMaterializedLiteralIndex() {
259 int next_index = 259 int next_index =
260 materialized_literal_count_ + JSFunction::kLiteralsPrefixSize; 260 materialized_literal_count_ + JSFunction::kLiteralsPrefixSize;
261 materialized_literal_count_++; 261 materialized_literal_count_++;
262 return next_index; 262 return next_index;
263 } 263 }
264 int materialized_literal_count() { return materialized_literal_count_; } 264 int materialized_literal_count() { return materialized_literal_count_; }
265 265
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
299 299
300 // Captures the number of loops inside the scope. 300 // Captures the number of loops inside the scope.
301 int loop_count_; 301 int loop_count_;
302 302
303 // Bookkeeping 303 // Bookkeeping
304 TemporaryScope** variable_; 304 TemporaryScope** variable_;
305 TemporaryScope* parent_; 305 TemporaryScope* parent_;
306 }; 306 };
307 307
308 308
309 TemporaryScope::TemporaryScope(TemporaryScope** variable) 309 TemporaryScope::TemporaryScope(TemporaryScope** variable, Isolate* isolate)
310 : materialized_literal_count_(0), 310 : materialized_literal_count_(0),
311 expected_property_count_(0), 311 expected_property_count_(0),
312 only_simple_this_property_assignments_(false), 312 only_simple_this_property_assignments_(false),
313 this_property_assignments_( 313 this_property_assignments_(isolate->factory()->empty_fixed_array()),
314 Isolate::Current()->factory()->empty_fixed_array()),
315 loop_count_(0), 314 loop_count_(0),
316 variable_(variable), 315 variable_(variable),
317 parent_(*variable) { 316 parent_(*variable) {
318 *variable = this; 317 *variable = this;
319 } 318 }
320 319
321 320
322 TemporaryScope::~TemporaryScope() { 321 TemporaryScope::~TemporaryScope() {
323 *variable_ = parent_; 322 *variable_ = parent_;
324 } 323 }
(...skipping 327 matching lines...) Expand 10 before | Expand all | Expand 10 after
652 Scope::Type type = 651 Scope::Type type =
653 in_global_context 652 in_global_context
654 ? Scope::GLOBAL_SCOPE 653 ? Scope::GLOBAL_SCOPE
655 : Scope::EVAL_SCOPE; 654 : Scope::EVAL_SCOPE;
656 Handle<String> no_name = isolate()->factory()->empty_symbol(); 655 Handle<String> no_name = isolate()->factory()->empty_symbol();
657 656
658 FunctionLiteral* result = NULL; 657 FunctionLiteral* result = NULL;
659 { Scope* scope = NewScope(top_scope_, type, inside_with()); 658 { Scope* scope = NewScope(top_scope_, type, inside_with());
660 LexicalScope lexical_scope(&this->top_scope_, &this->with_nesting_level_, 659 LexicalScope lexical_scope(&this->top_scope_, &this->with_nesting_level_,
661 scope); 660 scope);
662 TemporaryScope temp_scope(&this->temp_scope_); 661 TemporaryScope temp_scope(&this->temp_scope_, isolate());
663 if (strict_mode == kStrictMode) { 662 if (strict_mode == kStrictMode) {
664 top_scope_->EnableStrictMode(); 663 top_scope_->EnableStrictMode();
665 } 664 }
666 ZoneList<Statement*>* body = new ZoneList<Statement*>(16); 665 ZoneList<Statement*>* body = new ZoneList<Statement*>(16);
667 bool ok = true; 666 bool ok = true;
668 int beg_loc = scanner().location().beg_pos; 667 int beg_loc = scanner().location().beg_pos;
669 ParseSourceElements(body, Token::EOS, &ok); 668 ParseSourceElements(body, Token::EOS, &ok);
670 if (ok && top_scope_->is_strict_mode()) { 669 if (ok && top_scope_->is_strict_mode()) {
671 CheckOctalLiteral(beg_loc, scanner().location().end_pos, &ok); 670 CheckOctalLiteral(beg_loc, scanner().location().end_pos, &ok);
672 } 671 }
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
742 741
743 { 742 {
744 // Parse the function literal. 743 // Parse the function literal.
745 Handle<String> no_name = isolate()->factory()->empty_symbol(); 744 Handle<String> no_name = isolate()->factory()->empty_symbol();
746 Scope* scope = NewScope(top_scope_, Scope::GLOBAL_SCOPE, inside_with()); 745 Scope* scope = NewScope(top_scope_, Scope::GLOBAL_SCOPE, inside_with());
747 if (!info->closure().is_null()) { 746 if (!info->closure().is_null()) {
748 scope = Scope::DeserializeScopeChain(info, scope); 747 scope = Scope::DeserializeScopeChain(info, scope);
749 } 748 }
750 LexicalScope lexical_scope(&this->top_scope_, &this->with_nesting_level_, 749 LexicalScope lexical_scope(&this->top_scope_, &this->with_nesting_level_,
751 scope); 750 scope);
752 TemporaryScope temp_scope(&this->temp_scope_); 751 TemporaryScope temp_scope(&this->temp_scope_, isolate());
753 752
754 if (shared_info->strict_mode()) { 753 if (shared_info->strict_mode()) {
755 top_scope_->EnableStrictMode(); 754 top_scope_->EnableStrictMode();
756 } 755 }
757 756
758 FunctionLiteralType type = 757 FunctionLiteralType type =
759 shared_info->is_expression() ? EXPRESSION : DECLARATION; 758 shared_info->is_expression() ? EXPRESSION : DECLARATION;
760 bool ok = true; 759 bool ok = true;
761 result = ParseFunctionLiteral(name, 760 result = ParseFunctionLiteral(name,
762 false, // Strict mode name already checked. 761 false, // Strict mode name already checked.
(...skipping 182 matching lines...) Expand 10 before | Expand all | Expand 10 after
945 944
946 DISALLOW_COPY_AND_ASSIGN(InitializationBlockFinder); 945 DISALLOW_COPY_AND_ASSIGN(InitializationBlockFinder);
947 }; 946 };
948 947
949 948
950 // A ThisNamedPropertyAssigmentFinder finds and marks statements of the form 949 // A ThisNamedPropertyAssigmentFinder finds and marks statements of the form
951 // this.x = ...;, where x is a named property. It also determines whether a 950 // this.x = ...;, where x is a named property. It also determines whether a
952 // function contains only assignments of this type. 951 // function contains only assignments of this type.
953 class ThisNamedPropertyAssigmentFinder : public ParserFinder { 952 class ThisNamedPropertyAssigmentFinder : public ParserFinder {
954 public: 953 public:
955 ThisNamedPropertyAssigmentFinder() 954 explicit ThisNamedPropertyAssigmentFinder(Isolate* isolate)
956 : only_simple_this_property_assignments_(true), 955 : isolate_(isolate),
956 only_simple_this_property_assignments_(true),
957 names_(NULL), 957 names_(NULL),
958 assigned_arguments_(NULL), 958 assigned_arguments_(NULL),
959 assigned_constants_(NULL) {} 959 assigned_constants_(NULL) {}
960 960
961 void Update(Scope* scope, Statement* stat) { 961 void Update(Scope* scope, Statement* stat) {
962 // Bail out if function already has property assignment that are 962 // Bail out if function already has property assignment that are
963 // not simple this property assignments. 963 // not simple this property assignments.
964 if (!only_simple_this_property_assignments_) { 964 if (!only_simple_this_property_assignments_) {
965 return; 965 return;
966 } 966 }
(...skipping 10 matching lines...) Expand all
977 // Returns whether only statements of the form this.x = y; where y is either a 977 // Returns whether only statements of the form this.x = y; where y is either a
978 // constant or a function argument was encountered. 978 // constant or a function argument was encountered.
979 bool only_simple_this_property_assignments() { 979 bool only_simple_this_property_assignments() {
980 return only_simple_this_property_assignments_; 980 return only_simple_this_property_assignments_;
981 } 981 }
982 982
983 // Returns a fixed array containing three elements for each assignment of the 983 // Returns a fixed array containing three elements for each assignment of the
984 // form this.x = y; 984 // form this.x = y;
985 Handle<FixedArray> GetThisPropertyAssignments() { 985 Handle<FixedArray> GetThisPropertyAssignments() {
986 if (names_ == NULL) { 986 if (names_ == NULL) {
987 return FACTORY->empty_fixed_array(); 987 return isolate_->factory()->empty_fixed_array();
988 } 988 }
989 ASSERT(names_ != NULL); 989 ASSERT(names_ != NULL);
990 ASSERT(assigned_arguments_ != NULL); 990 ASSERT(assigned_arguments_ != NULL);
991 ASSERT_EQ(names_->length(), assigned_arguments_->length()); 991 ASSERT_EQ(names_->length(), assigned_arguments_->length());
992 ASSERT_EQ(names_->length(), assigned_constants_->length()); 992 ASSERT_EQ(names_->length(), assigned_constants_->length());
993 Handle<FixedArray> assignments = 993 Handle<FixedArray> assignments =
994 FACTORY->NewFixedArray(names_->length() * 3); 994 isolate_->factory()->NewFixedArray(names_->length() * 3);
995 for (int i = 0; i < names_->length(); i++) { 995 for (int i = 0; i < names_->length(); i++) {
996 assignments->set(i * 3, *names_->at(i)); 996 assignments->set(i * 3, *names_->at(i));
997 assignments->set(i * 3 + 1, Smi::FromInt(assigned_arguments_->at(i))); 997 assignments->set(i * 3 + 1, Smi::FromInt(assigned_arguments_->at(i)));
998 assignments->set(i * 3 + 2, *assigned_constants_->at(i)); 998 assignments->set(i * 3 + 2, *assigned_constants_->at(i));
999 } 999 }
1000 return assignments; 1000 return assignments;
1001 } 1001 }
1002 1002
1003 private: 1003 private:
1004 bool IsThisPropertyAssignment(Assignment* assignment) { 1004 bool IsThisPropertyAssignment(Assignment* assignment) {
1005 if (assignment != NULL) { 1005 if (assignment != NULL) {
1006 Property* property = assignment->target()->AsProperty(); 1006 Property* property = assignment->target()->AsProperty();
1007 return assignment->op() == Token::ASSIGN 1007 return assignment->op() == Token::ASSIGN
1008 && property != NULL 1008 && property != NULL
1009 && property->obj()->AsVariableProxy() != NULL 1009 && property->obj()->AsVariableProxy() != NULL
1010 && property->obj()->AsVariableProxy()->is_this(); 1010 && property->obj()->AsVariableProxy()->is_this();
1011 } 1011 }
1012 return false; 1012 return false;
1013 } 1013 }
1014 1014
1015 void HandleThisPropertyAssignment(Scope* scope, Assignment* assignment) { 1015 void HandleThisPropertyAssignment(Scope* scope, Assignment* assignment) {
1016 // Check that the property assigned to is a named property, which is not 1016 // Check that the property assigned to is a named property, which is not
1017 // __proto__. 1017 // __proto__.
1018 Property* property = assignment->target()->AsProperty(); 1018 Property* property = assignment->target()->AsProperty();
1019 ASSERT(property != NULL); 1019 ASSERT(property != NULL);
1020 Literal* literal = property->key()->AsLiteral(); 1020 Literal* literal = property->key()->AsLiteral();
1021 uint32_t dummy; 1021 uint32_t dummy;
1022 if (literal != NULL && 1022 if (literal != NULL &&
1023 literal->handle()->IsString() && 1023 literal->handle()->IsString() &&
1024 !String::cast(*(literal->handle()))->Equals(HEAP->Proto_symbol()) && 1024 !String::cast(*(literal->handle()))->Equals(
1025 isolate_->heap()->Proto_symbol()) &&
1025 !String::cast(*(literal->handle()))->AsArrayIndex(&dummy)) { 1026 !String::cast(*(literal->handle()))->AsArrayIndex(&dummy)) {
1026 Handle<String> key = Handle<String>::cast(literal->handle()); 1027 Handle<String> key = Handle<String>::cast(literal->handle());
1027 1028
1028 // Check whether the value assigned is either a constant or matches the 1029 // Check whether the value assigned is either a constant or matches the
1029 // name of one of the arguments to the function. 1030 // name of one of the arguments to the function.
1030 if (assignment->value()->AsLiteral() != NULL) { 1031 if (assignment->value()->AsLiteral() != NULL) {
1031 // Constant assigned. 1032 // Constant assigned.
1032 Literal* literal = assignment->value()->AsLiteral(); 1033 Literal* literal = assignment->value()->AsLiteral();
1033 AssignmentFromConstant(key, literal->handle()); 1034 AssignmentFromConstant(key, literal->handle());
1034 return; 1035 return;
(...skipping 13 matching lines...) Expand all
1048 } 1049 }
1049 // It is not a simple "this.x = value;" assignment with a constant 1050 // It is not a simple "this.x = value;" assignment with a constant
1050 // or parameter value. 1051 // or parameter value.
1051 AssignmentFromSomethingElse(); 1052 AssignmentFromSomethingElse();
1052 } 1053 }
1053 1054
1054 void AssignmentFromParameter(Handle<String> name, int index) { 1055 void AssignmentFromParameter(Handle<String> name, int index) {
1055 EnsureAllocation(); 1056 EnsureAllocation();
1056 names_->Add(name); 1057 names_->Add(name);
1057 assigned_arguments_->Add(index); 1058 assigned_arguments_->Add(index);
1058 assigned_constants_->Add(FACTORY->undefined_value()); 1059 assigned_constants_->Add(isolate_->factory()->undefined_value());
1059 } 1060 }
1060 1061
1061 void AssignmentFromConstant(Handle<String> name, Handle<Object> value) { 1062 void AssignmentFromConstant(Handle<String> name, Handle<Object> value) {
1062 EnsureAllocation(); 1063 EnsureAllocation();
1063 names_->Add(name); 1064 names_->Add(name);
1064 assigned_arguments_->Add(-1); 1065 assigned_arguments_->Add(-1);
1065 assigned_constants_->Add(value); 1066 assigned_constants_->Add(value);
1066 } 1067 }
1067 1068
1068 void AssignmentFromSomethingElse() { 1069 void AssignmentFromSomethingElse() {
1069 // The this assignment is not a simple one. 1070 // The this assignment is not a simple one.
1070 only_simple_this_property_assignments_ = false; 1071 only_simple_this_property_assignments_ = false;
1071 } 1072 }
1072 1073
1073 void EnsureAllocation() { 1074 void EnsureAllocation() {
1074 if (names_ == NULL) { 1075 if (names_ == NULL) {
1075 ASSERT(assigned_arguments_ == NULL); 1076 ASSERT(assigned_arguments_ == NULL);
1076 ASSERT(assigned_constants_ == NULL); 1077 ASSERT(assigned_constants_ == NULL);
1077 names_ = new ZoneStringList(4); 1078 names_ = new ZoneStringList(4);
1078 assigned_arguments_ = new ZoneList<int>(4); 1079 assigned_arguments_ = new ZoneList<int>(4);
1079 assigned_constants_ = new ZoneObjectList(4); 1080 assigned_constants_ = new ZoneObjectList(4);
1080 } 1081 }
1081 } 1082 }
1082 1083
1084 Isolate* isolate_;
1083 bool only_simple_this_property_assignments_; 1085 bool only_simple_this_property_assignments_;
1084 ZoneStringList* names_; 1086 ZoneStringList* names_;
1085 ZoneList<int>* assigned_arguments_; 1087 ZoneList<int>* assigned_arguments_;
1086 ZoneObjectList* assigned_constants_; 1088 ZoneObjectList* assigned_constants_;
1087 }; 1089 };
1088 1090
1089 1091
1090 void* Parser::ParseSourceElements(ZoneList<Statement*>* processor, 1092 void* Parser::ParseSourceElements(ZoneList<Statement*>* processor,
1091 int end_token, 1093 int end_token,
1092 bool* ok) { 1094 bool* ok) {
1093 // SourceElements :: 1095 // SourceElements ::
1094 // (Statement)* <end_token> 1096 // (Statement)* <end_token>
1095 1097
1096 // Allocate a target stack to use for this set of source 1098 // Allocate a target stack to use for this set of source
1097 // elements. This way, all scripts and functions get their own 1099 // elements. This way, all scripts and functions get their own
1098 // target stack thus avoiding illegal breaks and continues across 1100 // target stack thus avoiding illegal breaks and continues across
1099 // functions. 1101 // functions.
1100 TargetScope scope(&this->target_stack_); 1102 TargetScope scope(&this->target_stack_);
1101 1103
1102 ASSERT(processor != NULL); 1104 ASSERT(processor != NULL);
1103 InitializationBlockFinder block_finder; 1105 InitializationBlockFinder block_finder;
1104 ThisNamedPropertyAssigmentFinder this_property_assignment_finder; 1106 ThisNamedPropertyAssigmentFinder this_property_assignment_finder(isolate());
1105 bool directive_prologue = true; // Parsing directive prologue. 1107 bool directive_prologue = true; // Parsing directive prologue.
1106 1108
1107 while (peek() != end_token) { 1109 while (peek() != end_token) {
1108 if (directive_prologue && peek() != Token::STRING) { 1110 if (directive_prologue && peek() != Token::STRING) {
1109 directive_prologue = false; 1111 directive_prologue = false;
1110 } 1112 }
1111 1113
1112 Scanner::Location token_loc = scanner().peek_location(); 1114 Scanner::Location token_loc = scanner().peek_location();
1113 1115
1114 Statement* stat; 1116 Statement* stat;
(...skipping 397 matching lines...) Expand 10 before | Expand all | Expand 10 after
1512 Block* Parser::ParseVariableStatement(bool* ok) { 1514 Block* Parser::ParseVariableStatement(bool* ok) {
1513 // VariableStatement :: 1515 // VariableStatement ::
1514 // VariableDeclarations ';' 1516 // VariableDeclarations ';'
1515 1517
1516 Expression* dummy; // to satisfy the ParseVariableDeclarations() signature 1518 Expression* dummy; // to satisfy the ParseVariableDeclarations() signature
1517 Block* result = ParseVariableDeclarations(true, &dummy, CHECK_OK); 1519 Block* result = ParseVariableDeclarations(true, &dummy, CHECK_OK);
1518 ExpectSemicolon(CHECK_OK); 1520 ExpectSemicolon(CHECK_OK);
1519 return result; 1521 return result;
1520 } 1522 }
1521 1523
1522 static bool IsEvalOrArguments(Handle<String> string) { 1524
1523 return string.is_identical_to(FACTORY->eval_symbol()) || 1525 bool Parser::IsEvalOrArguments(Handle<String> string) {
1524 string.is_identical_to(FACTORY->arguments_symbol()); 1526 return string.is_identical_to(isolate()->factory()->eval_symbol()) ||
1527 string.is_identical_to(isolate()->factory()->arguments_symbol());
1525 } 1528 }
1526 1529
1530
1527 // If the variable declaration declares exactly one non-const 1531 // If the variable declaration declares exactly one non-const
1528 // variable, then *var is set to that variable. In all other cases, 1532 // variable, then *var is set to that variable. In all other cases,
1529 // *var is untouched; in particular, it is the caller's responsibility 1533 // *var is untouched; in particular, it is the caller's responsibility
1530 // to initialize it properly. This mechanism is used for the parsing 1534 // to initialize it properly. This mechanism is used for the parsing
1531 // of 'for-in' loops. 1535 // of 'for-in' loops.
1532 Block* Parser::ParseVariableDeclarations(bool accept_IN, 1536 Block* Parser::ParseVariableDeclarations(bool accept_IN,
1533 Expression** var, 1537 Expression** var,
1534 bool* ok) { 1538 bool* ok) {
1535 // VariableDeclarations :: 1539 // VariableDeclarations ::
1536 // ('var' | 'const') (Identifier ('=' AssignmentExpression)?)+[','] 1540 // ('var' | 'const') (Identifier ('=' AssignmentExpression)?)+[',']
(...skipping 1996 matching lines...) Expand 10 before | Expand all | Expand 10 after
3533 if (is_named && (type == EXPRESSION || type == NESTED)) { 3537 if (is_named && (type == EXPRESSION || type == NESTED)) {
3534 function_name = name; 3538 function_name = name;
3535 } 3539 }
3536 3540
3537 int num_parameters = 0; 3541 int num_parameters = 0;
3538 // Parse function body. 3542 // Parse function body.
3539 { Scope* scope = 3543 { Scope* scope =
3540 NewScope(top_scope_, Scope::FUNCTION_SCOPE, inside_with()); 3544 NewScope(top_scope_, Scope::FUNCTION_SCOPE, inside_with());
3541 LexicalScope lexical_scope(&this->top_scope_, &this->with_nesting_level_, 3545 LexicalScope lexical_scope(&this->top_scope_, &this->with_nesting_level_,
3542 scope); 3546 scope);
3543 TemporaryScope temp_scope(&this->temp_scope_); 3547 TemporaryScope temp_scope(&this->temp_scope_, isolate());
3544 top_scope_->SetScopeName(name); 3548 top_scope_->SetScopeName(name);
3545 3549
3546 // FormalParameterList :: 3550 // FormalParameterList ::
3547 // '(' (Identifier)*[','] ')' 3551 // '(' (Identifier)*[','] ')'
3548 Expect(Token::LPAREN, CHECK_OK); 3552 Expect(Token::LPAREN, CHECK_OK);
3549 int start_pos = scanner().location().beg_pos; 3553 int start_pos = scanner().location().beg_pos;
3550 Scanner::Location name_loc = Scanner::NoLocation(); 3554 Scanner::Location name_loc = Scanner::NoLocation();
3551 Scanner::Location dupe_loc = Scanner::NoLocation(); 3555 Scanner::Location dupe_loc = Scanner::NoLocation();
3552 Scanner::Location reserved_loc = Scanner::NoLocation(); 3556 Scanner::Location reserved_loc = Scanner::NoLocation();
3553 3557
(...skipping 1610 matching lines...) Expand 10 before | Expand all | Expand 10 after
5164 info->is_global(), 5168 info->is_global(),
5165 info->StrictMode()); 5169 info->StrictMode());
5166 } 5170 }
5167 } 5171 }
5168 5172
5169 info->SetFunction(result); 5173 info->SetFunction(result);
5170 return (result != NULL); 5174 return (result != NULL);
5171 } 5175 }
5172 5176
5173 } } // namespace v8::internal 5177 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/parser.h ('k') | src/serialize.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698