iv-phonic 0.1.5 → 0.1.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/Manifest.txt +1 -0
- data/Rakefile +1 -1
- data/ext/include/iv/ast.h +53 -62
- data/ext/include/iv/ast_factory.h +16 -23
- data/ext/include/iv/ast_fwd.h +6 -6
- data/ext/include/iv/ast_info.h +1 -1
- data/ext/include/iv/ast_serializer.h +35 -36
- data/ext/include/iv/ast_visitor.h +0 -1
- data/ext/include/iv/maybe.h +72 -0
- data/ext/include/iv/parser.h +64 -9
- data/ext/iv/phonic/ast_fwd.h +1 -1
- data/ext/iv/phonic/creator.h +53 -32
- data/ext/iv/phonic/factory.h +20 -30
- metadata +3 -2
@@ -71,7 +71,6 @@ class BasicAstVisitor
|
|
71
71
|
virtual void Visit(typename add<NullLiteral<Factory> >::type literal) = 0; //NOLINT
|
72
72
|
virtual void Visit(typename add<TrueLiteral<Factory> >::type literal) = 0; //NOLINT
|
73
73
|
virtual void Visit(typename add<FalseLiteral<Factory> >::type literal) = 0; //NOLINT
|
74
|
-
virtual void Visit(typename add<Undefined<Factory> >::type literal) = 0; //NOLINT
|
75
74
|
virtual void Visit(typename add<RegExpLiteral<Factory> >::type literal) = 0; //NOLINT
|
76
75
|
virtual void Visit(typename add<ArrayLiteral<Factory> >::type literal) = 0; //NOLINT
|
77
76
|
virtual void Visit(typename add<ObjectLiteral<Factory> >::type literal) = 0; //NOLINT
|
@@ -0,0 +1,72 @@
|
|
1
|
+
#ifndef _IV_MAYBE_H_
|
2
|
+
#define _IV_MAYBE_H_
|
3
|
+
#include <cassert>
|
4
|
+
#include <algorithm>
|
5
|
+
#include <tr1/type_traits>
|
6
|
+
#include "enable_if.h"
|
7
|
+
|
8
|
+
// Maybe NULL pointer wrapper class
|
9
|
+
// not have ownership
|
10
|
+
|
11
|
+
namespace iv {
|
12
|
+
namespace core {
|
13
|
+
|
14
|
+
template<class T>
|
15
|
+
class Maybe {
|
16
|
+
public:
|
17
|
+
typedef Maybe<T> this_type;
|
18
|
+
typedef void (this_type::*bool_type)() const;
|
19
|
+
|
20
|
+
Maybe(T* ptr) : ptr_(ptr) { }
|
21
|
+
Maybe() : ptr_(NULL) { }
|
22
|
+
|
23
|
+
template<class U>
|
24
|
+
Maybe(const Maybe<U>& rhs,
|
25
|
+
typename enable_if<std::tr1::is_convertible<U*, T*> >::type* = 0)
|
26
|
+
: ptr_(rhs.get_address_maybe_null()) {
|
27
|
+
}
|
28
|
+
|
29
|
+
T& operator*() const {
|
30
|
+
assert(ptr_);
|
31
|
+
return *ptr_;
|
32
|
+
}
|
33
|
+
|
34
|
+
T* Address() const {
|
35
|
+
assert(ptr_);
|
36
|
+
return ptr_;
|
37
|
+
}
|
38
|
+
|
39
|
+
operator bool_type() const {
|
40
|
+
return ptr_ != NULL ?
|
41
|
+
&this_type::this_type_does_not_support_comparisons : 0;
|
42
|
+
}
|
43
|
+
|
44
|
+
template<typename U>
|
45
|
+
this_type& operator=(const Maybe<U>& rhs) {
|
46
|
+
if (this != &rhs) {
|
47
|
+
this_type(rhs).swap(*this);
|
48
|
+
}
|
49
|
+
return *this;
|
50
|
+
}
|
51
|
+
|
52
|
+
inline void swap(this_type& rhs) {
|
53
|
+
using std::swap;
|
54
|
+
swap(ptr_, rhs.ptr_);
|
55
|
+
}
|
56
|
+
|
57
|
+
inline friend void swap(this_type& lhs, this_type& rhs) {
|
58
|
+
return lhs.swap(rhs);
|
59
|
+
}
|
60
|
+
|
61
|
+
inline T* get_address_maybe_null() const {
|
62
|
+
return ptr_;
|
63
|
+
}
|
64
|
+
|
65
|
+
private:
|
66
|
+
void this_type_does_not_support_comparisons() const { }
|
67
|
+
|
68
|
+
T* ptr_;
|
69
|
+
};
|
70
|
+
|
71
|
+
} } // namespace iv::core
|
72
|
+
#endif // _IV_MAYBE_H_
|
data/ext/include/iv/parser.h
CHANGED
@@ -8,6 +8,7 @@
|
|
8
8
|
#include <tr1/type_traits>
|
9
9
|
#include <tr1/array>
|
10
10
|
#include "static_assert.h"
|
11
|
+
#include "maybe.h"
|
11
12
|
#include "ast.h"
|
12
13
|
#include "ast_factory.h"
|
13
14
|
#include "lexer.h"
|
@@ -152,7 +153,7 @@ class Parser
|
|
152
153
|
#define V(AST) typedef typename ast::AST<Factory> AST;
|
153
154
|
AST_NODE_LIST(V)
|
154
155
|
#undef V
|
155
|
-
#define V(
|
156
|
+
#define V(XS) typedef typename ast::AstNode<Factory>::XS XS;
|
156
157
|
AST_LIST_LIST(V)
|
157
158
|
#undef V
|
158
159
|
#define V(S) typedef typename SpaceUString<Factory>::type S;
|
@@ -263,6 +264,11 @@ class Parser
|
|
263
264
|
Next();
|
264
265
|
const bool strict = ParseSourceElements(Token::EOS, body, CHECK);
|
265
266
|
const std::size_t end_position = lexer_.end_position();
|
267
|
+
#ifdef DEBUG
|
268
|
+
if (error_flag) {
|
269
|
+
assert(params && body && scope);
|
270
|
+
}
|
271
|
+
#endif
|
266
272
|
return (error_flag) ?
|
267
273
|
factory_->NewFunctionLiteral(FunctionLiteral::GLOBAL,
|
268
274
|
NULL,
|
@@ -464,6 +470,7 @@ class Parser
|
|
464
470
|
FunctionLiteral::GENERAL, CHECK);
|
465
471
|
// define named function as FunctionDeclaration
|
466
472
|
scope_->AddFunctionDeclaration(expr);
|
473
|
+
assert(expr);
|
467
474
|
return factory_->NewFunctionDeclaration(expr);
|
468
475
|
}
|
469
476
|
|
@@ -486,6 +493,7 @@ class Parser
|
|
486
493
|
body->push_back(stmt);
|
487
494
|
}
|
488
495
|
Next();
|
496
|
+
assert(body);
|
489
497
|
Block* const block = factory_->NewBlock(body,
|
490
498
|
begin,
|
491
499
|
lexer_.previous_end_position());
|
@@ -503,6 +511,7 @@ class Parser
|
|
503
511
|
Declarations* const decls = factory_->template NewVector<Declaration*>();
|
504
512
|
ParseVariableDeclarations(decls, token_ == Token::CONST, true, CHECK);
|
505
513
|
ExpectSemicolon(CHECK);
|
514
|
+
assert(decls);
|
506
515
|
return factory_->NewVariableStatement(op,
|
507
516
|
decls,
|
508
517
|
begin,
|
@@ -552,10 +561,12 @@ class Parser
|
|
552
561
|
Next();
|
553
562
|
// AssignmentExpression
|
554
563
|
expr = ParseAssignmentExpression(contains_in, CHECK);
|
564
|
+
assert(name);
|
555
565
|
decl = factory_->NewDeclaration(name, expr);
|
556
566
|
} else {
|
557
567
|
// Undefined Expression
|
558
|
-
|
568
|
+
assert(name);
|
569
|
+
decl = factory_->NewDeclaration(name, NULL);
|
559
570
|
}
|
560
571
|
decls->push_back(decl);
|
561
572
|
scope_->AddUnresolved(name, is_const);
|
@@ -593,6 +604,7 @@ class Parser
|
|
593
604
|
Next();
|
594
605
|
else_statement = ParseStatement(CHECK);
|
595
606
|
}
|
607
|
+
assert(expr && then_statement);
|
596
608
|
return factory_->NewIfStatement(expr,
|
597
609
|
then_statement,
|
598
610
|
else_statement,
|
@@ -635,6 +647,7 @@ class Parser
|
|
635
647
|
if (token_ == Token::SEMICOLON) {
|
636
648
|
Next();
|
637
649
|
}
|
650
|
+
assert(stmt && expr);
|
638
651
|
DoWhileStatement* const dowhile = factory_->NewDoWhileStatement(
|
639
652
|
stmt, expr, begin, lexer_.previous_end_position());
|
640
653
|
target.set_node(dowhile);
|
@@ -655,6 +668,7 @@ class Parser
|
|
655
668
|
EXPECT(Token::RPAREN);
|
656
669
|
|
657
670
|
Statement* const stmt = ParseStatement(CHECK);
|
671
|
+
assert(stmt);
|
658
672
|
WhileStatement* const whilestmt = factory_->NewWhileStatement(stmt,
|
659
673
|
expr, begin);
|
660
674
|
|
@@ -687,6 +701,7 @@ class Parser
|
|
687
701
|
factory_->template NewVector<Declaration*>();
|
688
702
|
ParseVariableDeclarations(decls, token_ == Token::CONST, false, CHECK);
|
689
703
|
if (token_ == Token::IN) {
|
704
|
+
assert(decls);
|
690
705
|
VariableStatement* const var =
|
691
706
|
factory_->NewVariableStatement(op,
|
692
707
|
decls,
|
@@ -705,12 +720,14 @@ class Parser
|
|
705
720
|
EXPECT(Token::RPAREN);
|
706
721
|
Target target(this, Target::kIterationStatement);
|
707
722
|
Statement* const body = ParseStatement(CHECK);
|
723
|
+
assert(body && init && enumerable);
|
708
724
|
ForInStatement* const forstmt =
|
709
725
|
factory_->NewForInStatement(body, init, enumerable,
|
710
726
|
for_stmt_begin);
|
711
727
|
target.set_node(forstmt);
|
712
728
|
return forstmt;
|
713
729
|
} else {
|
730
|
+
assert(decls);
|
714
731
|
init = factory_->NewVariableStatement(op, decls,
|
715
732
|
begin,
|
716
733
|
lexer_.end_position());
|
@@ -719,6 +736,7 @@ class Parser
|
|
719
736
|
Expression* const init_expr = ParseExpression(false, CHECK);
|
720
737
|
if (token_ == Token::IN) {
|
721
738
|
// for in loop
|
739
|
+
assert(init_expr);
|
722
740
|
init = factory_->NewExpressionStatement(init_expr,
|
723
741
|
lexer_.previous_end_position());
|
724
742
|
if (!init_expr->IsValidLeftHandSide()) {
|
@@ -729,12 +747,14 @@ class Parser
|
|
729
747
|
EXPECT(Token::RPAREN);
|
730
748
|
Target target(this, Target::kIterationStatement);
|
731
749
|
Statement* const body = ParseStatement(CHECK);
|
750
|
+
assert(body && init && enumerable);
|
732
751
|
ForInStatement* const forstmt =
|
733
752
|
factory_->NewForInStatement(body, init, enumerable,
|
734
753
|
for_stmt_begin);
|
735
754
|
target.set_node(forstmt);
|
736
755
|
return forstmt;
|
737
756
|
} else {
|
757
|
+
assert(init_expr);
|
738
758
|
init = factory_->NewExpressionStatement(init_expr,
|
739
759
|
lexer_.end_position());
|
740
760
|
}
|
@@ -757,7 +777,8 @@ class Parser
|
|
757
777
|
if (token_ == Token::RPAREN) {
|
758
778
|
Next();
|
759
779
|
} else {
|
760
|
-
Expression* next_expr = ParseExpression(true, CHECK);
|
780
|
+
Expression* const next_expr = ParseExpression(true, CHECK);
|
781
|
+
assert(next_expr);
|
761
782
|
next = factory_->NewExpressionStatement(next_expr,
|
762
783
|
lexer_.previous_end_position());
|
763
784
|
EXPECT(Token::RPAREN);
|
@@ -765,6 +786,7 @@ class Parser
|
|
765
786
|
|
766
787
|
Target target(this, Target::kIterationStatement);
|
767
788
|
Statement* const body = ParseStatement(CHECK);
|
789
|
+
assert(body);
|
768
790
|
ForStatement* const forstmt =
|
769
791
|
factory_->NewForStatement(body, init, cond, next, for_stmt_begin);
|
770
792
|
target.set_node(forstmt);
|
@@ -845,7 +867,6 @@ class Parser
|
|
845
867
|
// ReturnStatement
|
846
868
|
// : RETURN Expression_opt ';'
|
847
869
|
Statement* ParseReturnStatement(bool *res) {
|
848
|
-
// TODO(Constellation) NewUndefined -> NULL
|
849
870
|
assert(token_ == Token::RETURN);
|
850
871
|
const std::size_t begin = lexer_.begin_position();
|
851
872
|
Next();
|
@@ -861,11 +882,11 @@ class Parser
|
|
861
882
|
token_ == Token::RBRACE ||
|
862
883
|
token_ == Token::EOS) {
|
863
884
|
ExpectSemicolon(CHECK);
|
864
|
-
return factory_->NewReturnStatement(
|
885
|
+
return factory_->NewReturnStatement(NULL,
|
865
886
|
begin,
|
866
887
|
lexer_.previous_end_position());
|
867
888
|
}
|
868
|
-
Expression
|
889
|
+
Expression* const expr = ParseExpression(true, CHECK);
|
869
890
|
ExpectSemicolon(CHECK);
|
870
891
|
return factory_->NewReturnStatement(expr, begin,
|
871
892
|
lexer_.previous_end_position());
|
@@ -891,6 +912,7 @@ class Parser
|
|
891
912
|
EXPECT(Token::RPAREN);
|
892
913
|
|
893
914
|
Statement *stmt = ParseStatement(CHECK);
|
915
|
+
assert(expr && stmt);
|
894
916
|
return factory_->NewWithStatement(expr, stmt, begin);
|
895
917
|
}
|
896
918
|
|
@@ -934,6 +956,7 @@ class Parser
|
|
934
956
|
clauses->push_back(case_clause);
|
935
957
|
}
|
936
958
|
Next();
|
959
|
+
assert(expr && clauses);
|
937
960
|
SwitchStatement* const switch_stmt =
|
938
961
|
factory_->NewSwitchStatement(expr, clauses,
|
939
962
|
begin,
|
@@ -973,6 +996,7 @@ class Parser
|
|
973
996
|
body->push_back(stmt);
|
974
997
|
}
|
975
998
|
|
999
|
+
assert(body);
|
976
1000
|
return factory_->NewCaseClause(expr == NULL,
|
977
1001
|
expr, body,
|
978
1002
|
begin, lexer_.previous_end_position());
|
@@ -990,6 +1014,7 @@ class Parser
|
|
990
1014
|
}
|
991
1015
|
Expression* const expr = ParseExpression(true, CHECK);
|
992
1016
|
ExpectSemicolon(CHECK);
|
1017
|
+
assert(expr);
|
993
1018
|
return factory_->NewThrowStatement(expr,
|
994
1019
|
begin, lexer_.previous_end_position());
|
995
1020
|
}
|
@@ -1055,6 +1080,7 @@ class Parser
|
|
1055
1080
|
RAISE("missing catch or finally after try statement");
|
1056
1081
|
}
|
1057
1082
|
|
1083
|
+
assert(try_block);
|
1058
1084
|
return factory_->NewTryStatement(try_block,
|
1059
1085
|
name, catch_block,
|
1060
1086
|
finally_block, begin);
|
@@ -1074,6 +1100,7 @@ class Parser
|
|
1074
1100
|
Statement* ParseExpressionStatement(bool *res) {
|
1075
1101
|
Expression* const expr = ParseExpression(true, CHECK);
|
1076
1102
|
ExpectSemicolon(CHECK);
|
1103
|
+
assert(expr);
|
1077
1104
|
return factory_->NewExpressionStatement(expr,
|
1078
1105
|
lexer_.previous_end_position());
|
1079
1106
|
}
|
@@ -1105,9 +1132,11 @@ class Parser
|
|
1105
1132
|
const LabelSwitcher label_switcher(this, labels, exist_labels);
|
1106
1133
|
|
1107
1134
|
Statement* const stmt = ParseStatement(CHECK);
|
1135
|
+
assert(expr && stmt);
|
1108
1136
|
return factory_->NewLabelledStatement(expr, stmt);
|
1109
1137
|
}
|
1110
1138
|
ExpectSemicolon(CHECK);
|
1139
|
+
assert(expr);
|
1111
1140
|
return factory_->NewExpressionStatement(expr,
|
1112
1141
|
lexer_.previous_end_position());
|
1113
1142
|
}
|
@@ -1124,7 +1153,9 @@ class Parser
|
|
1124
1153
|
FunctionLiteral::GENERAL,
|
1125
1154
|
CHECK);
|
1126
1155
|
// define named function as variable declaration
|
1127
|
-
|
1156
|
+
assert(expr);
|
1157
|
+
assert(expr->name());
|
1158
|
+
scope_->AddUnresolved(expr->name().Address(), false);
|
1128
1159
|
return factory_->NewFunctionStatement(expr);
|
1129
1160
|
}
|
1130
1161
|
|
@@ -1146,6 +1177,7 @@ class Parser
|
|
1146
1177
|
while (token_ == Token::COMMA) {
|
1147
1178
|
Next();
|
1148
1179
|
right = ParseAssignmentExpression(contains_in, CHECK);
|
1180
|
+
assert(result && right);
|
1149
1181
|
result = factory_->NewBinaryOperation(Token::COMMA, result, right);
|
1150
1182
|
}
|
1151
1183
|
return result;
|
@@ -1178,6 +1210,7 @@ class Parser
|
|
1178
1210
|
const Token::Type op = token_;
|
1179
1211
|
Next();
|
1180
1212
|
Expression* const right = ParseAssignmentExpression(contains_in, CHECK);
|
1213
|
+
assert(result && right);
|
1181
1214
|
return factory_->NewAssignment(op, result, right);
|
1182
1215
|
}
|
1183
1216
|
|
@@ -1192,6 +1225,7 @@ class Parser
|
|
1192
1225
|
Expression* const left = ParseAssignmentExpression(true, CHECK);
|
1193
1226
|
EXPECT(Token::COLON);
|
1194
1227
|
Expression* const right = ParseAssignmentExpression(contains_in, CHECK);
|
1228
|
+
assert(result && left && right);
|
1195
1229
|
result = factory_->NewConditionalExpression(result, left, right);
|
1196
1230
|
}
|
1197
1231
|
return result;
|
@@ -1293,6 +1327,7 @@ class Parser
|
|
1293
1327
|
op = token_;
|
1294
1328
|
Next();
|
1295
1329
|
right = ParseBinaryExpression(contains_in, 2, CHECK);
|
1330
|
+
assert(left && right);
|
1296
1331
|
left = factory_->NewBinaryOperation(op, left, right);
|
1297
1332
|
}
|
1298
1333
|
if (prec < 4) return left;
|
@@ -1305,6 +1340,7 @@ class Parser
|
|
1305
1340
|
op = token_;
|
1306
1341
|
Next();
|
1307
1342
|
right = ParseBinaryExpression(contains_in, 3, CHECK);
|
1343
|
+
assert(left && right);
|
1308
1344
|
left = factory_->NewBinaryOperation(op, left, right);
|
1309
1345
|
}
|
1310
1346
|
if (prec < 5) return left;
|
@@ -1341,6 +1377,7 @@ class Parser
|
|
1341
1377
|
op = token_;
|
1342
1378
|
Next();
|
1343
1379
|
right = ParseBinaryExpression(contains_in, 7, CHECK);
|
1380
|
+
assert(left && right);
|
1344
1381
|
left = factory_->NewBinaryOperation(op, left, right);
|
1345
1382
|
}
|
1346
1383
|
if (prec < 9) return left;
|
@@ -1350,6 +1387,7 @@ class Parser
|
|
1350
1387
|
op = token_;
|
1351
1388
|
Next();
|
1352
1389
|
right = ParseBinaryExpression(contains_in, 8, CHECK);
|
1390
|
+
assert(left && right);
|
1353
1391
|
left = factory_->NewBinaryOperation(op, left, right);
|
1354
1392
|
}
|
1355
1393
|
return left;
|
@@ -1420,11 +1458,13 @@ class Parser
|
|
1420
1458
|
}
|
1421
1459
|
|
1422
1460
|
default:
|
1461
|
+
assert(left && right);
|
1423
1462
|
res = factory_->NewBinaryOperation(op, left, right);
|
1424
1463
|
break;
|
1425
1464
|
}
|
1426
1465
|
return res;
|
1427
1466
|
} else {
|
1467
|
+
assert(left && right);
|
1428
1468
|
return factory_->NewBinaryOperation(op, left, right);
|
1429
1469
|
}
|
1430
1470
|
}
|
@@ -1434,6 +1474,7 @@ class Parser
|
|
1434
1474
|
Expression* left,
|
1435
1475
|
Expression* right,
|
1436
1476
|
typename enable_if_c<!Reduce>::type* = 0) {
|
1477
|
+
assert(left && right);
|
1437
1478
|
return factory_->NewBinaryOperation(op, left, right);
|
1438
1479
|
}
|
1439
1480
|
|
@@ -1458,6 +1499,7 @@ class Parser
|
|
1458
1499
|
case Token::TYPEOF:
|
1459
1500
|
Next();
|
1460
1501
|
expr = ParseUnaryExpression(CHECK);
|
1502
|
+
assert(expr);
|
1461
1503
|
result = factory_->NewUnaryOperation(op, expr, begin);
|
1462
1504
|
break;
|
1463
1505
|
|
@@ -1471,6 +1513,7 @@ class Parser
|
|
1471
1513
|
expr->AsIdentifier()) {
|
1472
1514
|
RAISE("delete to direct identifier not allowed in strict code");
|
1473
1515
|
}
|
1516
|
+
assert(expr);
|
1474
1517
|
result = factory_->NewUnaryOperation(op, expr, begin);
|
1475
1518
|
break;
|
1476
1519
|
|
@@ -1481,6 +1524,7 @@ class Parser
|
|
1481
1524
|
result = factory_->NewReducedNumberLiteral(
|
1482
1525
|
~DoubleToInt32(expr->AsNumberLiteral()->value()));
|
1483
1526
|
} else {
|
1527
|
+
assert(expr);
|
1484
1528
|
result = factory_->NewUnaryOperation(op, expr, begin);
|
1485
1529
|
}
|
1486
1530
|
break;
|
@@ -1491,6 +1535,7 @@ class Parser
|
|
1491
1535
|
if (expr->AsNumberLiteral()) {
|
1492
1536
|
result = expr;
|
1493
1537
|
} else {
|
1538
|
+
assert(expr);
|
1494
1539
|
result = factory_->NewUnaryOperation(op, expr, begin);
|
1495
1540
|
}
|
1496
1541
|
break;
|
@@ -1502,6 +1547,7 @@ class Parser
|
|
1502
1547
|
result = factory_->NewReducedNumberLiteral(
|
1503
1548
|
-(expr->AsNumberLiteral()->value()));
|
1504
1549
|
} else {
|
1550
|
+
assert(expr);
|
1505
1551
|
result = factory_->NewUnaryOperation(op, expr, begin);
|
1506
1552
|
}
|
1507
1553
|
break;
|
@@ -1528,6 +1574,7 @@ class Parser
|
|
1528
1574
|
}
|
1529
1575
|
}
|
1530
1576
|
}
|
1577
|
+
assert(expr);
|
1531
1578
|
result = factory_->NewUnaryOperation(op, expr, begin);
|
1532
1579
|
break;
|
1533
1580
|
|
@@ -1563,6 +1610,7 @@ class Parser
|
|
1563
1610
|
}
|
1564
1611
|
}
|
1565
1612
|
}
|
1613
|
+
assert(expr);
|
1566
1614
|
expr = factory_->NewPostfixExpression(token_, expr,
|
1567
1615
|
lexer_.end_position());
|
1568
1616
|
Next();
|
@@ -1600,6 +1648,7 @@ class Parser
|
|
1600
1648
|
if (token_ == Token::LPAREN) {
|
1601
1649
|
ParseArguments(args, CHECK);
|
1602
1650
|
}
|
1651
|
+
assert(target && args);
|
1603
1652
|
expr = factory_->NewConstructorCall(target, args, lexer_.previous_end_position());
|
1604
1653
|
}
|
1605
1654
|
while (true) {
|
@@ -1607,6 +1656,7 @@ class Parser
|
|
1607
1656
|
case Token::LBRACK: {
|
1608
1657
|
Next();
|
1609
1658
|
Expression* const index = ParseExpression(true, CHECK);
|
1659
|
+
assert(expr && index);
|
1610
1660
|
expr = factory_->NewIndexAccess(expr, index);
|
1611
1661
|
EXPECT(Token::RBRACK);
|
1612
1662
|
break;
|
@@ -1616,6 +1666,7 @@ class Parser
|
|
1616
1666
|
Next<IgnoreReservedWords>(); // IDENTIFIERNAME
|
1617
1667
|
IS(Token::IDENTIFIER);
|
1618
1668
|
Identifier* const ident = ParseIdentifier(lexer_.Buffer());
|
1669
|
+
assert(expr && ident);
|
1619
1670
|
expr = factory_->NewIdentifierAccess(expr, ident);
|
1620
1671
|
break;
|
1621
1672
|
}
|
@@ -1625,6 +1676,7 @@ class Parser
|
|
1625
1676
|
Expressions* const args =
|
1626
1677
|
factory_->template NewVector<Expression*>();
|
1627
1678
|
ParseArguments(args, CHECK);
|
1679
|
+
assert(expr && args);
|
1628
1680
|
expr = factory_->NewFunctionCall(expr, args,
|
1629
1681
|
lexer_.previous_end_position());
|
1630
1682
|
} else {
|
@@ -1800,12 +1852,12 @@ class Parser
|
|
1800
1852
|
// | Elision ','
|
1801
1853
|
Expression* ParseArrayLiteral(bool *res) {
|
1802
1854
|
const std::size_t begin = lexer_.begin_position();
|
1803
|
-
|
1855
|
+
MaybeExpressions* const items = factory_->template NewVector<Maybe<Expression> >();
|
1804
1856
|
Next();
|
1805
1857
|
while (token_ != Token::RBRACK) {
|
1806
1858
|
if (token_ == Token::COMMA) {
|
1807
1859
|
// when Token::COMMA, only increment length
|
1808
|
-
items->push_back(
|
1860
|
+
items->push_back(Maybe<Expression>());
|
1809
1861
|
} else {
|
1810
1862
|
Expression* const expr = ParseAssignmentExpression(true, CHECK);
|
1811
1863
|
items->push_back(expr);
|
@@ -1815,6 +1867,7 @@ class Parser
|
|
1815
1867
|
}
|
1816
1868
|
}
|
1817
1869
|
Next();
|
1870
|
+
assert(items);
|
1818
1871
|
return factory_->NewArrayLiteral(items,
|
1819
1872
|
begin, lexer_.previous_end_position());
|
1820
1873
|
}
|
@@ -1959,6 +2012,7 @@ class Parser
|
|
1959
2012
|
}
|
1960
2013
|
const std::size_t end = lexer_.begin_position();
|
1961
2014
|
Next();
|
2015
|
+
assert(prop);
|
1962
2016
|
return factory_->NewObjectLiteral(prop, begin, end);
|
1963
2017
|
}
|
1964
2018
|
|
@@ -2135,6 +2189,7 @@ class Parser
|
|
2135
2189
|
}
|
2136
2190
|
Next();
|
2137
2191
|
const std::size_t end_block_position = lexer_.previous_end_position();
|
2192
|
+
assert(params && body && scope);
|
2138
2193
|
return factory_->NewFunctionLiteral(decl_type,
|
2139
2194
|
name,
|
2140
2195
|
params,
|
data/ext/iv/phonic/ast_fwd.h
CHANGED
@@ -52,7 +52,7 @@ namespace phonic {
|
|
52
52
|
#define V(AST) typedef core::ast::AST<AstFactory> AST;
|
53
53
|
AST_NODE_LIST(V)
|
54
54
|
#undef V
|
55
|
-
#define V(
|
55
|
+
#define V(XS) typedef core::ast::AstNode<AstFactory>::XS XS;
|
56
56
|
AST_LIST_LIST(V)
|
57
57
|
#undef V
|
58
58
|
#define V(S) typedef core::SpaceUString<AstFactory>::type S;
|