feat(runtime): avoid extra switch

This commit is contained in:
Leonardo de Moura 2019-02-23 17:35:21 -08:00
parent 4b44c5ce36
commit abd0f89820
4 changed files with 214 additions and 169 deletions

View file

@ -58,7 +58,7 @@ do emit $ sformat! "obj* apply_{n}(obj* f, {arg_decls}) {{\n",
when (j ≥ n) $
let fs := mk_fs_args (j - n) in
let sep := if j = n then "" else ", " in
emit $ sformat! " case {j}: {{ obj* r = FN{j}(f)({fs}{sep}{args}); free_heap_obj(f); return r; }\n"
emit $ sformat! " case {j}: {{ obj* r = FN{j}(f)({fs}{sep}{args}); free_closure_obj(f); return r; }\n"
},
emit " }\n",
emit " }\n",
@ -162,7 +162,7 @@ static obj* fix_args(obj* f, unsigned n, obj*const* as) {
for (unsigned i = 0; i < fixed; i++, source++, target++) {
*target = *source;
}
free_heap_obj(f);
free_closure_obj(f);
}
for (unsigned i = 0; i < n; i++, as++, target++) {
*target = *as;

View file

@ -29,7 +29,7 @@ static obj* fix_args(obj* f, unsigned n, obj*const* as) {
for (unsigned i = 0; i < fixed; i++, source++, target++) {
*target = *source;
}
free_heap_obj(f);
free_closure_obj(f);
}
for (unsigned i = 0; i < n; i++, as++, target++) {
*target = *as;
@ -103,22 +103,22 @@ unsigned fixed = closure_num_fixed(f);
if (arity == fixed + 1) {
if (is_exclusive(f)) {
switch (arity) {
case 1: { obj* r = FN1(f)(a1); free_heap_obj(f); return r; }
case 2: { obj* r = FN2(f)(fx(0), a1); free_heap_obj(f); return r; }
case 3: { obj* r = FN3(f)(fx(0), fx(1), a1); free_heap_obj(f); return r; }
case 4: { obj* r = FN4(f)(fx(0), fx(1), fx(2), a1); free_heap_obj(f); return r; }
case 5: { obj* r = FN5(f)(fx(0), fx(1), fx(2), fx(3), a1); free_heap_obj(f); return r; }
case 6: { obj* r = FN6(f)(fx(0), fx(1), fx(2), fx(3), fx(4), a1); free_heap_obj(f); return r; }
case 7: { obj* r = FN7(f)(fx(0), fx(1), fx(2), fx(3), fx(4), fx(5), a1); free_heap_obj(f); return r; }
case 8: { obj* r = FN8(f)(fx(0), fx(1), fx(2), fx(3), fx(4), fx(5), fx(6), a1); free_heap_obj(f); return r; }
case 9: { obj* r = FN9(f)(fx(0), fx(1), fx(2), fx(3), fx(4), fx(5), fx(6), fx(7), a1); free_heap_obj(f); return r; }
case 10: { obj* r = FN10(f)(fx(0), fx(1), fx(2), fx(3), fx(4), fx(5), fx(6), fx(7), fx(8), a1); free_heap_obj(f); return r; }
case 11: { obj* r = FN11(f)(fx(0), fx(1), fx(2), fx(3), fx(4), fx(5), fx(6), fx(7), fx(8), fx(9), a1); free_heap_obj(f); return r; }
case 12: { obj* r = FN12(f)(fx(0), fx(1), fx(2), fx(3), fx(4), fx(5), fx(6), fx(7), fx(8), fx(9), fx(10), a1); free_heap_obj(f); return r; }
case 13: { obj* r = FN13(f)(fx(0), fx(1), fx(2), fx(3), fx(4), fx(5), fx(6), fx(7), fx(8), fx(9), fx(10), fx(11), a1); free_heap_obj(f); return r; }
case 14: { obj* r = FN14(f)(fx(0), fx(1), fx(2), fx(3), fx(4), fx(5), fx(6), fx(7), fx(8), fx(9), fx(10), fx(11), fx(12), a1); free_heap_obj(f); return r; }
case 15: { obj* r = FN15(f)(fx(0), fx(1), fx(2), fx(3), fx(4), fx(5), fx(6), fx(7), fx(8), fx(9), fx(10), fx(11), fx(12), fx(13), a1); free_heap_obj(f); return r; }
case 16: { obj* r = FN16(f)(fx(0), fx(1), fx(2), fx(3), fx(4), fx(5), fx(6), fx(7), fx(8), fx(9), fx(10), fx(11), fx(12), fx(13), fx(14), a1); free_heap_obj(f); return r; }
case 1: { obj* r = FN1(f)(a1); free_closure_obj(f); return r; }
case 2: { obj* r = FN2(f)(fx(0), a1); free_closure_obj(f); return r; }
case 3: { obj* r = FN3(f)(fx(0), fx(1), a1); free_closure_obj(f); return r; }
case 4: { obj* r = FN4(f)(fx(0), fx(1), fx(2), a1); free_closure_obj(f); return r; }
case 5: { obj* r = FN5(f)(fx(0), fx(1), fx(2), fx(3), a1); free_closure_obj(f); return r; }
case 6: { obj* r = FN6(f)(fx(0), fx(1), fx(2), fx(3), fx(4), a1); free_closure_obj(f); return r; }
case 7: { obj* r = FN7(f)(fx(0), fx(1), fx(2), fx(3), fx(4), fx(5), a1); free_closure_obj(f); return r; }
case 8: { obj* r = FN8(f)(fx(0), fx(1), fx(2), fx(3), fx(4), fx(5), fx(6), a1); free_closure_obj(f); return r; }
case 9: { obj* r = FN9(f)(fx(0), fx(1), fx(2), fx(3), fx(4), fx(5), fx(6), fx(7), a1); free_closure_obj(f); return r; }
case 10: { obj* r = FN10(f)(fx(0), fx(1), fx(2), fx(3), fx(4), fx(5), fx(6), fx(7), fx(8), a1); free_closure_obj(f); return r; }
case 11: { obj* r = FN11(f)(fx(0), fx(1), fx(2), fx(3), fx(4), fx(5), fx(6), fx(7), fx(8), fx(9), a1); free_closure_obj(f); return r; }
case 12: { obj* r = FN12(f)(fx(0), fx(1), fx(2), fx(3), fx(4), fx(5), fx(6), fx(7), fx(8), fx(9), fx(10), a1); free_closure_obj(f); return r; }
case 13: { obj* r = FN13(f)(fx(0), fx(1), fx(2), fx(3), fx(4), fx(5), fx(6), fx(7), fx(8), fx(9), fx(10), fx(11), a1); free_closure_obj(f); return r; }
case 14: { obj* r = FN14(f)(fx(0), fx(1), fx(2), fx(3), fx(4), fx(5), fx(6), fx(7), fx(8), fx(9), fx(10), fx(11), fx(12), a1); free_closure_obj(f); return r; }
case 15: { obj* r = FN15(f)(fx(0), fx(1), fx(2), fx(3), fx(4), fx(5), fx(6), fx(7), fx(8), fx(9), fx(10), fx(11), fx(12), fx(13), a1); free_closure_obj(f); return r; }
case 16: { obj* r = FN16(f)(fx(0), fx(1), fx(2), fx(3), fx(4), fx(5), fx(6), fx(7), fx(8), fx(9), fx(10), fx(11), fx(12), fx(13), fx(14), a1); free_closure_obj(f); return r; }
}
}
switch (arity) {
@ -161,21 +161,21 @@ unsigned fixed = closure_num_fixed(f);
if (arity == fixed + 2) {
if (is_exclusive(f)) {
switch (arity) {
case 2: { obj* r = FN2(f)(a1, a2); free_heap_obj(f); return r; }
case 3: { obj* r = FN3(f)(fx(0), a1, a2); free_heap_obj(f); return r; }
case 4: { obj* r = FN4(f)(fx(0), fx(1), a1, a2); free_heap_obj(f); return r; }
case 5: { obj* r = FN5(f)(fx(0), fx(1), fx(2), a1, a2); free_heap_obj(f); return r; }
case 6: { obj* r = FN6(f)(fx(0), fx(1), fx(2), fx(3), a1, a2); free_heap_obj(f); return r; }
case 7: { obj* r = FN7(f)(fx(0), fx(1), fx(2), fx(3), fx(4), a1, a2); free_heap_obj(f); return r; }
case 8: { obj* r = FN8(f)(fx(0), fx(1), fx(2), fx(3), fx(4), fx(5), a1, a2); free_heap_obj(f); return r; }
case 9: { obj* r = FN9(f)(fx(0), fx(1), fx(2), fx(3), fx(4), fx(5), fx(6), a1, a2); free_heap_obj(f); return r; }
case 10: { obj* r = FN10(f)(fx(0), fx(1), fx(2), fx(3), fx(4), fx(5), fx(6), fx(7), a1, a2); free_heap_obj(f); return r; }
case 11: { obj* r = FN11(f)(fx(0), fx(1), fx(2), fx(3), fx(4), fx(5), fx(6), fx(7), fx(8), a1, a2); free_heap_obj(f); return r; }
case 12: { obj* r = FN12(f)(fx(0), fx(1), fx(2), fx(3), fx(4), fx(5), fx(6), fx(7), fx(8), fx(9), a1, a2); free_heap_obj(f); return r; }
case 13: { obj* r = FN13(f)(fx(0), fx(1), fx(2), fx(3), fx(4), fx(5), fx(6), fx(7), fx(8), fx(9), fx(10), a1, a2); free_heap_obj(f); return r; }
case 14: { obj* r = FN14(f)(fx(0), fx(1), fx(2), fx(3), fx(4), fx(5), fx(6), fx(7), fx(8), fx(9), fx(10), fx(11), a1, a2); free_heap_obj(f); return r; }
case 15: { obj* r = FN15(f)(fx(0), fx(1), fx(2), fx(3), fx(4), fx(5), fx(6), fx(7), fx(8), fx(9), fx(10), fx(11), fx(12), a1, a2); free_heap_obj(f); return r; }
case 16: { obj* r = FN16(f)(fx(0), fx(1), fx(2), fx(3), fx(4), fx(5), fx(6), fx(7), fx(8), fx(9), fx(10), fx(11), fx(12), fx(13), a1, a2); free_heap_obj(f); return r; }
case 2: { obj* r = FN2(f)(a1, a2); free_closure_obj(f); return r; }
case 3: { obj* r = FN3(f)(fx(0), a1, a2); free_closure_obj(f); return r; }
case 4: { obj* r = FN4(f)(fx(0), fx(1), a1, a2); free_closure_obj(f); return r; }
case 5: { obj* r = FN5(f)(fx(0), fx(1), fx(2), a1, a2); free_closure_obj(f); return r; }
case 6: { obj* r = FN6(f)(fx(0), fx(1), fx(2), fx(3), a1, a2); free_closure_obj(f); return r; }
case 7: { obj* r = FN7(f)(fx(0), fx(1), fx(2), fx(3), fx(4), a1, a2); free_closure_obj(f); return r; }
case 8: { obj* r = FN8(f)(fx(0), fx(1), fx(2), fx(3), fx(4), fx(5), a1, a2); free_closure_obj(f); return r; }
case 9: { obj* r = FN9(f)(fx(0), fx(1), fx(2), fx(3), fx(4), fx(5), fx(6), a1, a2); free_closure_obj(f); return r; }
case 10: { obj* r = FN10(f)(fx(0), fx(1), fx(2), fx(3), fx(4), fx(5), fx(6), fx(7), a1, a2); free_closure_obj(f); return r; }
case 11: { obj* r = FN11(f)(fx(0), fx(1), fx(2), fx(3), fx(4), fx(5), fx(6), fx(7), fx(8), a1, a2); free_closure_obj(f); return r; }
case 12: { obj* r = FN12(f)(fx(0), fx(1), fx(2), fx(3), fx(4), fx(5), fx(6), fx(7), fx(8), fx(9), a1, a2); free_closure_obj(f); return r; }
case 13: { obj* r = FN13(f)(fx(0), fx(1), fx(2), fx(3), fx(4), fx(5), fx(6), fx(7), fx(8), fx(9), fx(10), a1, a2); free_closure_obj(f); return r; }
case 14: { obj* r = FN14(f)(fx(0), fx(1), fx(2), fx(3), fx(4), fx(5), fx(6), fx(7), fx(8), fx(9), fx(10), fx(11), a1, a2); free_closure_obj(f); return r; }
case 15: { obj* r = FN15(f)(fx(0), fx(1), fx(2), fx(3), fx(4), fx(5), fx(6), fx(7), fx(8), fx(9), fx(10), fx(11), fx(12), a1, a2); free_closure_obj(f); return r; }
case 16: { obj* r = FN16(f)(fx(0), fx(1), fx(2), fx(3), fx(4), fx(5), fx(6), fx(7), fx(8), fx(9), fx(10), fx(11), fx(12), fx(13), a1, a2); free_closure_obj(f); return r; }
}
}
switch (arity) {
@ -222,20 +222,20 @@ unsigned fixed = closure_num_fixed(f);
if (arity == fixed + 3) {
if (is_exclusive(f)) {
switch (arity) {
case 3: { obj* r = FN3(f)(a1, a2, a3); free_heap_obj(f); return r; }
case 4: { obj* r = FN4(f)(fx(0), a1, a2, a3); free_heap_obj(f); return r; }
case 5: { obj* r = FN5(f)(fx(0), fx(1), a1, a2, a3); free_heap_obj(f); return r; }
case 6: { obj* r = FN6(f)(fx(0), fx(1), fx(2), a1, a2, a3); free_heap_obj(f); return r; }
case 7: { obj* r = FN7(f)(fx(0), fx(1), fx(2), fx(3), a1, a2, a3); free_heap_obj(f); return r; }
case 8: { obj* r = FN8(f)(fx(0), fx(1), fx(2), fx(3), fx(4), a1, a2, a3); free_heap_obj(f); return r; }
case 9: { obj* r = FN9(f)(fx(0), fx(1), fx(2), fx(3), fx(4), fx(5), a1, a2, a3); free_heap_obj(f); return r; }
case 10: { obj* r = FN10(f)(fx(0), fx(1), fx(2), fx(3), fx(4), fx(5), fx(6), a1, a2, a3); free_heap_obj(f); return r; }
case 11: { obj* r = FN11(f)(fx(0), fx(1), fx(2), fx(3), fx(4), fx(5), fx(6), fx(7), a1, a2, a3); free_heap_obj(f); return r; }
case 12: { obj* r = FN12(f)(fx(0), fx(1), fx(2), fx(3), fx(4), fx(5), fx(6), fx(7), fx(8), a1, a2, a3); free_heap_obj(f); return r; }
case 13: { obj* r = FN13(f)(fx(0), fx(1), fx(2), fx(3), fx(4), fx(5), fx(6), fx(7), fx(8), fx(9), a1, a2, a3); free_heap_obj(f); return r; }
case 14: { obj* r = FN14(f)(fx(0), fx(1), fx(2), fx(3), fx(4), fx(5), fx(6), fx(7), fx(8), fx(9), fx(10), a1, a2, a3); free_heap_obj(f); return r; }
case 15: { obj* r = FN15(f)(fx(0), fx(1), fx(2), fx(3), fx(4), fx(5), fx(6), fx(7), fx(8), fx(9), fx(10), fx(11), a1, a2, a3); free_heap_obj(f); return r; }
case 16: { obj* r = FN16(f)(fx(0), fx(1), fx(2), fx(3), fx(4), fx(5), fx(6), fx(7), fx(8), fx(9), fx(10), fx(11), fx(12), a1, a2, a3); free_heap_obj(f); return r; }
case 3: { obj* r = FN3(f)(a1, a2, a3); free_closure_obj(f); return r; }
case 4: { obj* r = FN4(f)(fx(0), a1, a2, a3); free_closure_obj(f); return r; }
case 5: { obj* r = FN5(f)(fx(0), fx(1), a1, a2, a3); free_closure_obj(f); return r; }
case 6: { obj* r = FN6(f)(fx(0), fx(1), fx(2), a1, a2, a3); free_closure_obj(f); return r; }
case 7: { obj* r = FN7(f)(fx(0), fx(1), fx(2), fx(3), a1, a2, a3); free_closure_obj(f); return r; }
case 8: { obj* r = FN8(f)(fx(0), fx(1), fx(2), fx(3), fx(4), a1, a2, a3); free_closure_obj(f); return r; }
case 9: { obj* r = FN9(f)(fx(0), fx(1), fx(2), fx(3), fx(4), fx(5), a1, a2, a3); free_closure_obj(f); return r; }
case 10: { obj* r = FN10(f)(fx(0), fx(1), fx(2), fx(3), fx(4), fx(5), fx(6), a1, a2, a3); free_closure_obj(f); return r; }
case 11: { obj* r = FN11(f)(fx(0), fx(1), fx(2), fx(3), fx(4), fx(5), fx(6), fx(7), a1, a2, a3); free_closure_obj(f); return r; }
case 12: { obj* r = FN12(f)(fx(0), fx(1), fx(2), fx(3), fx(4), fx(5), fx(6), fx(7), fx(8), a1, a2, a3); free_closure_obj(f); return r; }
case 13: { obj* r = FN13(f)(fx(0), fx(1), fx(2), fx(3), fx(4), fx(5), fx(6), fx(7), fx(8), fx(9), a1, a2, a3); free_closure_obj(f); return r; }
case 14: { obj* r = FN14(f)(fx(0), fx(1), fx(2), fx(3), fx(4), fx(5), fx(6), fx(7), fx(8), fx(9), fx(10), a1, a2, a3); free_closure_obj(f); return r; }
case 15: { obj* r = FN15(f)(fx(0), fx(1), fx(2), fx(3), fx(4), fx(5), fx(6), fx(7), fx(8), fx(9), fx(10), fx(11), a1, a2, a3); free_closure_obj(f); return r; }
case 16: { obj* r = FN16(f)(fx(0), fx(1), fx(2), fx(3), fx(4), fx(5), fx(6), fx(7), fx(8), fx(9), fx(10), fx(11), fx(12), a1, a2, a3); free_closure_obj(f); return r; }
}
}
switch (arity) {
@ -281,19 +281,19 @@ unsigned fixed = closure_num_fixed(f);
if (arity == fixed + 4) {
if (is_exclusive(f)) {
switch (arity) {
case 4: { obj* r = FN4(f)(a1, a2, a3, a4); free_heap_obj(f); return r; }
case 5: { obj* r = FN5(f)(fx(0), a1, a2, a3, a4); free_heap_obj(f); return r; }
case 6: { obj* r = FN6(f)(fx(0), fx(1), a1, a2, a3, a4); free_heap_obj(f); return r; }
case 7: { obj* r = FN7(f)(fx(0), fx(1), fx(2), a1, a2, a3, a4); free_heap_obj(f); return r; }
case 8: { obj* r = FN8(f)(fx(0), fx(1), fx(2), fx(3), a1, a2, a3, a4); free_heap_obj(f); return r; }
case 9: { obj* r = FN9(f)(fx(0), fx(1), fx(2), fx(3), fx(4), a1, a2, a3, a4); free_heap_obj(f); return r; }
case 10: { obj* r = FN10(f)(fx(0), fx(1), fx(2), fx(3), fx(4), fx(5), a1, a2, a3, a4); free_heap_obj(f); return r; }
case 11: { obj* r = FN11(f)(fx(0), fx(1), fx(2), fx(3), fx(4), fx(5), fx(6), a1, a2, a3, a4); free_heap_obj(f); return r; }
case 12: { obj* r = FN12(f)(fx(0), fx(1), fx(2), fx(3), fx(4), fx(5), fx(6), fx(7), a1, a2, a3, a4); free_heap_obj(f); return r; }
case 13: { obj* r = FN13(f)(fx(0), fx(1), fx(2), fx(3), fx(4), fx(5), fx(6), fx(7), fx(8), a1, a2, a3, a4); free_heap_obj(f); return r; }
case 14: { obj* r = FN14(f)(fx(0), fx(1), fx(2), fx(3), fx(4), fx(5), fx(6), fx(7), fx(8), fx(9), a1, a2, a3, a4); free_heap_obj(f); return r; }
case 15: { obj* r = FN15(f)(fx(0), fx(1), fx(2), fx(3), fx(4), fx(5), fx(6), fx(7), fx(8), fx(9), fx(10), a1, a2, a3, a4); free_heap_obj(f); return r; }
case 16: { obj* r = FN16(f)(fx(0), fx(1), fx(2), fx(3), fx(4), fx(5), fx(6), fx(7), fx(8), fx(9), fx(10), fx(11), a1, a2, a3, a4); free_heap_obj(f); return r; }
case 4: { obj* r = FN4(f)(a1, a2, a3, a4); free_closure_obj(f); return r; }
case 5: { obj* r = FN5(f)(fx(0), a1, a2, a3, a4); free_closure_obj(f); return r; }
case 6: { obj* r = FN6(f)(fx(0), fx(1), a1, a2, a3, a4); free_closure_obj(f); return r; }
case 7: { obj* r = FN7(f)(fx(0), fx(1), fx(2), a1, a2, a3, a4); free_closure_obj(f); return r; }
case 8: { obj* r = FN8(f)(fx(0), fx(1), fx(2), fx(3), a1, a2, a3, a4); free_closure_obj(f); return r; }
case 9: { obj* r = FN9(f)(fx(0), fx(1), fx(2), fx(3), fx(4), a1, a2, a3, a4); free_closure_obj(f); return r; }
case 10: { obj* r = FN10(f)(fx(0), fx(1), fx(2), fx(3), fx(4), fx(5), a1, a2, a3, a4); free_closure_obj(f); return r; }
case 11: { obj* r = FN11(f)(fx(0), fx(1), fx(2), fx(3), fx(4), fx(5), fx(6), a1, a2, a3, a4); free_closure_obj(f); return r; }
case 12: { obj* r = FN12(f)(fx(0), fx(1), fx(2), fx(3), fx(4), fx(5), fx(6), fx(7), a1, a2, a3, a4); free_closure_obj(f); return r; }
case 13: { obj* r = FN13(f)(fx(0), fx(1), fx(2), fx(3), fx(4), fx(5), fx(6), fx(7), fx(8), a1, a2, a3, a4); free_closure_obj(f); return r; }
case 14: { obj* r = FN14(f)(fx(0), fx(1), fx(2), fx(3), fx(4), fx(5), fx(6), fx(7), fx(8), fx(9), a1, a2, a3, a4); free_closure_obj(f); return r; }
case 15: { obj* r = FN15(f)(fx(0), fx(1), fx(2), fx(3), fx(4), fx(5), fx(6), fx(7), fx(8), fx(9), fx(10), a1, a2, a3, a4); free_closure_obj(f); return r; }
case 16: { obj* r = FN16(f)(fx(0), fx(1), fx(2), fx(3), fx(4), fx(5), fx(6), fx(7), fx(8), fx(9), fx(10), fx(11), a1, a2, a3, a4); free_closure_obj(f); return r; }
}
}
switch (arity) {
@ -338,18 +338,18 @@ unsigned fixed = closure_num_fixed(f);
if (arity == fixed + 5) {
if (is_exclusive(f)) {
switch (arity) {
case 5: { obj* r = FN5(f)(a1, a2, a3, a4, a5); free_heap_obj(f); return r; }
case 6: { obj* r = FN6(f)(fx(0), a1, a2, a3, a4, a5); free_heap_obj(f); return r; }
case 7: { obj* r = FN7(f)(fx(0), fx(1), a1, a2, a3, a4, a5); free_heap_obj(f); return r; }
case 8: { obj* r = FN8(f)(fx(0), fx(1), fx(2), a1, a2, a3, a4, a5); free_heap_obj(f); return r; }
case 9: { obj* r = FN9(f)(fx(0), fx(1), fx(2), fx(3), a1, a2, a3, a4, a5); free_heap_obj(f); return r; }
case 10: { obj* r = FN10(f)(fx(0), fx(1), fx(2), fx(3), fx(4), a1, a2, a3, a4, a5); free_heap_obj(f); return r; }
case 11: { obj* r = FN11(f)(fx(0), fx(1), fx(2), fx(3), fx(4), fx(5), a1, a2, a3, a4, a5); free_heap_obj(f); return r; }
case 12: { obj* r = FN12(f)(fx(0), fx(1), fx(2), fx(3), fx(4), fx(5), fx(6), a1, a2, a3, a4, a5); free_heap_obj(f); return r; }
case 13: { obj* r = FN13(f)(fx(0), fx(1), fx(2), fx(3), fx(4), fx(5), fx(6), fx(7), a1, a2, a3, a4, a5); free_heap_obj(f); return r; }
case 14: { obj* r = FN14(f)(fx(0), fx(1), fx(2), fx(3), fx(4), fx(5), fx(6), fx(7), fx(8), a1, a2, a3, a4, a5); free_heap_obj(f); return r; }
case 15: { obj* r = FN15(f)(fx(0), fx(1), fx(2), fx(3), fx(4), fx(5), fx(6), fx(7), fx(8), fx(9), a1, a2, a3, a4, a5); free_heap_obj(f); return r; }
case 16: { obj* r = FN16(f)(fx(0), fx(1), fx(2), fx(3), fx(4), fx(5), fx(6), fx(7), fx(8), fx(9), fx(10), a1, a2, a3, a4, a5); free_heap_obj(f); return r; }
case 5: { obj* r = FN5(f)(a1, a2, a3, a4, a5); free_closure_obj(f); return r; }
case 6: { obj* r = FN6(f)(fx(0), a1, a2, a3, a4, a5); free_closure_obj(f); return r; }
case 7: { obj* r = FN7(f)(fx(0), fx(1), a1, a2, a3, a4, a5); free_closure_obj(f); return r; }
case 8: { obj* r = FN8(f)(fx(0), fx(1), fx(2), a1, a2, a3, a4, a5); free_closure_obj(f); return r; }
case 9: { obj* r = FN9(f)(fx(0), fx(1), fx(2), fx(3), a1, a2, a3, a4, a5); free_closure_obj(f); return r; }
case 10: { obj* r = FN10(f)(fx(0), fx(1), fx(2), fx(3), fx(4), a1, a2, a3, a4, a5); free_closure_obj(f); return r; }
case 11: { obj* r = FN11(f)(fx(0), fx(1), fx(2), fx(3), fx(4), fx(5), a1, a2, a3, a4, a5); free_closure_obj(f); return r; }
case 12: { obj* r = FN12(f)(fx(0), fx(1), fx(2), fx(3), fx(4), fx(5), fx(6), a1, a2, a3, a4, a5); free_closure_obj(f); return r; }
case 13: { obj* r = FN13(f)(fx(0), fx(1), fx(2), fx(3), fx(4), fx(5), fx(6), fx(7), a1, a2, a3, a4, a5); free_closure_obj(f); return r; }
case 14: { obj* r = FN14(f)(fx(0), fx(1), fx(2), fx(3), fx(4), fx(5), fx(6), fx(7), fx(8), a1, a2, a3, a4, a5); free_closure_obj(f); return r; }
case 15: { obj* r = FN15(f)(fx(0), fx(1), fx(2), fx(3), fx(4), fx(5), fx(6), fx(7), fx(8), fx(9), a1, a2, a3, a4, a5); free_closure_obj(f); return r; }
case 16: { obj* r = FN16(f)(fx(0), fx(1), fx(2), fx(3), fx(4), fx(5), fx(6), fx(7), fx(8), fx(9), fx(10), a1, a2, a3, a4, a5); free_closure_obj(f); return r; }
}
}
switch (arity) {
@ -393,17 +393,17 @@ unsigned fixed = closure_num_fixed(f);
if (arity == fixed + 6) {
if (is_exclusive(f)) {
switch (arity) {
case 6: { obj* r = FN6(f)(a1, a2, a3, a4, a5, a6); free_heap_obj(f); return r; }
case 7: { obj* r = FN7(f)(fx(0), a1, a2, a3, a4, a5, a6); free_heap_obj(f); return r; }
case 8: { obj* r = FN8(f)(fx(0), fx(1), a1, a2, a3, a4, a5, a6); free_heap_obj(f); return r; }
case 9: { obj* r = FN9(f)(fx(0), fx(1), fx(2), a1, a2, a3, a4, a5, a6); free_heap_obj(f); return r; }
case 10: { obj* r = FN10(f)(fx(0), fx(1), fx(2), fx(3), a1, a2, a3, a4, a5, a6); free_heap_obj(f); return r; }
case 11: { obj* r = FN11(f)(fx(0), fx(1), fx(2), fx(3), fx(4), a1, a2, a3, a4, a5, a6); free_heap_obj(f); return r; }
case 12: { obj* r = FN12(f)(fx(0), fx(1), fx(2), fx(3), fx(4), fx(5), a1, a2, a3, a4, a5, a6); free_heap_obj(f); return r; }
case 13: { obj* r = FN13(f)(fx(0), fx(1), fx(2), fx(3), fx(4), fx(5), fx(6), a1, a2, a3, a4, a5, a6); free_heap_obj(f); return r; }
case 14: { obj* r = FN14(f)(fx(0), fx(1), fx(2), fx(3), fx(4), fx(5), fx(6), fx(7), a1, a2, a3, a4, a5, a6); free_heap_obj(f); return r; }
case 15: { obj* r = FN15(f)(fx(0), fx(1), fx(2), fx(3), fx(4), fx(5), fx(6), fx(7), fx(8), a1, a2, a3, a4, a5, a6); free_heap_obj(f); return r; }
case 16: { obj* r = FN16(f)(fx(0), fx(1), fx(2), fx(3), fx(4), fx(5), fx(6), fx(7), fx(8), fx(9), a1, a2, a3, a4, a5, a6); free_heap_obj(f); return r; }
case 6: { obj* r = FN6(f)(a1, a2, a3, a4, a5, a6); free_closure_obj(f); return r; }
case 7: { obj* r = FN7(f)(fx(0), a1, a2, a3, a4, a5, a6); free_closure_obj(f); return r; }
case 8: { obj* r = FN8(f)(fx(0), fx(1), a1, a2, a3, a4, a5, a6); free_closure_obj(f); return r; }
case 9: { obj* r = FN9(f)(fx(0), fx(1), fx(2), a1, a2, a3, a4, a5, a6); free_closure_obj(f); return r; }
case 10: { obj* r = FN10(f)(fx(0), fx(1), fx(2), fx(3), a1, a2, a3, a4, a5, a6); free_closure_obj(f); return r; }
case 11: { obj* r = FN11(f)(fx(0), fx(1), fx(2), fx(3), fx(4), a1, a2, a3, a4, a5, a6); free_closure_obj(f); return r; }
case 12: { obj* r = FN12(f)(fx(0), fx(1), fx(2), fx(3), fx(4), fx(5), a1, a2, a3, a4, a5, a6); free_closure_obj(f); return r; }
case 13: { obj* r = FN13(f)(fx(0), fx(1), fx(2), fx(3), fx(4), fx(5), fx(6), a1, a2, a3, a4, a5, a6); free_closure_obj(f); return r; }
case 14: { obj* r = FN14(f)(fx(0), fx(1), fx(2), fx(3), fx(4), fx(5), fx(6), fx(7), a1, a2, a3, a4, a5, a6); free_closure_obj(f); return r; }
case 15: { obj* r = FN15(f)(fx(0), fx(1), fx(2), fx(3), fx(4), fx(5), fx(6), fx(7), fx(8), a1, a2, a3, a4, a5, a6); free_closure_obj(f); return r; }
case 16: { obj* r = FN16(f)(fx(0), fx(1), fx(2), fx(3), fx(4), fx(5), fx(6), fx(7), fx(8), fx(9), a1, a2, a3, a4, a5, a6); free_closure_obj(f); return r; }
}
}
switch (arity) {
@ -446,16 +446,16 @@ unsigned fixed = closure_num_fixed(f);
if (arity == fixed + 7) {
if (is_exclusive(f)) {
switch (arity) {
case 7: { obj* r = FN7(f)(a1, a2, a3, a4, a5, a6, a7); free_heap_obj(f); return r; }
case 8: { obj* r = FN8(f)(fx(0), a1, a2, a3, a4, a5, a6, a7); free_heap_obj(f); return r; }
case 9: { obj* r = FN9(f)(fx(0), fx(1), a1, a2, a3, a4, a5, a6, a7); free_heap_obj(f); return r; }
case 10: { obj* r = FN10(f)(fx(0), fx(1), fx(2), a1, a2, a3, a4, a5, a6, a7); free_heap_obj(f); return r; }
case 11: { obj* r = FN11(f)(fx(0), fx(1), fx(2), fx(3), a1, a2, a3, a4, a5, a6, a7); free_heap_obj(f); return r; }
case 12: { obj* r = FN12(f)(fx(0), fx(1), fx(2), fx(3), fx(4), a1, a2, a3, a4, a5, a6, a7); free_heap_obj(f); return r; }
case 13: { obj* r = FN13(f)(fx(0), fx(1), fx(2), fx(3), fx(4), fx(5), a1, a2, a3, a4, a5, a6, a7); free_heap_obj(f); return r; }
case 14: { obj* r = FN14(f)(fx(0), fx(1), fx(2), fx(3), fx(4), fx(5), fx(6), a1, a2, a3, a4, a5, a6, a7); free_heap_obj(f); return r; }
case 15: { obj* r = FN15(f)(fx(0), fx(1), fx(2), fx(3), fx(4), fx(5), fx(6), fx(7), a1, a2, a3, a4, a5, a6, a7); free_heap_obj(f); return r; }
case 16: { obj* r = FN16(f)(fx(0), fx(1), fx(2), fx(3), fx(4), fx(5), fx(6), fx(7), fx(8), a1, a2, a3, a4, a5, a6, a7); free_heap_obj(f); return r; }
case 7: { obj* r = FN7(f)(a1, a2, a3, a4, a5, a6, a7); free_closure_obj(f); return r; }
case 8: { obj* r = FN8(f)(fx(0), a1, a2, a3, a4, a5, a6, a7); free_closure_obj(f); return r; }
case 9: { obj* r = FN9(f)(fx(0), fx(1), a1, a2, a3, a4, a5, a6, a7); free_closure_obj(f); return r; }
case 10: { obj* r = FN10(f)(fx(0), fx(1), fx(2), a1, a2, a3, a4, a5, a6, a7); free_closure_obj(f); return r; }
case 11: { obj* r = FN11(f)(fx(0), fx(1), fx(2), fx(3), a1, a2, a3, a4, a5, a6, a7); free_closure_obj(f); return r; }
case 12: { obj* r = FN12(f)(fx(0), fx(1), fx(2), fx(3), fx(4), a1, a2, a3, a4, a5, a6, a7); free_closure_obj(f); return r; }
case 13: { obj* r = FN13(f)(fx(0), fx(1), fx(2), fx(3), fx(4), fx(5), a1, a2, a3, a4, a5, a6, a7); free_closure_obj(f); return r; }
case 14: { obj* r = FN14(f)(fx(0), fx(1), fx(2), fx(3), fx(4), fx(5), fx(6), a1, a2, a3, a4, a5, a6, a7); free_closure_obj(f); return r; }
case 15: { obj* r = FN15(f)(fx(0), fx(1), fx(2), fx(3), fx(4), fx(5), fx(6), fx(7), a1, a2, a3, a4, a5, a6, a7); free_closure_obj(f); return r; }
case 16: { obj* r = FN16(f)(fx(0), fx(1), fx(2), fx(3), fx(4), fx(5), fx(6), fx(7), fx(8), a1, a2, a3, a4, a5, a6, a7); free_closure_obj(f); return r; }
}
}
switch (arity) {
@ -497,15 +497,15 @@ unsigned fixed = closure_num_fixed(f);
if (arity == fixed + 8) {
if (is_exclusive(f)) {
switch (arity) {
case 8: { obj* r = FN8(f)(a1, a2, a3, a4, a5, a6, a7, a8); free_heap_obj(f); return r; }
case 9: { obj* r = FN9(f)(fx(0), a1, a2, a3, a4, a5, a6, a7, a8); free_heap_obj(f); return r; }
case 10: { obj* r = FN10(f)(fx(0), fx(1), a1, a2, a3, a4, a5, a6, a7, a8); free_heap_obj(f); return r; }
case 11: { obj* r = FN11(f)(fx(0), fx(1), fx(2), a1, a2, a3, a4, a5, a6, a7, a8); free_heap_obj(f); return r; }
case 12: { obj* r = FN12(f)(fx(0), fx(1), fx(2), fx(3), a1, a2, a3, a4, a5, a6, a7, a8); free_heap_obj(f); return r; }
case 13: { obj* r = FN13(f)(fx(0), fx(1), fx(2), fx(3), fx(4), a1, a2, a3, a4, a5, a6, a7, a8); free_heap_obj(f); return r; }
case 14: { obj* r = FN14(f)(fx(0), fx(1), fx(2), fx(3), fx(4), fx(5), a1, a2, a3, a4, a5, a6, a7, a8); free_heap_obj(f); return r; }
case 15: { obj* r = FN15(f)(fx(0), fx(1), fx(2), fx(3), fx(4), fx(5), fx(6), a1, a2, a3, a4, a5, a6, a7, a8); free_heap_obj(f); return r; }
case 16: { obj* r = FN16(f)(fx(0), fx(1), fx(2), fx(3), fx(4), fx(5), fx(6), fx(7), a1, a2, a3, a4, a5, a6, a7, a8); free_heap_obj(f); return r; }
case 8: { obj* r = FN8(f)(a1, a2, a3, a4, a5, a6, a7, a8); free_closure_obj(f); return r; }
case 9: { obj* r = FN9(f)(fx(0), a1, a2, a3, a4, a5, a6, a7, a8); free_closure_obj(f); return r; }
case 10: { obj* r = FN10(f)(fx(0), fx(1), a1, a2, a3, a4, a5, a6, a7, a8); free_closure_obj(f); return r; }
case 11: { obj* r = FN11(f)(fx(0), fx(1), fx(2), a1, a2, a3, a4, a5, a6, a7, a8); free_closure_obj(f); return r; }
case 12: { obj* r = FN12(f)(fx(0), fx(1), fx(2), fx(3), a1, a2, a3, a4, a5, a6, a7, a8); free_closure_obj(f); return r; }
case 13: { obj* r = FN13(f)(fx(0), fx(1), fx(2), fx(3), fx(4), a1, a2, a3, a4, a5, a6, a7, a8); free_closure_obj(f); return r; }
case 14: { obj* r = FN14(f)(fx(0), fx(1), fx(2), fx(3), fx(4), fx(5), a1, a2, a3, a4, a5, a6, a7, a8); free_closure_obj(f); return r; }
case 15: { obj* r = FN15(f)(fx(0), fx(1), fx(2), fx(3), fx(4), fx(5), fx(6), a1, a2, a3, a4, a5, a6, a7, a8); free_closure_obj(f); return r; }
case 16: { obj* r = FN16(f)(fx(0), fx(1), fx(2), fx(3), fx(4), fx(5), fx(6), fx(7), a1, a2, a3, a4, a5, a6, a7, a8); free_closure_obj(f); return r; }
}
}
switch (arity) {
@ -546,14 +546,14 @@ unsigned fixed = closure_num_fixed(f);
if (arity == fixed + 9) {
if (is_exclusive(f)) {
switch (arity) {
case 9: { obj* r = FN9(f)(a1, a2, a3, a4, a5, a6, a7, a8, a9); free_heap_obj(f); return r; }
case 10: { obj* r = FN10(f)(fx(0), a1, a2, a3, a4, a5, a6, a7, a8, a9); free_heap_obj(f); return r; }
case 11: { obj* r = FN11(f)(fx(0), fx(1), a1, a2, a3, a4, a5, a6, a7, a8, a9); free_heap_obj(f); return r; }
case 12: { obj* r = FN12(f)(fx(0), fx(1), fx(2), a1, a2, a3, a4, a5, a6, a7, a8, a9); free_heap_obj(f); return r; }
case 13: { obj* r = FN13(f)(fx(0), fx(1), fx(2), fx(3), a1, a2, a3, a4, a5, a6, a7, a8, a9); free_heap_obj(f); return r; }
case 14: { obj* r = FN14(f)(fx(0), fx(1), fx(2), fx(3), fx(4), a1, a2, a3, a4, a5, a6, a7, a8, a9); free_heap_obj(f); return r; }
case 15: { obj* r = FN15(f)(fx(0), fx(1), fx(2), fx(3), fx(4), fx(5), a1, a2, a3, a4, a5, a6, a7, a8, a9); free_heap_obj(f); return r; }
case 16: { obj* r = FN16(f)(fx(0), fx(1), fx(2), fx(3), fx(4), fx(5), fx(6), a1, a2, a3, a4, a5, a6, a7, a8, a9); free_heap_obj(f); return r; }
case 9: { obj* r = FN9(f)(a1, a2, a3, a4, a5, a6, a7, a8, a9); free_closure_obj(f); return r; }
case 10: { obj* r = FN10(f)(fx(0), a1, a2, a3, a4, a5, a6, a7, a8, a9); free_closure_obj(f); return r; }
case 11: { obj* r = FN11(f)(fx(0), fx(1), a1, a2, a3, a4, a5, a6, a7, a8, a9); free_closure_obj(f); return r; }
case 12: { obj* r = FN12(f)(fx(0), fx(1), fx(2), a1, a2, a3, a4, a5, a6, a7, a8, a9); free_closure_obj(f); return r; }
case 13: { obj* r = FN13(f)(fx(0), fx(1), fx(2), fx(3), a1, a2, a3, a4, a5, a6, a7, a8, a9); free_closure_obj(f); return r; }
case 14: { obj* r = FN14(f)(fx(0), fx(1), fx(2), fx(3), fx(4), a1, a2, a3, a4, a5, a6, a7, a8, a9); free_closure_obj(f); return r; }
case 15: { obj* r = FN15(f)(fx(0), fx(1), fx(2), fx(3), fx(4), fx(5), a1, a2, a3, a4, a5, a6, a7, a8, a9); free_closure_obj(f); return r; }
case 16: { obj* r = FN16(f)(fx(0), fx(1), fx(2), fx(3), fx(4), fx(5), fx(6), a1, a2, a3, a4, a5, a6, a7, a8, a9); free_closure_obj(f); return r; }
}
}
switch (arity) {
@ -593,13 +593,13 @@ unsigned fixed = closure_num_fixed(f);
if (arity == fixed + 10) {
if (is_exclusive(f)) {
switch (arity) {
case 10: { obj* r = FN10(f)(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10); free_heap_obj(f); return r; }
case 11: { obj* r = FN11(f)(fx(0), a1, a2, a3, a4, a5, a6, a7, a8, a9, a10); free_heap_obj(f); return r; }
case 12: { obj* r = FN12(f)(fx(0), fx(1), a1, a2, a3, a4, a5, a6, a7, a8, a9, a10); free_heap_obj(f); return r; }
case 13: { obj* r = FN13(f)(fx(0), fx(1), fx(2), a1, a2, a3, a4, a5, a6, a7, a8, a9, a10); free_heap_obj(f); return r; }
case 14: { obj* r = FN14(f)(fx(0), fx(1), fx(2), fx(3), a1, a2, a3, a4, a5, a6, a7, a8, a9, a10); free_heap_obj(f); return r; }
case 15: { obj* r = FN15(f)(fx(0), fx(1), fx(2), fx(3), fx(4), a1, a2, a3, a4, a5, a6, a7, a8, a9, a10); free_heap_obj(f); return r; }
case 16: { obj* r = FN16(f)(fx(0), fx(1), fx(2), fx(3), fx(4), fx(5), a1, a2, a3, a4, a5, a6, a7, a8, a9, a10); free_heap_obj(f); return r; }
case 10: { obj* r = FN10(f)(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10); free_closure_obj(f); return r; }
case 11: { obj* r = FN11(f)(fx(0), a1, a2, a3, a4, a5, a6, a7, a8, a9, a10); free_closure_obj(f); return r; }
case 12: { obj* r = FN12(f)(fx(0), fx(1), a1, a2, a3, a4, a5, a6, a7, a8, a9, a10); free_closure_obj(f); return r; }
case 13: { obj* r = FN13(f)(fx(0), fx(1), fx(2), a1, a2, a3, a4, a5, a6, a7, a8, a9, a10); free_closure_obj(f); return r; }
case 14: { obj* r = FN14(f)(fx(0), fx(1), fx(2), fx(3), a1, a2, a3, a4, a5, a6, a7, a8, a9, a10); free_closure_obj(f); return r; }
case 15: { obj* r = FN15(f)(fx(0), fx(1), fx(2), fx(3), fx(4), a1, a2, a3, a4, a5, a6, a7, a8, a9, a10); free_closure_obj(f); return r; }
case 16: { obj* r = FN16(f)(fx(0), fx(1), fx(2), fx(3), fx(4), fx(5), a1, a2, a3, a4, a5, a6, a7, a8, a9, a10); free_closure_obj(f); return r; }
}
}
switch (arity) {
@ -638,12 +638,12 @@ unsigned fixed = closure_num_fixed(f);
if (arity == fixed + 11) {
if (is_exclusive(f)) {
switch (arity) {
case 11: { obj* r = FN11(f)(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11); free_heap_obj(f); return r; }
case 12: { obj* r = FN12(f)(fx(0), a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11); free_heap_obj(f); return r; }
case 13: { obj* r = FN13(f)(fx(0), fx(1), a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11); free_heap_obj(f); return r; }
case 14: { obj* r = FN14(f)(fx(0), fx(1), fx(2), a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11); free_heap_obj(f); return r; }
case 15: { obj* r = FN15(f)(fx(0), fx(1), fx(2), fx(3), a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11); free_heap_obj(f); return r; }
case 16: { obj* r = FN16(f)(fx(0), fx(1), fx(2), fx(3), fx(4), a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11); free_heap_obj(f); return r; }
case 11: { obj* r = FN11(f)(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11); free_closure_obj(f); return r; }
case 12: { obj* r = FN12(f)(fx(0), a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11); free_closure_obj(f); return r; }
case 13: { obj* r = FN13(f)(fx(0), fx(1), a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11); free_closure_obj(f); return r; }
case 14: { obj* r = FN14(f)(fx(0), fx(1), fx(2), a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11); free_closure_obj(f); return r; }
case 15: { obj* r = FN15(f)(fx(0), fx(1), fx(2), fx(3), a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11); free_closure_obj(f); return r; }
case 16: { obj* r = FN16(f)(fx(0), fx(1), fx(2), fx(3), fx(4), a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11); free_closure_obj(f); return r; }
}
}
switch (arity) {
@ -681,11 +681,11 @@ unsigned fixed = closure_num_fixed(f);
if (arity == fixed + 12) {
if (is_exclusive(f)) {
switch (arity) {
case 12: { obj* r = FN12(f)(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12); free_heap_obj(f); return r; }
case 13: { obj* r = FN13(f)(fx(0), a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12); free_heap_obj(f); return r; }
case 14: { obj* r = FN14(f)(fx(0), fx(1), a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12); free_heap_obj(f); return r; }
case 15: { obj* r = FN15(f)(fx(0), fx(1), fx(2), a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12); free_heap_obj(f); return r; }
case 16: { obj* r = FN16(f)(fx(0), fx(1), fx(2), fx(3), a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12); free_heap_obj(f); return r; }
case 12: { obj* r = FN12(f)(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12); free_closure_obj(f); return r; }
case 13: { obj* r = FN13(f)(fx(0), a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12); free_closure_obj(f); return r; }
case 14: { obj* r = FN14(f)(fx(0), fx(1), a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12); free_closure_obj(f); return r; }
case 15: { obj* r = FN15(f)(fx(0), fx(1), fx(2), a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12); free_closure_obj(f); return r; }
case 16: { obj* r = FN16(f)(fx(0), fx(1), fx(2), fx(3), a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12); free_closure_obj(f); return r; }
}
}
switch (arity) {
@ -722,10 +722,10 @@ unsigned fixed = closure_num_fixed(f);
if (arity == fixed + 13) {
if (is_exclusive(f)) {
switch (arity) {
case 13: { obj* r = FN13(f)(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13); free_heap_obj(f); return r; }
case 14: { obj* r = FN14(f)(fx(0), a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13); free_heap_obj(f); return r; }
case 15: { obj* r = FN15(f)(fx(0), fx(1), a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13); free_heap_obj(f); return r; }
case 16: { obj* r = FN16(f)(fx(0), fx(1), fx(2), a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13); free_heap_obj(f); return r; }
case 13: { obj* r = FN13(f)(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13); free_closure_obj(f); return r; }
case 14: { obj* r = FN14(f)(fx(0), a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13); free_closure_obj(f); return r; }
case 15: { obj* r = FN15(f)(fx(0), fx(1), a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13); free_closure_obj(f); return r; }
case 16: { obj* r = FN16(f)(fx(0), fx(1), fx(2), a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13); free_closure_obj(f); return r; }
}
}
switch (arity) {
@ -761,9 +761,9 @@ unsigned fixed = closure_num_fixed(f);
if (arity == fixed + 14) {
if (is_exclusive(f)) {
switch (arity) {
case 14: { obj* r = FN14(f)(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14); free_heap_obj(f); return r; }
case 15: { obj* r = FN15(f)(fx(0), a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14); free_heap_obj(f); return r; }
case 16: { obj* r = FN16(f)(fx(0), fx(1), a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14); free_heap_obj(f); return r; }
case 14: { obj* r = FN14(f)(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14); free_closure_obj(f); return r; }
case 15: { obj* r = FN15(f)(fx(0), a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14); free_closure_obj(f); return r; }
case 16: { obj* r = FN16(f)(fx(0), fx(1), a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14); free_closure_obj(f); return r; }
}
}
switch (arity) {
@ -798,8 +798,8 @@ unsigned fixed = closure_num_fixed(f);
if (arity == fixed + 15) {
if (is_exclusive(f)) {
switch (arity) {
case 15: { obj* r = FN15(f)(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15); free_heap_obj(f); return r; }
case 16: { obj* r = FN16(f)(fx(0), a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15); free_heap_obj(f); return r; }
case 15: { obj* r = FN15(f)(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15); free_closure_obj(f); return r; }
case 16: { obj* r = FN16(f)(fx(0), a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15); free_closure_obj(f); return r; }
}
}
switch (arity) {
@ -833,7 +833,7 @@ unsigned fixed = closure_num_fixed(f);
if (arity == fixed + 16) {
if (is_exclusive(f)) {
switch (arity) {
case 16: { obj* r = FN16(f)(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16); free_heap_obj(f); return r; }
case 16: { obj* r = FN16(f)(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16); free_closure_obj(f); return r; }
}
}
switch (arity) {

View file

@ -124,6 +124,66 @@ static void dealloc_parray_data(object ** data) {
free(mem);
}
static inline void free_heap_obj_core(object * o, size_t sz) {
#ifdef LEAN_FAKE_FREE
// Set kinds to invalid values, which should trap any further accesses in debug mode.
// Make sure object kind is recoverable for printing deleted objects
if (o->m_mem_kind != 42) {
o->m_kind = -o->m_kind;
o->m_mem_kind = 42;
}
#else
#ifdef LEAN_SMALL_ALLOCATOR
dealloc(reinterpret_cast<char *>(o) - sizeof(rc_type), sz);
#else
free(reinterpret_cast<char *>(o) - sizeof(rc_type));
#endif
#endif
}
void free_heap_obj(object * o) {
free_heap_obj_core(o, obj_byte_size(o) + sizeof(rc_type));
}
static inline void free_cnstr_obj(object * o) {
free_heap_obj_core(o, cnstr_byte_size(o) + sizeof(rc_type));
}
static inline void free_closure_obj_core(object * o) {
free_heap_obj_core(o, closure_byte_size(o) + sizeof(rc_type));
}
void free_closure_obj(object * o) {
return free_closure_obj_core(o);
}
static inline void free_array_obj(object * o) {
free_heap_obj_core(o, array_byte_size(o) + sizeof(rc_type));
}
static inline void free_sarray_obj(object * o) {
free_heap_obj_core(o, sarray_byte_size(o) + sizeof(rc_type));
}
static inline void free_string_obj(object * o) {
free_heap_obj_core(o, string_byte_size(o) + sizeof(rc_type));
}
inline void free_mpz_obj(object * o) {
free_heap_obj_core(o, sizeof(mpz_object) + sizeof(rc_type));
}
static inline void free_thunk_obj(object * o) {
free_heap_obj_core(o, sizeof(thunk_object) + sizeof(rc_type));
}
static inline void free_task_obj(object * o) {
free_heap_obj_core(o, sizeof(task_object) + sizeof(rc_type));
}
static inline void free_parray_obj(object * o) {
free_heap_obj_core(o, sizeof(parray_object) + sizeof(rc_type));
}
static void del_core(object * o, object * todo) {
lean_assert(is_heap_obj(o));
@ -132,53 +192,53 @@ static void del_core(object * o, object * todo) {
object ** it = cnstr_obj_cptr(o);
object ** end = it + cnstr_num_objs(o);
for (; it != end; ++it) dec(*it, todo);
free_heap_obj(o);
free_cnstr_obj(o);
break;
}
case object_kind::Closure: {
object ** it = closure_arg_cptr(o);
object ** end = it + closure_num_fixed(o);
for (; it != end; ++it) dec(*it, todo);
free_heap_obj(o);
free_closure_obj_core(o);
break;
}
case object_kind::Array: {
object ** it = array_cptr(o);
object ** end = it + array_size(o);
for (; it != end; ++it) dec(*it, todo);
free_heap_obj(o);
free_array_obj(o);
break;
}
case object_kind::ScalarArray:
free_heap_obj(o); break;
free_sarray_obj(o); break;
case object_kind::String:
free_heap_obj(o); break;
free_string_obj(o); break;
case object_kind::MPZ:
dealloc_mpz(o); break;
case object_kind::Thunk:
if (object * c = to_thunk(o)->m_closure) dec(c, todo);
if (object * v = to_thunk(o)->m_value) dec(v, todo);
free_heap_obj(o);
free_thunk_obj(o);
break;
case object_kind::Task:
deactivate_task(to_task(o));
break;
case object_kind::PArrayPop:
dec_ref(to_parray(o)->m_next, todo);
free_heap_obj(o);
free_parray_obj(o);
break;
case object_kind::PArrayPush:
case object_kind::PArraySet:
dec(to_parray(o)->m_elem, todo);
dec_ref(to_parray(o)->m_next, todo);
free_heap_obj(o);
free_parray_obj(o);
break;
case object_kind::PArrayRoot: {
object ** it = to_parray(o)->m_data;
object ** end = it + to_parray(o)->m_size;
for (; it != end; ++it) dec(*it, todo);
dealloc_parray_data(to_parray(o)->m_data);
free_heap_obj(o);
free_parray_obj(o);
break;
}
case object_kind::External:
@ -218,23 +278,6 @@ void * alloc_heap_object(size_t sz) {
return static_cast<char *>(r) + sizeof(rc_type);
}
void free_heap_obj(object * o) {
#ifdef LEAN_FAKE_FREE
// Set kinds to invalid values, which should trap any further accesses in debug mode.
// Make sure object kind is recoverable for printing deleted objects
if (o->m_mem_kind != 42) {
o->m_kind = -o->m_kind;
o->m_mem_kind = 42;
}
#else
#ifdef LEAN_SMALL_ALLOCATOR
dealloc(reinterpret_cast<char *>(o) - sizeof(rc_type), obj_byte_size(o) + sizeof(rc_type));
#else
free(reinterpret_cast<char *>(o) - sizeof(rc_type));
#endif
#endif
}
// =======================================
// Scalar arrays
@ -519,7 +562,7 @@ LEAN_THREAD_PTR(task_object, g_current_task_object);
void dealloc_task(task_object * t) {
if (t->m_imp) delete t->m_imp;
free_heap_obj(t);
free_task_obj(t);
}
struct scoped_current_task_object : flet<task_object *> {
@ -722,7 +765,7 @@ public:
lean_assert(t->m_imp == nullptr);
lock.unlock();
dec(v);
free_heap_obj(t);
free_task_obj(t);
return;
} else {
lean_assert(t->m_imp);
@ -1273,7 +1316,7 @@ static object * string_ensure_capacity(object * o, size_t extra) {
object * new_o = alloc_string(sz, cap + sz + extra, string_len(o));
lean_assert(string_capacity(new_o) >= sz + extra);
memcpy(w_string_cstr(new_o), string_cstr(o), sz);
free_heap_obj(o);
free_string_obj(o);
return new_o;
} else {
return o;

View file

@ -239,6 +239,8 @@ static_assert(sizeof(atomic<rc_type>) == sizeof(rc_type), "atomic<rc_type> and
void * alloc_heap_object(size_t sz);
void free_heap_obj(object * o);
void free_mpz_obj(object * o);
void free_closure_obj(object * o);
inline atomic<rc_type> * mt_rc_addr(object * o) {
return reinterpret_cast<atomic<rc_type> *>(reinterpret_cast<char *>(o) - sizeof(rc_type));
@ -348,7 +350,7 @@ inline external_object * to_external(object * o) { lean_assert(is_external(o));
"Additionally, the resulting std::atomic<Integral> specialization has standard layout, a trivial default constructor,
and a trivial destructor." */
inline void dealloc_mpz(object * o) { to_mpz(o)->~mpz_object(); free_heap_obj(o); }
inline void dealloc_mpz(object * o) { to_mpz(o)->~mpz_object(); free_mpz_obj(o); }
inline void dealloc_external(object * o) { delete to_external(o); }
inline void dealloc(object * o) {
lean_assert(is_heap_obj(o));