wren-cli
wren-cli copied to clipboard
Setters should return their argument
In Wren, assignment returns its value, like in C:
var a
System.print(a = 5) // 5
When implementing setters, we need to maintain this behavior:
// Not good
class C {
static a=(value) {
__a = value
}
}
System.print(C.a = 5) // null
// Good
class C {
static a=(value) { __a = value }
}
System.print(C.a = 5) // 5
// Also good
class C {
static a=(value) {
__a = value
return value
}
}
System.print(C.a = 5) // 5
Generally, the CLI do that, except in one foreign setter - Stdin.isRaw=(_)
:
https://github.com/wren-lang/wren-cli/blob/b82cf5a2e21ef54a8ac8347b27899edfeeffa724/src/module/io.c#L509-L525
Instead we should do:
void stdinIsRawSet(WrenVM* vm)
{
initStdin();
isStdinRaw = wrenGetSlotBool(vm, 1);
if (uv_guess_handle(stdinDescriptor) == UV_TTY)
{
uv_tty_t* handle = (uv_tty_t*)stdinStream;
uv_tty_set_mode(handle, isStdinRaw ? UV_TTY_MODE_RAW : UV_TTY_MODE_NORMAL);
}
else
{
// Can't set raw mode when not talking to a TTY.
// TODO: Make this a runtime error?
}
wrenEnsureSlots(vm, 1); // Is that required? Probably not
wrenSetSlotBool(vm, 0, isStdinRaw);
}