Skip to content
← Back

src/ir/values/sequence.ghul

1
namespace IR.Values is
2
use IO.Std;
3
4
use System.NotImplementedException;
5
use System.Text.StringBuilder;
6
7
use TypeTyped = Semantic.Types.Typed;
8
use Semantic.Types.Type;
9
use SymbolBase = Semantic.Symbols.Symbol;
10
11
class SEQUENCE: Value, TypeTyped is
12
type: Type;
13
element_type: Type;
14
15
values: Collections.List[Value];
16
17
init(
18
type: Type,
19
element_type: Type,
20
values: Collections.List[Value]
21
) is
22
super.init();
23
24
self.type = type;
25
self.element_type = element_type;
26
self.values = values;
27
si
28
29
gen(context: IR.CONTEXT) is
30
let boxer = IoC.CONTAINER.instance.value_boxer;
31
32
context.write_line("ldc.i4 {values.count}");
33
context.write_line("newarr {element_type.get_il_type()}");
34
35
let element_type_il_type = element_type.get_il_type();
36
37
for i in 0..values.count do
38
context.write_line("dup");
39
40
let v = boxer.box_if_needed(values[i], element_type);
41
42
context.write_line("ldc.i4 {i}");
43
gen(v, context);
44
45
context.write_line("stelem {element_type_il_type}");
46
od
47
si
48
49
to_string() -> string =>
50
"sequence:[{type}]({values})";
51
si
52
si