Skip to content

Commit 1ce01ce

Browse files
committed
Refine sequence mult for foreign objects.
1 parent 6fbc815 commit 1ce01ce

File tree

1 file changed

+41
-29
lines changed

1 file changed

+41
-29
lines changed

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

Lines changed: 41 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -183,6 +183,29 @@ protected ForeignBinaryNode(LookupAndCallBinaryNode op, boolean reverse) {
183183
this.reverse = reverse;
184184
}
185185

186+
protected static boolean isNegativeNumber(InteropLibrary lib, Object right) {
187+
long val = 0;
188+
try {
189+
if (lib.fitsInByte(right)) {
190+
val = lib.asByte(right);
191+
} else if (lib.fitsInShort(right)) {
192+
val = lib.asShort(right);
193+
} else if (lib.fitsInInt(right)) {
194+
val = lib.asInt(right);
195+
} else if (lib.fitsInLong(right)) {
196+
val = lib.asLong(right);
197+
}
198+
return val < 0;
199+
} catch (UnsupportedMessageException e) {
200+
// fall through
201+
}
202+
return false;
203+
}
204+
205+
protected static boolean isPythonLikeSequence(InteropLibrary lib, Object receiver) {
206+
return lib.hasArrayElements(receiver) || lib.isString(receiver);
207+
}
208+
186209
@Specialization(guards = {"!reverse", "lib.isBoolean(left)"})
187210
Object doComparisonBool(Object left, Object right,
188211
@CachedLibrary(limit = "3") InteropLibrary lib) {
@@ -244,11 +267,18 @@ Object doComparisonDoubleR(Object left, Object right,
244267
}
245268

246269
@SuppressWarnings("unused")
247-
@Specialization(guards = {"!lib.fitsInDouble(left)", "!lib.fitsInLong(left)", "!lib.isBoolean(left)"})
270+
@Specialization(guards = {"!reverse", "!lib.fitsInDouble(left)", "!lib.fitsInLong(left)", "!lib.isBoolean(left)"})
248271
public PNotImplemented doGeneric(Object left, Object right,
249272
@CachedLibrary(limit = "3") InteropLibrary lib) {
250273
return PNotImplemented.NOT_IMPLEMENTED;
251274
}
275+
276+
@SuppressWarnings("unused")
277+
@Specialization(guards = {"reverse", "!lib.fitsInDouble(right)", "!lib.fitsInLong(right)", "!lib.isBoolean(right)"})
278+
public PNotImplemented doGenericReverse(Object left, Object right,
279+
@CachedLibrary(limit = "3") InteropLibrary lib) {
280+
return PNotImplemented.NOT_IMPLEMENTED;
281+
}
252282
}
253283

254284
@Builtin(name = __ADD__, minNumOfPositionalArgs = 2)
@@ -297,7 +327,7 @@ abstract static class MulNode extends ForeignBinaryNode {
297327
super(BinaryArithmetic.Mul.create(), false);
298328
}
299329

300-
@Specialization(insertBefore = "doGeneric", guards = {"lib.hasArrayElements(left)", "lib.fitsInInt(right)"})
330+
@Specialization(insertBefore = "doGeneric", guards = {"isPythonLikeSequence(lib, left)", "lib.fitsInInt(right)"})
301331
static Object doForeignArray(Object left, Object right,
302332
@Cached PRaiseNode raise,
303333
@Cached PythonObjectFactory factory,
@@ -327,7 +357,7 @@ static Object doForeignArray(Object left, Object right,
327357
}
328358
}
329359

330-
@Specialization(insertBefore = "doGeneric", guards = {"lib.hasArrayElements(left)", "lib.isBoolean(right)"})
360+
@Specialization(insertBefore = "doGeneric", guards = {"isPythonLikeSequence(lib, left)", "lib.isBoolean(right)"})
331361
static Object doForeignArrayForeignBoolean(Object left, Object right,
332362
@Cached PRaiseNode raise,
333363
@Cached PythonObjectFactory factory,
@@ -341,7 +371,7 @@ static Object doForeignArrayForeignBoolean(Object left, Object right,
341371
}
342372

343373
@SuppressWarnings("unused")
344-
@Specialization(insertBefore = "doGeneric", guards = {"lib.hasArrayElements(left)", "isNegativeNumber(lib, right)"})
374+
@Specialization(insertBefore = "doGeneric", guards = {"isPythonLikeSequence(lib, left)", "isNegativeNumber(lib, right)"})
345375
static Object doForeignArrayNegativeMult(Object left, Object right,
346376
@Cached PythonObjectFactory factory,
347377
@CachedLibrary(limit = "3") InteropLibrary lib) {
@@ -350,30 +380,12 @@ static Object doForeignArrayNegativeMult(Object left, Object right,
350380
}
351381

352382
@SuppressWarnings("unused")
353-
@Specialization(insertBefore = "doGeneric", guards = {"!lib.fitsInDouble(left)", "!lib.fitsInLong(left)", "!lib.isBoolean(left)", "!lib.hasArrayElements(left)"})
383+
@Specialization(insertBefore = "doGeneric", guards = {"!lib.fitsInDouble(left)", "!lib.fitsInLong(left)", "!lib.isBoolean(left)", "!isPythonLikeSequence(lib, left)"})
354384
PNotImplemented doForeignGeneric(Object left, Object right,
355385
@CachedLibrary(limit = "3") InteropLibrary lib) {
356386
return PNotImplemented.NOT_IMPLEMENTED;
357387
}
358388

359-
protected static boolean isNegativeNumber(InteropLibrary lib, Object right) {
360-
long val = 0;
361-
try {
362-
if (lib.fitsInByte(right)) {
363-
val = lib.asByte(right);
364-
} else if (lib.fitsInShort(right)) {
365-
val = lib.asShort(right);
366-
} else if (lib.fitsInInt(right)) {
367-
val = lib.asInt(right);
368-
} else if (lib.fitsInLong(right)) {
369-
val = lib.asLong(right);
370-
}
371-
return val < 0;
372-
} catch (UnsupportedMessageException e) {
373-
// fall through
374-
}
375-
return false;
376-
}
377389
}
378390

379391
@Builtin(name = __RMUL__, minNumOfPositionalArgs = 2)
@@ -383,17 +395,17 @@ abstract static class RMulNode extends ForeignBinaryNode {
383395
super(BinaryArithmetic.Mul.create(), true);
384396
}
385397

386-
@Specialization(guards = {"lib.hasArrayElements(right)", "lib.fitsInInt(left)"})
387-
Object doForeignArray(Object left, Object right,
398+
@Specialization(guards = {"isPythonLikeSequence(lib, right)", "lib.fitsInInt(left)"})
399+
Object doForeignArray(Object right, Object left,
388400
@Cached PRaiseNode raise,
389401
@Cached PythonObjectFactory factory,
390402
@Cached PForeignToPTypeNode convert,
391403
@CachedLibrary(limit = "1") InteropLibrary lib) {
392404
return MulNode.doForeignArray(right, left, raise, factory, convert, lib);
393405
}
394406

395-
@Specialization(guards = {"lib.hasArrayElements(right)", "lib.isBoolean(left)"})
396-
Object doForeignArrayForeignBoolean(Object left, Object right,
407+
@Specialization(guards = {"isPythonLikeSequence(lib, right)", "lib.isBoolean(left)"})
408+
Object doForeignArrayForeignBoolean(Object right, Object left,
397409
@Cached PRaiseNode raise,
398410
@Cached PythonObjectFactory factory,
399411
@Cached PForeignToPTypeNode convert,
@@ -406,8 +418,8 @@ Object doForeignArrayForeignBoolean(Object left, Object right,
406418
}
407419

408420
@SuppressWarnings("unused")
409-
@Specialization(insertBefore = "doGeneric", guards = {"!lib.fitsInDouble(right)", "!lib.fitsInLong(right)", "!lib.isBoolean(right)", "!lib.hasArrayElements(right)"})
410-
PNotImplemented doForeignGneeric(Object left, Object right,
421+
@Specialization(insertBefore = "doGeneric", guards = {"!lib.fitsInDouble(right)", "!lib.fitsInLong(right)", "!lib.isBoolean(right)", "!isPythonLikeSequence(lib, right)"})
422+
PNotImplemented doForeignGneeric(Object right, Object left,
411423
@CachedLibrary(limit = "3") InteropLibrary lib) {
412424
return PNotImplemented.NOT_IMPLEMENTED;
413425
}

0 commit comments

Comments
 (0)