Skip to content

Commit 4cbe08a

Browse files
committed
Add base io classes builtins
1 parent cab80fa commit 4cbe08a

File tree

17 files changed

+897
-384
lines changed

17 files changed

+897
-384
lines changed

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

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -102,13 +102,15 @@
102102
import com.oracle.graal.python.builtins.modules.WarningsModuleBuiltins;
103103
import com.oracle.graal.python.builtins.modules.WeakRefModuleBuiltins;
104104
import com.oracle.graal.python.builtins.modules.ZipImportModuleBuiltins;
105-
import com.oracle.graal.python.builtins.modules.io.IOBaseBuiltins;
106-
import com.oracle.graal.python.builtins.objects.NotImplementedBuiltins;
107105
import com.oracle.graal.python.builtins.modules.bz2.BZ2CompressorBuiltins;
108106
import com.oracle.graal.python.builtins.modules.bz2.BZ2DecompressorBuiltins;
109107
import com.oracle.graal.python.builtins.modules.bz2.BZ2ModuleBuiltins;
108+
import com.oracle.graal.python.builtins.modules.io.BufferedIOBaseBuiltins;
110109
import com.oracle.graal.python.builtins.modules.io.BufferedReaderBuiltins;
110+
import com.oracle.graal.python.builtins.modules.io.IOBaseBuiltins;
111111
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;
112114
import com.oracle.graal.python.builtins.modules.zlib.ZLibModuleBuiltins;
113115
import com.oracle.graal.python.builtins.modules.zlib.ZlibCompressBuiltins;
114116
import com.oracle.graal.python.builtins.modules.zlib.ZlibDecompressBuiltins;
@@ -381,7 +383,15 @@ private static PythonBuiltins[] initializeBuiltins(boolean nativeAccessAllowed)
381383
new PythonCextBuiltins(),
382384
new WeakRefModuleBuiltins(),
383385
new ReferenceTypeBuiltins(),
386+
387+
// io
384388
new IOModuleBuiltins(),
389+
new IOBaseBuiltins(),
390+
new BufferedIOBaseBuiltins(),
391+
new RawIOBaseBuiltins(),
392+
new TextIOBaseBuiltins(),
393+
new BufferedReaderBuiltins(),
394+
385395
new StringModuleBuiltins(),
386396
new ItertoolsModuleBuiltins(),
387397
new FunctoolsModuleBuiltins(),
@@ -417,11 +427,12 @@ private static PythonBuiltins[] initializeBuiltins(boolean nativeAccessAllowed)
417427
new OperatorModuleBuiltins(),
418428
new ZipImporterBuiltins(),
419429
new ZipImportModuleBuiltins(),
430+
431+
// zlib
420432
new ZLibModuleBuiltins(),
421433
new ZlibCompressBuiltins(),
422434
new ZlibDecompressBuiltins(),
423-
new IOBaseBuiltins(),
424-
new BufferedReaderBuiltins(),
435+
425436
new MMapModuleBuiltins(),
426437
new FcntlModuleBuiltins(),
427438
new MMapBuiltins(),
@@ -433,9 +444,12 @@ private static PythonBuiltins[] initializeBuiltins(boolean nativeAccessAllowed)
433444
new PwdModuleBuiltins(),
434445
new ResourceModuleBuiltins(),
435446
new ContextvarsModuleBuiltins(),
447+
448+
// lzma
436449
new LZMAModuleBuiltins(),
437450
new LZMACompressorBuiltins(),
438451
new LZMADecompressorBuiltins(),
452+
439453
new MultiprocessingModuleBuiltins(),
440454
new SemLockBuiltins(),
441455
new WarningsModuleBuiltins(),

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

Lines changed: 32 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -134,18 +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"),
146-
// TODO rename to _IOBase and remove its definition from _io.py once readline() and readlines() are implemetned
147-
PIOBase("_IO_Base", true, "_io", true, true),
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),
148158
PBufferedReader("BufferedReader", "_io"),
159+
PBufferedWriter("BufferedWriter", "_io"),
160+
PBufferedRWPair("BufferedRWPair", "_io"),
161+
PBufferedRandom("BufferedRandom", "_io"),
162+
149163
PStatResult("stat_result", "os", false),
150164
PTerminalSize("terminal_size", "os", false),
151165
PUnameResult("uname_result", "posix", false),
@@ -231,6 +245,8 @@ public enum PythonBuiltinClassType implements TruffleObject {
231245
UnicodeTranslateError("UnicodeTranslateError", BuiltinNames.BUILTINS),
232246
RecursionError("RecursionError", BuiltinNames.BUILTINS),
233247

248+
IOUnsupportedOperation("UnsupportedOperation", "_io"),
249+
234250
// warnings
235251
Warning("Warning", BuiltinNames.BUILTINS),
236252
BytesWarning("BytesWarning", BuiltinNames.BUILTINS),
@@ -431,6 +447,18 @@ public final Shape getInstanceShape(PythonLanguage lang) {
431447
PHashInfo.base = PTuple;
432448
PThreadInfo.base = PTuple;
433449
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;
434462
}
435463

436464
/* 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)