1 # This file is part of NIT ( http://www.nitlanguage.org ).
3 # Copyright 2012-2013 Alexis Laferrière <alexis.laf@xymus.net>
5 # Licensed under the Apache License, Version 2.0 (the "License");
6 # you may not use this file except in compliance with the License.
7 # You may obtain a copy of the License at
9 # http://www.apache.org/licenses/LICENSE-2.0
11 # Unless required by applicable law or agreed to in writing, software
12 # distributed under the License is distributed on an "AS IS" BASIS,
13 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 # See the License for the specific language governing permissions and
15 # limitations under the License.
17 module test_ffi_c_global_ref
20 ToBePreserved global_tbps[3] = {NULL,NULL,NULL};
26 redef fun output
do print id
30 fun save_as_global
( tbp
: ToBePreserved, i
: Int ) import ToBePreserved.output
`{
31 if ( global_tbps[i] != NULL )
32 ToBePreserved_decr_ref( global_tbps[i] );
36 ToBePreserved_incr_ref( tbp );
38 fun recover_unsafe
( i
: Int ) : ToBePreserved `{
39 return global_tbps[i];
41 fun recover
( i
: Int ) : nullable ToBePreserved import ToBePreserved as nullable `{
42 if ( global_tbps[i] != NULL ) {
43 return ToBePreserved_as_nullable( global_tbps[i] );
45 return null_ToBePreserved();
49 fun launch_gc
do sys
.force_garbage_collection
52 var x
= new ToBePreserved( "x" )
53 var y
= new ToBePreserved( "y" )
56 a
.save_as_global
( y
, 0 )
57 sys
.force_garbage_collection
65 a
.save_as_global
( x
, 1 )
66 a
.save_as_global
( y
, 2 )
67 sys
.force_garbage_collection
68 a
.recover_unsafe
(0).output
69 a
.recover_unsafe
(1).output
70 a
.recover_unsafe
(2).output