Add a new 'a' format specifier to wrenCall that accepts an explicit byte array and length, enabling callers to pass strings containing null bytes without truncation. Also allow passing NULL for 'v' specifier arguments to produce a Wren NULL value. Rename setForeignCallbacks to setTestCallbacks for clarity. Extend the test suite with a new call.c test file that exercises all argument types including 'a' and 'v' with NULL, and add returnString/returnBytes foreign methods to verify wrenReturnString handles both null-terminated and explicit-length strings correctly.
52 lines
1.1 KiB
C
52 lines
1.1 KiB
C
#include <string.h>
|
|
|
|
#include "returns.h"
|
|
|
|
static void implicitNull(WrenVM* vm)
|
|
{
|
|
// Do nothing.
|
|
}
|
|
|
|
static void returnInt(WrenVM* vm)
|
|
{
|
|
wrenReturnDouble(vm, 123456);
|
|
}
|
|
|
|
static void returnFloat(WrenVM* vm)
|
|
{
|
|
wrenReturnDouble(vm, 123.456);
|
|
}
|
|
|
|
static void returnTrue(WrenVM* vm)
|
|
{
|
|
wrenReturnBool(vm, true);
|
|
}
|
|
|
|
static void returnFalse(WrenVM* vm)
|
|
{
|
|
wrenReturnBool(vm, false);
|
|
}
|
|
|
|
static void returnString(WrenVM* vm)
|
|
{
|
|
wrenReturnString(vm, "a string", -1);
|
|
}
|
|
|
|
static void returnBytes(WrenVM* vm)
|
|
{
|
|
wrenReturnString(vm, "a\0b\0c", 5);
|
|
}
|
|
|
|
WrenForeignMethodFn returnsBindMethod(const char* signature)
|
|
{
|
|
if (strcmp(signature, "static Api.implicitNull") == 0) return implicitNull;
|
|
if (strcmp(signature, "static Api.returnInt") == 0) return returnInt;
|
|
if (strcmp(signature, "static Api.returnFloat") == 0) return returnFloat;
|
|
if (strcmp(signature, "static Api.returnTrue") == 0) return returnTrue;
|
|
if (strcmp(signature, "static Api.returnFalse") == 0) return returnFalse;
|
|
if (strcmp(signature, "static Api.returnString") == 0) return returnString;
|
|
if (strcmp(signature, "static Api.returnBytes") == 0) return returnBytes;
|
|
|
|
return NULL;
|
|
}
|