summaryrefslogtreecommitdiff
path: root/test/cminor/lists.cm
blob: 6007f3ce449ed4a7e347460f4832d56c3cbffc10 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
/* List manipulations */

extern "malloc" : int -> int

"buildlist"(n): int -> int
{
  var b;

  if (n < 0) return 0;
  b = "malloc"(8) : int -> int;
  int32[b] = n;
  int32[b+4] = "buildlist"(n - 1) : int -> int;
  return b;
}

"reverselist"(l): int -> int
{
  var r, r2;
  r = 0;
  loop {
    if (l == 0) return r;
    r2 = "malloc"(8) : int -> int;
    int32[r2] = int32[l];
    int32[r2+4] = r;
    r = r2;
    l = int32[l+4];
  }
}