Skip to content

Commit d6bb23a

Browse files
committed
[GR-23304] Add base io classes builtins
PullRequest: graalpython/1571
2 parents dc865f9 + 4cbe08a commit d6bb23a

File tree

17 files changed

+1234
-335
lines changed

17 files changed

+1234
-335
lines changed

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

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -105,8 +105,12 @@
105105
import com.oracle.graal.python.builtins.modules.bz2.BZ2CompressorBuiltins;
106106
import com.oracle.graal.python.builtins.modules.bz2.BZ2DecompressorBuiltins;
107107
import com.oracle.graal.python.builtins.modules.bz2.BZ2ModuleBuiltins;
108+
import com.oracle.graal.python.builtins.modules.io.BufferedIOBaseBuiltins;
108109
import com.oracle.graal.python.builtins.modules.io.BufferedReaderBuiltins;
110+
import com.oracle.graal.python.builtins.modules.io.IOBaseBuiltins;
109111
import com.oracle.graal.python.builtins.modules.io.IOModuleBuiltins;
112+
import com.oracle.graal.python.builtins.modules.io.RawIOBaseBuiltins;
113+
import com.oracle.graal.python.builtins.modules.io.TextIOBaseBuiltins;
110114
import com.oracle.graal.python.builtins.modules.zlib.ZLibModuleBuiltins;
111115
import com.oracle.graal.python.builtins.modules.zlib.ZlibCompressBuiltins;
112116
import com.oracle.graal.python.builtins.modules.zlib.ZlibDecompressBuiltins;
@@ -379,7 +383,15 @@ private static PythonBuiltins[] initializeBuiltins(boolean nativeAccessAllowed)
379383
new PythonCextBuiltins(),
380384
new WeakRefModuleBuiltins(),
381385
new ReferenceTypeBuiltins(),
386+
387+
// io
382388
new IOModuleBuiltins(),
389+
new IOBaseBuiltins(),
390+
new BufferedIOBaseBuiltins(),
391+
new RawIOBaseBuiltins(),
392+
new TextIOBaseBuiltins(),
393+
new BufferedReaderBuiltins(),
394+
383395
new StringModuleBuiltins(),
384396
new ItertoolsModuleBuiltins(),
385397
new FunctoolsModuleBuiltins(),
@@ -415,10 +427,12 @@ private static PythonBuiltins[] initializeBuiltins(boolean nativeAccessAllowed)
415427
new OperatorModuleBuiltins(),
416428
new ZipImporterBuiltins(),
417429
new ZipImportModuleBuiltins(),
430+
431+
// zlib
418432
new ZLibModuleBuiltins(),
419433
new ZlibCompressBuiltins(),
420434
new ZlibDecompressBuiltins(),
421-
new BufferedReaderBuiltins(),
435+
422436
new MMapModuleBuiltins(),
423437
new FcntlModuleBuiltins(),
424438
new MMapBuiltins(),
@@ -430,9 +444,12 @@ private static PythonBuiltins[] initializeBuiltins(boolean nativeAccessAllowed)
430444
new PwdModuleBuiltins(),
431445
new ResourceModuleBuiltins(),
432446
new ContextvarsModuleBuiltins(),
447+
448+
// lzma
433449
new LZMAModuleBuiltins(),
434450
new LZMACompressorBuiltins(),
435451
new LZMADecompressorBuiltins(),
452+
436453
new MultiprocessingModuleBuiltins(),
437454
new SemLockBuiltins(),
438455
new WarningsModuleBuiltins(),

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

Lines changed: 32 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -134,16 +134,32 @@ public enum PythonBuiltinClassType implements TruffleObject {
134134
PClassmethod("classmethod", BuiltinNames.BUILTINS),
135135
PScandirIterator("ScandirIterator", false, "posix", false),
136136
PDirEntry("DirEntry", true, "posix", false),
137-
PLZMACompressor("LZMACompressor", "_lzma"),
138-
PLZMADecompressor("LZMADecompressor", "_lzma"),
139137
LsprofProfiler("Profiler", "_lsprof"),
140138
PStruct("Struct", "_struct"),
141139
PStructUnpackIterator("unpack_iterator", "_struct"),
140+
141+
// bz2
142142
BZ2Compressor("BZ2Compressor", "_bz2"),
143143
BZ2Decompressor("BZ2Decompressor", "_bz2"),
144+
145+
// lzma
146+
PLZMACompressor("LZMACompressor", "_lzma"),
147+
PLZMADecompressor("LZMADecompressor", "_lzma"),
148+
149+
// zlib
144150
ZlibCompress("Compress", "zlib"),
145151
ZlibDecompress("Decompress", "zlib"),
152+
153+
// io
154+
PIOBase("_IOBase", true, "_io", true),
155+
PRawIOBase("_RawIOBase", true, "_io", true),
156+
PTextIOBase("_TextIOBase", true, "_io", true),
157+
PBufferedIOBase("_BufferedIOBase", true, "_io", true),
146158
PBufferedReader("BufferedReader", "_io"),
159+
PBufferedWriter("BufferedWriter", "_io"),
160+
PBufferedRWPair("BufferedRWPair", "_io"),
161+
PBufferedRandom("BufferedRandom", "_io"),
162+
147163
PStatResult("stat_result", "os", false),
148164
PTerminalSize("terminal_size", "os", false),
149165
PUnameResult("uname_result", "posix", false),
@@ -229,6 +245,8 @@ public enum PythonBuiltinClassType implements TruffleObject {
229245
UnicodeTranslateError("UnicodeTranslateError", BuiltinNames.BUILTINS),
230246
RecursionError("RecursionError", BuiltinNames.BUILTINS),
231247

248+
IOUnsupportedOperation("UnsupportedOperation", "_io"),
249+
232250
// warnings
233251
Warning("Warning", BuiltinNames.BUILTINS),
234252
BytesWarning("BytesWarning", BuiltinNames.BUILTINS),
@@ -429,6 +447,18 @@ public final Shape getInstanceShape(PythonLanguage lang) {
429447
PHashInfo.base = PTuple;
430448
PThreadInfo.base = PTuple;
431449
PUnraisableHookArgs.base = PTuple;
450+
451+
// _io.UnsupportedOperation inherits from ValueError and OSError
452+
// done currently within IOModuleBuiltins class
453+
IOUnsupportedOperation.base = OSError;
454+
455+
PRawIOBase.base = PIOBase;
456+
PTextIOBase.base = PIOBase;
457+
PBufferedIOBase.base = PIOBase;
458+
PBufferedReader.base = PBufferedIOBase;
459+
PBufferedWriter.base = PBufferedIOBase;
460+
PBufferedRWPair.base = PBufferedIOBase;
461+
PBufferedRandom.base = PBufferedIOBase;
432462
}
433463

434464
/* InteropLibrary messages */
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,183 @@
1+
/*
2+
* Copyright (c) 2021, Oracle and/or its affiliates. All rights reserved.
3+
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4+
*
5+
* The Universal Permissive License (UPL), Version 1.0
6+
*
7+
* Subject to the condition set forth below, permission is hereby granted to any
8+
* person obtaining a copy of this software, associated documentation and/or
9+
* data (collectively the "Software"), free of charge and under any and all
10+
* copyright rights in the Software, and any and all patent rights owned or
11+
* freely licensable by each licensor hereunder covering either (i) the
12+
* unmodified Software as contributed to or provided by such licensor, or (ii)
13+
* the Larger Works (as defined below), to deal in both
14+
*
15+
* (a) the Software, and
16+
*
17+
* (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if
18+
* one is included with the Software each a "Larger Work" to which the Software
19+
* is contributed by such licensors),
20+
*
21+
* without restriction, including without limitation the rights to copy, create
22+
* derivative works of, display, perform, and distribute the Software and make,
23+
* use, sell, offer for sale, import, export, have made, and have sold the
24+
* Software and the Larger Work(s), and to sublicense the foregoing rights on
25+
* either these or other terms.
26+
*
27+
* This license is subject to the following condition:
28+
*
29+
* The above copyright notice and either this complete permission notice or at a
30+
* minimum a reference to the UPL must be included in all copies or substantial
31+
* portions of the Software.
32+
*
33+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
34+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
35+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
36+
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
37+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
38+
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
39+
* SOFTWARE.
40+
*/
41+
package com.oracle.graal.python.builtins.modules.io;
42+
43+
import static com.oracle.graal.python.builtins.objects.bytes.BytesUtils.getBytes;
44+
import static com.oracle.graal.python.builtins.objects.bytes.BytesUtils.getBytesLength;
45+
import static com.oracle.graal.python.nodes.ErrorMessages.S_RETURNED_TOO_MUCH_DATA;
46+
import static com.oracle.graal.python.nodes.ErrorMessages.S_SHOULD_RETURN_BYTES;
47+
import static com.oracle.graal.python.runtime.exception.PythonErrorType.IOUnsupportedOperation;
48+
import static com.oracle.graal.python.runtime.exception.PythonErrorType.ValueError;
49+
50+
import java.util.List;
51+
52+
import com.oracle.graal.python.builtins.Builtin;
53+
import com.oracle.graal.python.builtins.CoreFunctions;
54+
import com.oracle.graal.python.builtins.PythonBuiltinClassType;
55+
import com.oracle.graal.python.builtins.PythonBuiltins;
56+
import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodes;
57+
import com.oracle.graal.python.builtins.objects.object.PythonObjectLibrary;
58+
import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode;
59+
import com.oracle.graal.python.nodes.function.PythonBuiltinNode;
60+
import com.oracle.graal.python.nodes.function.builtins.PythonBinaryBuiltinNode;
61+
import com.oracle.truffle.api.dsl.Cached;
62+
import com.oracle.truffle.api.dsl.GenerateNodeFactory;
63+
import com.oracle.truffle.api.dsl.NodeFactory;
64+
import com.oracle.truffle.api.dsl.Specialization;
65+
import com.oracle.truffle.api.frame.VirtualFrame;
66+
import com.oracle.truffle.api.library.CachedLibrary;
67+
import com.oracle.truffle.api.profiles.ConditionProfile;
68+
69+
@CoreFunctions(extendClasses = PythonBuiltinClassType.PBufferedIOBase)
70+
public class BufferedIOBaseBuiltins extends PythonBuiltins {
71+
72+
protected static final String DETACH = "detach";
73+
protected static final String READ = "read";
74+
protected static final String READ1 = "read1";
75+
protected static final String READINTO = "readinto";
76+
protected static final String READINTO1 = "readinto1";
77+
protected static final String WRITE = "write";
78+
79+
@Override
80+
protected List<? extends NodeFactory<? extends PythonBuiltinBaseNode>> getNodeFactories() {
81+
return BufferedIOBaseBuiltinsFactory.getFactories();
82+
}
83+
84+
@Builtin(name = DETACH, minNumOfPositionalArgs = 1)
85+
@GenerateNodeFactory
86+
abstract static class DetachNode extends PythonBuiltinNode {
87+
88+
/**
89+
* implementation of cpython/Modules/_io/bufferedio.h:_io__BufferedIOBase_detach
90+
*/
91+
@Specialization
92+
Object detach(@SuppressWarnings("unused") Object self) {
93+
throw raise(IOUnsupportedOperation, DETACH);
94+
}
95+
}
96+
97+
@Builtin(name = READ, minNumOfPositionalArgs = 1)
98+
@GenerateNodeFactory
99+
abstract static class ReadNode extends PythonBuiltinNode {
100+
101+
/**
102+
* implementation of cpython/Modules/_io/bufferedio.c:bufferediobase_read
103+
*/
104+
@Specialization
105+
Object read(@SuppressWarnings("unused") Object self) {
106+
throw raise(IOUnsupportedOperation, READ);
107+
}
108+
}
109+
110+
@Builtin(name = READ1, minNumOfPositionalArgs = 1)
111+
@GenerateNodeFactory
112+
abstract static class Read1Node extends PythonBuiltinNode {
113+
114+
/**
115+
* implementation of cpython/Modules/_io/bufferedio.c:bufferediobase_read1
116+
*/
117+
@Specialization
118+
Object read1(@SuppressWarnings("unused") Object self) {
119+
throw raise(IOUnsupportedOperation, READ1);
120+
}
121+
}
122+
123+
abstract static class ReadIntoGenericNode extends PythonBinaryBuiltinNode {
124+
protected String method() {
125+
return null;
126+
}
127+
128+
/**
129+
* implementation of cpython/Modules/_io/bufferedio.c:_bufferediobase_readinto_generic
130+
*/
131+
@Specialization(limit = "2")
132+
Object readinto(VirtualFrame frame, Object self, Object buffer,
133+
@CachedLibrary(limit = "2") PythonObjectLibrary asByte,
134+
@CachedLibrary("self") PythonObjectLibrary libSelf,
135+
@Cached ConditionProfile isBuffer,
136+
@Cached ConditionProfile oversize,
137+
@Cached SequenceStorageNodes.BytesMemcpyNode memcpyNode) {
138+
int len = getBytesLength(asByte, buffer);
139+
Object data = libSelf.lookupAndCallRegularMethod(self, frame, method(), len);
140+
if (isBuffer.profile(!asByte.isBuffer(data))) {
141+
throw raise(ValueError, S_SHOULD_RETURN_BYTES, "read()");
142+
}
143+
byte[] bytes = getBytes(asByte, data);
144+
int dataLen = bytes.length;
145+
if (oversize.profile(dataLen > len)) {
146+
throw raise(ValueError, S_RETURNED_TOO_MUCH_DATA, "read()", len, dataLen);
147+
}
148+
memcpyNode.execute(frame, buffer, 0, bytes, 0, dataLen);
149+
return dataLen;
150+
}
151+
}
152+
153+
@Builtin(name = READINTO, minNumOfPositionalArgs = 2, parameterNames = {"$self", "$buffer"})
154+
@GenerateNodeFactory
155+
abstract static class ReadIntoNode extends ReadIntoGenericNode {
156+
@Override
157+
protected final String method() {
158+
return READ;
159+
}
160+
}
161+
162+
@Builtin(name = READINTO1, minNumOfPositionalArgs = 2, parameterNames = {"$self", "$buffer"})
163+
@GenerateNodeFactory
164+
abstract static class ReadInto1Node extends ReadIntoGenericNode {
165+
@Override
166+
protected final String method() {
167+
return READ1;
168+
}
169+
}
170+
171+
@Builtin(name = WRITE, minNumOfPositionalArgs = 1)
172+
@GenerateNodeFactory
173+
abstract static class WriteNode extends PythonBuiltinNode {
174+
175+
/**
176+
* implementation of cpython/Modules/_io/bufferedio.c:bufferediobase_write
177+
*/
178+
@Specialization
179+
Object write(@SuppressWarnings("unused") Object self) {
180+
throw raise(IOUnsupportedOperation, WRITE);
181+
}
182+
}
183+
}

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

Lines changed: 0 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,6 @@
4141
package com.oracle.graal.python.builtins.modules.io;
4242

4343
import java.io.ByteArrayOutputStream;
44-
import java.util.ArrayList;
4544

4645
import com.oracle.truffle.api.CompilerDirectives;
4746

@@ -103,17 +102,4 @@ protected static void append(ByteArrayOutputStream chunks, byte[] bytes, int len
103102
protected static byte[] toByteArray(ByteArrayOutputStream chunks) {
104103
return chunks.toByteArray();
105104
}
106-
107-
protected static ArrayList<Object> createList() {
108-
return new ArrayList<>();
109-
}
110-
111-
protected static void append(ArrayList<Object> list, Object v) {
112-
list.add(v);
113-
}
114-
115-
protected static Object[] asArray(ArrayList<Object> list) {
116-
return list.toArray(new Object[0]);
117-
}
118-
119105
}

0 commit comments

Comments
 (0)