Don't automatically flush on every System.write().
It's handy because it ensures writes are flushed to the terminal before any calls to read from stdin, but it's also gratuitously slow. Instead, added a Stdout class with an explicit flush() method that can be called by the user. Fix #445.
This commit is contained in:
+5
-1
@@ -43,6 +43,7 @@ extern void stdinIsRawSet(WrenVM* vm);
|
||||
extern void stdinIsTerminal(WrenVM* vm);
|
||||
extern void stdinReadStart(WrenVM* vm);
|
||||
extern void stdinReadStop(WrenVM* vm);
|
||||
extern void stdoutFlush(WrenVM* vm);
|
||||
extern void schedulerCaptureMethods(WrenVM* vm);
|
||||
extern void timerStartTimer(WrenVM* vm);
|
||||
|
||||
@@ -61,7 +62,7 @@ extern void timerStartTimer(WrenVM* vm);
|
||||
// If you add a new class to the largest module below, make sure to bump this.
|
||||
// Note that it also includes an extra slot for the sentinel value indicating
|
||||
// the end of the list.
|
||||
#define MAX_CLASSES_PER_MODULE 5
|
||||
#define MAX_CLASSES_PER_MODULE 6
|
||||
|
||||
// Describes one foreign method in a class.
|
||||
typedef struct
|
||||
@@ -153,6 +154,9 @@ static ModuleRegistry modules[] =
|
||||
STATIC_METHOD("readStart_()", stdinReadStart)
|
||||
STATIC_METHOD("readStop_()", stdinReadStop)
|
||||
END_CLASS
|
||||
CLASS(Stdout)
|
||||
STATIC_METHOD("flush()", stdoutFlush)
|
||||
END_CLASS
|
||||
END_MODULE
|
||||
MODULE(os)
|
||||
CLASS(Platform)
|
||||
|
||||
@@ -151,7 +151,6 @@ static WrenForeignClassMethods bindForeignClass(
|
||||
static void write(WrenVM* vm, const char* text)
|
||||
{
|
||||
printf("%s", text);
|
||||
fflush(stdout);
|
||||
}
|
||||
|
||||
static void reportError(WrenVM* vm, WrenErrorType type,
|
||||
|
||||
@@ -545,6 +545,12 @@ void stdinIsTerminal(WrenVM* vm)
|
||||
wrenSetSlotBool(vm, 0, uv_guess_handle(stdinDescriptor) == UV_TTY);
|
||||
}
|
||||
|
||||
void stdoutFlush(WrenVM* vm)
|
||||
{
|
||||
fflush(stdout);
|
||||
wrenSetSlotNull(vm, 0);
|
||||
}
|
||||
|
||||
static void allocCallback(uv_handle_t* handle, size_t suggestedSize,
|
||||
uv_buf_t* buf)
|
||||
{
|
||||
|
||||
@@ -297,3 +297,7 @@ class Stdin {
|
||||
foreign static readStart_()
|
||||
foreign static readStop_()
|
||||
}
|
||||
|
||||
class Stdout {
|
||||
foreign static flush()
|
||||
}
|
||||
|
||||
@@ -298,4 +298,8 @@ static const char* ioModuleSource =
|
||||
"\n"
|
||||
" foreign static readStart_()\n"
|
||||
" foreign static readStop_()\n"
|
||||
"}\n"
|
||||
"\n"
|
||||
"class Stdout {\n"
|
||||
" foreign static flush()\n"
|
||||
"}\n";
|
||||
|
||||
Reference in New Issue
Block a user