iv-phonic 0.1.0 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -218,16 +218,16 @@ class Parser
218
218
  int type_;
219
219
  };
220
220
 
221
- class TargetScope : private Noncopyable<Target>::type {
221
+ class TargetSwitcher : private Noncopyable<TargetSwitcher>::type {
222
222
  public:
223
- explicit TargetScope(parser_type* parser)
223
+ explicit TargetSwitcher(parser_type* parser)
224
224
  : parser_(parser),
225
225
  target_(parser->target()),
226
226
  labels_(parser->labels()) {
227
227
  parser_->set_target(NULL);
228
228
  parser_->set_labels(NULL);
229
229
  }
230
- ~TargetScope() {
230
+ ~TargetSwitcher() {
231
231
  parser_->set_target(target_);
232
232
  parser_->set_labels(labels_);
233
233
  }
@@ -237,12 +237,12 @@ class Parser
237
237
  Identifiers* labels_;
238
238
  };
239
239
 
240
- Parser(Factory* space, const Source* source)
240
+ Parser(Factory* factory, const Source* source)
241
241
  : lexer_(source),
242
242
  error_(),
243
243
  strict_(false),
244
244
  error_state_(0),
245
- factory_(space),
245
+ factory_(factory),
246
246
  scope_(NULL),
247
247
  target_(NULL),
248
248
  labels_(NULL) {
@@ -251,18 +251,27 @@ class Parser
251
251
  // Program
252
252
  // : SourceElements
253
253
  FunctionLiteral* ParseProgram() {
254
- FunctionLiteral* const global = factory_->NewFunctionLiteral(
255
- FunctionLiteral::GLOBAL);
256
- global->set_strict(strict_);
254
+ Identifiers* params = factory_->template NewVector<Identifier*>();
255
+ Statements* body = factory_->template NewVector<Statement*>();
256
+ Scope* const scope = factory_->NewScope(FunctionLiteral::GLOBAL);
257
257
  assert(target_ == NULL);
258
258
  bool error_flag = true;
259
259
  bool *res = &error_flag;
260
- {
261
- const ScopeSwitcher switcher(this, global->scope());
262
- Next();
263
- ParseSourceElements(Token::EOS, global, CHECK);
264
- }
265
- return (error_flag) ? global : NULL;
260
+ const ScopeSwitcher scope_switcher(this, scope);
261
+ Next();
262
+ const bool strict = ParseSourceElements(Token::EOS, body, CHECK);
263
+ const std::size_t end_position = lexer_.end_position();
264
+ return (error_flag) ?
265
+ factory_->NewFunctionLiteral(FunctionLiteral::GLOBAL,
266
+ NULL,
267
+ params,
268
+ body,
269
+ scope,
270
+ strict,
271
+ 0,
272
+ end_position,
273
+ 0,
274
+ end_position) : NULL;
266
275
  }
267
276
 
268
277
  // SourceElements
@@ -273,16 +282,16 @@ class Parser
273
282
  // : Statements
274
283
  // | FunctionDeclaration
275
284
  bool ParseSourceElements(Token::Type end,
276
- FunctionLiteral* function,
285
+ Statements* body,
277
286
  bool *res) {
278
287
  Statement* stmt;
279
288
  bool recognize_directive = true;
280
- const StrictSwitcher switcher(this);
289
+ const StrictSwitcher strict_switcher(this);
281
290
  while (token_ != end) {
282
291
  if (token_ == Token::FUNCTION) {
283
292
  // FunctionDeclaration
284
293
  stmt = ParseFunctionDeclaration(CHECK);
285
- function->AddStatement(stmt);
294
+ body->push_back(stmt);
286
295
  recognize_directive = false;
287
296
  } else {
288
297
  stmt = ParseStatement(CHECK);
@@ -294,8 +303,7 @@ class Parser
294
303
  // expression is directive
295
304
  if (expr->AsStringLiteral()->value().compare(
296
305
  ParserData::kUseStrict.data()) == 0) {
297
- switcher.SwitchStrictMode();
298
- function->set_strict(true);
306
+ strict_switcher.SwitchStrictMode();
299
307
  }
300
308
  } else {
301
309
  recognize_directive = false;
@@ -304,10 +312,10 @@ class Parser
304
312
  recognize_directive = false;
305
313
  }
306
314
  }
307
- function->AddStatement(stmt);
315
+ body->push_back(stmt);
308
316
  }
309
317
  }
310
- return true;
318
+ return strict_switcher.IsStrict();
311
319
  }
312
320
 
313
321
  // Statement
@@ -466,17 +474,19 @@ class Parser
466
474
  // | StatementList Statement
467
475
  Block* ParseBlock(bool *res) {
468
476
  assert(token_ == Token::LBRACE);
477
+ const std::size_t begin = lexer_.begin_position();
469
478
  Statements* const body = factory_->template NewVector<Statement*>();
470
- Statement* stmt;
471
479
  Target target(this, Target::kNamedOnlyStatement);
472
480
 
473
481
  Next();
474
482
  while (token_ != Token::RBRACE) {
475
- stmt = ParseStatement(CHECK);
483
+ Statement* const stmt = ParseStatement(CHECK);
476
484
  body->push_back(stmt);
477
485
  }
478
486
  Next();
479
- Block* const block = factory_->NewBlock(body);
487
+ Block* const block = factory_->NewBlock(body,
488
+ begin,
489
+ lexer_.previous_end_position());
480
490
  target.set_node(block);
481
491
  return block;
482
492
  }
@@ -486,10 +496,15 @@ class Parser
486
496
  // : CONST VariableDeclarationList ';'
487
497
  Statement* ParseVariableStatement(bool *res) {
488
498
  assert(token_ == Token::VAR || token_ == Token::CONST);
499
+ const Token::Type op = token_;
500
+ const std::size_t begin = lexer_.begin_position();
489
501
  Declarations* const decls = factory_->template NewVector<Declaration*>();
490
502
  ParseVariableDeclarations(decls, token_ == Token::CONST, true, CHECK);
491
503
  ExpectSemicolon(CHECK);
492
- return factory_->NewVariableStatement(token_, decls);
504
+ return factory_->NewVariableStatement(op,
505
+ decls,
506
+ begin,
507
+ lexer_.previous_end_position());
493
508
  }
494
509
 
495
510
  // VariableDeclarationList
@@ -552,7 +567,8 @@ class Parser
552
567
  Statement* ParseEmptyStatement() {
553
568
  assert(token_ == Token::SEMICOLON);
554
569
  Next();
555
- return factory_->NewEmptyStatement();
570
+ return factory_->NewEmptyStatement(lexer_.previous_begin_position(),
571
+ lexer_.previous_end_position());
556
572
  }
557
573
 
558
574
  // IfStatement
@@ -560,6 +576,7 @@ class Parser
560
576
  // | IF '(' Expression ')' Statement
561
577
  Statement* ParseIfStatement(bool *res) {
562
578
  assert(token_ == Token::IF);
579
+ const std::size_t begin = lexer_.begin_position();
563
580
  Statement* else_statement = NULL;
564
581
  Next();
565
582
 
@@ -576,7 +593,8 @@ class Parser
576
593
  }
577
594
  return factory_->NewIfStatement(expr,
578
595
  then_statement,
579
- else_statement);
596
+ else_statement,
597
+ begin);
580
598
  }
581
599
 
582
600
  // IterationStatement
@@ -593,6 +611,7 @@ class Parser
593
611
  Statement* ParseDoWhileStatement(bool *res) {
594
612
  // DO Statement WHILE '(' Expression ')' ';'
595
613
  assert(token_ == Token::DO);
614
+ const std::size_t begin = lexer_.begin_position();
596
615
  Target target(this, Target::kIterationStatement);
597
616
  Next();
598
617
 
@@ -614,7 +633,8 @@ class Parser
614
633
  if (token_ == Token::SEMICOLON) {
615
634
  Next();
616
635
  }
617
- DoWhileStatement* const dowhile = factory_->NewDoWhileStatement(stmt, expr);
636
+ DoWhileStatement* const dowhile = factory_->NewDoWhileStatement(
637
+ stmt, expr, begin, lexer_.previous_end_position());
618
638
  target.set_node(dowhile);
619
639
  return dowhile;
620
640
  }
@@ -622,6 +642,7 @@ class Parser
622
642
  // WHILE '(' Expression ')' Statement
623
643
  Statement* ParseWhileStatement(bool *res) {
624
644
  assert(token_ == Token::WHILE);
645
+ const std::size_t begin = lexer_.begin_position();
625
646
  Next();
626
647
 
627
648
  EXPECT(Token::LPAREN);
@@ -632,7 +653,8 @@ class Parser
632
653
  EXPECT(Token::RPAREN);
633
654
 
634
655
  Statement* const stmt = ParseStatement(CHECK);
635
- WhileStatement* const whilestmt = factory_->NewWhileStatement(stmt, expr);
656
+ WhileStatement* const whilestmt = factory_->NewWhileStatement(stmt,
657
+ expr, begin);
636
658
 
637
659
  target.set_node(whilestmt);
638
660
  return whilestmt;
@@ -648,6 +670,7 @@ class Parser
648
670
  // FOR '(' VAR VariableDeclarationNoIn IN Expression ')' Statement
649
671
  Statement* ParseForStatement(bool *res) {
650
672
  assert(token_ == Token::FOR);
673
+ const std::size_t for_stmt_begin = lexer_.begin_position();
651
674
  Next();
652
675
 
653
676
  EXPECT(Token::LPAREN);
@@ -656,13 +679,18 @@ class Parser
656
679
 
657
680
  if (token_ != Token::SEMICOLON) {
658
681
  if (token_ == Token::VAR || token_ == Token::CONST) {
682
+ const std::size_t begin = lexer_.begin_position();
683
+ const Token::Type op = token_;
659
684
  Declarations* const decls =
660
685
  factory_->template NewVector<Declaration*>();
661
686
  ParseVariableDeclarations(decls, token_ == Token::CONST, false, CHECK);
662
- VariableStatement* const var =
663
- factory_->NewVariableStatement(token_, decls);
664
- init = var;
665
687
  if (token_ == Token::IN) {
688
+ VariableStatement* const var =
689
+ factory_->NewVariableStatement(op,
690
+ decls,
691
+ begin,
692
+ lexer_.previous_end_position());
693
+ init = var;
666
694
  // for in loop
667
695
  Next();
668
696
  const Declarations& decls = var->decls();
@@ -676,15 +704,21 @@ class Parser
676
704
  Target target(this, Target::kIterationStatement);
677
705
  Statement* const body = ParseStatement(CHECK);
678
706
  ForInStatement* const forstmt =
679
- factory_->NewForInStatement(body, init, enumerable);
707
+ factory_->NewForInStatement(body, init, enumerable,
708
+ for_stmt_begin);
680
709
  target.set_node(forstmt);
681
710
  return forstmt;
711
+ } else {
712
+ init = factory_->NewVariableStatement(op, decls,
713
+ begin,
714
+ lexer_.end_position());
682
715
  }
683
716
  } else {
684
717
  Expression* const init_expr = ParseExpression(false, CHECK);
685
- init = factory_->NewExpressionStatement(init_expr);
686
718
  if (token_ == Token::IN) {
687
719
  // for in loop
720
+ init = factory_->NewExpressionStatement(init_expr,
721
+ lexer_.previous_end_position());
688
722
  if (!init_expr->IsValidLeftHandSide()) {
689
723
  RAISE("invalid for-in left-hand-side");
690
724
  }
@@ -694,9 +728,13 @@ class Parser
694
728
  Target target(this, Target::kIterationStatement);
695
729
  Statement* const body = ParseStatement(CHECK);
696
730
  ForInStatement* const forstmt =
697
- factory_->NewForInStatement(body, init, enumerable);
731
+ factory_->NewForInStatement(body, init, enumerable,
732
+ for_stmt_begin);
698
733
  target.set_node(forstmt);
699
734
  return forstmt;
735
+ } else {
736
+ init = factory_->NewExpressionStatement(init_expr,
737
+ lexer_.end_position());
700
738
  }
701
739
  }
702
740
  }
@@ -717,15 +755,16 @@ class Parser
717
755
  if (token_ == Token::RPAREN) {
718
756
  Next();
719
757
  } else {
720
- Expression *next_expr = ParseExpression(true, CHECK);
721
- next = factory_->NewExpressionStatement(next_expr);
758
+ Expression* next_expr = ParseExpression(true, CHECK);
759
+ next = factory_->NewExpressionStatement(next_expr,
760
+ lexer_.previous_end_position());
722
761
  EXPECT(Token::RPAREN);
723
762
  }
724
763
 
725
764
  Target target(this, Target::kIterationStatement);
726
765
  Statement* const body = ParseStatement(CHECK);
727
766
  ForStatement* const forstmt =
728
- factory_->NewForStatement(body, init, cond, next);
767
+ factory_->NewForStatement(body, init, cond, next, for_stmt_begin);
729
768
  target.set_node(forstmt);
730
769
  return forstmt;
731
770
  }
@@ -734,6 +773,7 @@ class Parser
734
773
  // : CONTINUE Identifier_opt ';'
735
774
  Statement* ParseContinueStatement(bool *res) {
736
775
  assert(token_ == Token::CONTINUE);
776
+ const std::size_t begin = lexer_.begin_position();
737
777
  Identifier* label = NULL;
738
778
  IterationStatement** target;
739
779
  Next();
@@ -754,13 +794,15 @@ class Parser
754
794
  }
755
795
  }
756
796
  ExpectSemicolon(CHECK);
757
- return factory_->NewContinueStatement(label, target);
797
+ return factory_->NewContinueStatement(label, target, begin,
798
+ lexer_.previous_end_position());
758
799
  }
759
800
 
760
801
  // BreakStatement
761
802
  // : BREAK Identifier_opt ';'
762
803
  Statement* ParseBreakStatement(bool *res) {
763
804
  assert(token_ == Token::BREAK);
805
+ const std::size_t begin = lexer_.begin_position();
764
806
  Identifier* label = NULL;
765
807
  BreakableStatement** target = NULL;
766
808
  Next();
@@ -794,13 +836,16 @@ class Parser
794
836
  }
795
837
  }
796
838
  ExpectSemicolon(CHECK);
797
- return factory_->NewBreakStatement(label, target);
839
+ return factory_->NewBreakStatement(label, target, begin,
840
+ lexer_.previous_end_position());
798
841
  }
799
842
 
800
843
  // ReturnStatement
801
844
  // : RETURN Expression_opt ';'
802
845
  Statement* ParseReturnStatement(bool *res) {
846
+ // TODO(Constellation) NewUndefined -> NULL
803
847
  assert(token_ == Token::RETURN);
848
+ const std::size_t begin = lexer_.begin_position();
804
849
  Next();
805
850
 
806
851
  if (scope_->IsGlobal()) {
@@ -814,17 +859,21 @@ class Parser
814
859
  token_ == Token::RBRACE ||
815
860
  token_ == Token::EOS) {
816
861
  ExpectSemicolon(CHECK);
817
- return factory_->NewReturnStatement(factory_->NewUndefined());
862
+ return factory_->NewReturnStatement(factory_->NewUndefined(),
863
+ begin,
864
+ lexer_.previous_end_position());
818
865
  }
819
866
  Expression *expr = ParseExpression(true, CHECK);
820
867
  ExpectSemicolon(CHECK);
821
- return factory_->NewReturnStatement(expr);
868
+ return factory_->NewReturnStatement(expr, begin,
869
+ lexer_.previous_end_position());
822
870
  }
823
871
 
824
872
  // WithStatement
825
873
  // : WITH '(' Expression ')' Statement
826
874
  Statement* ParseWithStatement(bool *res) {
827
875
  assert(token_ == Token::WITH);
876
+ const std::size_t begin = lexer_.begin_position();
828
877
  Next();
829
878
 
830
879
  // section 12.10.1
@@ -840,7 +889,7 @@ class Parser
840
889
  EXPECT(Token::RPAREN);
841
890
 
842
891
  Statement *stmt = ParseStatement(CHECK);
843
- return factory_->NewWithStatement(expr, stmt);
892
+ return factory_->NewWithStatement(expr, stmt, begin);
844
893
  }
845
894
 
846
895
  // SwitchStatement
@@ -851,6 +900,7 @@ class Parser
851
900
  // | '{' CaseClauses_opt DefaultClause CaseClauses_opt '}'
852
901
  Statement* ParseSwitchStatement(bool *res) {
853
902
  assert(token_ == Token::SWITCH);
903
+ const std::size_t begin = lexer_.begin_position();
854
904
  CaseClause* case_clause;
855
905
  Next();
856
906
 
@@ -882,9 +932,10 @@ class Parser
882
932
  clauses->push_back(case_clause);
883
933
  }
884
934
  Next();
885
-
886
935
  SwitchStatement* const switch_stmt =
887
- factory_->NewSwitchStatement(expr, clauses);
936
+ factory_->NewSwitchStatement(expr, clauses,
937
+ begin,
938
+ lexer_.previous_end_position());
888
939
  target.set_node(switch_stmt);
889
940
  return switch_stmt;
890
941
  }
@@ -900,6 +951,7 @@ class Parser
900
951
  // : DEFAULT ':' StatementList_opt
901
952
  CaseClause* ParseCaseClause(bool *res) {
902
953
  assert(token_ == Token::CASE || token_ == Token::DEFAULT);
954
+ const std::size_t begin = lexer_.begin_position();
903
955
  Expression* expr = NULL;
904
956
  Statements* const body = factory_->template NewVector<Statement*>();
905
957
 
@@ -919,22 +971,25 @@ class Parser
919
971
  body->push_back(stmt);
920
972
  }
921
973
 
922
- return factory_->NewCaseClause(expr == NULL, expr, body);
974
+ return factory_->NewCaseClause(expr == NULL,
975
+ expr, body,
976
+ begin, lexer_.previous_end_position());
923
977
  }
924
978
 
925
979
  // ThrowStatement
926
980
  // : THROW Expression ';'
927
981
  Statement* ParseThrowStatement(bool *res) {
928
982
  assert(token_ == Token::THROW);
983
+ const std::size_t begin = lexer_.begin_position();
929
984
  Next();
930
985
  // Throw requires Expression
931
986
  if (lexer_.has_line_terminator_before_next()) {
932
- // TODO(Constellation) more refined parse error system
933
987
  RAISE("missing expression between throw and newline");
934
988
  }
935
989
  Expression* const expr = ParseExpression(true, CHECK);
936
990
  ExpectSemicolon(CHECK);
937
- return factory_->NewThrowStatement(expr);
991
+ return factory_->NewThrowStatement(expr,
992
+ begin, lexer_.previous_end_position());
938
993
  }
939
994
 
940
995
  // TryStatement
@@ -949,6 +1004,7 @@ class Parser
949
1004
  // : FINALLY Block
950
1005
  Statement* ParseTryStatement(bool *res) {
951
1006
  assert(token_ == Token::TRY);
1007
+ const std::size_t begin = lexer_.begin_position();
952
1008
  Identifier* name = NULL;
953
1009
  Block* catch_block = NULL;
954
1010
  Block* finally_block = NULL;
@@ -998,22 +1054,26 @@ class Parser
998
1054
  }
999
1055
 
1000
1056
  return factory_->NewTryStatement(try_block,
1001
- name, catch_block, finally_block);
1057
+ name, catch_block,
1058
+ finally_block, begin);
1002
1059
  }
1003
1060
 
1004
1061
  // DebuggerStatement
1005
1062
  // : DEBUGGER ';'
1006
1063
  Statement* ParseDebuggerStatement(bool *res) {
1007
1064
  assert(token_ == Token::DEBUGGER);
1065
+ const std::size_t begin = lexer_.begin_position();
1008
1066
  Next();
1009
1067
  ExpectSemicolon(CHECK);
1010
- return factory_->NewDebuggerStatement();
1068
+ return factory_->NewDebuggerStatement(begin,
1069
+ lexer_.previous_end_position());
1011
1070
  }
1012
1071
 
1013
1072
  Statement* ParseExpressionStatement(bool *res) {
1014
1073
  Expression* const expr = ParseExpression(true, CHECK);
1015
1074
  ExpectSemicolon(CHECK);
1016
- return factory_->NewExpressionStatement(expr);
1075
+ return factory_->NewExpressionStatement(expr,
1076
+ lexer_.previous_end_position());
1017
1077
  }
1018
1078
 
1019
1079
  // LabelledStatement
@@ -1040,13 +1100,14 @@ class Parser
1040
1100
  RAISE("duplicate label");
1041
1101
  }
1042
1102
  labels->push_back(label);
1043
- const LabelScope scope(this, labels, exist_labels);
1103
+ const LabelSwitcher label_switcher(this, labels, exist_labels);
1044
1104
 
1045
1105
  Statement* const stmt = ParseStatement(CHECK);
1046
1106
  return factory_->NewLabelledStatement(expr, stmt);
1047
1107
  }
1048
1108
  ExpectSemicolon(CHECK);
1049
- return factory_->NewExpressionStatement(expr);
1109
+ return factory_->NewExpressionStatement(expr,
1110
+ lexer_.previous_end_position());
1050
1111
  }
1051
1112
 
1052
1113
  template<bool Use>
@@ -1304,33 +1365,33 @@ class Parser
1304
1365
  Expression* res;
1305
1366
  switch (op) {
1306
1367
  case Token::ADD:
1307
- res = factory_->NewNumberLiteral(l_val + r_val);
1368
+ res = factory_->NewReducedNumberLiteral(l_val + r_val);
1308
1369
  break;
1309
1370
 
1310
1371
  case Token::SUB:
1311
- res = factory_->NewNumberLiteral(l_val - r_val);
1372
+ res = factory_->NewReducedNumberLiteral(l_val - r_val);
1312
1373
  break;
1313
1374
 
1314
1375
  case Token::MUL:
1315
- res = factory_->NewNumberLiteral(l_val * r_val);
1376
+ res = factory_->NewReducedNumberLiteral(l_val * r_val);
1316
1377
  break;
1317
1378
 
1318
1379
  case Token::DIV:
1319
- res = factory_->NewNumberLiteral(l_val / r_val);
1380
+ res = factory_->NewReducedNumberLiteral(l_val / r_val);
1320
1381
  break;
1321
1382
 
1322
1383
  case Token::BIT_OR:
1323
- res = factory_->NewNumberLiteral(
1384
+ res = factory_->NewReducedNumberLiteral(
1324
1385
  DoubleToInt32(l_val) | DoubleToInt32(r_val));
1325
1386
  break;
1326
1387
 
1327
1388
  case Token::BIT_AND:
1328
- res = factory_->NewNumberLiteral(
1389
+ res = factory_->NewReducedNumberLiteral(
1329
1390
  DoubleToInt32(l_val) & DoubleToInt32(r_val));
1330
1391
  break;
1331
1392
 
1332
1393
  case Token::BIT_XOR:
1333
- res = factory_->NewNumberLiteral(
1394
+ res = factory_->NewReducedNumberLiteral(
1334
1395
  DoubleToInt32(l_val) ^ DoubleToInt32(r_val));
1335
1396
  break;
1336
1397
 
@@ -1338,21 +1399,21 @@ class Parser
1338
1399
  case Token::SHL: {
1339
1400
  const int32_t value = DoubleToInt32(l_val)
1340
1401
  << (DoubleToInt32(r_val) & 0x1f);
1341
- res = factory_->NewNumberLiteral(value);
1402
+ res = factory_->NewReducedNumberLiteral(value);
1342
1403
  break;
1343
1404
  }
1344
1405
 
1345
1406
  case Token::SHR: {
1346
1407
  const uint32_t shift = DoubleToInt32(r_val) & 0x1f;
1347
1408
  const uint32_t value = DoubleToUInt32(l_val) >> shift;
1348
- res = factory_->NewNumberLiteral(value);
1409
+ res = factory_->NewReducedNumberLiteral(value);
1349
1410
  break;
1350
1411
  }
1351
1412
 
1352
1413
  case Token::SAR: {
1353
1414
  uint32_t shift = DoubleToInt32(r_val) & 0x1f;
1354
1415
  int32_t value = DoubleToInt32(l_val) >> shift;
1355
- res = factory_->NewNumberLiteral(value);
1416
+ res = factory_->NewReducedNumberLiteral(value);
1356
1417
  break;
1357
1418
  }
1358
1419
 
@@ -1388,13 +1449,14 @@ class Parser
1388
1449
  Expression* ParseUnaryExpression(bool *res) {
1389
1450
  Expression *result, *expr;
1390
1451
  const Token::Type op = token_;
1452
+ const std::size_t begin = lexer_.begin_position();
1391
1453
  switch (token_) {
1392
1454
  case Token::VOID:
1393
1455
  case Token::NOT:
1394
1456
  case Token::TYPEOF:
1395
1457
  Next();
1396
1458
  expr = ParseUnaryExpression(CHECK);
1397
- result = factory_->NewUnaryOperation(op, expr);
1459
+ result = factory_->NewUnaryOperation(op, expr, begin);
1398
1460
  break;
1399
1461
 
1400
1462
  case Token::DELETE:
@@ -1407,17 +1469,17 @@ class Parser
1407
1469
  expr->AsIdentifier()) {
1408
1470
  RAISE("delete to direct identifier not allowed in strict code");
1409
1471
  }
1410
- result = factory_->NewUnaryOperation(op, expr);
1472
+ result = factory_->NewUnaryOperation(op, expr, begin);
1411
1473
  break;
1412
1474
 
1413
1475
  case Token::BIT_NOT:
1414
1476
  Next();
1415
1477
  expr = ParseUnaryExpression(CHECK);
1416
- if (expr->AsNumberLiteral()) {
1417
- result = factory_->NewNumberLiteral(
1478
+ if (ReduceExpressions && expr->AsNumberLiteral()) {
1479
+ result = factory_->NewReducedNumberLiteral(
1418
1480
  ~DoubleToInt32(expr->AsNumberLiteral()->value()));
1419
1481
  } else {
1420
- result = factory_->NewUnaryOperation(op, expr);
1482
+ result = factory_->NewUnaryOperation(op, expr, begin);
1421
1483
  }
1422
1484
  break;
1423
1485
 
@@ -1427,18 +1489,18 @@ class Parser
1427
1489
  if (expr->AsNumberLiteral()) {
1428
1490
  result = expr;
1429
1491
  } else {
1430
- result = factory_->NewUnaryOperation(op, expr);
1492
+ result = factory_->NewUnaryOperation(op, expr, begin);
1431
1493
  }
1432
1494
  break;
1433
1495
 
1434
1496
  case Token::SUB:
1435
1497
  Next();
1436
1498
  expr = ParseUnaryExpression(CHECK);
1437
- if (expr->AsNumberLiteral()) {
1438
- result = factory_->NewNumberLiteral(
1499
+ if (ReduceExpressions && expr->AsNumberLiteral()) {
1500
+ result = factory_->NewReducedNumberLiteral(
1439
1501
  -(expr->AsNumberLiteral()->value()));
1440
1502
  } else {
1441
- result = factory_->NewUnaryOperation(op, expr);
1503
+ result = factory_->NewUnaryOperation(op, expr, begin);
1442
1504
  }
1443
1505
  break;
1444
1506
 
@@ -1464,7 +1526,7 @@ class Parser
1464
1526
  }
1465
1527
  }
1466
1528
  }
1467
- result = factory_->NewUnaryOperation(op, expr);
1529
+ result = factory_->NewUnaryOperation(op, expr, begin);
1468
1530
  break;
1469
1531
 
1470
1532
  default:
@@ -1499,7 +1561,8 @@ class Parser
1499
1561
  }
1500
1562
  }
1501
1563
  }
1502
- expr = factory_->NewPostfixExpression(token_, expr);
1564
+ expr = factory_->NewPostfixExpression(token_, expr,
1565
+ lexer_.end_position());
1503
1566
  Next();
1504
1567
  }
1505
1568
  return expr;
@@ -1535,7 +1598,7 @@ class Parser
1535
1598
  if (token_ == Token::LPAREN) {
1536
1599
  ParseArguments(args, CHECK);
1537
1600
  }
1538
- expr = factory_->NewConstructorCall(target, args);
1601
+ expr = factory_->NewConstructorCall(target, args, lexer_.previous_end_position());
1539
1602
  }
1540
1603
  while (true) {
1541
1604
  switch (token_) {
@@ -1560,7 +1623,8 @@ class Parser
1560
1623
  Expressions* const args =
1561
1624
  factory_->template NewVector<Expression*>();
1562
1625
  ParseArguments(args, CHECK);
1563
- expr = factory_->NewFunctionCall(expr, args);
1626
+ expr = factory_->NewFunctionCall(expr, args,
1627
+ lexer_.previous_end_position());
1564
1628
  } else {
1565
1629
  return expr;
1566
1630
  }
@@ -1591,7 +1655,8 @@ class Parser
1591
1655
  Expression* result = NULL;
1592
1656
  switch (token_) {
1593
1657
  case Token::THIS:
1594
- result = factory_->NewThisLiteral();
1658
+ result = factory_->NewThisLiteral(lexer_.begin_position(),
1659
+ lexer_.end_position());
1595
1660
  Next();
1596
1661
  break;
1597
1662
 
@@ -1600,17 +1665,20 @@ class Parser
1600
1665
  break;
1601
1666
 
1602
1667
  case Token::NULL_LITERAL:
1603
- result = factory_->NewNullLiteral();
1668
+ result = factory_->NewNullLiteral(lexer_.begin_position(),
1669
+ lexer_.end_position());
1604
1670
  Next();
1605
1671
  break;
1606
1672
 
1607
1673
  case Token::TRUE_LITERAL:
1608
- result = factory_->NewTrueLiteral();
1674
+ result = factory_->NewTrueLiteral(lexer_.begin_position(),
1675
+ lexer_.end_position());
1609
1676
  Next();
1610
1677
  break;
1611
1678
 
1612
1679
  case Token::FALSE_LITERAL:
1613
- result = factory_->NewFalseLiteral();
1680
+ result = factory_->NewFalseLiteral(lexer_.begin_position(),
1681
+ lexer_.end_position());
1614
1682
  Next();
1615
1683
  break;
1616
1684
 
@@ -1620,7 +1688,9 @@ class Parser
1620
1688
  if (strict_ && lexer_.NumericType() == lexer_type::OCTAL) {
1621
1689
  RAISE("octal integer literal not allowed in strict code");
1622
1690
  }
1623
- result = factory_->NewNumberLiteral(lexer_.Numeric());
1691
+ result = factory_->NewNumberLiteral(lexer_.Numeric(),
1692
+ lexer_.begin_position(),
1693
+ lexer_.end_position());
1624
1694
  Next();
1625
1695
  break;
1626
1696
 
@@ -1630,9 +1700,13 @@ class Parser
1630
1700
  RAISE("octal excape sequence not allowed in strict code");
1631
1701
  }
1632
1702
  if (state == lexer_type::NONE) {
1633
- result = factory_->NewDirectivable(lexer_.Buffer());
1703
+ result = factory_->NewDirectivable(lexer_.Buffer(),
1704
+ lexer_.begin_position(),
1705
+ lexer_.end_position());
1634
1706
  } else {
1635
- result = factory_->NewStringLiteral(lexer_.Buffer());
1707
+ result = factory_->NewStringLiteral(lexer_.Buffer(),
1708
+ lexer_.begin_position(),
1709
+ lexer_.end_position());
1636
1710
  }
1637
1711
  Next();
1638
1712
  break;
@@ -1696,8 +1770,10 @@ class Parser
1696
1770
  if (!lexer_.ScanRegExpFlags()) {
1697
1771
  RAISE("invalid regular expression flag");
1698
1772
  }
1699
- RegExpLiteral* const expr =
1700
- factory_->NewRegExpLiteral(content, lexer_.Buffer());
1773
+ RegExpLiteral* const expr = factory_->NewRegExpLiteral(
1774
+ content, lexer_.Buffer(),
1775
+ lexer_.begin_position(),
1776
+ lexer_.end_position());
1701
1777
  if (!expr) {
1702
1778
  RAISE("invalid regular expression");
1703
1779
  }
@@ -1721,6 +1797,7 @@ class Parser
1721
1797
  // : ','
1722
1798
  // | Elision ','
1723
1799
  Expression* ParseArrayLiteral(bool *res) {
1800
+ const std::size_t begin = lexer_.begin_position();
1724
1801
  Expressions* const items = factory_->template NewVector<Expression*>();
1725
1802
  Next();
1726
1803
  while (token_ != Token::RBRACK) {
@@ -1736,7 +1813,8 @@ class Parser
1736
1813
  }
1737
1814
  }
1738
1815
  Next();
1739
- return factory_->NewArrayLiteral(items);
1816
+ return factory_->NewArrayLiteral(items,
1817
+ begin, lexer_.previous_end_position());
1740
1818
  }
1741
1819
 
1742
1820
 
@@ -1768,6 +1846,7 @@ class Parser
1768
1846
  typedef std::tr1::unordered_map<IdentifierKey, int> ObjectMap;
1769
1847
  typedef typename ObjectLiteral::Property Property;
1770
1848
  typedef typename ObjectLiteral::Properties Properties;
1849
+ const std::size_t begin = lexer_.begin_position();
1771
1850
  Properties* const prop = factory_->template NewVector<Property>();
1772
1851
  ObjectMap map;
1773
1852
  Expression* expr;
@@ -1782,8 +1861,10 @@ class Parser
1782
1861
  Next<IgnoreReservedWords>(); // IDENTIFIERNAME
1783
1862
  if (token_ == Token::COLON) {
1784
1863
  // property
1785
- ident = ParseIdentifier(
1786
- is_get ? ParserData::kGet : ParserData::kSet);
1864
+ ident = ParseIdentifierWithPosition(
1865
+ is_get ? ParserData::kGet : ParserData::kSet,
1866
+ lexer_.previous_begin_position(),
1867
+ lexer_.previous_end_position());
1787
1868
  expr = ParseAssignmentExpression(true, CHECK);
1788
1869
  ObjectLiteral::AddDataProperty(prop, ident, expr);
1789
1870
  typename ObjectMap::iterator it = map.find(ident);
@@ -1870,8 +1951,9 @@ class Parser
1870
1951
  Next<IgnoreReservedWordsAndIdentifyGetterOrSetter>();
1871
1952
  }
1872
1953
  }
1954
+ const std::size_t end = lexer_.begin_position();
1873
1955
  Next();
1874
- return factory_->NewObjectLiteral(prop);
1956
+ return factory_->NewObjectLiteral(prop, begin, end);
1875
1957
  }
1876
1958
 
1877
1959
  FunctionLiteral* ParseFunctionLiteral(
@@ -1882,6 +1964,7 @@ class Parser
1882
1964
  // IDENTIFIER_opt
1883
1965
  std::tr1::unordered_set<IdentifierKey> param_set;
1884
1966
  std::size_t throw_error_if_strict_code_line = 0;
1967
+ const std::size_t begin_position = lexer_.begin_position();
1885
1968
  enum {
1886
1969
  kDetectNone = 0,
1887
1970
  kDetectEvalName,
@@ -1892,8 +1975,8 @@ class Parser
1892
1975
  kDetectFutureReservedWords
1893
1976
  } throw_error_if_strict_code = kDetectNone;
1894
1977
 
1895
- FunctionLiteral* const literal = factory_->NewFunctionLiteral(decl_type);
1896
- literal->set_strict(strict_);
1978
+ Identifiers* const params = factory_->template NewVector<Identifier*>();
1979
+ Identifier* name = NULL;
1897
1980
 
1898
1981
  if (arg_type == FunctionLiteral::GENERAL) {
1899
1982
  assert(token_ == Token::FUNCTION);
@@ -1901,8 +1984,7 @@ class Parser
1901
1984
  const Token::Type current = token_;
1902
1985
  if (current == Token::IDENTIFIER ||
1903
1986
  Token::IsAddedFutureReservedWordInStrictCode(current)) {
1904
- Identifier* const name = ParseIdentifier(lexer_.Buffer());
1905
- literal->SetName(name);
1987
+ name = ParseIdentifier(lexer_.Buffer());
1906
1988
  if (Token::IsAddedFutureReservedWordInStrictCode(current)) {
1907
1989
  throw_error_if_strict_code = kDetectFutureReservedWords;
1908
1990
  throw_error_if_strict_code_line = lexer_.line_number();
@@ -1921,9 +2003,7 @@ class Parser
1921
2003
  }
1922
2004
  }
1923
2005
 
1924
- const ScopeSwitcher switcher(this, literal->scope());
1925
- const TargetScope scope(this);
1926
- literal->set_start_position(lexer_.begin_position());
2006
+ const std::size_t begin_block_position = lexer_.begin_position();
1927
2007
 
1928
2008
  // '(' FormalParameterList_opt ')'
1929
2009
  IS(Token::LPAREN);
@@ -1954,7 +2034,7 @@ class Parser
1954
2034
  }
1955
2035
  }
1956
2036
  }
1957
- literal->AddParameter(ident);
2037
+ params->push_back(ident);
1958
2038
  EXPECT(Token::RPAREN);
1959
2039
  } else {
1960
2040
  if (token_ != Token::RPAREN) {
@@ -1984,7 +2064,7 @@ class Parser
1984
2064
  throw_error_if_strict_code_line = lexer_.line_number();
1985
2065
  }
1986
2066
  }
1987
- literal->AddParameter(ident);
2067
+ params->push_back(ident);
1988
2068
  param_set.insert(ident);
1989
2069
  if (token_ == Token::COMMA) {
1990
2070
  Next(true);
@@ -2003,8 +2083,13 @@ class Parser
2003
2083
  // | SourceElements
2004
2084
  EXPECT(Token::LBRACE);
2005
2085
 
2006
- ParseSourceElements(Token::RBRACE, literal, CHECK);
2007
- if (strict_ || literal->strict()) {
2086
+ Statements* const body = factory_->template NewVector<Statement*>();
2087
+ Scope* const scope = factory_->NewScope(decl_type);
2088
+ const ScopeSwitcher scope_switcher(this, scope);
2089
+ const TargetSwitcher target_switcher(this);
2090
+ const bool function_is_strict =
2091
+ ParseSourceElements(Token::RBRACE, body, CHECK);
2092
+ if (strict_ || function_is_strict) {
2008
2093
  // section 13.1
2009
2094
  // Strict Mode Restrictions
2010
2095
  switch (throw_error_if_strict_code) {
@@ -2042,14 +2127,36 @@ class Parser
2042
2127
  break;
2043
2128
  }
2044
2129
  }
2045
- literal->set_end_position(lexer_.end_position());
2046
2130
  Next();
2047
- return literal;
2131
+ const std::size_t end_block_position = lexer_.previous_end_position();
2132
+ return factory_->NewFunctionLiteral(decl_type,
2133
+ name,
2134
+ params,
2135
+ body,
2136
+ scope,
2137
+ function_is_strict,
2138
+ begin_block_position,
2139
+ end_block_position,
2140
+ begin_position,
2141
+ end_block_position);
2048
2142
  }
2049
2143
 
2050
2144
  template<typename Range>
2051
2145
  Identifier* ParseIdentifier(const Range& range) {
2052
- Identifier* const ident = factory_->NewIdentifier(range);
2146
+ Identifier* const ident = factory_->NewIdentifier(range,
2147
+ lexer_.begin_position(),
2148
+ lexer_.end_position());
2149
+ Next();
2150
+ return ident;
2151
+ }
2152
+
2153
+ template<typename Range>
2154
+ Identifier* ParseIdentifierWithPosition(const Range& range,
2155
+ std::size_t begin,
2156
+ std::size_t end) {
2157
+ Identifier* const ident = factory_->NewIdentifier(range,
2158
+ begin,
2159
+ end);
2053
2160
  Next();
2054
2161
  return ident;
2055
2162
  }
@@ -2183,8 +2290,8 @@ class Parser
2183
2290
  UNEXPECT(token_);
2184
2291
  }
2185
2292
 
2186
- inline lexer_type& lexer() {
2187
- return lexer_;
2293
+ inline lexer_type* lexer() const {
2294
+ return &lexer_;
2188
2295
  }
2189
2296
  template<typename LexType>
2190
2297
  inline Token::Type Next() {
@@ -2249,15 +2356,15 @@ class Parser
2249
2356
  parser_type* parser_;
2250
2357
  };
2251
2358
 
2252
- class LabelScope : private Noncopyable<LabelScope>::type {
2359
+ class LabelSwitcher : private Noncopyable<LabelSwitcher>::type {
2253
2360
  public:
2254
- LabelScope(parser_type* parser,
2255
- Identifiers* labels, bool exist_labels)
2361
+ LabelSwitcher(parser_type* parser,
2362
+ Identifiers* labels, bool exist_labels)
2256
2363
  : parser_(parser),
2257
2364
  exist_labels_(exist_labels) {
2258
2365
  parser_->set_labels(labels);
2259
2366
  }
2260
- ~LabelScope() {
2367
+ ~LabelSwitcher() {
2261
2368
  if (!exist_labels_) {
2262
2369
  parser_->set_labels(NULL);
2263
2370
  }
@@ -2279,6 +2386,9 @@ class Parser
2279
2386
  inline void SwitchStrictMode() const {
2280
2387
  parser_->set_strict(true);
2281
2388
  }
2389
+ inline bool IsStrict() const {
2390
+ return parser_->strict();
2391
+ }
2282
2392
  private:
2283
2393
  parser_type* parser_;
2284
2394
  bool prev_;