Skip to content

Commit 03ad6e0

Browse files
committed
[GR-23304] Implement BufferedReader
1 parent fa91256 commit 03ad6e0

File tree

14 files changed

+2228
-13
lines changed

14 files changed

+2228
-13
lines changed

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,6 @@
6565
import com.oracle.graal.python.builtins.modules.FunctoolsModuleBuiltins;
6666
import com.oracle.graal.python.builtins.modules.GcModuleBuiltins;
6767
import com.oracle.graal.python.builtins.modules.GraalPythonModuleBuiltins;
68-
import com.oracle.graal.python.builtins.modules.IOModuleBuiltins;
6968
import com.oracle.graal.python.builtins.modules.ImpModuleBuiltins;
7069
import com.oracle.graal.python.builtins.modules.ItertoolsModuleBuiltins;
7170
import com.oracle.graal.python.builtins.modules.JArrayModuleBuiltins;
@@ -103,6 +102,8 @@
103102
import com.oracle.graal.python.builtins.modules.WeakRefModuleBuiltins;
104103
import com.oracle.graal.python.builtins.modules.ZipImportModuleBuiltins;
105104
import com.oracle.graal.python.builtins.objects.NotImplementedBuiltins;
105+
import com.oracle.graal.python.builtins.modules.io.BufferedReaderBuiltins;
106+
import com.oracle.graal.python.builtins.modules.io.IOModuleBuiltins;
106107
import com.oracle.graal.python.builtins.modules.zlib.ZLibModuleBuiltins;
107108
import com.oracle.graal.python.builtins.modules.zlib.ZlibCompressBuiltins;
108109
import com.oracle.graal.python.builtins.modules.zlib.ZlibDecompressBuiltins;
@@ -415,6 +416,7 @@ private static PythonBuiltins[] initializeBuiltins() {
415416
new ZLibModuleBuiltins(),
416417
new ZlibCompressBuiltins(),
417418
new ZlibDecompressBuiltins(),
419+
new BufferedReaderBuiltins(),
418420
new MMapModuleBuiltins(),
419421
new FcntlModuleBuiltins(),
420422
new MMapBuiltins(),

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,7 @@ public enum PythonBuiltinClassType implements TruffleObject {
140140
PStruct("Struct", "_struct"),
141141
ZlibCompress("Compress", "zlib"),
142142
ZlibDecompress("Decompress", "zlib"),
143+
PBufferedReader("BufferedReader", "_io"),
143144

144145
// Errors and exceptions:
145146

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

Lines changed: 445 additions & 0 deletions
Large diffs are not rendered by default.
Lines changed: 119 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,119 @@
1+
/*
2+
* Copyright (c) 2020, 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 java.io.ByteArrayOutputStream;
44+
import java.util.ArrayList;
45+
46+
import com.oracle.truffle.api.CompilerDirectives;
47+
48+
public class BufferedIOUtil {
49+
50+
// start of the stream (the default); offset should be zero or positive
51+
protected static final int SEEK_SET = 0;
52+
// current stream position; offset may be negative
53+
protected static final int SEEK_CUR = 1;
54+
// end of the stream; offset is usually negative
55+
protected static final int SEEK_END = 2;
56+
57+
protected static boolean isValidWriteBuffer(PBuffered self) {
58+
return (self.isWritable() && self.getWriteEnd() != -1);
59+
}
60+
61+
protected static int safeDowncast(PBuffered self) {
62+
return ((self.isReadable() && self.getReadEnd() != -1)) ? (self.getReadEnd() - self.getPos()) : 0;
63+
}
64+
65+
protected static boolean isValidReadBuffer(PBuffered self) {
66+
return self.isReadable() && self.getReadEnd() != -1;
67+
}
68+
69+
protected static int readahead(PBuffered self) {
70+
return ((self.isReadable() && isValidReadBuffer(self)) ? (self.getReadEnd() - self.getPos()) : 0);
71+
}
72+
73+
/**
74+
* implementation of cpython/Modules/_io/bufferedio.c:RAW_OFFSET
75+
*/
76+
protected static long rawOffset(PBuffered self) {
77+
return (((isValidReadBuffer(self) || isValidWriteBuffer(self)) && self.getRawPos() >= 0) ? self.getRawPos() - self.getPos() : 0);
78+
}
79+
80+
/**
81+
* implementation of cpython/Modules/_io/bufferedio.c:MINUS_LAST_BLOCK
82+
*/
83+
protected static int minusLastBlock(PBuffered self, int size) {
84+
return (self.getBufferMask() != 0 ? (size & ~self.getBufferMask()) : (self.getBufferSize() * (size / self.getBufferSize())));
85+
}
86+
87+
@CompilerDirectives.TruffleBoundary
88+
protected static ByteArrayOutputStream createStream() {
89+
return new ByteArrayOutputStream();
90+
}
91+
92+
@CompilerDirectives.TruffleBoundary
93+
protected static void append(ByteArrayOutputStream chunks, byte[] bytes, int off, int len) {
94+
chunks.write(bytes, off, len);
95+
}
96+
97+
@CompilerDirectives.TruffleBoundary
98+
protected static void append(ByteArrayOutputStream chunks, byte[] bytes, int len) {
99+
append(chunks, bytes, 0, len);
100+
}
101+
102+
@CompilerDirectives.TruffleBoundary
103+
protected static byte[] toByteArray(ByteArrayOutputStream chunks) {
104+
return chunks.toByteArray();
105+
}
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+
119+
}

0 commit comments

Comments
 (0)