iv-phonic 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -140,15 +140,20 @@ class Parser : private Noncopyable<Parser<Factory> >::type {
140
140
  #undef V
141
141
  class Target : private Noncopyable<Target>::type {
142
142
  public:
143
- Target(parser_type * parser, BreakableStatement* target)
143
+ typedef typename SpaceVector<Factory, Identifier*>::type Identifiers;
144
+ enum Type {
145
+ kNamedOnlyStatement = 0, // (00)2
146
+ kIterationStatement = 2, // (10)2
147
+ kSwitchStatement = 3 // (11)2
148
+ };
149
+ Target(parser_type* parser, Type type)
144
150
  : parser_(parser),
145
151
  prev_(parser->target()),
146
- node_(target) {
152
+ labels_(parser->labels()),
153
+ node_(NULL),
154
+ type_(type) {
147
155
  parser_->set_target(this);
148
- if (parser_->labels()) {
149
- target->set_labels(parser_->labels());
150
- parser_->set_labels(NULL);
151
- }
156
+ parser_->set_labels(NULL);
152
157
  }
153
158
  ~Target() {
154
159
  parser_->set_target(prev_);
@@ -156,13 +161,36 @@ class Parser : private Noncopyable<Parser<Factory> >::type {
156
161
  inline Target* previous() const {
157
162
  return prev_;
158
163
  }
159
- inline BreakableStatement* node() const {
164
+ inline bool IsAnonymous() const {
165
+ return type_ & 2;
166
+ }
167
+ inline bool IsIteration() const {
168
+ return type_ == kIterationStatement;
169
+ }
170
+ inline bool IsSwitch() const {
171
+ return type_ == kSwitchStatement;
172
+ }
173
+ inline bool IsNamedOnly() const {
174
+ return !IsAnonymous();
175
+ }
176
+ inline BreakableStatement** node() {
177
+ node_ = new(parser_->factory())BreakableStatement*();
160
178
  return node_;
161
179
  }
180
+ inline Identifiers* labels() const {
181
+ return labels_;
182
+ }
183
+ inline void set_node(BreakableStatement* node) {
184
+ if (node_) {
185
+ *node_ = node;
186
+ }
187
+ }
162
188
  private:
163
189
  parser_type* parser_;
164
190
  Target* prev_;
165
- BreakableStatement* node_;
191
+ Identifiers* labels_;
192
+ BreakableStatement** node_;
193
+ int type_;
166
194
  };
167
195
 
168
196
  Parser(BasicSource* source, Factory* space)
@@ -200,7 +228,7 @@ class Parser : private Noncopyable<Parser<Factory> >::type {
200
228
  // | FunctionDeclaration
201
229
  bool ParseSourceElements(Token::Type end,
202
230
  FunctionLiteral* function, bool *res) {
203
- Statement *stmt;
231
+ Statement* stmt;
204
232
  bool recognize_use_strict_directive = true;
205
233
  const StrictSwitcher switcher(this);
206
234
  while (token_ != end) {
@@ -369,11 +397,9 @@ class Parser : private Noncopyable<Parser<Factory> >::type {
369
397
  // and this statement is very useful for not breaking FunctionDeclaration.
370
398
  Statement* ParseFunctionDeclaration(bool *res) {
371
399
  assert(token_ == Token::FUNCTION);
372
- Next();
373
- IS(Token::IDENTIFIER);
374
- FunctionLiteral* expr = ParseFunctionLiteral(
400
+ FunctionLiteral* const expr = ParseFunctionLiteral(
375
401
  FunctionLiteral::DECLARATION,
376
- FunctionLiteral::GENERAL, true, CHECK);
402
+ FunctionLiteral::GENERAL, CHECK);
377
403
  // define named function as FunctionDeclaration
378
404
  scope_->AddFunctionDeclaration(expr);
379
405
  return factory_->NewFunctionStatement(expr);
@@ -388,9 +414,9 @@ class Parser : private Noncopyable<Parser<Factory> >::type {
388
414
  // | StatementList Statement
389
415
  Block* ParseBlock(bool *res) {
390
416
  assert(token_ == Token::LBRACE);
391
- Block *block = factory_->NewBlock();
392
- Statement *stmt;
393
- Target target(this, block);
417
+ Block* const block = factory_->NewBlock();
418
+ Statement* stmt;
419
+ Target target(this, Target::kNamedOnlyStatement);
394
420
 
395
421
  Next();
396
422
  while (token_ != Token::RBRACE) {
@@ -398,6 +424,7 @@ class Parser : private Noncopyable<Parser<Factory> >::type {
398
424
  block->AddStatement(stmt);
399
425
  }
400
426
  Next();
427
+ target.set_node(block);
401
428
  return block;
402
429
  }
403
430
 
@@ -406,7 +433,7 @@ class Parser : private Noncopyable<Parser<Factory> >::type {
406
433
  // : CONST VariableDeclarationList ';'
407
434
  Statement* ParseVariableStatement(bool *res) {
408
435
  assert(token_ == Token::VAR || token_ == Token::CONST);
409
- VariableStatement* stmt = factory_->NewVariableStatement(token_);
436
+ VariableStatement* const stmt = factory_->NewVariableStatement(token_);
410
437
  ParseVariableDeclarations(stmt, true, CHECK);
411
438
  ExpectSemicolon(CHECK);
412
439
  return stmt;
@@ -428,14 +455,14 @@ class Parser : private Noncopyable<Parser<Factory> >::type {
428
455
  Statement* ParseVariableDeclarations(VariableStatement* stmt,
429
456
  bool contains_in,
430
457
  bool *res) {
431
- Identifier *name;
432
- Expression *expr;
433
- Declaration *decl;
458
+ Identifier* name;
459
+ Expression* expr;
460
+ Declaration* decl;
434
461
 
435
462
  do {
436
463
  Next();
437
464
  IS(Token::IDENTIFIER);
438
- name = factory_->NewIdentifier(lexer_.Buffer());
465
+ name = ParseIdentifier(lexer_.Buffer());
439
466
  // section 12.2.1
440
467
  // within the strict code, Identifier must not be "eval" or "arguments"
441
468
  if (strict_) {
@@ -449,7 +476,6 @@ class Parser : private Noncopyable<Parser<Factory> >::type {
449
476
  }
450
477
  }
451
478
  }
452
- Next();
453
479
 
454
480
  if (token_ == Token::ASSIGN) {
455
481
  Next();
@@ -480,24 +506,23 @@ class Parser : private Noncopyable<Parser<Factory> >::type {
480
506
  // | IF '(' Expression ')' Statement
481
507
  Statement* ParseIfStatement(bool *res) {
482
508
  assert(token_ == Token::IF);
483
- IfStatement *if_stmt = NULL;
484
- Statement* stmt;
509
+ Statement* else_statement = NULL;
485
510
  Next();
486
511
 
487
512
  EXPECT(Token::LPAREN);
488
513
 
489
- Expression *expr = ParseExpression(true, CHECK);
514
+ Expression* const expr = ParseExpression(true, CHECK);
490
515
 
491
516
  EXPECT(Token::RPAREN);
492
517
 
493
- stmt = ParseStatement(CHECK);
494
- if_stmt = factory_->NewIfStatement(expr, stmt);
518
+ Statement* const then_statement = ParseStatement(CHECK);
495
519
  if (token_ == Token::ELSE) {
496
520
  Next();
497
- stmt = ParseStatement(CHECK);
498
- if_stmt->SetElse(stmt);
521
+ else_statement = ParseStatement(CHECK);
499
522
  }
500
- return if_stmt;
523
+ return factory_->NewIfStatement(expr,
524
+ then_statement,
525
+ else_statement);
501
526
  }
502
527
 
503
528
  // IterationStatement
@@ -514,23 +539,22 @@ class Parser : private Noncopyable<Parser<Factory> >::type {
514
539
  Statement* ParseDoWhileStatement(bool *res) {
515
540
  // DO Statement WHILE '(' Expression ')' ';'
516
541
  assert(token_ == Token::DO);
517
- DoWhileStatement* dowhile = factory_->NewDoWhileStatement();
518
- Target target(this, dowhile);
542
+ Target target(this, Target::kIterationStatement);
519
543
  Next();
520
544
 
521
- Statement *stmt = ParseStatement(CHECK);
522
- dowhile->set_body(stmt);
545
+ Statement* const stmt = ParseStatement(CHECK);
523
546
 
524
547
  EXPECT(Token::WHILE);
525
548
 
526
549
  EXPECT(Token::LPAREN);
527
550
 
528
- Expression *expr = ParseExpression(true, CHECK);
529
- dowhile->set_cond(expr);
551
+ Expression* const expr = ParseExpression(true, CHECK);
530
552
 
531
553
  EXPECT(Token::RPAREN);
532
554
 
533
555
  ExpectSemicolon(CHECK);
556
+ DoWhileStatement* const dowhile = factory_->NewDoWhileStatement(stmt, expr);
557
+ target.set_node(dowhile);
534
558
  return dowhile;
535
559
  }
536
560
 
@@ -541,15 +565,15 @@ class Parser : private Noncopyable<Parser<Factory> >::type {
541
565
 
542
566
  EXPECT(Token::LPAREN);
543
567
 
544
- Expression *expr = ParseExpression(true, CHECK);
545
- WhileStatement* whilestmt = factory_->NewWhileStatement(expr);
546
- Target target(this, whilestmt);
568
+ Expression* const expr = ParseExpression(true, CHECK);
569
+ Target target(this, Target::kIterationStatement);
547
570
 
548
571
  EXPECT(Token::RPAREN);
549
572
 
550
- Statement* stmt = ParseStatement(CHECK);
551
- whilestmt->set_body(stmt);
573
+ Statement* const stmt = ParseStatement(CHECK);
574
+ WhileStatement* const whilestmt = factory_->NewWhileStatement(stmt, expr);
552
575
 
576
+ target.set_node(whilestmt);
553
577
  return whilestmt;
554
578
  }
555
579
 
@@ -571,7 +595,7 @@ class Parser : private Noncopyable<Parser<Factory> >::type {
571
595
 
572
596
  if (token_ != Token::SEMICOLON) {
573
597
  if (token_ == Token::VAR || token_ == Token::CONST) {
574
- VariableStatement *var = factory_->NewVariableStatement(token_);
598
+ VariableStatement* const var = factory_->NewVariableStatement(token_);
575
599
  ParseVariableDeclarations(var, false, CHECK);
576
600
  init = var;
577
601
  if (token_ == Token::IN) {
@@ -583,17 +607,17 @@ class Parser : private Noncopyable<Parser<Factory> >::type {
583
607
  // so check declarations' size is 1.
584
608
  RAISE("invalid for-in left-hand-side");
585
609
  }
586
- Expression *enumerable = ParseExpression(true, CHECK);
610
+ Expression* const enumerable = ParseExpression(true, CHECK);
587
611
  EXPECT(Token::RPAREN);
588
- ForInStatement* forstmt =
589
- factory_->NewForInStatement(init, enumerable);
590
- Target target(this, forstmt);
591
- Statement *body = ParseStatement(CHECK);
592
- forstmt->set_body(body);
612
+ Target target(this, Target::kIterationStatement);
613
+ Statement* const body = ParseStatement(CHECK);
614
+ ForInStatement* const forstmt =
615
+ factory_->NewForInStatement(body, init, enumerable);
616
+ target.set_node(forstmt);
593
617
  return forstmt;
594
618
  }
595
619
  } else {
596
- Expression *init_expr = ParseExpression(false, CHECK);
620
+ Expression* const init_expr = ParseExpression(false, CHECK);
597
621
  init = factory_->NewExpressionStatement(init_expr);
598
622
  if (token_ == Token::IN) {
599
623
  // for in loop
@@ -601,13 +625,13 @@ class Parser : private Noncopyable<Parser<Factory> >::type {
601
625
  RAISE("invalid for-in left-hand-side");
602
626
  }
603
627
  Next();
604
- Expression *enumerable = ParseExpression(true, CHECK);
628
+ Expression* const enumerable = ParseExpression(true, CHECK);
605
629
  EXPECT(Token::RPAREN);
606
- ForInStatement* forstmt =
607
- factory_->NewForInStatement(init, enumerable);
608
- Target target(this, forstmt);
609
- Statement *body = ParseStatement(CHECK);
610
- forstmt->set_body(body);
630
+ Target target(this, Target::kIterationStatement);
631
+ Statement* const body = ParseStatement(CHECK);
632
+ ForInStatement* const forstmt =
633
+ factory_->NewForInStatement(body, init, enumerable);
634
+ target.set_node(forstmt);
611
635
  return forstmt;
612
636
  }
613
637
  }
@@ -616,7 +640,7 @@ class Parser : private Noncopyable<Parser<Factory> >::type {
616
640
  // ordinary for loop
617
641
  EXPECT(Token::SEMICOLON);
618
642
 
619
- Expression *cond = NULL;
643
+ Expression* cond = NULL;
620
644
  if (token_ == Token::SEMICOLON) {
621
645
  // no cond expr
622
646
  Next();
@@ -625,7 +649,7 @@ class Parser : private Noncopyable<Parser<Factory> >::type {
625
649
  EXPECT(Token::SEMICOLON);
626
650
  }
627
651
 
628
- ExpressionStatement *next = NULL;
652
+ ExpressionStatement* next = NULL;
629
653
  if (token_ == Token::RPAREN) {
630
654
  Next();
631
655
  } else {
@@ -634,60 +658,47 @@ class Parser : private Noncopyable<Parser<Factory> >::type {
634
658
  EXPECT(Token::RPAREN);
635
659
  }
636
660
 
637
- ForStatement *for_stmt = factory_->NewForStatement();
638
- Target target(this, for_stmt);
639
- Statement *body = ParseStatement(CHECK);
640
- for_stmt->set_body(body);
641
- if (init) {
642
- for_stmt->SetInit(init);
643
- }
644
- if (cond) {
645
- for_stmt->SetCondition(cond);
646
- }
647
- if (next) {
648
- for_stmt->SetNext(next);
649
- }
650
-
651
- return for_stmt;
661
+ Target target(this, Target::kIterationStatement);
662
+ Statement* const body = ParseStatement(CHECK);
663
+ ForStatement* const forstmt =
664
+ factory_->NewForStatement(body, init, cond, next);
665
+ target.set_node(forstmt);
666
+ return forstmt;
652
667
  }
653
668
 
654
669
  // ContinueStatement
655
670
  // : CONTINUE Identifier_opt ';'
656
671
  Statement* ParseContinueStatement(bool *res) {
657
672
  assert(token_ == Token::CONTINUE);
658
- ContinueStatement *continue_stmt = factory_->NewContinueStatement();
673
+ Identifier* label = NULL;
674
+ IterationStatement** target;
659
675
  Next();
660
676
  if (!lexer_.has_line_terminator_before_next() &&
661
677
  token_ != Token::SEMICOLON &&
662
678
  token_ != Token::RBRACE &&
663
679
  token_ != Token::EOS) {
664
680
  IS(Token::IDENTIFIER);
665
- Identifier* label = factory_->NewIdentifier(lexer_.Buffer());
666
- continue_stmt->SetLabel(label);
667
- IterationStatement* target = LookupContinuableTarget(label);
668
- if (target) {
669
- continue_stmt->SetTarget(target);
670
- } else {
681
+ label = ParseIdentifier(lexer_.Buffer());
682
+ target = LookupContinuableTarget(label);
683
+ if (!target) {
671
684
  RAISE("label not found");
672
685
  }
673
- Next();
674
686
  } else {
675
- IterationStatement* target = LookupContinuableTarget();
676
- if (target) {
677
- continue_stmt->SetTarget(target);
678
- } else {
687
+ target = LookupContinuableTarget();
688
+ if (!target) {
679
689
  RAISE("label not found");
680
690
  }
681
691
  }
682
692
  ExpectSemicolon(CHECK);
683
- return continue_stmt;
693
+ return factory_->NewContinueStatement(label, target);
684
694
  }
685
695
 
686
696
  // BreakStatement
687
697
  // : BREAK Identifier_opt ';'
688
698
  Statement* ParseBreakStatement(bool *res) {
689
699
  assert(token_ == Token::BREAK);
690
- BreakStatement *break_stmt = factory_->NewBreakStatement();
700
+ Identifier* label = NULL;
701
+ BreakableStatement** target = NULL;
691
702
  Next();
692
703
  if (!lexer_.has_line_terminator_before_next() &&
693
704
  token_ != Token::SEMICOLON &&
@@ -695,8 +706,7 @@ class Parser : private Noncopyable<Parser<Factory> >::type {
695
706
  token_ != Token::EOS) {
696
707
  // label
697
708
  IS(Token::IDENTIFIER);
698
- Identifier* label = factory_->NewIdentifier(lexer_.Buffer());
699
- break_stmt->SetLabel(label);
709
+ label = ParseIdentifier(lexer_.Buffer());
700
710
  if (ContainsLabel(labels_, label)) {
701
711
  // example
702
712
  //
@@ -708,24 +718,19 @@ class Parser : private Noncopyable<Parser<Factory> >::type {
708
718
  // In iv, BreakStatement with label, but without target is
709
719
  // interpreted as EmptyStatement
710
720
  } else {
711
- BreakableStatement* target = LookupBreakableTarget(label);
712
- if (target) {
713
- break_stmt->SetTarget(target);
714
- } else {
721
+ target = LookupBreakableTarget(label);
722
+ if (!target) {
715
723
  RAISE("label not found");
716
724
  }
717
725
  }
718
- Next();
719
726
  } else {
720
- BreakableStatement* target = LookupBreakableTarget();
721
- if (target) {
722
- break_stmt->SetTarget(target);
723
- } else {
727
+ target = LookupBreakableTarget();
728
+ if (!target) {
724
729
  RAISE("label not found");
725
730
  }
726
731
  }
727
732
  ExpectSemicolon(CHECK);
728
- return break_stmt;
733
+ return factory_->NewBreakStatement(label, target);
729
734
  }
730
735
 
731
736
  // ReturnStatement
@@ -782,7 +787,7 @@ class Parser : private Noncopyable<Parser<Factory> >::type {
782
787
 
783
788
  Expression *expr = ParseExpression(true, CHECK);
784
789
  SwitchStatement *switch_stmt = factory_->NewSwitchStatement(expr);
785
- Target target(this, switch_stmt);
790
+ Target target(this, Target::kSwitchStatement);
786
791
 
787
792
  EXPECT(Token::RPAREN);
788
793
 
@@ -794,6 +799,7 @@ class Parser : private Noncopyable<Parser<Factory> >::type {
794
799
  }
795
800
  Next();
796
801
 
802
+ target.set_node(switch_stmt);
797
803
  return switch_stmt;
798
804
  }
799
805
 
@@ -808,16 +814,16 @@ class Parser : private Noncopyable<Parser<Factory> >::type {
808
814
  // : DEFAULT ':' StatementList_opt
809
815
  CaseClause* ParseCaseClause(bool *res) {
810
816
  assert(token_ == Token::CASE || token_ == Token::DEFAULT);
811
- CaseClause *clause = factory_->NewCaseClause();
812
- Statement *stmt;
817
+ CaseClause* clause;
818
+ Statement* stmt;
813
819
 
814
820
  if (token_ == Token::CASE) {
815
821
  Next();
816
- Expression *expr = ParseExpression(true, CHECK);
817
- clause->SetExpression(expr);
822
+ Expression* const expr = ParseExpression(true, CHECK);
823
+ clause = factory_->NewCaseClause(false, expr);
818
824
  } else {
819
825
  EXPECT(Token::DEFAULT);
820
- clause->SetDefault();
826
+ clause = factory_->NewCaseClause(true, NULL);
821
827
  }
822
828
 
823
829
  EXPECT(Token::COLON);
@@ -836,13 +842,12 @@ class Parser : private Noncopyable<Parser<Factory> >::type {
836
842
  // : THROW Expression ';'
837
843
  Statement* ParseThrowStatement(bool *res) {
838
844
  assert(token_ == Token::THROW);
839
- Expression *expr;
840
845
  Next();
841
846
  // Throw requires Expression
842
847
  if (lexer_.has_line_terminator_before_next()) {
843
848
  RAISE("missing expression between throw and newline");
844
849
  }
845
- expr = ParseExpression(true, CHECK);
850
+ Expression* const expr = ParseExpression(true, CHECK);
846
851
  ExpectSemicolon(CHECK);
847
852
  return factory_->NewThrowStatement(expr);
848
853
  }
@@ -859,14 +864,14 @@ class Parser : private Noncopyable<Parser<Factory> >::type {
859
864
  // : FINALLY Block
860
865
  Statement* ParseTryStatement(bool *res) {
861
866
  assert(token_ == Token::TRY);
862
- Identifier *name;
863
- Block *block;
867
+ Identifier* name = NULL;
868
+ Block* catch_block = NULL;
869
+ Block* finally_block = NULL;
864
870
  bool has_catch_or_finally = false;
865
871
 
866
872
  Next();
867
873
 
868
- block = ParseBlock(CHECK);
869
- TryStatement *try_stmt = factory_->NewTryStatement(block);
874
+ Block* const try_block = ParseBlock(CHECK);
870
875
 
871
876
  if (token_ == Token::CATCH) {
872
877
  // Catch
@@ -874,7 +879,7 @@ class Parser : private Noncopyable<Parser<Factory> >::type {
874
879
  Next();
875
880
  EXPECT(Token::LPAREN);
876
881
  IS(Token::IDENTIFIER);
877
- name = factory_->NewIdentifier(lexer_.Buffer());
882
+ name = ParseIdentifier(lexer_.Buffer());
878
883
  // section 12.14.1
879
884
  // within the strict code, Identifier must not be "eval" or "arguments"
880
885
  if (strict_) {
@@ -889,25 +894,23 @@ class Parser : private Noncopyable<Parser<Factory> >::type {
889
894
  }
890
895
  }
891
896
  }
892
- Next();
893
897
  EXPECT(Token::RPAREN);
894
- block = ParseBlock(CHECK);
895
- try_stmt->SetCatch(name, block);
898
+ catch_block = ParseBlock(CHECK);
896
899
  }
897
900
 
898
901
  if (token_ == Token::FINALLY) {
899
902
  // Finally
900
903
  has_catch_or_finally= true;
901
904
  Next();
902
- block = ParseBlock(CHECK);
903
- try_stmt->SetFinally(block);
905
+ finally_block = ParseBlock(CHECK);
904
906
  }
905
907
 
906
908
  if (!has_catch_or_finally) {
907
909
  RAISE("missing catch or finally after try statement");
908
910
  }
909
911
 
910
- return try_stmt;
912
+ return factory_->NewTryStatement(try_block,
913
+ name, catch_block, finally_block);
911
914
  }
912
915
 
913
916
  // DebuggerStatement
@@ -920,7 +923,7 @@ class Parser : private Noncopyable<Parser<Factory> >::type {
920
923
  }
921
924
 
922
925
  Statement* ParseExpressionStatement(bool *res) {
923
- Expression* expr = ParseExpression(true, CHECK);
926
+ Expression* const expr = ParseExpression(true, CHECK);
924
927
  ExpectSemicolon(CHECK);
925
928
  return factory_->NewExpressionStatement(expr);
926
929
  }
@@ -932,7 +935,7 @@ class Parser : private Noncopyable<Parser<Factory> >::type {
932
935
  // : Expression ';'
933
936
  Statement* ParseExpressionOrLabelledStatement(bool *res) {
934
937
  assert(token_ == Token::IDENTIFIER);
935
- Expression* expr = ParseExpression(true, CHECK);
938
+ Expression* const expr = ParseExpression(true, CHECK);
936
939
  if (token_ == Token::COLON &&
937
940
  expr->AsIdentifier()) {
938
941
  // LabelledStatement
@@ -949,9 +952,9 @@ class Parser : private Noncopyable<Parser<Factory> >::type {
949
952
  RAISE("duplicate label");
950
953
  }
951
954
  labels->push_back(label);
952
- LabelScope scope(this, labels, exist_labels);
955
+ const LabelScope scope(this, labels, exist_labels);
953
956
 
954
- Statement* stmt = ParseStatement(CHECK);
957
+ Statement* const stmt = ParseStatement(CHECK);
955
958
  return factory_->NewLabelledStatement(expr, stmt);
956
959
  }
957
960
  ExpectSemicolon(CHECK);
@@ -963,11 +966,10 @@ class Parser : private Noncopyable<Parser<Factory> >::type {
963
966
  if (strict_) {
964
967
  RAISE("function statement not allowed in strict code");
965
968
  }
966
- Next();
967
- IS(Token::IDENTIFIER);
968
- FunctionLiteral* expr = ParseFunctionLiteral(FunctionLiteral::STATEMENT,
969
- FunctionLiteral::GENERAL,
970
- true, CHECK);
969
+ FunctionLiteral* const expr = ParseFunctionLiteral(
970
+ FunctionLiteral::STATEMENT,
971
+ FunctionLiteral::GENERAL,
972
+ CHECK);
971
973
  // define named function as variable declaration
972
974
  scope_->AddUnresolved(expr->name(), false);
973
975
  return factory_->NewFunctionStatement(expr);
@@ -977,8 +979,8 @@ class Parser : private Noncopyable<Parser<Factory> >::type {
977
979
  // : AssignmentExpression
978
980
  // | Expression ',' AssignmentExpression
979
981
  Expression* ParseExpression(bool contains_in, bool *res) {
980
- Expression *right;
981
- Expression *result = ParseAssignmentExpression(contains_in, CHECK);
982
+ Expression* right;
983
+ Expression* result = ParseAssignmentExpression(contains_in, CHECK);
982
984
  while (token_ == Token::COMMA) {
983
985
  Next();
984
986
  right = ParseAssignmentExpression(contains_in, CHECK);
@@ -991,7 +993,7 @@ class Parser : private Noncopyable<Parser<Factory> >::type {
991
993
  // : ConditionalExpression
992
994
  // | LeftHandSideExpression AssignmentOperator AssignmentExpression
993
995
  Expression* ParseAssignmentExpression(bool contains_in, bool *res) {
994
- Expression *result = ParseConditionalExpression(contains_in, CHECK);
996
+ Expression* const result = ParseConditionalExpression(contains_in, CHECK);
995
997
  if (!Token::IsAssignOp(token_)) {
996
998
  return result;
997
999
  }
@@ -1013,7 +1015,7 @@ class Parser : private Noncopyable<Parser<Factory> >::type {
1013
1015
  }
1014
1016
  const Token::Type op = token_;
1015
1017
  Next();
1016
- Expression *right = ParseAssignmentExpression(contains_in, CHECK);
1018
+ Expression* const right = ParseAssignmentExpression(contains_in, CHECK);
1017
1019
  return factory_->NewAssignment(op, result, right);
1018
1020
  }
1019
1021
 
@@ -1021,14 +1023,13 @@ class Parser : private Noncopyable<Parser<Factory> >::type {
1021
1023
  // : LogicalOrExpression
1022
1024
  // | LogicalOrExpression '?' AssignmentExpression ':' AssignmentExpression
1023
1025
  Expression* ParseConditionalExpression(bool contains_in, bool *res) {
1024
- Expression *result;
1025
- result = ParseBinaryExpression(contains_in, 9, CHECK);
1026
+ Expression* result = ParseBinaryExpression(contains_in, 9, CHECK);
1026
1027
  if (token_ == Token::CONDITIONAL) {
1027
1028
  Next();
1028
1029
  // see ECMA-262 section 11.12
1029
- Expression *left = ParseAssignmentExpression(true, CHECK);
1030
+ Expression* const left = ParseAssignmentExpression(true, CHECK);
1030
1031
  EXPECT(Token::COLON);
1031
- Expression *right = ParseAssignmentExpression(contains_in, CHECK);
1032
+ Expression* const right = ParseAssignmentExpression(contains_in, CHECK);
1032
1033
  result = factory_->NewConditionalExpression(result, left, right);
1033
1034
  }
1034
1035
  return result;
@@ -1369,8 +1370,7 @@ class Parser : private Noncopyable<Parser<Factory> >::type {
1369
1370
  // | LeftHandSideExpression INCREMENT
1370
1371
  // | LeftHandSideExpression DECREMENT
1371
1372
  Expression* ParsePostfixExpression(bool *res) {
1372
- Expression *expr;
1373
- expr = ParseMemberExpression(true, CHECK);
1373
+ Expression* expr = ParseMemberExpression(true, CHECK);
1374
1374
  if (!lexer_.has_line_terminator_before_next() &&
1375
1375
  (token_ == Token::INC || token_ == Token::DEC)) {
1376
1376
  if (!expr->IsValidLeftHandSide()) {
@@ -1414,9 +1414,8 @@ class Parser : private Noncopyable<Parser<Factory> >::type {
1414
1414
  if (token_ != Token::NEW) {
1415
1415
  if (token_ == Token::FUNCTION) {
1416
1416
  // FunctionExpression
1417
- Next();
1418
1417
  expr = ParseFunctionLiteral(FunctionLiteral::EXPRESSION,
1419
- FunctionLiteral::GENERAL, true, CHECK);
1418
+ FunctionLiteral::GENERAL, CHECK);
1420
1419
  } else {
1421
1420
  expr = ParsePrimaryExpression(CHECK);
1422
1421
  }
@@ -1429,7 +1428,6 @@ class Parser : private Noncopyable<Parser<Factory> >::type {
1429
1428
  }
1430
1429
  expr = con;
1431
1430
  }
1432
- FunctionCall *funcall;
1433
1431
  while (true) {
1434
1432
  switch (token_) {
1435
1433
  case Token::LBRACK: {
@@ -1443,15 +1441,14 @@ class Parser : private Noncopyable<Parser<Factory> >::type {
1443
1441
  case Token::PERIOD: {
1444
1442
  Next(Lexer::kIgnoreReservedWords); // IDENTIFIERNAME
1445
1443
  IS(Token::IDENTIFIER);
1446
- Identifier* ident = factory_->NewIdentifier(lexer_.Buffer());
1447
- Next();
1444
+ Identifier* const ident = ParseIdentifier(lexer_.Buffer());
1448
1445
  expr = factory_->NewIdentifierAccess(expr, ident);
1449
1446
  break;
1450
1447
  }
1451
1448
 
1452
1449
  case Token::LPAREN:
1453
1450
  if (allow_call) {
1454
- funcall = factory_->NewFunctionCall(expr);
1451
+ FunctionCall* const funcall = factory_->NewFunctionCall(expr);
1455
1452
  ParseArguments(funcall, CHECK);
1456
1453
  expr = funcall;
1457
1454
  } else {
@@ -1481,7 +1478,7 @@ class Parser : private Noncopyable<Parser<Factory> >::type {
1481
1478
  // | STRING
1482
1479
  // | REGEXP
1483
1480
  Expression* ParsePrimaryExpression(bool *res) {
1484
- Expression *result = NULL;
1481
+ Expression* result = NULL;
1485
1482
  switch (token_) {
1486
1483
  case Token::THIS:
1487
1484
  result = factory_->NewThisLiteral();
@@ -1489,8 +1486,7 @@ class Parser : private Noncopyable<Parser<Factory> >::type {
1489
1486
  break;
1490
1487
 
1491
1488
  case Token::IDENTIFIER:
1492
- result = factory_->NewIdentifier(lexer_.Buffer());
1493
- Next();
1489
+ result = ParseIdentifier(lexer_.Buffer());
1494
1490
  break;
1495
1491
 
1496
1492
  case Token::NULL_LITERAL:
@@ -1569,7 +1565,7 @@ class Parser : private Noncopyable<Parser<Factory> >::type {
1569
1565
  // : AssignmentExpression
1570
1566
  // | ArgumentList ',' AssignmentExpression
1571
1567
  Call* ParseArguments(Call* func, bool *res) {
1572
- Expression *expr;
1568
+ Expression* expr;
1573
1569
  Next();
1574
1570
  while (token_ != Token::RPAREN) {
1575
1571
  expr = ParseAssignmentExpression(true, CHECK);
@@ -1614,8 +1610,8 @@ class Parser : private Noncopyable<Parser<Factory> >::type {
1614
1610
  // : ','
1615
1611
  // | Elision ','
1616
1612
  Expression* ParseArrayLiteral(bool *res) {
1617
- ArrayLiteral *array = factory_->NewArrayLiteral();
1618
- Expression *expr;
1613
+ ArrayLiteral* const array = factory_->NewArrayLiteral();
1614
+ Expression* expr;
1619
1615
  Next();
1620
1616
  while (token_ != Token::RBRACK) {
1621
1617
  if (token_ == Token::COMMA) {
@@ -1660,10 +1656,10 @@ class Parser : private Noncopyable<Parser<Factory> >::type {
1660
1656
  // : IDENTIFIER
1661
1657
  Expression* ParseObjectLiteral(bool *res) {
1662
1658
  typedef std::tr1::unordered_map<IdentifierKey, int> ObjectMap;
1663
- ObjectLiteral *object = factory_->NewObjectLiteral();
1659
+ ObjectLiteral* const object = factory_->NewObjectLiteral();
1664
1660
  ObjectMap map;
1665
- Expression *expr;
1666
- Identifier *ident;
1661
+ Expression* expr;
1662
+ Identifier* ident;
1667
1663
 
1668
1664
  // IDENTIFIERNAME
1669
1665
  Next(Lexer::kIgnoreReservedWordsAndIdentifyGetterOrSetter);
@@ -1674,9 +1670,8 @@ class Parser : private Noncopyable<Parser<Factory> >::type {
1674
1670
  Next(Lexer::kIgnoreReservedWords); // IDENTIFIERNAME
1675
1671
  if (token_ == Token::COLON) {
1676
1672
  // property
1677
- ident = factory_->NewIdentifier(
1673
+ ident = ParseIdentifier(
1678
1674
  is_get ? ParserData::kGet : ParserData::kSet);
1679
- Next();
1680
1675
  expr = ParseAssignmentExpression(true, CHECK);
1681
1676
  object->AddDataProperty(ident, expr);
1682
1677
  typename ObjectMap::iterator it = map.find(ident);
@@ -1699,17 +1694,16 @@ class Parser : private Noncopyable<Parser<Factory> >::type {
1699
1694
  token_ == Token::STRING ||
1700
1695
  token_ == Token::NUMBER) {
1701
1696
  if (token_ == Token::NUMBER) {
1702
- ident = factory_->NewIdentifier(lexer_.Buffer8());
1697
+ ident = ParseIdentifier(lexer_.Buffer8());
1703
1698
  } else {
1704
- ident = factory_->NewIdentifier(lexer_.Buffer());
1699
+ ident = ParseIdentifier(lexer_.Buffer());
1705
1700
  }
1706
- Next();
1707
1701
  typename ObjectLiteral::PropertyDescriptorType type =
1708
1702
  (is_get) ? ObjectLiteral::GET : ObjectLiteral::SET;
1709
1703
  expr = ParseFunctionLiteral(
1710
1704
  FunctionLiteral::EXPRESSION,
1711
1705
  (is_get) ? FunctionLiteral::GETTER : FunctionLiteral::SETTER,
1712
- false, CHECK);
1706
+ CHECK);
1713
1707
  object->AddAccessor(type, ident, expr);
1714
1708
  typename ObjectMap::iterator it = map.find(ident);
1715
1709
  if (it == map.end()) {
@@ -1732,8 +1726,7 @@ class Parser : private Noncopyable<Parser<Factory> >::type {
1732
1726
  } else if (token_ == Token::IDENTIFIER ||
1733
1727
  token_ == Token::STRING ||
1734
1728
  token_ == Token::NUMBER) {
1735
- ident = factory_->NewIdentifier(lexer_.Buffer());
1736
- Next();
1729
+ ident = ParseIdentifier(lexer_.Buffer());
1737
1730
  EXPECT(Token::COLON);
1738
1731
  expr = ParseAssignmentExpression(true, CHECK);
1739
1732
  object->AddDataProperty(ident, expr);
@@ -1768,7 +1761,6 @@ class Parser : private Noncopyable<Parser<Factory> >::type {
1768
1761
  FunctionLiteral* ParseFunctionLiteral(
1769
1762
  typename FunctionLiteral::DeclType decl_type,
1770
1763
  typename FunctionLiteral::ArgType arg_type,
1771
- bool allow_identifier,
1772
1764
  bool *res) {
1773
1765
  // IDENTIFIER
1774
1766
  // IDENTIFIER_opt
@@ -1783,19 +1775,27 @@ class Parser : private Noncopyable<Parser<Factory> >::type {
1783
1775
  kDetectDuplicateParameter
1784
1776
  } throw_error_if_strict_code = kDetectNone;
1785
1777
 
1786
- FunctionLiteral *literal = factory_->NewFunctionLiteral(decl_type);
1778
+ FunctionLiteral* const literal = factory_->NewFunctionLiteral(decl_type);
1787
1779
  literal->set_strict(strict_);
1788
- if (allow_identifier && token_ == Token::IDENTIFIER) {
1789
- Identifier* const name = factory_->NewIdentifier(lexer_.Buffer());
1790
- literal->SetName(name);
1791
- const EvalOrArguments val = IsEvalOrArguments(name);
1792
- if (val) {
1793
- throw_error_if_strict_code = (val == kEval) ?
1794
- kDetectEvalName : kDetectArgumentsName;
1795
- throw_error_if_strict_code_line = lexer_.line_number();
1796
- }
1780
+
1781
+ if (arg_type == FunctionLiteral::GENERAL) {
1782
+ assert(token_ == Token::FUNCTION);
1797
1783
  Next();
1784
+ if (token_ == Token::IDENTIFIER) {
1785
+ Identifier* const name = ParseIdentifier(lexer_.Buffer());
1786
+ literal->SetName(name);
1787
+ const EvalOrArguments val = IsEvalOrArguments(name);
1788
+ if (val) {
1789
+ throw_error_if_strict_code = (val == kEval) ?
1790
+ kDetectEvalName : kDetectArgumentsName;
1791
+ throw_error_if_strict_code_line = lexer_.line_number();
1792
+ }
1793
+ } else if (decl_type == FunctionLiteral::DECLARATION ||
1794
+ decl_type == FunctionLiteral::STATEMENT) {
1795
+ IS(Token::IDENTIFIER);
1796
+ }
1798
1797
  }
1798
+
1799
1799
  const ScopeSwitcher switcher(this, literal->scope());
1800
1800
  literal->set_start_position(lexer_.pos() - 2);
1801
1801
 
@@ -1808,7 +1808,7 @@ class Parser : private Noncopyable<Parser<Factory> >::type {
1808
1808
  } else if (arg_type == FunctionLiteral::SETTER) {
1809
1809
  // if setter, parameter count is 1
1810
1810
  IS(Token::IDENTIFIER);
1811
- Identifier* const ident = factory_->NewIdentifier(lexer_.Buffer());
1811
+ Identifier* const ident = ParseIdentifier(lexer_.Buffer());
1812
1812
  if (!throw_error_if_strict_code) {
1813
1813
  const EvalOrArguments val = IsEvalOrArguments(ident);
1814
1814
  if (val) {
@@ -1818,12 +1818,11 @@ class Parser : private Noncopyable<Parser<Factory> >::type {
1818
1818
  }
1819
1819
  }
1820
1820
  literal->AddParameter(ident);
1821
- Next();
1822
1821
  EXPECT(Token::RPAREN);
1823
1822
  } else {
1824
1823
  while (token_ != Token::RPAREN) {
1825
1824
  IS(Token::IDENTIFIER);
1826
- Identifier* const ident = factory_->NewIdentifier(lexer_.Buffer());
1825
+ Identifier* const ident = ParseIdentifier(lexer_.Buffer());
1827
1826
  if (!throw_error_if_strict_code) {
1828
1827
  const EvalOrArguments val = IsEvalOrArguments(ident);
1829
1828
  if (val) {
@@ -1839,7 +1838,6 @@ class Parser : private Noncopyable<Parser<Factory> >::type {
1839
1838
  }
1840
1839
  literal->AddParameter(ident);
1841
1840
  param_set.insert(ident);
1842
- Next();
1843
1841
  if (token_ != Token::RPAREN) {
1844
1842
  EXPECT(Token::COMMA);
1845
1843
  }
@@ -1894,11 +1892,18 @@ class Parser : private Noncopyable<Parser<Factory> >::type {
1894
1892
  return literal;
1895
1893
  }
1896
1894
 
1895
+ template<typename Range>
1896
+ Identifier* ParseIdentifier(const Range& range) {
1897
+ Identifier* const ident = factory_->NewIdentifier(range);
1898
+ Next();
1899
+ return ident;
1900
+ }
1901
+
1897
1902
  bool ContainsLabel(const Identifiers* const labels,
1898
1903
  const Identifier * const label) const {
1899
1904
  assert(label != NULL);
1900
1905
  if (labels) {
1901
- const SpaceUString& value = label->value();
1906
+ const typename Identifier::value_type& value = label->value();
1902
1907
  for (typename Identifiers::const_iterator it = labels->begin(),
1903
1908
  last = labels->end();
1904
1909
  it != last; ++it) {
@@ -1912,61 +1917,59 @@ class Parser : private Noncopyable<Parser<Factory> >::type {
1912
1917
 
1913
1918
  bool TargetsContainsLabel(const Identifier* const label) const {
1914
1919
  assert(label != NULL);
1915
- for (Target* target = target_;
1920
+ for (const Target* target = target_;
1916
1921
  target != NULL;
1917
1922
  target = target->previous()) {
1918
- if (ContainsLabel(target->node()->labels(), label)) {
1923
+ if (ContainsLabel(target->labels(), label)) {
1919
1924
  return true;
1920
1925
  }
1921
1926
  }
1922
1927
  return false;
1923
1928
  }
1924
1929
 
1925
- BreakableStatement* LookupBreakableTarget(
1930
+ BreakableStatement** LookupBreakableTarget(
1926
1931
  const Identifier* const label) const {
1927
1932
  assert(label != NULL);
1928
- for (const Target* target = target_;
1933
+ for (Target* target = target_;
1929
1934
  target != NULL;
1930
1935
  target = target->previous()) {
1931
- if (ContainsLabel(target->node()->labels(), label)) {
1936
+ if (ContainsLabel(target->labels(), label)) {
1932
1937
  return target->node();
1933
1938
  }
1934
1939
  }
1935
1940
  return NULL;
1936
1941
  }
1937
1942
 
1938
- BreakableStatement* LookupBreakableTarget() const {
1939
- for (const Target* target = target_;
1943
+ BreakableStatement** LookupBreakableTarget() const {
1944
+ for (Target* target = target_;
1940
1945
  target != NULL;
1941
1946
  target = target->previous()) {
1942
- if (target->node()->AsAnonymousBreakableStatement()) {
1947
+ if (target->IsAnonymous()) {
1943
1948
  return target->node();
1944
1949
  }
1945
1950
  }
1946
1951
  return NULL;
1947
1952
  }
1948
1953
 
1949
- IterationStatement* LookupContinuableTarget(
1954
+ IterationStatement** LookupContinuableTarget(
1950
1955
  const Identifier* const label) const {
1951
1956
  assert(label != NULL);
1952
- for (const Target* target = target_;
1957
+ for (Target* target = target_;
1953
1958
  target != NULL;
1954
1959
  target = target->previous()) {
1955
- IterationStatement* const iter = target->node()->AsIterationStatement();
1956
- if (iter && ContainsLabel(iter->labels(), label)) {
1957
- return iter;
1960
+ if (target->IsIteration() && ContainsLabel(target->labels(), label)) {
1961
+ return reinterpret_cast<IterationStatement**>(target->node());
1958
1962
  }
1959
1963
  }
1960
1964
  return NULL;
1961
1965
  }
1962
1966
 
1963
- IterationStatement* LookupContinuableTarget() const {
1964
- for (const Target* target = target_;
1967
+ IterationStatement** LookupContinuableTarget() const {
1968
+ for (Target* target = target_;
1965
1969
  target != NULL;
1966
1970
  target = target->previous()) {
1967
- IterationStatement* const iter = target->node()->AsIterationStatement();
1968
- if (iter) {
1969
- return iter;
1971
+ if (target->IsIteration()) {
1972
+ return reinterpret_cast<IterationStatement**>(target->node());
1970
1973
  }
1971
1974
  }
1972
1975
  return NULL;
@@ -2050,6 +2053,9 @@ class Parser : private Noncopyable<Parser<Factory> >::type {
2050
2053
  inline void set_target(Target* target) {
2051
2054
  target_ = target;
2052
2055
  }
2056
+ inline Factory* factory() const {
2057
+ return factory_;
2058
+ }
2053
2059
  inline Identifiers* labels() const {
2054
2060
  return labels_;
2055
2061
  }