Thank you Thomas,
I have a progress using foreign-primitive for allocating objects.
On the contrary, given the following definitions:
(defineparse(foreign-primitivescheme-object(((constc-string) filename)
(scheme-objectl))
"P(C_k, filename, l);"))
where function P is defined in a companion cpp file and reads as follows:
C_wordc(C_wordC_k, C_wordl)
{
if(l==C_SCHEME_END_OF_LIST)
{
C_return(C_SCHEME_END_OF_LIST);
}
C_wordcdr=c(C_k, C_i_cdr(l));
C_word*ptr=C_alloc(C_SIZEOF_PAIR);
C_wordres=C_a_pair(&ptr, C_i_car(l), cdr);
C_return(res);
}
externvoidP(C_wordC_k, constchar*filename, C_wordl)
{
C_kontinue(C_k, c(C_k, l));
}
My goal here is to just walk through the given list l and allocate fresh
pairs for it. When I try:
(parse "something.json" '(1 2 3))
I still get:
#(#<procedure> #(#<procedure> #(#<procedure> #(#<procedure>
#(#<procedure> #(#<procedure> #(#<procedure> #(#<procedure>
#(#<procedure> #(#<procedure> #(#<procedure> #(#<procedure>
#(#<procedure> #(#<procedure> #(#<procedure> #(#<procedure>
#(#<procedure> #(#<procedure> #(#<procedure> #(#<procedure>
#(#<procedure> #(#<procedure> #(#<procedure> #(#<procedure>
#(#<procedure> #(#<procedure> #(#<procedure> #(#<procedure>
#(#<procedure> #(#<procedure> #(#<procedure> #(#<procedure>
#(#<procedure> #(#<procedure> #(#<procedure> #(#<procedure>
#(#<procedure> #(#<procedure> #(#<procedure> #(#<procedure>
#(#<procedure> #(#<procedure> #(#<procedure> #(#<procedure>
#(#<procedure> #(#<procedure> #(#<procedure> #(#<procedure>
#(#<procedure> #(#<procedure> #(#<procedure> #(#<procedure>
#(#<procedure> #(#<procedure> #(#<procedure> #(#<procedure>
#(#<procedure> #(#<procedure> #(#<procedure> #(#<procedure>
#(#<procedure> #(#<procedure> #(#<procedure> #(#<procedure>
#(#<procedure> #(#<procedure> #(#<procedure> #(#<procedure>
#(#<procedure> #(#<procedure> #(#<procedure> #(#<procedure>
#(#<procedure> #(#<procedure> #(#<procedure> #(#<procedure>
#(#<procedure> #(#<procedure> #(#<procedure> #(#<procedure>
#(#<procedure> #(#<procedure> #(#<procedure> #(#<procedure>
#(#<procedure> #(#<procedure> #(#<procedure> #(#<procedure>
#(#<procedure> #(#<procedure> #(#<procedure> #(#<procedure>
#(#<procedure> #(#<procedure> #(#<procedure> #(#<procedure>
#(#<procedure> #(#<procedure> #(#<procedure> #(#<procedure>
#(#<procedure> #(#<procedure> #(#<procedure> #(#<procedure>
#(#<procedure> #(#<procedure> #(#<procedure> #(#<procedure>
#(#<procedure> #(#<procedure> #(#<procedure> #(#<procedure>
#(#<procedure> #(#<procedure> #(#<procedure> #(#<procedure>
#(#<procedure> #(#<procedure> #(#<procedure> #(#<procedure>
#(#<procedure> #(#<procedure> #(#<procedure> #(#<procedure>
#(#<procedure> #(#<procedure> #(#<procedure> #(#<procedure>
#(#<procedure> #(#<procedure> #(#<procedure> #(#<procedure>
#(#<procedure> #(#<procedure> #(#<procedure> #(#<procedure> #(#<proc...
[panic] Detected corrupted data in stack - execution terminated <stdin>: <--
What I'm doing wrong?
Thanks again,
M
On 9/20/25 7:40 PM, Thomas Chust wrote:
Hello Massimo,
I believe you can only allocate Scheme data from a foreign-primitive,
not from a foreign[-safe]-lambda: The memory reserved by C_alloc lives
/on the C stack/, so a C function that uses this primitive must never
return. It can invoke a continuation to communicate a return value,
but it must not unwind the C stack below the point of allocation.
There is nothing preventing such a function from invoking itself,
though. As long as the recursive call is either optimized away as a
simple jump or never returns, the allocation should still work!
Ciao,
Thomas C.
Am Sa., 20. Sept. 2025 um 18:27 Uhr schrieb Massimo Nocentini via
Chicken-users <[email protected]>:
Dear list,
I have a question about the foreign module. Given the following
definition:
(defineparse(foreign-safe-lambda*scheme-object(((constc-string)
filename))
"C_word out = P(filename); C_return(out);"
))
and
externC_wordP(constchar*filename)
{
char*str="hello world";
intlength=strlen(str);
C_word*ptr=C_alloc(C_SIZEOF_STRING(length));
C_wordres=C_string(&ptr, length, str);
returnres;
}
When I use the parse function on a string, I get the following output:
#(#<procedure> #<procedure C_values> (#(#<procedure> #...
How can I allocate Scheme object from a C function (possibly
recursive)?
Thank you all in advance,
Massimo