Skip to content

Commit 8db5cad

Browse files
committed
[GR-10596] bin function is not available.
1 parent 6856440 commit 8db5cad

File tree

3 files changed

+77
-0
lines changed

3 files changed

+77
-0
lines changed
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
# Copyright (c) 2018, Oracle and/or its affiliates.
2+
# Copyright (C) 1996-2017 Python Software Foundation
3+
#
4+
# Licensed under the PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2
5+
6+
import unittest
7+
8+
class MyIndexable(object):
9+
def __init__(self, value):
10+
self.value = value
11+
def __index__(self):
12+
return self.value
13+
14+
class BuiltinTest(unittest.TestCase):
15+
def test_bin(self):
16+
self.assertEqual(bin(0), '0b0')
17+
self.assertEqual(bin(1), '0b1')
18+
self.assertEqual(bin(-1), '-0b1')
19+
self.assertEqual(bin(2**65), '0b1' + '0' * 65)
20+
self.assertEqual(bin(2**65-1), '0b' + '1' * 65)
21+
self.assertEqual(bin(-(2**65)), '-0b1' + '0' * 65)
22+
self.assertEqual(bin(-(2**65-1)), '-0b' + '1' * 65)
23+
24+
# test of specializations
25+
self.assertEqual(bin(MyIndexable(False)), '0b0')
26+
self.assertEqual(bin(MyIndexable(True)), '0b1')
27+
self.assertEqual(bin(MyIndexable(-(2**65))), '-0b1' + '0' * 65)

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

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import static com.oracle.graal.python.builtins.objects.PNone.NO_VALUE;
2929
import static com.oracle.graal.python.builtins.objects.PNotImplemented.NOT_IMPLEMENTED;
3030
import static com.oracle.graal.python.nodes.BuiltinNames.ABS;
31+
import static com.oracle.graal.python.nodes.BuiltinNames.BIN;
3132
import static com.oracle.graal.python.nodes.BuiltinNames.CALLABLE;
3233
import static com.oracle.graal.python.nodes.BuiltinNames.CHR;
3334
import static com.oracle.graal.python.nodes.BuiltinNames.COMPILE;
@@ -197,6 +198,54 @@ public Object absObject(Object object,
197198
return result;
198199
}
199200
}
201+
202+
// bin(object)
203+
@Builtin(name = BIN, fixedNumOfArguments = 1)
204+
@TypeSystemReference(PythonArithmeticTypes.class)
205+
@GenerateNodeFactory
206+
public abstract static class BinNode extends PythonUnaryBuiltinNode {
207+
208+
public abstract String executeObject(Object x);
209+
210+
private String buildString(boolean isNegative, String number) {
211+
StringBuilder sb = new StringBuilder();
212+
if(isNegative) {
213+
sb.append('-');
214+
}
215+
sb.append("0b");
216+
sb.append(number);
217+
return sb.toString();
218+
}
219+
220+
@Specialization
221+
public String doL(long x) {
222+
return buildString(x < 0, Long.toBinaryString(Math.abs(x)));
223+
}
224+
225+
@Specialization
226+
public String doD(double x) {
227+
throw raise(TypeError, "'%p' object cannot be interpreted as an integer", x);
228+
}
229+
230+
@Specialization
231+
@TruffleBoundary
232+
public String doPI(PInt x) {
233+
BigInteger value = x.getValue();
234+
return buildString(value.compareTo(BigInteger.ZERO) == -1, value.abs().toString(2));
235+
}
236+
237+
@Specialization
238+
public String doO(Object x,
239+
@Cached("create()") MathModuleBuiltins.ConvertToIntNode toIntNode,
240+
@Cached("create()") BinNode recursiveNode) {
241+
Object value = toIntNode.execute(x);
242+
return recursiveNode.executeObject(value);
243+
}
244+
245+
protected BinNode create() {
246+
return BuiltinFunctionsFactory.BinNodeFactory.create();
247+
}
248+
}
200249

201250
// callable(object)
202251
@Builtin(name = CALLABLE, fixedNumOfArguments = 1)

mx.graalpython/copyrights/overrides

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -233,6 +233,7 @@ graalpython/com.oracle.graal.python.test/src/tests/test_getattribute-bimorphic-i
233233
graalpython/com.oracle.graal.python.test/src/tests/test_if-class-none.py,zippy.copyright
234234
graalpython/com.oracle.graal.python.test/src/tests/test_if.py,zippy.copyright
235235
graalpython/com.oracle.graal.python.test/src/tests/test_list.py,python.copyright
236+
graalpython/com.oracle.graal.python.test/src/tests/test_builtin.py,python.copyright
236237
graalpython/com.oracle.graal.python.test/src/tests/test_mandelbrot3.py,benchmarks.copyright
237238
graalpython/com.oracle.graal.python.test/src/tests/test_math.py,python.copyright
238239
graalpython/com.oracle.graal.python.test/src/tests/test_mm2d_naive.py,zippy.copyright

0 commit comments

Comments
 (0)