git » jacl.git » commit c21267d

Fix %IF bug: if context is return, children should have expr context

author Alan Dipert
2020-01-30 00:37:14 UTC
committer Alan Dipert
2020-01-30 00:37:14 UTC
parent 989e40a1a7aa0892731ab7abca943602e55ebda0

Fix %IF bug: if context is return, children should have expr context

jacl.js +8 -4

diff --git a/jacl.js b/jacl.js
index e4161d7..80576a0 100644
--- a/jacl.js
+++ b/jacl.js
@@ -1373,9 +1373,10 @@ const analyzeSpecials = new Map([
   [JACLPKG.intern('%IF'), (env, parent, form) => {
     if ([...form].length < 4) throw new Error(`IF requires at least 3 args`);
     const [, pred, expr0, expr1] = form;
+    const childEnv = env.context === 'return' ? env.withContext('expr') : env;
     const testNode = analyze(env.withContext('expr'), null, pred),
-          thenNode = analyze(env, null, expr0),
-          elseNode = analyze(env, null, expr1);
+          thenNode = analyze(childEnv, null, expr0),
+          elseNode = analyze(childEnv, null, expr1);
     const node = makeNode('if', {
       env: env,
       parent: parent,
@@ -1847,7 +1848,10 @@ const emitNode = (print, node) => {
       print(')');
       if (context !== 'expr') print(';\n');
       break;
-    case 'if':
+    case 'if': {
+      if (context === 'return') {
+        print('return ');
+      }
       if (context === 'expr' || context === 'return') {
         print('((');
         emitNode(print, node.testNode);
@@ -1866,7 +1870,7 @@ const emitNode = (print, node) => {
         print('\n');
       }
       break;
-    case 'tagbody': {
+    } case 'tagbody': {
       if (context === 'return') print('return ');
       if (context === 'return' || context === 'expr') {
         print('(function()\n');