Skip to content

Commit 285108a

Browse files
committed
Fix semantics of foreign mult: scalar vectors are treated as numbers.
1 parent 269a7a9 commit 285108a

File tree

2 files changed

+15
-19
lines changed

2 files changed

+15
-19
lines changed

graalpython/com.oracle.graal.python.tck/src/com/oracle/graal/python/tck/PythonProvider.java

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -360,11 +360,15 @@ public void accept(SnippetRun snippetRun) throws PolyglotException {
360360
} else {
361361
throw snippetRun.getException();
362362
}
363-
} else {
363+
} else if (!(isNumber(par0) && isScalarVector(par1) || isScalarVector(par0) && isNumber(par1))) {
364364
ResultVerifier.getDefaultResultVerifier().accept(snippetRun);
365365
}
366366
}
367367

368+
protected static boolean isScalarVector(Value val) {
369+
return isNumber(val) && val.hasArrayElements() && val.getArraySize() == 1 && !isMapping(val);
370+
}
371+
368372
protected static boolean isNumber(Value par0) {
369373
return par0.isNumber() || par0.isBoolean();
370374
}
@@ -374,7 +378,7 @@ protected static boolean isNegativeNumber(Value par0) {
374378
}
375379

376380
protected static boolean isSequence(Value par0) {
377-
return par0.isString() || (par0.hasArrayElements() && !isMapping(par0));
381+
return !isNumber(par0) && (par0.isString() || (par0.hasArrayElements() && !isMapping(par0)));
378382
}
379383

380384
protected static boolean isMapping(Value par0) {
@@ -390,7 +394,7 @@ private static boolean hasMemoryError(SnippetRun snippetRun) {
390394
}
391395

392396
private static boolean isInteger(Value par0) {
393-
return (par0.isNumber() && par0.fitsInInt() || par0.isBoolean()) && !isSequence(par0);
397+
return (par0.isNumber() && par0.fitsInInt() || par0.isBoolean());
394398
}
395399

396400
private static final PSequenceMultiplicationVerifier INSTANCE = new PSequenceMultiplicationVerifier();

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/foreign/TruffleObjectBuiltins.java

Lines changed: 8 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -270,7 +270,7 @@ abstract static class MulNode extends UnboxNode {
270270

271271
public abstract Object executeWith(Object left, Object right);
272272

273-
@Specialization(guards = {"isBoxed(left)", "!isForeignArray(left)", "!isForeignObject(right)"})
273+
@Specialization(guards = {"isBoxed(left)", "!isForeignObject(right)"})
274274
Object doForeignBoxed(TruffleObject left, Object right) {
275275
try {
276276
return mulNode.executeObject(unboxLeft(left), right);
@@ -279,7 +279,7 @@ Object doForeignBoxed(TruffleObject left, Object right) {
279279
}
280280
}
281281

282-
@Specialization(guards = {"isBoxed(left)", "!isForeignArray(left)", "isBoxed(right)", "!isForeignArray(right)"})
282+
@Specialization(guards = {"isBoxed(left)", "isBoxed(right)"})
283283
Object doForeignBoxed(TruffleObject left, TruffleObject right) {
284284
try {
285285
return getRecursiveNode().executeWith(left, unboxRight(right));
@@ -289,7 +289,7 @@ Object doForeignBoxed(TruffleObject left, TruffleObject right) {
289289
return PNotImplemented.NOT_IMPLEMENTED;
290290
}
291291

292-
@Specialization(guards = {"isForeignArray(left)", "isPositive(right)"})
292+
@Specialization(guards = {"isForeignArray(left)", "!isBoxed(left)", "right > 0"})
293293
Object doForeignArray(TruffleObject left, int right,
294294
@Cached("READ.createNode()") Node readNode,
295295
@Cached("GET_SIZE.createNode()") Node sizeNode) {
@@ -312,7 +312,7 @@ Object doForeignArray(TruffleObject left, int right,
312312
}
313313
}
314314

315-
@Specialization(guards = {"isForeignArray(left)", "isBoxed(right)", "!isForeignArray(right)"})
315+
@Specialization(guards = {"isForeignArray(left)", "!isBoxed(left)", "isBoxed(right)"})
316316
Object doForeignArray(TruffleObject left, TruffleObject right,
317317
@Cached("READ.createNode()") Node readNode,
318318
@Cached("GET_SIZE.createNode()") Node sizeNode) {
@@ -331,7 +331,7 @@ Object doForeignArray(TruffleObject left, TruffleObject right,
331331
return PNotImplemented.NOT_IMPLEMENTED;
332332
}
333333

334-
@Specialization(guards = {"isForeignArray(left)", "right"})
334+
@Specialization(guards = {"isForeignArray(left)", "!isBoxed(left)", "right"})
335335
Object doForeignArray(TruffleObject left, @SuppressWarnings("unused") boolean right,
336336
@Cached("READ.createNode()") Node readNode,
337337
@Cached("GET_SIZE.createNode()") Node sizeNode) {
@@ -343,19 +343,19 @@ Object doForeignArray(TruffleObject left, @SuppressWarnings("unused") boolean ri
343343
}
344344

345345
@SuppressWarnings("unused")
346-
@Specialization(guards = {"isForeignArray(left)", "!right"})
346+
@Specialization(guards = {"isForeignArray(left)", "!isBoxed(left)", "!right"})
347347
Object doForeignArrayEmpty(TruffleObject left, boolean right) {
348348
return factory().createList();
349349
}
350350

351351
@SuppressWarnings("unused")
352-
@Specialization(guards = {"isForeignArray(left)", "right <= 0"})
352+
@Specialization(guards = {"isForeignArray(left)", "!isBoxed(left)", "right <= 0"})
353353
Object doForeignArrayEmpty(TruffleObject left, int right) {
354354
return factory().createList();
355355
}
356356

357357
@SuppressWarnings("unused")
358-
@Specialization(guards = {"isForeignArray(left)", "right <= 0"})
358+
@Specialization(guards = {"isForeignArray(left)", "!isBoxed(left)", "right <= 0"})
359359
Object doForeignArrayEmpty(TruffleObject left, long right) {
360360
return factory().createList();
361361
}
@@ -366,10 +366,6 @@ PNotImplemented doGeneric(Object left, Object right) {
366366
return PNotImplemented.NOT_IMPLEMENTED;
367367
}
368368

369-
protected boolean isPositive(int right) {
370-
return right > 0;
371-
}
372-
373369
private MulNode getRecursiveNode() {
374370
if (recursive == null) {
375371
CompilerDirectives.transferToInterpreterAndInvalidate();
@@ -592,10 +588,6 @@ Object doForeignBoxed(TruffleObject left, TruffleObject right) {
592588
PNotImplemented doGeneric(Object left, Object right) {
593589
return PNotImplemented.NOT_IMPLEMENTED;
594590
}
595-
596-
protected boolean isPositive(int right) {
597-
return right > 0;
598-
}
599591
}
600592

601593
@Builtin(name = __RTRUEDIV__, fixedNumOfArguments = 2)

0 commit comments

Comments
 (0)