-
-
Notifications
You must be signed in to change notification settings - Fork 373
/
CallFrame.pm
59 lines (49 loc) · 1.46 KB
/
CallFrame.pm
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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
my class CallFrame {
has Mu $!interp;
has Int $.level;
has %.annotations;
has %.my;
method new(Int :$level = 0) {
my $l = $level + 1;
my Mu $interp := pir::getinterp__P;
my $self := nqp::create(CallFrame);
nqp::bindattr($self, CallFrame, '$!interp', pir::getinterp__P);
nqp::bindattr($self, CallFrame, '%!annotations',
Q:PIR {
.local pmc interp, annon
.local int level
interp = find_lex '$interp'
$P0 = find_lex '$l'
level = repr_unbox_int $P0
annon = interp["annotations"; level]
%r = perl6ize_type annon
}
);
my Mu $lexpad := Q:PIR {
.local pmc interp
.local int level
interp = find_lex '$interp'
$P0 = find_lex '$l'
level = $P0
# no idea why we need this:
%r = interp["lexpad"; level]
};
my $h := nqp::create(EnumMap);
nqp::bindattr($h, EnumMap, '$!storage', $lexpad);
nqp::bindattr($self, CallFrame, '%!my', $h);
$self;
}
method line() {
%.annotations<line>;
}
method file() {
%.annotations<file>;
}
method callframe(Int $level = 0) {
X::NYI.new(feature => 'Callframe.callframe').throw;
}
}
sub callframe(Int $level = 0) {
CallFrame.new(level => ($level + 1));
}
# vim: ft=perl6