txlyre 3 小時之前
父節點
當前提交
6696bd6ddd
共有 1 個文件被更改,包括 33 次插入5 次删除
  1. 33 5
      qic.c

+ 33 - 5
qic.c

@@ -3348,11 +3348,19 @@ node_t *parse(char *source) {
         },                                                                     \
         true);                                                                 \
   }
-#define COMPILE_ERROR(fmt, ...)                                                \
-  {                                                                            \
-    format_error(GETFNAME(node->fi), GETSRC(node->fi), node->pos, fmt,         \
-                 ##__VA_ARGS__);                                               \
-    exit(1);                                                                   \
+#define COMPILE_ERROR(fmt, ...)                                                          \
+  {                                                                                      \
+    if (MACROCALLS->length) {                                                            \
+      format_error(GETFNAME(((node_t *)MACROCALLS->data[MACROCALLS->length - 1])->fi),   \
+                   GETSRC(((node_t *)MACROCALLS->data[MACROCALLS->length - 1])->fi),     \
+                   ((node_t *)MACROCALLS->data[MACROCALLS->length - 1])->pos, fmt,       \
+                   ##__VA_ARGS__);                                                       \
+      format_error(GETFNAME(node->fi), GETSRC(node->fi), node->pos,                      \
+                   "after the expansion of macro:");                                     \
+    } else                                                                               \
+      format_error(GETFNAME(node->fi), GETSRC(node->fi), node->pos, fmt,                 \
+                   ##__VA_ARGS__);                                                       \
+    exit(1);                                                                             \
   }
 #define COMPILE_NOTE(fmt, ...)                                                 \
   {                                                                            \
@@ -3360,6 +3368,8 @@ node_t *parse(char *source) {
                  ##__VA_ARGS__);                                               \
   }
 
+list_t *MACROCALLS;
+
 void compile_node(buffer_t *gbuf, buffer_t *buf, list_t *ctx, table_t *ltab,
                   list_t *lstk, list_t *sstk, list_t *lbl, node_t *node);
 
@@ -5284,6 +5294,16 @@ node_t *_expand_mvars(node_t *node, int expr, mvar_expand_err_t *err) {
         return NULL;
     }
 
+    return node;
+  } else if (node->tag == N_RETURN) {
+    node = node_copy(node);
+
+    if (node->a) {
+      node->a = _expand_mvars(node->a, 1, err);
+      if (err->code != 0)
+        return NULL;
+    }
+
     return node;
   } else if (node->tag == N_CALL) {
     node = node_copy(node);
@@ -5388,6 +5408,9 @@ void compile_macro_call(buffer_t *gbuf, buffer_t *buf, list_t *ctx,
   if (r) {
     r = expand_mvars(node, r, expr);
 
+    if (expr && r->tag == N_EXPRSTMT)
+      r = r->a;
+
     if (r->tag == N_MACRO_CALL) {
       list_pop(MVARS);
 
@@ -5411,7 +5434,11 @@ void compile_macro_call(buffer_t *gbuf, buffer_t *buf, list_t *ctx,
     if (!expr && IS_EXPR(r))
       r = node1(N_EXPRSTMT, r);
 
+    list_push(MACROCALLS, node);
+
     compile_node(gbuf, buf, ctx, ltab, lstk, sstk, lbl, r);
+    
+    list_pop(MACROCALLS);
   } else
     COMPILE_ERROR("macro '%s' expanded to nil", name);
 
@@ -6998,6 +7025,7 @@ int main(int argc, char **argv) {
 
   HBUF = buffer_new();
   MVARS = list_new();
+  MACROCALLS = list_new();
 
   genmathlib();