Skip to content

Commit 5007465

Browse files
committed
add bitwise operations to foreign objects
1 parent e0a2bc3 commit 5007465

File tree

1 file changed

+68
-1
lines changed

1 file changed

+68
-1
lines changed

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

Lines changed: 68 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,10 +27,11 @@
2727
package com.oracle.graal.python.builtins.objects.foreign;
2828

2929
import static com.oracle.graal.python.builtins.PythonBuiltinClassType.AttributeError;
30-
import static com.oracle.graal.python.builtins.PythonBuiltinClassType.StopIteration;
3130
import static com.oracle.graal.python.builtins.PythonBuiltinClassType.MemoryError;
31+
import static com.oracle.graal.python.builtins.PythonBuiltinClassType.StopIteration;
3232
import static com.oracle.graal.python.nodes.SpecialAttributeNames.__BASES__;
3333
import static com.oracle.graal.python.nodes.SpecialMethodNames.__ADD__;
34+
import static com.oracle.graal.python.nodes.SpecialMethodNames.__AND__;
3435
import static com.oracle.graal.python.nodes.SpecialMethodNames.__BOOL__;
3536
import static com.oracle.graal.python.nodes.SpecialMethodNames.__CALL__;
3637
import static com.oracle.graal.python.nodes.SpecialMethodNames.__DELATTR__;
@@ -53,18 +54,23 @@
5354
import static com.oracle.graal.python.nodes.SpecialMethodNames.__NEW__;
5455
import static com.oracle.graal.python.nodes.SpecialMethodNames.__NEXT__;
5556
import static com.oracle.graal.python.nodes.SpecialMethodNames.__NE__;
57+
import static com.oracle.graal.python.nodes.SpecialMethodNames.__OR__;
5658
import static com.oracle.graal.python.nodes.SpecialMethodNames.__RADD__;
59+
import static com.oracle.graal.python.nodes.SpecialMethodNames.__RAND__;
5760
import static com.oracle.graal.python.nodes.SpecialMethodNames.__RDIVMOD__;
5861
import static com.oracle.graal.python.nodes.SpecialMethodNames.__REPR__;
5962
import static com.oracle.graal.python.nodes.SpecialMethodNames.__RFLOORDIV__;
6063
import static com.oracle.graal.python.nodes.SpecialMethodNames.__RMUL__;
64+
import static com.oracle.graal.python.nodes.SpecialMethodNames.__ROR__;
6165
import static com.oracle.graal.python.nodes.SpecialMethodNames.__RSUB__;
6266
import static com.oracle.graal.python.nodes.SpecialMethodNames.__RTRUEDIV__;
67+
import static com.oracle.graal.python.nodes.SpecialMethodNames.__RXOR__;
6368
import static com.oracle.graal.python.nodes.SpecialMethodNames.__SETATTR__;
6469
import static com.oracle.graal.python.nodes.SpecialMethodNames.__SETITEM__;
6570
import static com.oracle.graal.python.nodes.SpecialMethodNames.__STR__;
6671
import static com.oracle.graal.python.nodes.SpecialMethodNames.__SUB__;
6772
import static com.oracle.graal.python.nodes.SpecialMethodNames.__TRUEDIV__;
73+
import static com.oracle.graal.python.nodes.SpecialMethodNames.__XOR__;
6874

6975
import java.util.Arrays;
7076
import java.util.List;
@@ -940,4 +946,65 @@ Object check(Object self, Object instance,
940946
}
941947
}
942948
}
949+
950+
@Builtin(name = __RAND__, minNumOfPositionalArgs = 2)
951+
@Builtin(name = __AND__, minNumOfPositionalArgs = 2)
952+
@GenerateNodeFactory
953+
abstract static class AndNode extends PythonBinaryBuiltinNode {
954+
@Specialization(limit = "3")
955+
protected static Object op(VirtualFrame frame, Object left, Object right,
956+
@Cached("create(__AND__, __RAND__)") LookupAndCallBinaryNode callAnd,
957+
@CachedLibrary("left") InteropLibrary lib) {
958+
if (lib.isNumber(left) && lib.fitsInLong(left)) {
959+
try {
960+
return callAnd.executeObject(frame, lib.asLong(left), right);
961+
} catch (UnsupportedMessageException e) {
962+
throw CompilerDirectives.shouldNotReachHere();
963+
}
964+
} else {
965+
return PNotImplemented.NOT_IMPLEMENTED;
966+
}
967+
}
968+
}
969+
970+
@Builtin(name = __ROR__, minNumOfPositionalArgs = 2)
971+
@Builtin(name = __OR__, minNumOfPositionalArgs = 2)
972+
@GenerateNodeFactory
973+
abstract static class OrNode extends PythonBinaryBuiltinNode {
974+
@Specialization(limit = "3")
975+
protected static Object op(VirtualFrame frame, Object left, Object right,
976+
@Cached("create(__OR__, __ROR__)") LookupAndCallBinaryNode callOr,
977+
@CachedLibrary("left") InteropLibrary lib) {
978+
if (lib.isNumber(left) && lib.fitsInLong(left)) {
979+
try {
980+
return callOr.executeObject(frame, lib.asLong(left), right);
981+
} catch (UnsupportedMessageException e) {
982+
throw CompilerDirectives.shouldNotReachHere();
983+
}
984+
} else {
985+
return PNotImplemented.NOT_IMPLEMENTED;
986+
}
987+
}
988+
}
989+
990+
@Builtin(name = __RXOR__, minNumOfPositionalArgs = 2)
991+
@Builtin(name = __XOR__, minNumOfPositionalArgs = 2)
992+
@GenerateNodeFactory
993+
abstract static class XorNode extends PythonBinaryBuiltinNode {
994+
@Specialization(limit = "3")
995+
protected static Object op(VirtualFrame frame, Object left, Object right,
996+
@Cached("create(__XOR__, __RXOR__)") LookupAndCallBinaryNode callXor,
997+
@CachedLibrary("left") InteropLibrary lib) {
998+
if (lib.isNumber(left) && lib.fitsInLong(left)) {
999+
try {
1000+
return callXor.executeObject(frame, lib.asLong(left), right);
1001+
} catch (UnsupportedMessageException e) {
1002+
throw CompilerDirectives.shouldNotReachHere();
1003+
}
1004+
} else {
1005+
return PNotImplemented.NOT_IMPLEMENTED;
1006+
}
1007+
}
1008+
}
1009+
9431010
}

0 commit comments

Comments
 (0)