Basically, a stack-allocated array cannot be consumed.On Sat, Jul 11, 2015 at 7:21 AM, Kiwamu Okabe kiw...@debian.or.jp wrote:
Hi all,
I start to write code with gfarray library.
However I catch “the linear dynamic variable [arr$view$4464(-1)] is
preserved but with an incompatible type” error.
How to fix it?
Well, my point is that you cannot really implement a proof function like
consume_gfarray_v (without leaking resource).
Using gfarray is not different from using array. If you have a function
like consume_array_v, then you will encounter the same problem.On Sat, Jul 11, 2015 at 10:07 AM, Kiwamu Okabe kiw...@debian.or.jp wrote:
On Sat, Jul 11, 2015 at 11:04 PM, Hongwei Xi gmh...@gmail.com wrote:
Basically, a stack-allocated array cannot be consumed.
Umm… Do you have another solution to use gfarrray from application?
The following is something that works. You need the latest
version of ATS2 at Github. I have to say that gfarray is probably not
meant to be used in this way; it is mainly for doing program verification.
// #include
“share/atspre_staload.hats”
//
staload
“libats/SATS/ilist_prf.sats”
//
staload “libats/SATS/gfarray.sats”
staload _ = “libats/DATS/gfarray.dats”
//
staload UN = “prelude/SATS/unsafe.sats”
//
implement main0 () = {
var arr = @int
vtypedef VT = [xs:ilist](LENGTH(xs, 3), gfarray_v(int, arr, xs) | ptr(arr
))
val (pflen, pfarr | arr) = $UN.castvwtp0{VT}(addr@arr)
prval nth0 = NTHbas ()
prval LENGTHcons _ = pflen
val v = gfarray_get_at (nth0, pfarr | arr, i2sz(0))
val () = println! ("gfarray[0] = ", unstamp_t{int}(v))
prval () = $UN.castview0(pfarr)
}On Sunday, July 12, 2015 at 8:09:27 AM UTC-4, Kiwamu Okabe wrote:
I try to cast @[int][N] into gfarray_v (int, l, xs).
But it’s hard to access first entry of gfarray in this time…
local #define N 16
var _global_arr: @[int][N]?
in
fun arr_takeout (): [l:addr][xs:ilist] (LENGTH (xs, N), gfarray_v
(int, l, xs) | ptr l) = let
extern castfn cast_takeout {l:addr} (ptr l):
[xs:ilist] (LENGTH (xs, N), gfarray_v (int, l, xs) | ptr l)
in
cast_takeout addr@_global_arr
end
fun arr_addback {l:addr}{xs:ilist} (pfarr: gfarray_v (int, l, xs) |
addr: ptr l): void = let
extern castfn cast_addback {l:addr}{xs:ilist} (pfarr: gfarray_v
(int, l, xs) | addr: ptr l): void
in
cast_addback (pfarr | addr)
end
end
implement main0 () = {
val (pflen, pfarr | arr) = arr_takeout ()
prval nth0 = NTHbas ()
val v = gfarray_get_at (nth0, pfarr | arr, i2sz 0)
// val () = arr_addback (pfarr | arr)
}