Skip to content

Commit c18ee8c

Browse files
committed
Implement array.append/fromfile/frombytes.
1 parent 6b9962d commit c18ee8c

File tree

3 files changed

+90
-0
lines changed

3 files changed

+90
-0
lines changed

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -201,6 +201,7 @@ private static final String[] initializeCoreFiles() {
201201
"str",
202202
"type",
203203
"_imp",
204+
"array",
204205
"_thread",
205206
"function",
206207
"_functools",

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/array/ArrayBuiltins.java

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,8 +49,11 @@
4949
import com.oracle.graal.python.builtins.PythonBuiltinClassType;
5050
import com.oracle.graal.python.builtins.PythonBuiltins;
5151
import com.oracle.graal.python.builtins.objects.PNone;
52+
import com.oracle.graal.python.builtins.objects.array.ArrayBuiltinsFactory.ArrayNoGeneralizationNodeGen;
5253
import com.oracle.graal.python.builtins.objects.common.IndexNodes.NormalizeIndexNode;
5354
import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodes;
55+
import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodes.GenNodeSupplier;
56+
import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodes.GeneralizationNode;
5457
import com.oracle.graal.python.nodes.SpecialMethodNames;
5558
import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode;
5659
import com.oracle.graal.python.nodes.function.PythonBuiltinNode;
@@ -68,6 +71,7 @@
6871
import com.oracle.truffle.api.dsl.Cached;
6972
import com.oracle.truffle.api.dsl.Fallback;
7073
import com.oracle.truffle.api.dsl.GenerateNodeFactory;
74+
import com.oracle.truffle.api.dsl.GenerateUncached;
7175
import com.oracle.truffle.api.dsl.NodeFactory;
7276
import com.oracle.truffle.api.dsl.Specialization;
7377
import com.oracle.truffle.api.frame.VirtualFrame;
@@ -298,4 +302,40 @@ public int len(PArray self) {
298302
return self.len();
299303
}
300304
}
305+
306+
/**
307+
* Does not allow any generalization but compatible types.
308+
*/
309+
@GenerateUncached
310+
public abstract static class ArrayNoGeneralizationNode extends SequenceStorageNodes.NoGeneralizationNode {
311+
312+
public static final GenNodeSupplier SUPPLIER = new GenNodeSupplier() {
313+
314+
public GeneralizationNode create() {
315+
return ArrayNoGeneralizationNodeGen.create();
316+
}
317+
318+
public GeneralizationNode getUncached() {
319+
return ArrayNoGeneralizationNodeGen.getUncached();
320+
}
321+
};
322+
323+
@Override
324+
protected String getErrorMessage() {
325+
return "signed short integer is greater than maximum";
326+
}
327+
}
328+
329+
// bytearray.append(x)
330+
@Builtin(name = "append", minNumOfPositionalArgs = 2)
331+
@GenerateNodeFactory
332+
public abstract static class ArrayAppendNode extends PythonBinaryBuiltinNode {
333+
@Specialization
334+
PArray append(PArray array, Object arg,
335+
@Cached SequenceStorageNodes.AppendNode appendNode) {
336+
appendNode.execute(array.getSequenceStorage(), arg, ArrayNoGeneralizationNode.SUPPLIER);
337+
return array;
338+
}
339+
}
340+
301341
}

graalpython/lib-graalpython/array.py

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
# Copyright (c) 2019, Oracle and/or its affiliates. All rights reserved.
2+
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
3+
#
4+
# The Universal Permissive License (UPL), Version 1.0
5+
#
6+
# Subject to the condition set forth below, permission is hereby granted to any
7+
# person obtaining a copy of this software, associated documentation and/or
8+
# data (collectively the "Software"), free of charge and under any and all
9+
# copyright rights in the Software, and any and all patent rights owned or
10+
# freely licensable by each licensor hereunder covering either (i) the
11+
# unmodified Software as contributed to or provided by such licensor, or (ii)
12+
# the Larger Works (as defined below), to deal in both
13+
#
14+
# (a) the Software, and
15+
#
16+
# (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if
17+
# one is included with the Software each a "Larger Work" to which the Software
18+
# is contributed by such licensors),
19+
#
20+
# without restriction, including without limitation the rights to copy, create
21+
# derivative works of, display, perform, and distribute the Software and make,
22+
# use, sell, offer for sale, import, export, have made, and have sold the
23+
# Software and the Larger Work(s), and to sublicense the foregoing rights on
24+
# either these or other terms.
25+
#
26+
# This license is subject to the following condition:
27+
#
28+
# The above copyright notice and either this complete permission notice or at a
29+
# minimum a reference to the UPL must be included in all copies or substantial
30+
# portions of the Software.
31+
#
32+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
33+
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
34+
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
35+
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
36+
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
37+
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
38+
# SOFTWARE.
39+
40+
def frombytes(self, bytesLike):
41+
for b in bytesLike:
42+
self.append(b)
43+
44+
45+
def fromfile(self, f, n):
46+
self.frombytes(f.read(n))
47+
48+
array.frombytes = frombytes
49+
array.fromfile = fromfile

0 commit comments

Comments
 (0)