@@ -554,6 +554,10 @@ struct JSPrinter {
554554
555555 JSPrinter (bool pretty_, bool finalize_, Ref ast_) : pretty(pretty_), finalize(finalize_), buffer(0 ), size(0 ), used(0 ), indent(0 ), possibleSpace(false ), ast(ast_) {}
556556
557+ ~JSPrinter () {
558+ free (buffer);
559+ }
560+
557561 void printAst () {
558562 print (ast);
559563 buffer[used] = 0 ;
@@ -652,6 +656,7 @@ struct JSPrinter {
652656 }
653657 if (node->isAssign ()) {
654658 printAssign (node);
659+ return ;
655660 }
656661 IString type = node[0 ]->getIString ();
657662 switch (type.str [0 ]) {
@@ -715,6 +720,7 @@ struct JSPrinter {
715720 }
716721 case ' t' : {
717722 if (type == TOPLEVEL) printToplevel (node);
723+ else if (type == TRY) printTry (node);
718724 else abort ();
719725 break ;
720726 }
@@ -808,7 +814,6 @@ struct JSPrinter {
808814 }
809815
810816 void printAssign (Ref node) {
811- assert (false && " printAssign still used!" );
812817 auto * assign = node->asAssign ();
813818 printChild (assign->target (), node, -1 );
814819 space ();
@@ -1135,6 +1140,15 @@ struct JSPrinter {
11351140 emit (' }' );
11361141 }
11371142
1143+ void printTry (Ref node) {
1144+ emit (" try " );
1145+ printBlock (node[1 ]);
1146+ emit (" catch (" );
1147+ printName (node[2 ]);
1148+ emit (" ) " );
1149+ printBlock (node[3 ]);
1150+ }
1151+
11381152 void printSub (Ref node) {
11391153 printChild (node[1 ], node, -1 );
11401154 emit (' [' );
@@ -1377,66 +1391,18 @@ class ValueBuilder {
13771391 .push_back (makeRawArray ());
13781392 return ret;
13791393 }
1380- static Ref makeCall (IString target, Ref arg) {
1381- Ref ret = &makeRawArray (3 )->push_back (makeRawString (CALL))
1382- .push_back (makeName (target))
1383- .push_back (makeRawArray (1 ));
1384- ret[2 ]->push_back (arg);
1385- return ret;
1386- }
1387- static Ref makeCall (IString target, Ref arg1, Ref arg2) {
1388- Ref ret = &makeRawArray (3 )->push_back (makeRawString (CALL))
1389- .push_back (makeName (target))
1390- .push_back (makeRawArray (2 ));
1391- ret[2 ]->push_back (arg1);
1392- ret[2 ]->push_back (arg2);
1393- return ret;
1394- }
1395- static Ref makeCall (IString target, Ref arg1, Ref arg2, Ref arg3, Ref arg4) {
1396- Ref ret = &makeRawArray (3 )->push_back (makeRawString (CALL))
1397- .push_back (makeName (target))
1398- .push_back (makeRawArray (4 ));
1399- ret[2 ]->push_back (arg1);
1400- ret[2 ]->push_back (arg2);
1401- ret[2 ]->push_back (arg3);
1402- ret[2 ]->push_back (arg4);
1403- return ret;
1404- }
1405- static Ref makeCall (IString target, Ref arg1, Ref arg2, Ref arg3, Ref arg4, Ref arg5, Ref arg6, Ref arg7, Ref arg8) {
1406- Ref ret = &makeRawArray (3 )->push_back (makeRawString (CALL))
1407- .push_back (makeName (target))
1408- .push_back (makeRawArray (8 ));
1409- ret[2 ]->push_back (arg1);
1410- ret[2 ]->push_back (arg2);
1411- ret[2 ]->push_back (arg3);
1412- ret[2 ]->push_back (arg4);
1413- ret[2 ]->push_back (arg5);
1414- ret[2 ]->push_back (arg6);
1415- ret[2 ]->push_back (arg7);
1416- ret[2 ]->push_back (arg8);
1417- return ret;
1418- }
1419- static Ref makeCall (IString target, Ref arg1, Ref arg2, Ref arg3, Ref arg4, Ref arg5, Ref arg6, Ref arg7, Ref arg8, Ref arg9, Ref arg10, Ref arg11, Ref arg12, Ref arg13, Ref arg14, Ref arg15, Ref arg16) {
1420- Ref ret = &makeRawArray (3 )->push_back (makeRawString (CALL))
1421- .push_back (makeName (target))
1422- .push_back (makeRawArray (16 ));
1423- ret[2 ]->push_back (arg1);
1424- ret[2 ]->push_back (arg2);
1425- ret[2 ]->push_back (arg3);
1426- ret[2 ]->push_back (arg4);
1427- ret[2 ]->push_back (arg5);
1428- ret[2 ]->push_back (arg6);
1429- ret[2 ]->push_back (arg7);
1430- ret[2 ]->push_back (arg8);
1431- ret[2 ]->push_back (arg9);
1432- ret[2 ]->push_back (arg10);
1433- ret[2 ]->push_back (arg11);
1434- ret[2 ]->push_back (arg12);
1435- ret[2 ]->push_back (arg13);
1436- ret[2 ]->push_back (arg14);
1437- ret[2 ]->push_back (arg15);
1438- ret[2 ]->push_back (arg16);
1439- return ret;
1394+
1395+ template <typename ...Ts>
1396+ static Ref makeCall (IString target, Ts... args) {
1397+ size_t nArgs = sizeof ...(Ts);
1398+ Ref callArgs = makeRawArray (nArgs);
1399+ Ref argArray[] = {args...};
1400+ for (size_t i = 0 ; i < nArgs; ++i) {
1401+ callArgs->push_back (argArray[i]);
1402+ }
1403+ return &makeRawArray (3 )->push_back (makeRawString (CALL))
1404+ .push_back (makeName (target))
1405+ .push_back (callArgs);
14401406 }
14411407
14421408 static void appendToCall (Ref call, Ref element) {
@@ -1610,12 +1576,26 @@ class ValueBuilder {
16101576 }
16111577 }
16121578
1579+ static Ref makeTry (Ref try_, Ref arg, Ref catch_) {
1580+ assert (try_[0 ] == BLOCK);
1581+ assert (catch_[0 ] == BLOCK);
1582+ return &makeRawArray (3 )->push_back (makeRawString (TRY))
1583+ .push_back (try_)
1584+ .push_back (arg)
1585+ .push_back (catch_);
1586+ }
1587+
16131588 static Ref makeDot (Ref obj, IString key) {
16141589 return &makeRawArray (3 )->push_back (makeRawString (DOT))
16151590 .push_back (obj)
16161591 .push_back (makeRawString (key));
16171592 }
16181593
1594+ template <typename ...Ts>
1595+ static Ref makeDot (Ref obj, Ref key, Ts... args) {
1596+ return makeDot (makeDot (obj, key), args...);
1597+ }
1598+
16191599 static Ref makeDot (Ref obj, Ref key) {
16201600 assert (key->isString ());
16211601 return makeDot (obj, key->getIString ());
0 commit comments