Skip to content

Commit 51a1a24

Browse files
timfelfangerer
authored andcommitted
fix reverse ops for foreign objects and __mul__/__rmul__ for foreign arrays
1 parent f0df15c commit 51a1a24

File tree

1 file changed

+15
-54
lines changed

1 file changed

+15
-54
lines changed

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

Lines changed: 15 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -202,10 +202,6 @@ protected static boolean isNegativeNumber(InteropLibrary lib, Object right) {
202202
return false;
203203
}
204204

205-
protected static boolean isPythonLikeSequence(InteropLibrary lib, Object receiver) {
206-
return lib.hasArrayElements(receiver);
207-
}
208-
209205
@Specialization(guards = {"!reverse", "lib.isBoolean(left)"})
210206
Object doComparisonBool(Object left, Object right,
211207
@CachedLibrary(limit = "3") InteropLibrary lib) {
@@ -245,59 +241,52 @@ Object doComparisonString(Object left, Object right,
245241
return PNotImplemented.NOT_IMPLEMENTED;
246242
}
247243
}
248-
@Specialization(guards = {"reverse", "lib.isBoolean(right)"})
244+
@Specialization(guards = {"reverse", "lib.isBoolean(left)"})
249245
Object doComparisonBoolR(Object left, Object right,
250246
@CachedLibrary(limit = "3") InteropLibrary lib) {
251247
try {
252-
return op.executeObject(left, lib.asBoolean(right));
248+
return op.executeObject(right, lib.asBoolean(left));
253249
} catch (UnsupportedMessageException e) {
254250
return PNotImplemented.NOT_IMPLEMENTED;
255251
}
256252
}
257253

258-
@Specialization(guards = {"reverse", "lib.fitsInLong(right)"})
254+
@Specialization(guards = {"reverse", "lib.fitsInLong(left)"})
259255
Object doComparisonLongR(Object left, Object right,
260256
@CachedLibrary(limit = "3") InteropLibrary lib) {
261257
try {
262-
return op.executeObject(left, lib.asLong(right));
258+
return op.executeObject(right, lib.asLong(left));
263259
} catch (UnsupportedMessageException e) {
264260
return PNotImplemented.NOT_IMPLEMENTED;
265261
}
266262
}
267263

268-
@Specialization(guards = {"reverse", "lib.fitsInDouble(right)"})
264+
@Specialization(guards = {"reverse", "lib.fitsInDouble(left)"})
269265
Object doComparisonDoubleR(Object left, Object right,
270266
@CachedLibrary(limit = "3") InteropLibrary lib) {
271267
try {
272-
return op.executeObject(left, lib.asDouble(right));
268+
return op.executeObject(right, lib.asDouble(left));
273269
} catch (UnsupportedMessageException e) {
274270
return PNotImplemented.NOT_IMPLEMENTED;
275271
}
276272
}
277273

278-
@Specialization(guards = {"reverse", "lib.isString(right)"})
274+
@Specialization(guards = {"reverse", "lib.isString(left)"})
279275
Object doComparisonStringR(Object left, Object right,
280276
@CachedLibrary(limit = "3") InteropLibrary lib) {
281277
try {
282-
return op.executeObject(left, lib.asString(right));
278+
return op.executeObject(right, lib.asString(left));
283279
} catch (UnsupportedMessageException e) {
284280
return PNotImplemented.NOT_IMPLEMENTED;
285281
}
286282
}
287283

288284
@SuppressWarnings("unused")
289-
@Specialization(guards = {"!reverse", "!lib.fitsInDouble(left)", "!lib.fitsInLong(left)", "!lib.isBoolean(left)"})
285+
@Specialization(guards = {"!lib.fitsInDouble(left)", "!lib.fitsInLong(left)", "!lib.isBoolean(left)"})
290286
public PNotImplemented doGeneric(Object left, Object right,
291287
@CachedLibrary(limit = "3") InteropLibrary lib) {
292288
return PNotImplemented.NOT_IMPLEMENTED;
293289
}
294-
295-
@SuppressWarnings("unused")
296-
@Specialization(guards = {"reverse", "!lib.fitsInDouble(right)", "!lib.fitsInLong(right)", "!lib.isBoolean(right)"})
297-
public PNotImplemented doGenericReverse(Object left, Object right,
298-
@CachedLibrary(limit = "3") InteropLibrary lib) {
299-
return PNotImplemented.NOT_IMPLEMENTED;
300-
}
301290
}
302291

303292
@Builtin(name = __ADD__, minNumOfPositionalArgs = 2)
@@ -346,6 +335,10 @@ abstract static class MulNode extends ForeignBinaryNode {
346335
super(BinaryArithmetic.Mul.create(), false);
347336
}
348337

338+
protected static boolean isPythonLikeSequence(InteropLibrary lib, Object receiver) {
339+
return lib.hasArrayElements(receiver);
340+
}
341+
349342
@Specialization(insertBefore = "doComparisonBool", guards = {"isPythonLikeSequence(lib, left)", "lib.fitsInInt(right)"})
350343
static Object doForeignArray(Object left, Object right,
351344
@Cached PRaiseNode raise,
@@ -365,7 +358,7 @@ static Object doForeignArray(Object left, Object right,
365358

366359
// repeat data
367360
for (int i = 0; i < repeatedData.length; i++) {
368-
repeatedData[i] = unpackForeignArray[i % rightInt];
361+
repeatedData[i] = unpackForeignArray[i % unpackForeignArray.length];
369362
}
370363

371364
return factory.createList(repeatedData);
@@ -409,39 +402,7 @@ PNotImplemented doForeignGeneric(Object left, Object right,
409402

410403
@Builtin(name = __RMUL__, minNumOfPositionalArgs = 2)
411404
@GenerateNodeFactory
412-
abstract static class RMulNode extends ForeignBinaryNode {
413-
RMulNode() {
414-
super(BinaryArithmetic.Mul.create(), true);
415-
}
416-
417-
@Specialization(insertBefore = "doComparisonBool", guards = {"isPythonLikeSequence(lib, right)", "lib.fitsInInt(left)"})
418-
Object doForeignArray(Object right, Object left,
419-
@Cached PRaiseNode raise,
420-
@Cached PythonObjectFactory factory,
421-
@Cached PForeignToPTypeNode convert,
422-
@CachedLibrary(limit = "1") InteropLibrary lib) {
423-
return MulNode.doForeignArray(right, left, raise, factory, convert, lib);
424-
}
425-
426-
@Specialization(insertBefore = "doComparisonBool", guards = {"isPythonLikeSequence(lib, right)", "lib.isBoolean(left)"})
427-
Object doForeignArrayForeignBoolean(Object right, Object left,
428-
@Cached PRaiseNode raise,
429-
@Cached PythonObjectFactory factory,
430-
@Cached PForeignToPTypeNode convert,
431-
@CachedLibrary(limit = "1") InteropLibrary lib) {
432-
try {
433-
return MulNode.doForeignArray(right, lib.asBoolean(left) ? 1 : 0, raise, factory, convert, lib);
434-
} catch (UnsupportedMessageException e) {
435-
return PNotImplemented.NOT_IMPLEMENTED;
436-
}
437-
}
438-
439-
@SuppressWarnings("unused")
440-
@Specialization(insertBefore = "doGeneric", guards = {"!lib.fitsInDouble(right)", "!lib.fitsInLong(right)", "!lib.isBoolean(right)", "!isPythonLikeSequence(lib, right)"})
441-
PNotImplemented doForeignGneeric(Object right, Object left,
442-
@CachedLibrary(limit = "3") InteropLibrary lib) {
443-
return PNotImplemented.NOT_IMPLEMENTED;
444-
}
405+
abstract static class RMulNode extends MulNode {
445406
}
446407

447408
@Builtin(name = __SUB__, minNumOfPositionalArgs = 2)

0 commit comments

Comments
 (0)