Skip to content

Commit 45bdf2e

Browse files
committed
Merge remote-tracking branch 'origin/master' into tim/GR-9957/dynamic-cast
2 parents 8b8209e + ef9f41c commit 45bdf2e

File tree

137 files changed

+1574
-1572
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

137 files changed

+1574
-1572
lines changed

graalpython/com.oracle.graal.python.test/src/com/oracle/graal/python/test/PythonTests.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -169,7 +169,7 @@ public static void assertPrints(String expected, String code) {
169169
String source = code;
170170
PythonTests.runScript(new String[0], source, printStream, System.err);
171171
String result = byteArray.toString().replaceAll("\r\n", "\n");
172-
assertEquals(expected, result);
172+
assertEquals(expected.replaceAll(" at 0x[0-9a-f]*>", " at 0xabcd>"), result.replaceAll(" at 0x[0-9a-f]*>", " at 0xabcd>"));
173173
}
174174

175175
public static VirtualFrame createVirtualFrame() {

graalpython/com.oracle.graal.python.test/src/tests/test_math.py

Lines changed: 110 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -290,6 +290,66 @@ def testLog(self):
290290
math.log(10, MyFloat())
291291
self.assertRaises(ValueError, math.log, 0)
292292

293+
def testLog1p(self):
294+
self.assertRaises(TypeError, math.log1p)
295+
for n in [2, 2**90, 2**300]:
296+
self.assertAlmostEqual(math.log1p(n), math.log1p(float(n)))
297+
self.assertRaises(ValueError, math.log1p, -1)
298+
self.assertEqual(math.log1p(INF), INF)
299+
300+
# test of specializations
301+
self.ftest('log1p(MyFloat())', math.log1p(MyFloat()), 0.4700036292457356)
302+
self.assertRaises(TypeError, math.log1p, 'ahoj')
303+
self.ftest('log1p(BIG_INT)', math.log1p(BIG_INT), 71.38013712610532)
304+
305+
#@requires_IEEE_754
306+
def testLog2(self):
307+
self.assertRaises(TypeError, math.log2)
308+
309+
# Check some integer values
310+
self.assertEqual(math.log2(1), 0.0)
311+
self.assertEqual(math.log2(2), 1.0)
312+
self.assertEqual(math.log2(4), 2.0)
313+
314+
# Large integer values
315+
self.assertEqual(math.log2(2**1023), 1023.0)
316+
self.assertEqual(math.log2(2**1024), 1024.0)
317+
self.assertEqual(math.log2(2**2000), 2000.0)
318+
319+
self.assertRaises(ValueError, math.log2, -1.5)
320+
self.assertRaises(ValueError, math.log2, NINF)
321+
self.assertTrue(math.isnan(math.log2(NAN)))
322+
323+
# test of specializations
324+
self.ftest('log2(MyFloat())', math.log2(MyFloat()), -0.7369655941662062)
325+
self.assertRaises(TypeError, math.log2, 'ahoj')
326+
self.ftest('log2(BIG_INT)', math.log2(BIG_INT), 102.97976984980635)
327+
328+
def testLog2Exact(self):
329+
# Check that we get exact equality for log2 of powers of 2.
330+
actual = [math.log2(math.ldexp(1.0, n)) for n in range(-1074, 1024)]
331+
expected = [float(n) for n in range(-1074, 1024)]
332+
self.assertEqual(actual, expected)
333+
334+
def testLog10(self):
335+
self.assertRaises(TypeError, math.log10)
336+
self.ftest('log10(0.1)', math.log10(0.1), -1)
337+
self.ftest('log10(1)', math.log10(1), 0)
338+
self.ftest('log10(10)', math.log10(10), 1)
339+
self.ftest('log10(10**1000)', math.log10(10**1000), 1000.0)
340+
self.assertRaises(ValueError, math.log10, -1.5)
341+
self.assertRaises(ValueError, math.log10, -10**1000)
342+
self.assertRaises(ValueError, math.log10, NINF)
343+
self.assertEqual(math.log(INF), INF)
344+
self.assertTrue(math.isnan(math.log10(NAN)))
345+
346+
# test of specializations
347+
# TODO uncomment when GR-10346 will be fixed
348+
#self.ftest('log10(MyFloat())', math.log10(MyFloat()), -0.22184874961635637)
349+
self.assertRaises(TypeError, math.log10, 'ahoj')
350+
# TODO uncomment when GR-10346 will be fixed
351+
#self.ftest('log10(BIG_INT)', math.log10(BIG_INT), 30.999999671364986)
352+
293353
def testIsfinite(self):
294354
self.assertTrue(math.isfinite(0.0))
295355
self.assertTrue(math.isfinite(-0.0))
@@ -384,6 +444,19 @@ def __ceil__(self):
384444
self.assertEqual(math.ceil(O()), 'cau')
385445
self.assertEqual(math.ceil(999.1), 1000)
386446

447+
self.assertEqual(math.ceil(MyFloat()),1)
448+
449+
class F1():
450+
def __float__(self):
451+
return 1.1
452+
def __ceil__(self):
453+
return 44
454+
self.assertEqual(math.ceil(F1()), 44)
455+
456+
class F2():
457+
def __float__(self):
458+
return 1.1
459+
self.assertEqual(math.ceil(F2()), 2)
387460

388461
def test_basic_copysign(self):
389462
self.assertEqual(math.copysign(3, -0), 3.0)
@@ -952,6 +1025,36 @@ def test_fmod(self):
9521025
self.assertEqual(math.fmod(2432902008176640000999, 12.12), 10.396369527944033)
9531026
self.assertEqual(math.fmod(-1e-100, 1e100), -1e-100)
9541027

1028+
def testExp(self):
1029+
self.assertRaises(TypeError, math.exp)
1030+
self.ftest('exp(-1)', math.exp(-1), 1/math.e)
1031+
self.ftest('exp(0)', math.exp(0), 1)
1032+
self.ftest('exp(1)', math.exp(1), math.e)
1033+
self.assertEqual(math.exp(INF), INF)
1034+
self.assertEqual(math.exp(NINF), 0.)
1035+
self.assertTrue(math.isnan(math.exp(NAN)))
1036+
self.assertRaises(OverflowError, math.exp, 1000000)
1037+
1038+
# test of specializations
1039+
self.ftest('exp(MyFloat())', math.exp(MyFloat()), 1.8221188003905089)
1040+
self.assertRaises(TypeError, math.exp, 'ahoj')
1041+
self.assertRaises(OverflowError, math.exp, BIG_INT)
1042+
1043+
def testExpm1(self):
1044+
self.assertRaises(TypeError, math.exp)
1045+
self.ftest('expm1(-1)', math.expm1(-1), 1/math.e-1)
1046+
self.ftest('expm1(0)', math.expm1(0), 0)
1047+
self.ftest('expm1(1)', math.expm1(1), math.e-1)
1048+
self.assertEqual(math.expm1(INF), INF)
1049+
self.assertEqual(math.expm1(NINF), -1.)
1050+
self.assertTrue(math.isnan(math.expm1(NAN)))
1051+
self.assertRaises(OverflowError, math.expm1, 1000000)
1052+
1053+
# test of specializations
1054+
self.ftest('expm1(MyFloat())', math.expm1(MyFloat()), 0.8221188003905089)
1055+
self.assertRaises(TypeError, math.expm1, 'ahoj')
1056+
self.assertRaises(OverflowError, math.expm1, BIG_INT)
1057+
9551058
def test_frexp(self):
9561059
self.assertRaises(TypeError, math.frexp)
9571060

@@ -970,6 +1073,11 @@ def testfrexp(name, result, expected):
9701073
self.assertEqual(math.frexp(NINF)[0], NINF)
9711074
self.assertTrue(math.isnan(math.frexp(NAN)[0]))
9721075

1076+
# test of specializations
1077+
testfrexp('frexp(MyFloat())', math.frexp(MyFloat()), (0.6, 0))
1078+
self.assertRaises(TypeError, math.log1p, 'ahoj')
1079+
testfrexp('log1p(BIG_INT)', math.frexp(BIG_INT), (0.9860753853527933, 103))
1080+
9731081
testfrexp('frexp(True)', math.frexp(True), (0.5, 1))
9741082
testfrexp('frexp(False)', math.frexp(False), (0.0, 0))
9751083
testfrexp('frexp(6227020800)', math.frexp(6227020800), (0.7249206304550171, 33))
@@ -986,6 +1094,8 @@ def getY():
9861094

9871095
testfrexp('frexp(X(10))', math.frexp(X(10)), (0.625, 4))
9881096
testfrexp('frexp(Y(11.11))', math.frexp(Y(11.11)), (0.694375, 4))
1097+
testfrexp('frexp(2**1023)', math.frexp(2**1023), (0.5, 1024))
1098+
self.assertRaises(OverflowError, math.frexp, 2**1024)
9891099

9901100
def test_ldexp(self):
9911101
self.assertRaises(TypeError, math.ldexp)

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@
2727

2828
import java.util.HashMap;
2929

30+
import com.oracle.truffle.api.CompilerAsserts;
31+
3032
public enum PythonBuiltinClassType {
3133

3234
TruffleObject(com.oracle.truffle.api.interop.TruffleObject.class, "truffle_object"),
@@ -109,6 +111,7 @@ public enum PythonBuiltinClassType {
109111

110112
@Override
111113
public String toString() {
114+
CompilerAsserts.neverPartOfCompilation();
112115
return shortName;
113116
}
114117

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

Lines changed: 10 additions & 76 deletions
Original file line numberDiff line numberDiff line change
@@ -30,30 +30,20 @@
3030

3131
import java.util.AbstractMap;
3232
import java.util.AbstractMap.SimpleEntry;
33-
import java.util.ArrayList;
3433
import java.util.Arrays;
3534
import java.util.Collections;
3635
import java.util.HashMap;
3736
import java.util.List;
3837
import java.util.Map;
3938
import java.util.Map.Entry;
40-
import java.util.function.Consumer;
41-
import java.util.function.Function;
39+
import java.util.function.BiConsumer;
4240

43-
import com.oracle.graal.python.PythonLanguage;
44-
import com.oracle.graal.python.builtins.objects.PNone;
4541
import com.oracle.graal.python.builtins.objects.function.Arity;
4642
import com.oracle.graal.python.builtins.objects.function.PBuiltinFunction;
4743
import com.oracle.graal.python.builtins.objects.object.PythonObject;
4844
import com.oracle.graal.python.builtins.objects.type.PythonBuiltinClass;
49-
import com.oracle.graal.python.nodes.PNode;
50-
import com.oracle.graal.python.nodes.argument.ReadDefaultArgumentNode;
51-
import com.oracle.graal.python.nodes.argument.ReadIndexedArgumentNode;
52-
import com.oracle.graal.python.nodes.argument.ReadKeywordNode;
53-
import com.oracle.graal.python.nodes.argument.ReadVarArgsNode;
54-
import com.oracle.graal.python.nodes.argument.ReadVarKeywordsNode;
5545
import com.oracle.graal.python.nodes.function.BuiltinFunctionRootNode;
56-
import com.oracle.graal.python.nodes.function.PythonBuiltinNode;
46+
import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode;
5747
import com.oracle.graal.python.runtime.PythonCore;
5848
import com.oracle.truffle.api.RootCallTarget;
5949
import com.oracle.truffle.api.Truffle;
@@ -64,14 +54,14 @@ public abstract class PythonBuiltins {
6454
private final Map<String, PBuiltinFunction> builtinFunctions = new HashMap<>();
6555
private final Map<PythonBuiltinClass, Map.Entry<Class<?>[], Boolean>> builtinClasses = new HashMap<>();
6656

67-
protected abstract List<? extends NodeFactory<? extends PythonBuiltinNode>> getNodeFactories();
57+
protected abstract List<? extends NodeFactory<? extends PythonBuiltinBaseNode>> getNodeFactories();
6858

6959
public void initialize(PythonCore core) {
7060
if (builtinFunctions.size() > 0) {
7161
return;
7262
}
73-
initializeEachFactoryWith(factory -> builtin -> {
74-
RootCallTarget callTarget = createBuiltinCallTarget(core.getLanguage(), factory, builtin.name(), createArgumentsList(builtin));
63+
initializeEachFactoryWith((factory, builtin) -> {
64+
RootCallTarget callTarget = Truffle.getRuntime().createCallTarget(new BuiltinFunctionRootNode(core.getLanguage(), builtin, factory));
7565
String name = builtin.name();
7666
if (builtin.constructsClass().length > 0) {
7767
name = __NEW__;
@@ -104,7 +94,7 @@ public void initialize(PythonCore core) {
10494

10595
public final void initializeClasses(PythonCore core) {
10696
assert builtinClasses.isEmpty();
107-
initializeEachFactoryWith(factory -> builtin -> {
97+
initializeEachFactoryWith((factory, builtin) -> {
10898
if (builtin.constructsClass().length > 0) {
10999
createBuiltinClassFor(core, builtin);
110100
}
@@ -147,24 +137,15 @@ private PythonBuiltinClass createBuiltinClassFor(PythonCore core, Builtin builti
147137
return builtinClass;
148138
}
149139

150-
private void initializeEachFactoryWith(Function<NodeFactory<PythonBuiltinNode>, Consumer<Builtin>> func) {
151-
@SuppressWarnings("unchecked")
152-
List<NodeFactory<PythonBuiltinNode>> factories = (List<NodeFactory<PythonBuiltinNode>>) getNodeFactories();
140+
private void initializeEachFactoryWith(BiConsumer<NodeFactory<? extends PythonBuiltinBaseNode>, Builtin> func) {
141+
List<? extends NodeFactory<? extends PythonBuiltinBaseNode>> factories = getNodeFactories();
153142
assert factories != null : "No factories found. Override getFactories() to resolve this.";
154-
for (NodeFactory<PythonBuiltinNode> factory : factories) {
143+
for (NodeFactory<? extends PythonBuiltinBaseNode> factory : factories) {
155144
Builtin builtin = factory.getNodeClass().getAnnotation(Builtin.class);
156-
func.apply(factory).accept(builtin);
145+
func.accept(factory, builtin);
157146
}
158147
}
159148

160-
private static RootCallTarget createBuiltinCallTarget(PythonLanguage language, NodeFactory<PythonBuiltinNode> factory, String name, PNode[] argsKeywords) {
161-
PythonBuiltinNode builtinNode = factory.createNode((Object) argsKeywords);
162-
language.getNodeFactory().registerNodeFactory(builtinNode, factory);
163-
BuiltinFunctionRootNode rootNode = new BuiltinFunctionRootNode(language, name, builtinNode);
164-
RootCallTarget callTarget = Truffle.getRuntime().createCallTarget(rootNode);
165-
return callTarget;
166-
}
167-
168149
private static Arity createArity(Builtin builtin) {
169150
int minNum = builtin.minNumOfArguments();
170151
int maxNum = Math.max(minNum, builtin.maxNumOfArguments());
@@ -178,53 +159,6 @@ private static Arity createArity(Builtin builtin) {
178159
Arrays.asList(new String[0]), Arrays.asList(builtin.keywordArguments()));
179160
}
180161

181-
private static PNode[] createArgumentsList(Builtin builtin) {
182-
ArrayList<PNode> args = new ArrayList<>();
183-
int numOfPositionalArgs = Math.max(builtin.minNumOfArguments(), builtin.maxNumOfArguments());
184-
185-
if (builtin.keywordArguments().length > 0 && builtin.maxNumOfArguments() > builtin.minNumOfArguments()) {
186-
// (tfel): This is actually a specification error, if there are keyword
187-
// names, we cannot also have optional positional arguments, but we're
188-
// being defensive here.
189-
numOfPositionalArgs = builtin.minNumOfArguments();
190-
}
191-
192-
if (builtin.fixedNumOfArguments() > 0) {
193-
numOfPositionalArgs = builtin.fixedNumOfArguments();
194-
}
195-
196-
// read those arguments that only come positionally
197-
for (int i = 0; i < numOfPositionalArgs; i++) {
198-
args.add(ReadIndexedArgumentNode.create(i));
199-
}
200-
201-
// read splat args if any
202-
if (builtin.takesVariableArguments()) {
203-
args.add(ReadVarArgsNode.create(args.size(), true));
204-
}
205-
206-
// read named keyword arguments
207-
for (int i = 0; i < builtin.keywordArguments().length; i++) {
208-
String name = builtin.keywordArguments()[i];
209-
ReadDefaultArgumentNode defaultNode = new ReadDefaultArgumentNode();
210-
defaultNode.setValue(PNone.NO_VALUE);
211-
if (!builtin.takesVariableArguments()) {
212-
// if there's no splat, we also accept the keywords positionally
213-
args.add(ReadKeywordNode.create(name, i + numOfPositionalArgs, defaultNode));
214-
} else {
215-
// if there is a splat, keywords have to be passed by name
216-
args.add(ReadKeywordNode.create(name, defaultNode));
217-
}
218-
}
219-
220-
if (builtin.takesVariableKeywords()) {
221-
args.add(ReadVarKeywordsNode.create(builtin.keywordArguments()));
222-
}
223-
224-
PNode[] argsKeywords = args.toArray(new PNode[args.size()]);
225-
return argsKeywords;
226-
}
227-
228162
private void setBuiltinFunction(String name, PBuiltinFunction function) {
229163
builtinFunctions.put(name, function);
230164
}

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
import com.oracle.graal.python.builtins.objects.type.PythonClass;
3939
import com.oracle.graal.python.nodes.control.GetIteratorNode;
4040
import com.oracle.graal.python.nodes.control.GetNextNode;
41+
import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode;
4142
import com.oracle.graal.python.nodes.function.PythonBuiltinNode;
4243
import com.oracle.graal.python.runtime.exception.PException;
4344
import com.oracle.graal.python.runtime.sequence.PSequence;
@@ -54,7 +55,7 @@
5455
public final class ArrayModuleBuiltins extends PythonBuiltins {
5556

5657
@Override
57-
protected List<? extends NodeFactory<? extends PythonBuiltinNode>> getNodeFactories() {
58+
protected List<? extends NodeFactory<? extends PythonBuiltinBaseNode>> getNodeFactories() {
5859
return ArrayModuleBuiltinsFactory.getFactories();
5960
}
6061

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

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -38,18 +38,18 @@
3838
*/
3939
package com.oracle.graal.python.builtins.modules;
4040

41+
import java.util.ArrayList;
42+
import java.util.List;
43+
4144
import com.oracle.graal.python.builtins.CoreFunctions;
4245
import com.oracle.graal.python.builtins.PythonBuiltins;
43-
import com.oracle.graal.python.nodes.function.PythonBuiltinNode;
46+
import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode;
4447
import com.oracle.truffle.api.dsl.NodeFactory;
4548

46-
import java.util.ArrayList;
47-
import java.util.List;
48-
4949
@CoreFunctions(defineModule = "_ast")
5050
public class AstModuleBuiltins extends PythonBuiltins {
5151
@Override
52-
protected List<? extends NodeFactory<? extends PythonBuiltinNode>> getNodeFactories() {
52+
protected List<? extends NodeFactory<? extends PythonBuiltinBaseNode>> getNodeFactories() {
5353
return new ArrayList<>();
5454
}
5555
}

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@
4646
import com.oracle.graal.python.builtins.objects.PNone;
4747
import com.oracle.graal.python.builtins.objects.function.PKeyword;
4848
import com.oracle.graal.python.nodes.call.CallNode;
49-
import com.oracle.graal.python.nodes.function.PythonBuiltinNode;
49+
import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode;
5050
import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode;
5151
import com.oracle.graal.python.nodes.function.builtins.PythonVarargsBuiltinNode;
5252
import com.oracle.truffle.api.Truffle;
@@ -60,7 +60,7 @@
6060
@CoreFunctions(defineModule = "atexit")
6161
public class AtexitModuleBuiltins extends PythonBuiltins {
6262
@Override
63-
protected List<? extends NodeFactory<? extends PythonBuiltinNode>> getNodeFactories() {
63+
protected List<? extends NodeFactory<? extends PythonBuiltinBaseNode>> getNodeFactories() {
6464
return AtexitModuleBuiltinsFactory.getFactories();
6565
}
6666

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
import com.oracle.graal.python.builtins.PythonBuiltins;
3232
import com.oracle.graal.python.builtins.objects.PNone;
3333
import com.oracle.graal.python.builtins.objects.list.PList;
34+
import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode;
3435
import com.oracle.graal.python.nodes.function.PythonBuiltinNode;
3536
import com.oracle.graal.python.runtime.sequence.PSequence;
3637
import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
@@ -41,7 +42,7 @@
4142
final class BisectModuleBuiltins extends PythonBuiltins {
4243

4344
@Override
44-
protected List<? extends NodeFactory<? extends PythonBuiltinNode>> getNodeFactories() {
45+
protected List<? extends NodeFactory<? extends PythonBuiltinBaseNode>> getNodeFactories() {
4546
return BisectModuleBuiltinsFactory.getFactories();
4647
}
4748

0 commit comments

Comments
 (0)