@@ -27,6 +27,8 @@ using LFortran::Arg;
2727using LFortran::Fn_Arg;
2828using LFortran::Args_;
2929using LFortran::Var_Kw;
30+ using LFortran::Kw_or_Star_Arg;
31+ using LFortran::Call_Arg;
3032
3133static inline char * name2char (const ast_t *n) {
3234 return down_cast2<Name_t>(n)->m_id ;
@@ -546,32 +548,9 @@ static inline Var_Kw *VAR_KW(Allocator &al,
546548 STMTS(stmts), stmts.size(), \
547549 EXPRS(decorator), decorator.size())
548550#define CLASS_02 (decorator, id, args, stmts, l ) make_ClassDef_t(p.m_a, l, \
549- name2char (id), EXPRS( args) , args.size(), nullptr, 0 , \
551+ name2char (id), args->expr.p , args->expr.n, args->kw.p, args->kw.n , \
550552 STMTS(stmts), stmts.size(), \
551553 EXPRS(decorator), decorator.size())
552- #define CLASS_03 (decorator, id, args, keywords, stmts, l ) \
553- make_ClassDef_t (p.m_a, l, name2char(id), EXPRS(args), args.size(), \
554- keywords.p, keywords.n, STMTS(stmts), stmts.size(), \
555- EXPRS(decorator), decorator.size())
556- #define CLASS_04 (decorator, id, keywords, stmts, l ) make_ClassDef_t(p.m_a, l, \
557- name2char (id), nullptr, 0, keywords.p, keywords.n, \
558- STMTS(stmts), stmts.size(), \
559- EXPRS(decorator), decorator.size())
560- #define CLASS_05 (decorator, id, args, tc, stmts, l ) make_ClassDef_t(p.m_a, l, \
561- name2char (id), EXPRS(args), args.size(), nullptr, 0, \
562- STMTS(stmts), stmts.size(), \
563- EXPRS(decorator), decorator.size()); \
564- extract_type_comment (p, l, tc)
565- #define CLASS_06 (decorator, id, args, keywords, tc, stmts, l ) \
566- make_ClassDef_t (p.m_a, l, name2char(id), EXPRS(args), args.size(), \
567- keywords.p, keywords.n, STMTS(stmts), stmts.size(), \
568- EXPRS(decorator), decorator.size()); \
569- extract_type_comment (p, l, tc)
570- #define CLASS_07 (decorator, id, keywords, tc, stmts, l ) make_ClassDef_t(p.m_a, l, \
571- name2char (id), nullptr, 0, keywords.p, keywords.n, \
572- STMTS(stmts), stmts.size(), \
573- EXPRS(decorator), decorator.size()); \
574- extract_type_comment (p, l, tc)
575554
576555#define ASYNC_FUNCTION_01 (decorator, id, args, stmts, l ) \
577556 make_AsyncFunctionDef_t (p.m_a, l, name2char(id), args->arguments, \
@@ -841,14 +820,67 @@ static inline ast_t *PREFIX_STRING(Allocator &al, Location &l, char *prefix, cha
841820 return tmp;
842821}
843822
844- static inline keyword_t *CALL_KW (Allocator &al, Location &l,
823+ static inline keyword_t *CALL_ARG_KW (Allocator &al, Location &l,
845824 char *arg, expr_t * val) {
846825 keyword_t *r = al.allocate <keyword_t >();
847826 r->loc = l;
848827 r->m_arg = arg;
849828 r->m_value = val;
850829 return r;
851830}
831+ #define CALL_KW_01 (arg, val, l ) CALL_ARG_KW (p.m_a, l, \
832+ name2char (arg), EXPR(val))
833+ #define CALL_EXPR_01 (val, l ) CALL_ARG_KW (p.m_a, l, nullptr , EXPR (val))
834+
835+ static inline Kw_or_Star_Arg *KW_OR_EXPR (Allocator &al,
836+ expr_t *expr, keyword_t *kw_arg) {
837+ Kw_or_Star_Arg *r = al.allocate <Kw_or_Star_Arg>();
838+ r->star_arg = expr;
839+ r->kw_arg = kw_arg;
840+ return r;
841+ }
842+ #define CALL_KW_02 (id, e, l ) KW_OR_EXPR (p.m_a, nullptr , CALL_KW_01 (id, e, l))
843+ #define CALL_EXPR_02 (e, l ) KW_OR_EXPR (p.m_a, EXPR (e), nullptr )
844+
845+ static inline Call_Arg *CALL_ARG (
846+ Allocator &al,
847+ Kw_or_Star_Arg *m_expr_or_kw, size_t n_expr_or_kw,
848+ keyword_t *m_kw, size_t n_kw
849+ ) {
850+ Call_Arg *r = al.allocate <Call_Arg>();
851+ Vec<expr_t *> exprs;
852+ exprs.reserve (al, n_expr_or_kw);
853+ Vec<keyword_t > kws;
854+ kws.reserve (al, n_kw);
855+
856+ for (size_t i=0 ; i<n_expr_or_kw; i++) {
857+ if (m_expr_or_kw[i].star_arg != nullptr ) {
858+ exprs.push_back (al, m_expr_or_kw[i].star_arg );
859+ } else if (m_expr_or_kw[i].kw_arg != nullptr ) {
860+ kws.push_back (al, *m_expr_or_kw[i].kw_arg );
861+ }
862+ }
863+ for (size_t i=0 ; i<n_kw; i++) {
864+ kws.push_back (al, m_kw[i]);
865+ }
866+
867+ r->expr .p = exprs.p ;
868+ r->expr .n = exprs.n ;
869+ r->kw .p = kws.p ;
870+ r->kw .n = kws.n ;
871+ return r;
872+ }
873+
874+ #define CALL_ARG_00 () CALL_ARG (p.m_a, nullptr , 0 , nullptr , 0 )
875+ #define CALL_ARG_01 (exprs ) CALL_ARG (p.m_a, exprs.p, exprs.n, nullptr , 0 )
876+ #define CALL_ARG_02 (kwargs ) CALL_ARG (p.m_a, nullptr , 0 , kwargs.p, kwargs.n)
877+ #define CALL_ARG_03 (exprs, kwargs ) CALL_ARG (p.m_a, exprs.p, exprs.n, \
878+ kwargs.p, kwargs.n)
879+
880+ #define CALL_01 (func, args, l ) make_Call_t(p.m_a, l, \
881+ EXPR (func), args->expr.p, args->expr.n, args->kw.p, args->kw.n)
882+ #define CALL_02 (func, comp, l ) make_Call_t(p.m_a, l, \
883+ EXPR (func), EXPRS(comp), comp.size(), nullptr, 0)
852884
853885static inline comprehension_t *COMP(Allocator &al, Location &l,
854886 expr_t *target, expr_t * iter, expr_t **ifs, size_t ifs_size,
@@ -862,16 +894,6 @@ static inline comprehension_t *COMP(Allocator &al, Location &l,
862894 r->m_is_async = is_async;
863895 return r;
864896}
865-
866- #define CALL_KEYWORD_01 (arg, val, l ) CALL_KW (p.m_a, l, name2char(arg), EXPR (val))
867- #define CALL_KEYWORD_02 (val, l ) CALL_KW (p.m_a, l, nullptr , EXPR (val))
868- #define CALL_01 (func, args, l ) make_Call_t(p.m_a, l, \
869- EXPR (func), EXPRS(args), args.size(), nullptr, 0)
870- #define CALL_02 (func, args, keywords, l ) make_Call_t(p.m_a, l, \
871- EXPR (func), EXPRS(args), args.size(), keywords.p, keywords.size())
872- #define CALL_03 (func, keywords, l ) make_Call_t(p.m_a, l, \
873- EXPR (func), nullptr, 0, keywords.p, keywords.size())
874-
875897#define COMP_FOR_01 (target, iter, l ) COMP (p.m_a, l, \
876898 EXPR (SET_EXPR_CTX_01 (target, Store)), EXPR(iter), nullptr, 0, 0)
877899#define COMP_FOR_02 (target, iter, ifs, l ) COMP (p.m_a, l, \
0 commit comments