mirror of
https://github.com/idris-lang/Idris2.git
synced 2024-12-26 13:11:30 +03:00
b1f45f2748
* RefC backend improvements 1. OnCollect had the wrong number of arguments. The code creator expects 3 arguments, but onCollect in prim.h expected 4 arguments. The first of which was an erased arguments. That is now fixed. 2. OnCollect did not call `newReference` when creating a new reference to the pointer and the freeing function 3. OnCollect and OnCollectAny still had a spurious printf statement Those issues have been fixed, the test case can be found in tests/refc/garbageCollect 4. The IORef mechanism expects that the %World token will be passed around consistently. This is not the case. States in Control.App make use of IORefs, but the function created from Control.App.prim_app_bind had the world token erased to NULL. Now, IORefs are managed using a global variable, IORef_Storage * global_IORef_Storage; referenced in cBackend.h, defined in the created .c file, and set to NULL in main(); 5. While multithreading and forking is still not supported, compiling a program that makes use of Control.App demands a C implementation of prim_fork. Files support/refc/threads.c and support/refc/threads.h provide a dummy implementation for it, so that Control.App programs compile and run. A test for these 2 issues is given in tests/refc/issue2424 * format changes to make the linter happy * format changes to make the linter happy * format changes to make the linter happy * spelling mistake braket -> bracket Co-authored-by: Volkmar Frinken <volkmar@onutechnology.com>
33 lines
869 B
Idris
33 lines
869 B
Idris
module Main
|
|
|
|
|
|
data SomePointer : Type where
|
|
|
|
%foreign "C:idris2_getNull, libidris2_support, idris_support.h"
|
|
getTypedPointer : PrimIO (Ptr SomePointer)
|
|
|
|
|
|
freeTypedPointer : Ptr SomePointer -> IO ()
|
|
freeTypedPointer ptr = do
|
|
putStrLn "allocated (Ptr t) freed"
|
|
-- we could free the pointer here. However, since ptr is the NULL pointer, we just simulate it
|
|
|
|
|
|
%foreign "C:idris2_getNull, libidris2_support, idris_support.h"
|
|
getSomeAnyPointer : PrimIO (AnyPtr)
|
|
|
|
freeAnyPointer : AnyPtr -> IO ()
|
|
freeAnyPointer ptr = do
|
|
putStrLn "allocated AnyPtr freed"
|
|
-- we could free the pointer here. However, since ptr is the NULL pointer, we just simulate it
|
|
|
|
|
|
|
|
main : IO ()
|
|
main = do
|
|
ptr <- primIO $ getTypedPointer
|
|
gcPtr <- onCollect ptr freeTypedPointer
|
|
anyptr <- primIO $ getSomeAnyPointer
|
|
gcAnyPtr <- onCollectAny anyptr freeAnyPointer
|
|
pure ()
|