feat: add wrenEnsureSlots, wrenSetSlotNewList, and wrenInsertInList C API functions for list manipulation
Add three new public C API functions to the Wren embedding API that enable foreign methods to create and populate lists. wrenEnsureSlots grows the foreign slot stack to guarantee space for temporary work, wrenSetSlotNewList stores a new empty list in a slot, and wrenInsertInList inserts a value from one slot into a list at another slot at a given index (supporting negative indices for relative positioning). The implementation includes a new internal ensureStack helper that reallocates the fiber's stack and updates all pointers (stack top, call frame starts, open upvalues, and foreign stack start) when the reallocation moves the stack. New test files (lists.c, lists.h, lists.wren) exercise creation, appending, insertion, and negative index insertion, and the existing slots test is extended with an ensure test that verifies slot count growth and slot usability.
This commit is contained in:
@@ -240,6 +240,14 @@ void* wrenAllocateForeign(WrenVM* vm, size_t size);
|
||||
// Returns the number of slots available to the current foreign method.
|
||||
int wrenGetSlotCount(WrenVM* vm);
|
||||
|
||||
// Ensures that the foreign method stack has at least [numSlots] available for
|
||||
// use, growing the stack if needed.
|
||||
//
|
||||
// Does not shrink the stack if it has more than enough slots.
|
||||
//
|
||||
// It is an error to call this from a finalizer.
|
||||
void wrenEnsureSlots(WrenVM* vm, int numSlots);
|
||||
|
||||
// TODO: Update docs.
|
||||
|
||||
// The following functions read one of the arguments passed to a foreign call.
|
||||
@@ -327,6 +335,9 @@ void wrenSetSlotBytes(WrenVM* vm, int slot, const char* bytes, int length);
|
||||
// Stores the numeric [value] in [slot].
|
||||
void wrenSetSlotDouble(WrenVM* vm, int slot, double value);
|
||||
|
||||
// Stores a new empty list in [slot].
|
||||
void wrenSetSlotNewList(WrenVM* vm, int slot);
|
||||
|
||||
// Stores null in [slot].
|
||||
void wrenSetSlotNull(WrenVM* vm, int slot);
|
||||
|
||||
@@ -343,4 +354,11 @@ void wrenSetSlotString(WrenVM* vm, int slot, const char* text);
|
||||
// This does not release the handle for the value.
|
||||
void wrenSetSlotValue(WrenVM* vm, int slot, WrenValue* value);
|
||||
|
||||
// Takes the value stored at [elementSlot] and inserts it into the list stored
|
||||
// at [listSlot] at [index].
|
||||
//
|
||||
// As in Wren, negative indexes can be used to insert from the end. To append
|
||||
// an element, use `-1` for the index.
|
||||
void wrenInsertInList(WrenVM* vm, int listSlot, int index, int elementSlot);
|
||||
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user