Allow casts between c_ptr types and allow c_ptrTo on arrays.
This patch enables casts (by providing a _cast proc) for
c_ptr types and also creates a special version of c_ptrTo
for arrays that checks for a 1-D rectangular arrayand
returns a pointer to the first element.
I also changed the name of the extern function c_ptrTo
to _c_ptrTo so that c_ptrTo is the version with the extra
checks (that normally just calls c_ptrTo which just returns
the original pointer anyway).
Index: modules/standard/SysBasic.chpl
===================================================================
--- modules/standard/SysBasic.chpl (revision 22538)
+++ modules/standard/SysBasic.chpl (working copy)
@@ -60,7 +60,11 @@
inline proc _cast(type t, x) where t:c_ptr && x:_nilType {
return __primitive("cast", t, x);
}
+inline proc _cast(type t, x) where t:c_ptr && x.type:c_ptr {
+ return __primitive("cast", t, x);
+}
+
inline proc c_calloc(type eltType, size: integral) {
var ret:c_ptr(eltType);
__primitive("array_alloc", ret, eltType, size);
@@ -95,8 +99,20 @@
inline proc _cond_test(x: c_ptr) return x != nil;
inline proc !(x: c_ptr) return x == nil;
-extern proc c_ptrTo(ref x:?t):c_ptr(t);
+extern proc _c_ptrTo(ref x:?t):c_ptr(t);
+inline proc c_ptrTo(arr: []) where isRectangularArr(arr) && arr.rank == 1 {
+ return _c_ptrTo(arr[arr.domain.low]);
+}
+inline proc c_ptrTo(ref x:?t):c_ptr(t)
+{
+ if isArrayType(t) then
+ compilerError("c_ptrTo unsupported array type");
+ if isDomainType(t) then
+ compilerError("c_ptrTo domain type not supported");
+ // Other cases should be avoided, e.g. sync vars
+ return _c_ptrTo(x);
+}
// C strings
//extern type c_string; is a built-in primitive type
Index: runtime/include/chpltypes.h
===================================================================
--- runtime/include/chpltypes.h (revision 22538)
+++ runtime/include/chpltypes.h (working copy)
@@ -25,7 +25,7 @@
typedef void* c_void_ptr;
#define c_nil NULL
static inline c_int is_c_nil(void* x) { return x==NULL; }
-static inline void* c_ptrTo(void* x) { return x; }
+static inline void* _c_ptrTo(void* x) { return x; }
typedef const char* c_string;
typedef enum {
Index: test/extern/ferguson/tuple_to_pointer.chpl
===================================================================
--- test/extern/ferguson/tuple_to_pointer.chpl (revision 22538)
+++ test/extern/ferguson/tuple_to_pointer.chpl (working copy)
@@ -1,13 +1,13 @@
-extern proc printit(x:c_ptr(c_int), n:c_int);
+extern proc printarr(x:c_ptr(c_int), n:c_int);
proc go() {
var t:10*c_int;
for i in 1..10 do t[i] = i:c_int;
writeln(t);
- printit(c_ptrTo(t[1]), 10);
- printit(c_ptrTo(t), 10);
+ printarr(c_ptrTo(t[1]), 10);
+ printarr(c_ptrTo(t):c_ptr(c_int), 10);
}
go();
Index: test/extern/ferguson/c_ptrs.h
===================================================================
--- test/extern/ferguson/c_ptrs.h (revision 22538)
+++ test/extern/ferguson/c_ptrs.h (working copy)
@@ -8,6 +8,16 @@
printf("printme(%i)\n", *x);
}
+static void printarr(int* x, int n) {
+ int i;
+ printf("printme[0..%i] = ", n-1);
+ for( i = 0; i < n; i++ ) {
+ printf("%i ", x[i]);
+ }
+ printf("\n");
+}
+
+
static int* getit(void) {
static int static_value = 22;
return &static_value;
Index: test/extern/ferguson/c_ptr_casting.compopts
===================================================================
--- test/extern/ferguson/c_ptr_casting.compopts (revision 22538)
+++ test/extern/ferguson/c_ptr_casting.compopts (working copy)
@@ -1 +1 @@
-print_elements.h
+c_ptrs.h
Index: test/extern/ferguson/array_to_pointer.compopts
===================================================================
--- test/extern/ferguson/array_to_pointer.compopts (revision 22538)
+++ test/extern/ferguson/array_to_pointer.compopts (working copy)
@@ -1 +1 @@
-print_elements.h
+c_ptrs.h
Index: test/extern/ferguson/tuple_to_pointer.compopts
===================================================================
--- test/extern/ferguson/tuple_to_pointer.compopts (revision 22538)
+++ test/extern/ferguson/tuple_to_pointer.compopts (working copy)
@@ -1 +1 @@
-print_elements.h
+c_ptrs.h
Index: test/extern/ferguson/c_ptr_casting.good
===================================================================
--- test/extern/ferguson/c_ptr_casting.good (revision 22538)
+++ test/extern/ferguson/c_ptr_casting.good (working copy)
@@ -1,2 +1,2 @@
(x = 1) (x = 2) (x = 3) (x = 4) (x = 5) (x = 6) (x = 7) (x = 8) (x = 9) (x =
10)
-1 2 3 4 5 6 7 8 9 10
+printme[0..9] = 1 2 3 4 5 6 7 8 9 10
Index: test/extern/ferguson/array_to_pointer.good
===================================================================
--- test/extern/ferguson/array_to_pointer.good (revision 22538)
+++ test/extern/ferguson/array_to_pointer.good (working copy)
@@ -1,3 +1,3 @@
1 2 3 4 5 6 7 8 9 10
-1 2 3 4 5 6 7 8 9 10
-1 2 3 4 5 6 7 8 9 10
+printme[0..9] = 1 2 3 4 5 6 7 8 9 10
+printme[0..9] = 1 2 3 4 5 6 7 8 9 10
Index: test/extern/ferguson/tuple_to_pointer.good
===================================================================
--- test/extern/ferguson/tuple_to_pointer.good (revision 22538)
+++ test/extern/ferguson/tuple_to_pointer.good (working copy)
@@ -1,3 +1,3 @@
(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
-1 2 3 4 5 6 7 8 9 10
-1 2 3 4 5 6 7 8 9 10
+printme[0..9] = 1 2 3 4 5 6 7 8 9 10
+printme[0..9] = 1 2 3 4 5 6 7 8 9 10
Index: test/extern/ferguson/c_ptr_casting.chpl
===================================================================
--- test/extern/ferguson/c_ptr_casting.chpl (revision 22538)
+++ test/extern/ferguson/c_ptr_casting.chpl (working copy)
@@ -1,4 +1,4 @@
-extern proc printit(x:c_ptr(c_int), n:c_int);
+extern proc printarr(x:c_ptr(c_int), n:c_int);
record R {
var x: c_int;
@@ -10,7 +10,7 @@
for i in 1..10 do a[i] = new R(i:c_int);
writeln(a);
- //printit(c_ptrTo(a[1]):c_ptr(c_int));
+ printarr(c_ptrTo(a[1]):c_ptr(c_int), 10);
}
go();
Index: test/extern/ferguson/array_to_pointer.chpl
===================================================================
--- test/extern/ferguson/array_to_pointer.chpl (revision 22538)
+++ test/extern/ferguson/array_to_pointer.chpl (working copy)
@@ -1,12 +1,12 @@
-extern proc printit(x:c_ptr(c_int), n:c_int);
+extern proc printarr(x:c_ptr(c_int), n:c_int);
proc go() {
var a = for i in 1..10 do i:c_int;
writeln(a);
- printit(c_ptrTo(a[1]), 10);
- printit(c_ptrTo(a), 10);
+ printarr(c_ptrTo(a[1]), 10);
+ printarr(c_ptrTo(a), 10);
}
go();
------------------------------------------------------------------------------
CenturyLink Cloud: The Leader in Enterprise Cloud Services.
Learn Why More Businesses Are Choosing CenturyLink Cloud For
Critical Workloads, Development Environments & Everything In Between.
Get a Quote or Start a Free Trial Today.
http://pubads.g.doubleclick.net/gampad/clk?id=119420431&iu=/4140/ostg.clktrk
_______________________________________________
Chapel-developers mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/chapel-developers