Skip to content

Commit 60278e7

Browse files
committed
Add assertion that an object is native
1 parent 2a6f88c commit 60278e7

File tree

5 files changed

+40
-3
lines changed

5 files changed

+40
-3
lines changed

graalpython/com.oracle.graal.python.test/src/tests/cpyext/__init__.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,13 @@ def assert_raises(err, fn, *args, **kwargs):
5858
assert raised
5959

6060

61+
if sys.implementation.name == 'graalpy':
62+
is_native_object = __graalpython__.is_native_object
63+
else:
64+
def is_native_object(obj):
65+
return True
66+
67+
6168
def unhandled_error_compare(x, y):
6269
if (isinstance(x, BaseException) and isinstance(y, BaseException)):
6370
return type(x) == type(y)

graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_bytes.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,8 @@
3838
# SOFTWARE.
3939
import unittest
4040

41-
from . import CPyExtTestCase, CPyExtFunction, CPyExtFunctionOutVars, unhandled_error_compare, CPyExtType
41+
from . import CPyExtTestCase, CPyExtFunction, CPyExtFunctionOutVars, unhandled_error_compare, CPyExtType, \
42+
is_native_object
4243

4344
__dir__ = __file__.rpartition("/")[0]
4445

@@ -589,6 +590,7 @@ def test_create_from_buffer_exception(self):
589590
class TestNativeSubclass(unittest.TestCase):
590591
def test_builtins(self):
591592
b = BytesSubclass(b"hello")
593+
assert is_native_object(b)
592594
assert type(b) == BytesSubclass
593595
assert b
594596
assert not BytesSubclass(b'')

graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_err.py

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@
4141
import warnings
4242

4343
from . import CPyExtTestCase, CPyExtFunction, CPyExtFunctionVoid, unhandled_error_compare, \
44-
CPyExtType
44+
CPyExtType, is_native_object
4545

4646
__dir__ = __file__.rpartition("/")[0]
4747

@@ -660,10 +660,17 @@ def raise_native_exception():
660660

661661

662662
class TestNativeExceptionSubclass:
663+
def test_init(self):
664+
e = ExceptionSubclass(1, 2, 3)
665+
assert is_native_object(e)
666+
assert type(e) == ExceptionSubclass
667+
assert isinstance(e, Exception)
668+
663669
def test_raise_type(self):
664670
try:
665671
raise ExceptionSubclass
666672
except ExceptionSubclass as e:
673+
assert is_native_object(e)
667674
assert e.args == ()
668675
else:
669676
assert False
@@ -672,6 +679,7 @@ def test_raise_instance(self):
672679
try:
673680
raise ExceptionSubclass(1)
674681
except ExceptionSubclass as e:
682+
assert is_native_object(e)
675683
assert e.args == (1,)
676684
else:
677685
assert False
@@ -780,6 +788,7 @@ def gen():
780788
g = gen()
781789
next(g)
782790
e = g.throw(ExceptionSubclass)
791+
assert is_native_object(e)
783792
assert type(e) == ExceptionSubclass
784793

785794
g = gen()

graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_tuple.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,8 @@
3838
# SOFTWARE.
3939
import unittest
4040

41-
from . import CPyExtTestCase, CPyExtFunction, CPyExtFunctionOutVars, unhandled_error_compare, GRAALPYTHON, CPyExtType
41+
from . import CPyExtTestCase, CPyExtFunction, CPyExtFunctionOutVars, unhandled_error_compare, CPyExtType, \
42+
is_native_object
4243

4344
__dir__ = __file__.rpartition("/")[0]
4445

@@ -250,6 +251,8 @@ def compile_module(self, name):
250251
class TestNativeSubclass(unittest.TestCase):
251252
def test_builtins(self):
252253
t = TupleSubclass(1, 2, 3)
254+
assert type(t) == TupleSubclass
255+
assert is_native_object(t)
253256
assert t
254257
assert len(t) == 3
255258
assert t[1] == 2

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

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@
8484
import com.oracle.graal.python.builtins.modules.GraalPythonModuleBuiltinsFactory.DebugNodeFactory;
8585
import com.oracle.graal.python.builtins.objects.PNone;
8686
import com.oracle.graal.python.builtins.objects.bytes.PBytes;
87+
import com.oracle.graal.python.builtins.objects.cext.PythonAbstractNativeObject;
8788
import com.oracle.graal.python.builtins.objects.code.CodeNodes;
8889
import com.oracle.graal.python.builtins.objects.code.PCode;
8990
import com.oracle.graal.python.builtins.objects.common.DynamicObjectStorage;
@@ -916,6 +917,21 @@ Object doit() {
916917
}
917918
}
918919

920+
@Builtin(name = "is_native_object", minNumOfPositionalArgs = 1)
921+
@GenerateNodeFactory
922+
abstract static class IsNativeObject extends PythonUnaryBuiltinNode {
923+
@Specialization
924+
boolean isNative(@SuppressWarnings("unused") PythonAbstractNativeObject obj) {
925+
return true;
926+
}
927+
928+
@Fallback
929+
boolean isNative(@SuppressWarnings("unused") Object obj) {
930+
return false;
931+
}
932+
933+
}
934+
919935
// This is only used from HPy
920936
@Builtin(name = "PyTruffle_CreateType", minNumOfPositionalArgs = 4)
921937
@GenerateNodeFactory

0 commit comments

Comments
 (0)