diff --git a/src/expr.h b/src/expr.h index 713a5592..7651f5c6 100644 --- a/src/expr.h +++ b/src/expr.h @@ -687,13 +687,14 @@ struct CallExpr: Expr{ ctx->emit(OP_BUILD_TUPLE_UNPACK, (int)args.size(), line); for(auto& item: kwargs){ - item.second->emit(ctx); if(item.second->is_starred()){ if(item.second->star_level() != 2) FATAL_ERROR(); + item.second->emit(ctx); }else{ // k=v int index = ctx->add_const(py_var(ctx->vm, item.first)); ctx->emit(OP_LOAD_CONST, index, line); + item.second->emit(ctx); ctx->emit(OP_BUILD_TUPLE, 2, line); } } diff --git a/tests/46_star.py b/tests/46_star.py index f21e31b8..e1034feb 100644 --- a/tests/46_star.py +++ b/tests/46_star.py @@ -52,4 +52,15 @@ try: x = f1(*[1, 2, 3, 4]) exit(1) except TypeError: - pass \ No newline at end of file + pass + + +def g(*args, **kwargs): + return args, kwargs + +def f(a, b, *args, c=1, **kwargs): + return g(a, b, *args, c=c, **kwargs) + +args, kwargs = f(1, 2, 3, 4, c=5, d=6, e=-6.0) +assert args == (1, 2, 3, 4) +assert kwargs == {'c': 5, 'd': 6, 'e': -6.0} \ No newline at end of file