Rune - Fix array passing, optimize constant array indices
[rune.git] / tests / lvalue2.d
1 #!/usr/local/bin/rune -x
2 #
3 # lvalue storage qualifier as a global
4
5 import "sys";
6 import <stdio>;
7
8 alias stdio.File *stdout = stdio.stdout;
9
10 const int loops = 10000000;
11 project "tests";
12
13 class Fubar {
14         # Initializers are only executed once
15         #
16         int x = 233;
17
18         # Constructors are executed every time
19         #
20         constructor method void doinit() {
21                 stdout->show("call init");
22                 /* this.x = 23;  would run every time */
23         }
24 }
25
26 class Fubar2 {
27         int *p;
28         heap int z = 456;
29         int zz = 457;
30 }
31
32 # should use <prefix>/lvalue2/rune_ary.map and rune_fu.map
33 #
34 persist int ary[loops];
35 persist Fubar fu;
36 int X;
37
38 # should use <prefix>/tests/rune_fu2.map
39 #
40 persist shared Fubar fu2;
41
42 private constructor
43 void
44 ginit()
45 {
46         X = 1;
47 }
48
49
50 int
51 main(int ac, char **av)
52 {
53         fubar();
54         fubar();
55         fubar();
56 }
57
58 void
59 fubar()
60 {
61         int i;
62         persist int j = 4;
63         Fubar2 z;
64
65         ++j;
66         stdout->show("j should be 5+: ", j);
67         i = z.z;
68         stdout->show("i should be 456: ", i);
69         stdout->show("z.z should be 456: ", z.z);
70         stdout->show("z.zz should be 457: ", z.zz);
71         z.z = 1;
72         stdout->show("z.z should be 1: ", z.z);
73
74         ary[0] = 1;
75         X = 2;
76
77         for (i = 0; i < loops; ++i)
78                 ary[i] += i;
79         stdout->show("Array is at ", &ary[0]);
80         stdout->show("Array is at ", &ary[i-2]);
81         stdout->show("Array is at ", &ary[i-1]);
82         stdout->show("Array is at ", &ary[i]);
83         stdout->show("Should start at 100: ", ary[100]);
84         stdout->show("Value of x should start at 233: ", fu.x);
85         ++fu.x;
86 }