|
|
@@ -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();
|
|
|
|