
Hi,
Hi YHC,
I'm trying to do a make_tuple of 11 elements.
Is the correct structure to do:
MAKE_NODE(ret, G_infoTuple, N_NORMAL);
...
node->args[0] = thing0 node->args[1] = thing1 node->args[2] = thing2 node->args[3] = thing3 ... node->args[10] = thing10
Then, how does the garbage collector know the number of elements?
I would have thought that it would basically have been make_array, but make array uses data, not args; how does data help the situation?
My first question is to ask why you need to make an 11 tuple from the C code. I guess you must be adding support for some library, but the normal way to do that is using the FFI. Only one or two specialised things in the prelude are coded directly using the C interface. In any case I've just pushed a patch that makes it much easier to make tuples from the C code. You can now use Node* make_nTuple(int num, ...); To make a tuple of any size (including 0). So now you can do return make_nTuple(3, a, b, c);
Finally, I would think that I would nead to heap_pushGlobal any time I call anything that calls heap_alloc, but not all functions do this:
Node* _primIntegerQuotRem(Node* node){ Node* quot = _primIntegerQuot(node); Node* rem = _primIntegerRem(node); return make_tuple(quot, rem); }
Could the GC not be called during _primIntegerRem, and collect quot?
Oops, yes that's a bug. This is partly why we've moved to using the FFI for primitives where possible. It's so easy to make mistakes. Thanks Tom