-
Notifications
You must be signed in to change notification settings - Fork 5
/
Kernel.pir
166 lines (130 loc) · 3.05 KB
/
Kernel.pir
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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
## $Id$
=head1 TITLE
Kernel - Cardinal Kernel class
=head1 DESCRIPTION
=head2 Functions
=over
=item onload()
Perform initializations and create the kernel class
=cut
.namespace ['Kernel']
.sub 'onload' :anon :init :load
.local pmc cardinalmeta, kernelprototype
load_bytecode 'P6object.pbc'
$P0 = get_hll_global ['CardinalObject'], '!CARDINALMETA'
kernelprototype = $P0.'new_class'('Kernel', 'attr'=>'%!properties')
#cardinalmeta = $P0.'HOW'()
cardinalmeta = kernelprototype.'new'()
set_hll_global ['Kernel'], '!CARDINALMETA', cardinalmeta
#.local pmc cardinalmeta
#cardinalmeta = get_hll_global ['CardinalObject'], '!CARDINALMETA'
#cardinalmeta.'new_class'('CardinalKernel')
#$P0 = cardinalmeta.'HOW'()
#set_hll_global ['CardinalKernel'], '!CARDINALMETA', $P0
.end
=item WHENCE()
Return the invocant's auto-vivification closure.
=cut
.sub 'WHENCE' :method
$P0 = self.'WHAT'()
$P1 = $P0.'WHENCE'()
.return ($P1)
.end
=item get_bool(vtable)
Returns true if the object is defined, false otherwise
=cut
.sub '' :vtable('get_bool')
$I0 = 'defined'(self)
.return ($I0)
.end
=item print() prints to stdout
=item puts() print to stdout
=item readline() read from stdin
=cut
.sub 'print' :method
.param pmc args :slurpy
$P0 = get_hll_global 'print'
.tailcall $P0(self)
.end
.sub 'puts' :method
.param pmc args :slurpy
$P0 = get_hll_global 'puts'
.tailcall $P0(args :flat)
.end
.sub 'readline' :method
.param pmc args :slurpy
$P0 = get_hll_global 'readline'
.tailcall $P0(args)
.end
.sub 'printf' :method
.param pmc fmt
.param pmc args :slurpy
$P0 = get_hll_global 'print'
$P99 = get_hll_global ['Kernel'], '!CARDINALMETA'
$P1 = $P99.'sprintf'(fmt, args :flat)
.tailcall $P0($P1)
.end
.sub 'sprintf' :method
.param pmc fmt
.param pmc args :slurpy
$P0 = new 'CardinalString'
sprintf $P0, fmt, args
.return ($P0)
.end
=item `(cmd)
Call the OS with C<cmd>, return the ouput.
=cut
.sub '`' :method
.param string cmd
.local pmc pipe
pipe = open cmd, "-|"
.local string buffer
.local pmc output
output = new 'CardinalString'
$S0 = pop pipe # pop buf layer
goto lp
lp:
buffer = read pipe, 256
output.'concat'(buffer)
if pipe goto lp
goto done
done:
.return(output)
.end
=item
Call the OS, return C<true> if successful, otherwise C<false>
=cut
.sub 'system' :method
.param string syscall
spawnw $I0, syscall
if $I0 == 0 goto done_t
goto done_f
done_t:
$S0 = "true"
goto ret
done_f:
$S0 = "false"
goto ret
ret:
.return ($S0)
.end
.sub 'exit!' :method
.param int return
exit return
.end
.sub callcc :method
.param pmc block :named('!BLOCK')
.local pmc cont
cont = new 'CardinalContinuation'
set_addr cont, done
block(cont)
goto done
done:
.end
=back
=cut
# Local Variables:
# mode: pir
# fill-column: 100
# End:
# vim: expandtab shiftwidth=4 ft=pir: