Merge: doc: fixed some typos and other misc. corrections
[nit.git] / tests / test_ffi_c_global_ref.nit
1 # This file is part of NIT ( http://www.nitlanguage.org ).
2 #
3 # Copyright 2012-2013 Alexis Laferrière <alexis.laf@xymus.net>
4 #
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
8 #
9 # http://www.apache.org/licenses/LICENSE-2.0
10 #
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.
16
17 module test_ffi_c_global_ref
18
19 `{
20 ToBePreserved global_tbps[3] = {NULL,NULL,NULL};
21 `}
22
23 class ToBePreserved
24 var id : String
25
26 redef fun output do print id
27 end
28
29 class A
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] );
33
34 global_tbps[i] = tbp;
35
36 ToBePreserved_incr_ref( tbp );
37 `}
38 fun recover_unsafe( i : Int ) : ToBePreserved `{
39 return global_tbps[i];
40 `}
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] );
44 } else {
45 return null_ToBePreserved();
46 }
47 `}
48
49 fun launch_gc do sys.force_garbage_collection
50 end
51
52 var x = new ToBePreserved( "x" )
53 var y = new ToBePreserved( "y" )
54 var a = new A
55
56 a.save_as_global( y, 0 )
57 sys.force_garbage_collection
58 var r = a.recover(0)
59 if r != null then
60 r.output
61 else
62 print "null :("
63 end
64
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