-
-
Notifications
You must be signed in to change notification settings - Fork 373
/
CallFrame.pm
42 lines (36 loc) · 1.08 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
my class CallFrame {
has Int $.level;
has %.annotations;
has %.my;
method new(Int :$level = 0) {
my $l = $level + 1;
my $self := nqp::create(CallFrame);
my $i = $l;
my Mu $ctx := nqp::ctx();
while $i-- {
$ctx := nqp::ctxcaller($ctx);
}
my $h := nqp::create(EnumMap);
nqp::bindattr($h, EnumMap, '$!storage', $ctx);
nqp::bindattr($self, CallFrame, '%!my', $h);
nqp::bindattr($self, CallFrame, '$!level', $l);
my $e := nqp::handle(nqp::die(''), 'CATCH', nqp::exception());
my $bt := nqp::backtrace($e);
nqp::bindattr($self, CallFrame, '%!annotations',
nqp::hllize(nqp::atkey(nqp::atpos($bt, $l), 'annotations')));
$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 expandtab sw=4