From a344a6d191043a8fda83b323abf785ddaa84972a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20=C4=8Cert=C3=ADk?= Date: Tue, 14 Jun 2022 16:06:42 +0300 Subject: [PATCH 1/2] Implement cpython support in test_c_interop_03 --- integration_tests/CMakeLists.txt | 2 +- integration_tests/test_c_interop_03.py | 20 +++++++++++--------- src/runtime/ltypes/ltypes.py | 19 +++++++++++++++---- 3 files changed, 27 insertions(+), 14 deletions(-) diff --git a/integration_tests/CMakeLists.txt b/integration_tests/CMakeLists.txt index 5674dec808..461e6ea141 100644 --- a/integration_tests/CMakeLists.txt +++ b/integration_tests/CMakeLists.txt @@ -154,7 +154,7 @@ RUN(NAME test_math_02 LABELS cpython llvm) RUN(NAME test_c_interop_01 LABELS cpython llvm c) RUN(NAME test_c_interop_02 LABELS cpython llvm c EXTRAFILES test_c_interop_02b.c) -RUN(NAME test_c_interop_03 LABELS llvm c +RUN(NAME test_c_interop_03 LABELS cpython llvm c EXTRAFILES test_c_interop_03b.c) RUN(NAME test_c_interop_04 LABELS cpython llvm c EXTRAFILES test_c_interop_04b.c) diff --git a/integration_tests/test_c_interop_03.py b/integration_tests/test_c_interop_03.py index 45eb583a17..80a03ce069 100644 --- a/integration_tests/test_c_interop_03.py +++ b/integration_tests/test_c_interop_03.py @@ -1,4 +1,5 @@ -from ltypes import ccall, f32, f64, i32, i64, CPtr, pointer, Pointer, p_c_pointer +from ltypes import (ccall, f32, f64, i32, i64, CPtr, pointer, Pointer, + p_c_pointer, empty_c_void_p) @ccall def f_pi32_i32(x: CPtr) -> i32: @@ -20,26 +21,27 @@ def test_c_callbacks(): xi32: i32 xi32 = 3 p: CPtr - p_c_pointer(pointer(xi32), p) - print(pointer(xi32), p) + p = empty_c_void_p() + p_c_pointer(pointer(xi32, i32), p) + print(pointer(xi32, i32), p) assert f_pi32_i32(p) == 4 xi64: i64 xi64 = 3 - p_c_pointer(pointer(xi64), p) - print(pointer(xi64), p) + p_c_pointer(pointer(xi64, i64), p) + print(pointer(xi64, i64), p) assert f_pi64_i32(p) == 4 xf32: f32 xf32 = 3.3 - p_c_pointer(pointer(xf32), p) - print(pointer(xf32), p) + p_c_pointer(pointer(xf32, f32), p) + print(pointer(xf32, f32), p) assert abs(f_pf32_i32(p)-4.3) < 1e-6 xf64: f64 xf64 = 3.3 - p_c_pointer(pointer(xf64), p) - print(pointer(xf64), p) + p_c_pointer(pointer(xf64, f64), p) + print(pointer(xf64, f64), p) assert abs(f_pf64_i32(p)-4.3) < 1e-12 test_c_callbacks() diff --git a/src/runtime/ltypes/ltypes.py b/src/runtime/ltypes/ltypes.py index 1531770518..3c23300220 100644 --- a/src/runtime/ltypes/ltypes.py +++ b/src/runtime/ltypes/ltypes.py @@ -177,15 +177,26 @@ def ccall(f): wrapped_f = CTypes(f) return wrapped_f -def pointer(x): +def pointer(x, type=None): from numpy import ndarray if isinstance(x, ndarray): return ctypes.c_void_p(x.ctypes.data) #return x.ctypes.data_as(ctypes.POINTER(ctypes.c_int32)) else: - type_ = x.annotations[0] - if type_ == i32: - return ctypes.pointer(ctypes.c_int32(x)) + if type == i32: + #return ctypes.c_void_p(ctypes.pointer(ctypes.c_int32(x))) + #return ctypes.pointer(ctypes.c_int32(x)) + return ctypes.cast(ctypes.pointer(ctypes.c_int32(x)), + ctypes.c_void_p) + elif type == i64: + return ctypes.cast(ctypes.pointer(ctypes.c_int64(x)), + ctypes.c_void_p) + elif type == f32: + return ctypes.cast(ctypes.pointer(ctypes.c_float(x)), + ctypes.c_void_p) + elif type == f64: + return ctypes.cast(ctypes.pointer(ctypes.c_double(x)), + ctypes.c_void_p) else: raise Exception("Type not supported in pointer()") From 97d0aeb3bdc7a11d2e51bfacc94bd26bc7d2c395 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20=C4=8Cert=C3=ADk?= Date: Tue, 14 Jun 2022 16:12:12 +0300 Subject: [PATCH 2/2] Allow to pass types as arguments --- src/lpython/semantics/python_ast_to_asr.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/lpython/semantics/python_ast_to_asr.cpp b/src/lpython/semantics/python_ast_to_asr.cpp index ff610631bf..bf7eb46269 100644 --- a/src/lpython/semantics/python_ast_to_asr.cpp +++ b/src/lpython/semantics/python_ast_to_asr.cpp @@ -1261,6 +1261,11 @@ class CommonVisitor : public AST::BaseVisitor { ASR::symbol_t *s = current_scope->resolve_symbol(name); if (s) { tmp = ASR::make_Var_t(al, x.base.base.loc, s); + } else if (name == "i32" || name == "i64" || name == "f32" || name == "f64") { + int64_t i = -1; + ASR::ttype_t *type = ASRUtils::TYPE(ASR::make_Integer_t(al, x.base.base.loc, + 4, nullptr, 0)); + tmp = ASR::make_IntegerConstant_t(al, x.base.base.loc, i, type); } else { throw SemanticError("Variable '" + name + "' not declared", x.base.base.loc);