Skip to content

Commit 4f236f7

Browse files
committed
[GR-23304] add open_code to io module and initialize io
PullRequest: graalpython/1773
2 parents 1b5226e + a2a37fe commit 4f236f7

18 files changed

+152
-154
lines changed

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/PythonLanguage.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -257,7 +257,7 @@ protected PythonContext createContext(Env env) {
257257

258258
Object[] engineOptionsUnroll = this.engineOptionsStorage;
259259
if (engineOptionsUnroll == null) {
260-
this.engineOptionsStorage = engineOptionsUnroll = PythonOptions.createEngineOptionValuesStorage(env);
260+
this.engineOptionsStorage = PythonOptions.createEngineOptionValuesStorage(env);
261261
} else {
262262
assert Arrays.equals(engineOptionsUnroll, PythonOptions.createEngineOptionValuesStorage(env)) : "invalid engine options";
263263
}

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/Python3Core.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -271,7 +271,6 @@ private static String[] initializeCoreFiles() {
271271
"_functools",
272272
"method",
273273
"code",
274-
"_io",
275274
"_frozen_importlib",
276275
"__graalpython__",
277276
"_weakref",
@@ -298,7 +297,7 @@ private static String[] initializeCoreFiles() {
298297
"mmap",
299298
"_ast",
300299
"java",
301-
"pyio_patches",
300+
"sys_post_init",
302301
"_contextvars",
303302
"pip_hook",
304303
"marshal",
@@ -412,6 +411,7 @@ private static PythonBuiltins[] initializeBuiltins(boolean nativeAccessAllowed)
412411
new PythonCextBuiltins(),
413412
new WeakRefModuleBuiltins(),
414413
new ReferenceTypeBuiltins(),
414+
new WarningsModuleBuiltins(),
415415

416416
// io
417417
new IOModuleBuiltins(),
@@ -665,7 +665,7 @@ public void warn(PythonBuiltinClassType type, String format, Object... args) {
665665

666666
@Override
667667
public Object getStderr() {
668-
Object sys = lookupBuiltinModule("sys");
668+
PythonModule sys = lookupBuiltinModule("sys");
669669
try {
670670
return PythonObjectLibrary.getUncached().lookupAttribute(sys, null, "stderr");
671671
} catch (PException e) {

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/CodecsTruffleModuleBuiltins.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ public abstract static class LookupTextEncoding extends PNodeWithRaise {
7373
public abstract Object execute(VirtualFrame frame, String encoding, String alternateCommand);
7474

7575
@Specialization
76-
Object lookup(VirtualFrame frame, String encoding, String alternateCommand,
76+
static Object lookup(VirtualFrame frame, String encoding, String alternateCommand,
7777
@CachedContext(PythonLanguage.class) PythonContext context,
7878
@CachedLibrary(limit = "1") PythonObjectLibrary lib) {
7979
PythonModule codecs = context.getCore().lookupBuiltinModule("_codecs_truffle");
@@ -85,7 +85,7 @@ public abstract static class GetPreferredEncoding extends PNodeWithRaise {
8585
public abstract String execute(VirtualFrame frame);
8686

8787
@Specialization
88-
String getpreferredencoding(VirtualFrame frame,
88+
static String getpreferredencoding(VirtualFrame frame,
8989
@CachedContext(PythonLanguage.class) PythonContext context,
9090
@CachedLibrary(limit = "2") PythonObjectLibrary lib,
9191
@Cached CastToJavaStringNode castToJavaStringNode) {
@@ -101,13 +101,13 @@ public abstract static class MakeIncrementalcodecNode extends PNodeWithRaise {
101101
public abstract Object execute(VirtualFrame frame, Object codecInfo, Object errors, String attrName);
102102

103103
@Specialization
104-
Object getIncEncoder(VirtualFrame frame, Object codecInfo, @SuppressWarnings("unused") PNone errors, String attrName,
104+
static Object getIncEncoder(VirtualFrame frame, Object codecInfo, @SuppressWarnings("unused") PNone errors, String attrName,
105105
@CachedLibrary(limit = "2") PythonObjectLibrary lib) {
106106
return lib.lookupAndCallRegularMethod(codecInfo, frame, attrName);
107107
}
108108

109109
@Specialization(guards = "!isPNone(errors)")
110-
Object getIncEncoder(VirtualFrame frame, Object codecInfo, Object errors, String attrName,
110+
static Object getIncEncoder(VirtualFrame frame, Object codecInfo, Object errors, String attrName,
111111
@CachedLibrary(limit = "2") PythonObjectLibrary lib) {
112112
return lib.lookupAndCallRegularMethod(codecInfo, frame, attrName, errors);
113113
}
@@ -118,7 +118,7 @@ public abstract static class GetIncrementalEncoderNode extends PNodeWithRaise {
118118
public abstract Object execute(VirtualFrame frame, Object codecInfo, String errors);
119119

120120
@Specialization
121-
Object getIncEncoder(VirtualFrame frame, Object codecInfo, String errors,
121+
static Object getIncEncoder(VirtualFrame frame, Object codecInfo, String errors,
122122
@Cached MakeIncrementalcodecNode makeIncrementalcodecNode) {
123123
return makeIncrementalcodecNode.execute(frame, codecInfo, errors, "incrementalencoder");
124124
}

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/SysModuleBuiltins.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,8 @@
6161
import com.oracle.graal.python.builtins.PythonBuiltinClassType;
6262
import com.oracle.graal.python.builtins.PythonBuiltins;
6363
import com.oracle.graal.python.builtins.modules.SysModuleBuiltinsClinicProviders.GetFrameNodeClinicProviderGen;
64+
import com.oracle.graal.python.builtins.modules.io.FileIOBuiltins;
65+
import com.oracle.graal.python.builtins.modules.io.PFileIO;
6466
import com.oracle.graal.python.builtins.objects.PNone;
6567
import com.oracle.graal.python.builtins.objects.exception.PBaseException;
6668
import com.oracle.graal.python.builtins.objects.frame.PFrame;
@@ -350,6 +352,22 @@ public void initialize(PythonCore core) {
350352
}
351353
builtinConstants.put("__gmultiarch", PythonUtils.getPythonArch() + "-" + os);
352354

355+
PFileIO stdin = core.factory().createFileIO(PythonBuiltinClassType.PFileIO);
356+
FileIOBuiltins.FileIOInit.internalInit(stdin, "<stdin>", 0, "r");
357+
builtinConstants.put("stdin", stdin);
358+
builtinConstants.put("__stdin__", stdin);
359+
360+
PFileIO stdout = core.factory().createFileIO(PythonBuiltinClassType.PFileIO);
361+
FileIOBuiltins.FileIOInit.internalInit(stdout, "<stdout>", 1, "w");
362+
builtinConstants.put("stdout", stdout);
363+
builtinConstants.put("__stdout__", stdout);
364+
365+
PFileIO stderr = core.factory().createFileIO(PythonBuiltinClassType.PFileIO);
366+
stderr.setUTF8Write(true);
367+
FileIOBuiltins.FileIOInit.internalInit(stderr, "<stderr>", 2, "w");
368+
builtinConstants.put("stderr", stderr);
369+
builtinConstants.put("__stderr__", stderr);
370+
353371
super.initialize(core);
354372

355373
// we need these during core initialization, they are re-set in postInitialize

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/io/FileIOBuiltins.java

Lines changed: 29 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@
4444
import static com.oracle.graal.python.builtins.PythonBuiltinClassType.OverflowError;
4545
import static com.oracle.graal.python.builtins.PythonBuiltinClassType.PRawIOBase;
4646
import static com.oracle.graal.python.builtins.PythonBuiltinClassType.RuntimeError;
47+
import static com.oracle.graal.python.builtins.modules.CodecsModuleBuiltins.STRICT;
4748
import static com.oracle.graal.python.builtins.modules.PosixModuleBuiltins.mapPythonSeekWhenceToPosix;
4849
import static com.oracle.graal.python.builtins.modules.io.BufferedIOUtil.SEEK_CUR;
4950
import static com.oracle.graal.python.builtins.modules.io.BufferedIOUtil.SEEK_END;
@@ -110,6 +111,7 @@
110111
import com.oracle.graal.python.builtins.modules.SysModuleBuiltins;
111112
import com.oracle.graal.python.builtins.modules.WarningsModuleBuiltins;
112113
import com.oracle.graal.python.builtins.objects.PNone;
114+
import com.oracle.graal.python.builtins.objects.bytes.BytesBuiltins;
113115
import com.oracle.graal.python.builtins.objects.bytes.BytesNodes;
114116
import com.oracle.graal.python.builtins.objects.bytes.PBytes;
115117
import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodes;
@@ -131,6 +133,7 @@
131133
import com.oracle.graal.python.nodes.function.builtins.PythonTernaryClinicBuiltinNode;
132134
import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode;
133135
import com.oracle.graal.python.nodes.function.builtins.clinic.ArgumentClinicProvider;
136+
import com.oracle.graal.python.nodes.util.CastToJavaStringNode;
134137
import com.oracle.graal.python.runtime.AsyncHandler;
135138
import com.oracle.graal.python.runtime.GilNode;
136139
import com.oracle.graal.python.runtime.PosixSupportLibrary;
@@ -273,11 +276,10 @@ private static int processMode(PFileIO self, IONodes.IOMode mode) {
273276
return flags;
274277
}
275278

276-
public static void internalInit(PFileIO self, String name, int fd, IONodes.IOMode mode,
277-
PythonContext ctxt) {
279+
public static void internalInit(PFileIO self, String name, int fd, String mode) {
278280
self.setCloseFD(false);
279-
self.setFD(fd, ctxt);
280-
processMode(self, mode);
281+
self.setFD(fd, null);
282+
processMode(self, IONodes.IOMode.create(mode));
281283
self.setBlksize(DEFAULT_BUFFER_SIZE);
282284
WriteAttributeToObjectNode.getUncached().execute(self, NAME, name);
283285
}
@@ -632,13 +634,13 @@ Object closedError(PFileIO self, Object buffer) {
632634
@GenerateNodeFactory
633635
abstract static class WriteNode extends PythonBinaryBuiltinNode {
634636

635-
@Specialization(guards = {"!self.isClosed()", "self.isWritable()"})
637+
@Specialization(guards = {"!self.isClosed()", "self.isWritable()", "!self.isUTF8Write()"})
636638
Object write(VirtualFrame frame, PFileIO self, Object data,
637-
@Cached PosixModuleBuiltins.WriteNode posixWrite,
639+
@Shared("p") @Cached PosixModuleBuiltins.WriteNode posixWrite,
638640
@Cached BytesNodes.ToBytesNode toBytes,
639641
@CachedLibrary("getPosixSupport()") PosixSupportLibrary posixLib,
640-
@Cached BranchProfile errorProfile,
641-
@Cached GilNode gil) {
642+
@Shared("e") @Cached BranchProfile errorProfile,
643+
@Shared("g") @Cached GilNode gil) {
642644
try {
643645
return posixWrite.write(self.getFD(), toBytes.execute(data), posixLib, errorProfile, gil);
644646
} catch (PosixSupportLibrary.PosixException e) {
@@ -650,6 +652,25 @@ Object write(VirtualFrame frame, PFileIO self, Object data,
650652
}
651653
}
652654

655+
@Specialization(guards = {"!self.isClosed()", "self.isWritable()", "self.isUTF8Write()"})
656+
Object utf8write(VirtualFrame frame, PFileIO self, Object data,
657+
@Shared("p") @Cached PosixModuleBuiltins.WriteNode posixWrite,
658+
@Cached CastToJavaStringNode castStr,
659+
@CachedLibrary("getPosixSupport()") PosixSupportLibrary posixLib,
660+
@Shared("e") @Cached BranchProfile errorProfile,
661+
@Shared("g") @Cached GilNode gil) {
662+
byte[] bytes = BytesBuiltins.stringToByte(castStr.execute(data), "utf-8", STRICT, getRaiseNode());
663+
try {
664+
return posixWrite.write(self.getFD(), bytes, posixLib, errorProfile, gil);
665+
} catch (PosixSupportLibrary.PosixException e) {
666+
if (e.getErrorCode() == EAGAIN.getNumber()) {
667+
return PNone.NONE;
668+
}
669+
errorProfile.enter();
670+
throw raiseOSErrorFromPosixException(frame, e);
671+
}
672+
}
673+
653674
@Specialization(guards = {"!self.isClosed()", "!self.isWritable()"})
654675
Object notWritable(@SuppressWarnings("unused") PFileIO self, @SuppressWarnings("unused") Object buf) {
655676
throw raise(IOUnsupportedOperation, FILE_NOT_OPEN_FOR_S, "writing");

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/io/IOBaseDictBuiltins.java

Lines changed: 3 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@
4949
import static com.oracle.graal.python.builtins.PythonBuiltinClassType.PIOBase;
5050
import static com.oracle.graal.python.builtins.PythonBuiltinClassType.PStringIO;
5151
import static com.oracle.graal.python.builtins.PythonBuiltinClassType.PTextIOWrapper;
52+
import static com.oracle.graal.python.builtins.modules.io.IONodes.getDict;
5253
import static com.oracle.graal.python.nodes.SpecialAttributeNames.__DICT__;
5354

5455
import java.util.List;
@@ -57,16 +58,13 @@
5758
import com.oracle.graal.python.builtins.CoreFunctions;
5859
import com.oracle.graal.python.builtins.PythonBuiltinClassType;
5960
import com.oracle.graal.python.builtins.objects.PNone;
60-
import com.oracle.graal.python.builtins.objects.dict.PDict;
6161
import com.oracle.graal.python.builtins.objects.object.PythonObject;
6262
import com.oracle.graal.python.builtins.objects.object.PythonObjectLibrary;
6363
import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode;
6464
import com.oracle.graal.python.nodes.function.builtins.PythonBinaryBuiltinNode;
65-
import com.oracle.truffle.api.CompilerDirectives;
6665
import com.oracle.truffle.api.dsl.GenerateNodeFactory;
6766
import com.oracle.truffle.api.dsl.NodeFactory;
6867
import com.oracle.truffle.api.dsl.Specialization;
69-
import com.oracle.truffle.api.interop.UnsupportedMessageException;
7068
import com.oracle.truffle.api.library.CachedLibrary;
7169

7270
@CoreFunctions(extendClasses = {PIOBase, PFileIO, PStringIO, PTextIOWrapper, PBytesIO,
@@ -85,18 +83,9 @@ protected List<? extends NodeFactory<? extends PythonBuiltinBaseNode>> getNodeFa
8583
public abstract static class DictNode extends PythonBinaryBuiltinNode {
8684

8785
@Specialization(guards = "isNoValue(none)", limit = "2")
88-
protected Object getDict(PythonObject self, @SuppressWarnings("unused") PNone none,
86+
protected Object doit(PythonObject self, @SuppressWarnings("unused") PNone none,
8987
@CachedLibrary("self") PythonObjectLibrary lib) {
90-
PDict dict = lib.getDict(self);
91-
if (dict == null) {
92-
dict = factory().createDictFixedStorage(self);
93-
try {
94-
lib.setDict(self, dict);
95-
} catch (UnsupportedMessageException e) {
96-
throw CompilerDirectives.shouldNotReachHere(e);
97-
}
98-
}
99-
return dict;
88+
return getDict(self, lib, factory());
10089
}
10190

10291
@Specialization

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/io/IOModuleBuiltins.java

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,9 @@
5252
import static com.oracle.graal.python.builtins.PythonBuiltinClassType.PTextIOWrapper;
5353
import static com.oracle.graal.python.builtins.PythonBuiltinClassType.ValueError;
5454
import static com.oracle.graal.python.builtins.modules.CodecsModuleBuiltins.STRICT;
55+
import static com.oracle.graal.python.builtins.modules.io.BufferedIOUtil.SEEK_CUR;
56+
import static com.oracle.graal.python.builtins.modules.io.BufferedIOUtil.SEEK_END;
57+
import static com.oracle.graal.python.builtins.modules.io.BufferedIOUtil.SEEK_SET;
5558
import static com.oracle.graal.python.builtins.modules.io.IONodes.CLOSE;
5659
import static com.oracle.graal.python.nodes.ErrorMessages.BINARY_MODE_DOESN_T_TAKE_AN_S_ARGUMENT;
5760
import static com.oracle.graal.python.nodes.ErrorMessages.CAN_T_HAVE_TEXT_AND_BINARY_MODE_AT_ONCE;
@@ -78,6 +81,7 @@
7881
import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode;
7982
import com.oracle.graal.python.nodes.function.PythonBuiltinNode;
8083
import com.oracle.graal.python.nodes.function.builtins.PythonClinicBuiltinNode;
84+
import com.oracle.graal.python.nodes.function.builtins.PythonUnaryClinicBuiltinNode;
8185
import com.oracle.graal.python.nodes.function.builtins.clinic.ArgumentClinicProvider;
8286
import com.oracle.graal.python.runtime.PosixSupportLibrary;
8387
import com.oracle.graal.python.runtime.PythonCore;
@@ -106,11 +110,17 @@ protected List<? extends NodeFactory<? extends PythonBuiltinBaseNode>> getNodeFa
106110
@Override
107111
public void initialize(PythonCore core) {
108112
super.initialize(core);
113+
builtinConstants.put("SEEK_SET", SEEK_SET);
114+
builtinConstants.put("SEEK_CUR", SEEK_CUR);
115+
builtinConstants.put("SEEK_END", SEEK_END);
109116
builtinConstants.put("DEFAULT_BUFFER_SIZE", DEFAULT_BUFFER_SIZE);
110117
PythonBuiltinClass unsupportedOpExcType = core.lookupType(IOUnsupportedOperation);
111118
unsupportedOpExcType.setSuperClass(core.lookupType(OSError), core.lookupType(ValueError));
112119
builtinConstants.put(IOUnsupportedOperation.getName(), unsupportedOpExcType);
113120
builtinConstants.put(BlockingIOError.getName(), core.lookupType(BlockingIOError));
121+
122+
builtinConstants.put("_warn", core.lookupBuiltinModule("_warnings").getAttribute("warn"));
123+
builtinConstants.put("_os", core.lookupBuiltinModule("posix"));
114124
}
115125

116126
@Builtin(name = "_IOBase", minNumOfPositionalArgs = 1, takesVarArgs = true, takesVarKeywordArgs = true, constructsClass = PIOBase)
@@ -225,6 +235,24 @@ private static PFileIO createFileIO(VirtualFrame frame, Object file, IONodes.IOM
225235
return fileIO;
226236
}
227237

238+
// PEP 578 stub
239+
@Builtin(name = "open_code", minNumOfPositionalArgs = 1, parameterNames = {"path"})
240+
@ArgumentClinic(name = "path", conversion = ArgumentClinic.ClinicConversion.String)
241+
@GenerateNodeFactory
242+
public abstract static class IOOpenCodeNode extends PythonUnaryClinicBuiltinNode {
243+
244+
@Override
245+
protected ArgumentClinicProvider getArgumentClinic() {
246+
return IOModuleBuiltinsClinicProviders.IOOpenCodeNodeClinicProviderGen.INSTANCE;
247+
}
248+
249+
@Specialization
250+
public PFileIO openCode(VirtualFrame frame, String path,
251+
@Cached FileIOBuiltins.FileIOInit initFileIO) {
252+
return createFileIO(frame, path, IONodes.IOMode.create("rb"), true, PNone.NONE, factory(), initFileIO);
253+
}
254+
}
255+
228256
@Builtin(name = "open", minNumOfPositionalArgs = 1, parameterNames = {"file", "mode", "buffering", "encoding", "errors", "newline", "closefd", "opener"})
229257
@ArgumentClinic(name = "mode", conversionClass = IONodes.CreateIOModeNode.class, args = "true")
230258
@ArgumentClinic(name = "buffering", conversion = ArgumentClinic.ClinicConversion.Int, defaultValue = "-1", useDefaultForNone = true)

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/io/IONodes.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,11 @@ public static class IOMode {
160160
this.mode = mode;
161161
}
162162

163+
protected static IOMode create(String mode) {
164+
IOMode m = new IOMode(mode);
165+
return m.decode();
166+
}
167+
163168
IOMode decode() {
164169
/* Decode mode */
165170
int flags = 0;

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/io/PFileIO.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,8 @@ public class PFileIO extends PythonBuiltinObject {
5959
boolean finalizing;
6060
private int blksize;
6161

62+
private boolean utf8Write;
63+
6264
public PFileIO(Object cls, Shape instanceShape) {
6365
super(cls, instanceShape);
6466
this.fd = null;
@@ -161,6 +163,14 @@ public int getBlksize() {
161163
public void setBlksize(int blksize) {
162164
this.blksize = blksize;
163165
}
166+
167+
public boolean isUTF8Write() {
168+
return utf8Write;
169+
}
170+
171+
public void setUTF8Write(boolean utf8Write) {
172+
this.utf8Write = utf8Write;
173+
}
164174
}
165175

166176
@CompilerDirectives.ValueType

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/io/TextIOWrapperNodes.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -791,7 +791,9 @@ void init(VirtualFrame frame, PTextIO self, Object buffer, Object encodingArg,
791791
if (buffer instanceof PBuffered) {
792792
/* Cache the raw FileIO object to speed up 'closed' checks */
793793
if (((PBuffered) buffer).isFastClosedChecks()) {
794-
self.setFileIO(((PBuffered) buffer).getFileIORaw());
794+
PFileIO f = ((PBuffered) buffer).getFileIORaw();
795+
self.setFileIO(f);
796+
f.setUTF8Write(false);
795797
}
796798
}
797799

0 commit comments

Comments
 (0)