@@ -583,21 +583,11 @@ public void initialize(Python3Core core) {
583
583
final TruffleString gmultiarch = cat (PythonUtils .getPythonArch (), T_DASH , os .getName ());
584
584
addBuiltinConstant ("__gmultiarch" , gmultiarch );
585
585
586
- PFileIO stdin = factory . createFileIO ( PythonBuiltinClassType . PFileIO );
587
- FileIOBuiltins . FileIOInit . internalInit ( stdin , toTruffleStringUncached ( "<stdin>" ), 0 , IOMode . R );
588
- addBuiltinConstant (T_STDIN , stdin );
589
- addBuiltinConstant (T___STDIN__ , stdin );
586
+ // Initialized later in postInitialize
587
+ addBuiltinConstant ( T_STDIN , PNone . NONE );
588
+ addBuiltinConstant (T_STDOUT , PNone . NONE );
589
+ addBuiltinConstant (T_STDERR , PNone . NONE );
590
590
591
- PFileIO stdout = factory .createFileIO (PythonBuiltinClassType .PFileIO );
592
- FileIOBuiltins .FileIOInit .internalInit (stdout , toTruffleStringUncached ("<stdout>" ), 1 , IOMode .W );
593
- addBuiltinConstant (T_STDOUT , stdout );
594
- addBuiltinConstant (T___STDOUT__ , stdout );
595
-
596
- PFileIO stderr = factory .createFileIO (PythonBuiltinClassType .PFileIO );
597
- stderr .setUTF8Write (true );
598
- FileIOBuiltins .FileIOInit .internalInit (stderr , toTruffleStringUncached ("<stderr>" ), 2 , IOMode .W );
599
- addBuiltinConstant (T_STDERR , stderr );
600
- addBuiltinConstant (T___STDERR__ , stderr );
601
591
addBuiltinConstant ("implementation" , makeImplementation (factory , versionInfo , gmultiarch ));
602
592
addBuiltinConstant ("hexversion" , PythonLanguage .VERSION_HEX );
603
593
@@ -773,37 +763,52 @@ public void postInitialize(Python3Core core) {
773
763
}
774
764
775
765
@ TruffleBoundary
776
- public void initStd (Python3Core core ) {
766
+ static void initStd (Python3Core core ) {
777
767
PythonObjectFactory factory = core .factory ();
768
+ PythonContext context = core .getContext ();
778
769
779
770
// wrap std in/out/err
780
771
GraalPythonModuleBuiltins gp = (GraalPythonModuleBuiltins ) core .lookupBuiltinModule (T___GRAALPYTHON__ ).getBuiltins ();
781
772
TruffleString stdioEncoding = gp .getStdIOEncoding ();
782
773
TruffleString stdioError = gp .getStdIOError ();
783
- Object posixSupport = core . getContext () .getPosixSupport ();
774
+ Object posixSupport = context .getPosixSupport ();
784
775
PosixSupportLibrary posixLib = PosixSupportLibrary .getUncached ();
785
776
PythonModule sysModule = core .lookupBuiltinModule (T_SYS );
786
777
787
- PBuffered reader = factory .createBufferedReader (PythonBuiltinClassType .PBufferedReader );
788
- BufferedReaderBuiltins .BufferedReaderInit .internalInit (reader , (PFileIO ) getBuiltinConstant (T_STDIN ), BufferedReaderBuiltins .DEFAULT_BUFFER_SIZE , factory , posixSupport ,
789
- posixLib );
790
- setWrapper (T_STDIN , T___STDIN__ , T_R , stdioEncoding , stdioError , reader , sysModule , factory );
778
+ // Note that stdin is always buffered, this only applies to stdout and stderr
779
+ boolean buffering = !context .getOption (PythonOptions .UnbufferedIO );
780
+
781
+ PFileIO stdinFileIO = factory .createFileIO (PythonBuiltinClassType .PFileIO );
782
+ FileIOBuiltins .FileIOInit .internalInit (stdinFileIO , toTruffleStringUncached ("<stdin>" ), 0 , IOMode .RB );
783
+ PBuffered stdinBuffer = factory .createBufferedReader (PythonBuiltinClassType .PBufferedReader );
784
+ BufferedReaderBuiltins .BufferedReaderInit .internalInit (stdinBuffer , stdinFileIO , BufferedReaderBuiltins .DEFAULT_BUFFER_SIZE , factory , posixSupport , posixLib );
785
+ setWrapper (T_STDIN , T___STDIN__ , T_R , stdioEncoding , stdioError , stdinBuffer , sysModule , factory , true );
786
+
787
+ PFileIO stdoutFileIO = factory .createFileIO (PythonBuiltinClassType .PFileIO );
788
+ FileIOBuiltins .FileIOInit .internalInit (stdoutFileIO , toTruffleStringUncached ("<stdout>" ), 1 , IOMode .WB );
789
+ Object stdoutBuffer = createBufferedIO (buffering , factory , stdoutFileIO , posixSupport , posixLib );
790
+ setWrapper (T_STDOUT , T___STDOUT__ , T_W , stdioEncoding , stdioError , stdoutBuffer , sysModule , factory , buffering );
791
791
792
+ PFileIO stderr = factory .createFileIO (PythonBuiltinClassType .PFileIO );
793
+ FileIOBuiltins .FileIOInit .internalInit (stderr , toTruffleStringUncached ("<stderr>" ), 2 , IOMode .WB );
794
+ Object stderrBuffer = createBufferedIO (buffering , factory , stderr , posixSupport , posixLib );
795
+ setWrapper (T_STDERR , T___STDERR__ , T_W , stdioEncoding , T_BACKSLASHREPLACE , stderrBuffer , sysModule , factory , buffering );
796
+ }
797
+
798
+ private static Object createBufferedIO (boolean buffering , PythonObjectFactory factory , PFileIO fileIo , Object posixSupport , PosixSupportLibrary posixLib ) {
799
+ if (!buffering ) {
800
+ return fileIo ;
801
+ }
792
802
PBuffered writer = factory .createBufferedWriter (PythonBuiltinClassType .PBufferedWriter );
793
- BufferedWriterBuiltins .BufferedWriterInit .internalInit (writer , (PFileIO ) getBuiltinConstant (T_STDOUT ), BufferedReaderBuiltins .DEFAULT_BUFFER_SIZE , factory , posixSupport ,
794
- posixLib );
795
- setWrapper (T_STDOUT , T___STDOUT__ , T_W , stdioEncoding , stdioError , writer , sysModule , factory );
796
-
797
- writer = factory .createBufferedWriter (PythonBuiltinClassType .PBufferedWriter );
798
- BufferedWriterBuiltins .BufferedWriterInit .internalInit (writer , (PFileIO ) getBuiltinConstant (T_STDERR ), BufferedReaderBuiltins .DEFAULT_BUFFER_SIZE , factory , posixSupport ,
799
- posixLib );
800
- setWrapper (T_STDERR , T___STDERR__ , T_W , stdioEncoding , T_BACKSLASHREPLACE , writer , sysModule , factory );
803
+ BufferedWriterBuiltins .BufferedWriterInit .internalInit (writer , fileIo , BufferedReaderBuiltins .DEFAULT_BUFFER_SIZE , factory , posixSupport , posixLib );
804
+ return writer ;
801
805
}
802
806
803
- private static PTextIO setWrapper (TruffleString name , TruffleString specialName , TruffleString mode , TruffleString encoding , TruffleString error , PBuffered buffered , PythonModule sysModule ,
804
- PythonObjectFactory factory ) {
807
+ private static PTextIO setWrapper (TruffleString name , TruffleString specialName , TruffleString mode , TruffleString encoding , TruffleString error , Object buffer , PythonModule sysModule ,
808
+ PythonObjectFactory factory , boolean buffering ) {
805
809
PTextIO textIOWrapper = factory .createTextIO (PythonBuiltinClassType .PTextIOWrapper );
806
- TextIOWrapperInitNodeGen .getUncached ().execute (null , null , textIOWrapper , buffered , encoding , error , PNone .NONE , true , true );
810
+ TextIOWrapperInitNodeGen .getUncached ().execute (null , null , textIOWrapper , buffer , encoding , error , PNone .NONE ,
811
+ /* line_buffering */ buffering , /* write_through */ !buffering );
807
812
808
813
setAttribute (textIOWrapper , T_MODE , mode );
809
814
setAttribute (sysModule , name , textIOWrapper );
0 commit comments