1 | .sub '' :main |
---|
2 | say 'START' |
---|
3 | |
---|
4 | .local pmc types, ops |
---|
5 | types = split ' ', 'Integer Float Complex' |
---|
6 | ops = split ' ', 'add sub mul div' |
---|
7 | |
---|
8 | .local pmc i1 |
---|
9 | .local string base_type, derived_type |
---|
10 | i1 = iter types |
---|
11 | next_i1: |
---|
12 | unless i1, end_i1 |
---|
13 | base_type = shift i1 |
---|
14 | derived_type = concat 'Foo', base_type |
---|
15 | |
---|
16 | $P0 = subclass base_type, derived_type |
---|
17 | |
---|
18 | .local pmc i2, cs |
---|
19 | .local string op |
---|
20 | i2 = iter ops |
---|
21 | next_i2: |
---|
22 | unless i2, end_i2 |
---|
23 | op = shift i2 |
---|
24 | |
---|
25 | cs = new 'CodeString' |
---|
26 | cs.'emit'("print '%0: 10 %1 2 = '", base_type, op) |
---|
27 | cs.'emit'("$P0 = new '%0'", base_type) |
---|
28 | cs.'emit'("$P0 = 10") |
---|
29 | cs.'emit'("%0 $P1, $P0, 2", op) |
---|
30 | cs.'emit'("say $P1") |
---|
31 | eval(cs) |
---|
32 | |
---|
33 | cs = new 'CodeString' |
---|
34 | cs.'emit'("print '%0: 10 %1 2 = '", derived_type, op) |
---|
35 | cs.'emit'("$P0 = new '%0'", derived_type) |
---|
36 | cs.'emit'("$P0 = 10") |
---|
37 | cs.'emit'("%0 $P1, $P0, 2", op) |
---|
38 | cs.'emit'("say $P1") |
---|
39 | eval(cs) |
---|
40 | |
---|
41 | goto next_i2 |
---|
42 | end_i2: |
---|
43 | |
---|
44 | goto next_i1 |
---|
45 | end_i1: |
---|
46 | |
---|
47 | say 'FINISH' |
---|
48 | .end |
---|
49 | |
---|
50 | .sub eval |
---|
51 | .param string code |
---|
52 | |
---|
53 | .local pmc PIR |
---|
54 | PIR = compreg 'PIR' |
---|
55 | |
---|
56 | .local pmc eh |
---|
57 | eh = new 'ExceptionHandler' |
---|
58 | set_addr eh, handler |
---|
59 | push_eh eh |
---|
60 | |
---|
61 | .local pmc cs |
---|
62 | cs = new ['CodeString'] |
---|
63 | cs.'emit'(".sub '' :anon") |
---|
64 | cs.'emit'(code) |
---|
65 | cs.'emit'(".end") |
---|
66 | $P0 = PIR(cs) |
---|
67 | $P0() |
---|
68 | pop_eh |
---|
69 | goto end |
---|
70 | |
---|
71 | handler: |
---|
72 | .local pmc ex |
---|
73 | .local string msg |
---|
74 | .get_results(ex) |
---|
75 | msg = ex |
---|
76 | say ex |
---|
77 | |
---|
78 | end: |
---|
79 | .end |
---|
80 | |
---|
81 | =begin output |
---|
82 | |
---|
83 | START |
---|
84 | Integer: 10 add 2 = 12 |
---|
85 | FooInteger: 10 add 2 = Multiple Dispatch: No suitable candidate found for 'add_int', with signature 'PIP->P' |
---|
86 | Integer: 10 sub 2 = 8 |
---|
87 | FooInteger: 10 sub 2 = Multiple Dispatch: No suitable candidate found for 'subtract_int', with signature 'PIP->P' |
---|
88 | Integer: 10 mul 2 = 20 |
---|
89 | FooInteger: 10 mul 2 = Multiple Dispatch: No suitable candidate found for 'multiply_int', with signature 'PIP->P' |
---|
90 | Integer: 10 div 2 = 5 |
---|
91 | FooInteger: 10 div 2 = Multiple Dispatch: No suitable candidate found for 'divide_int', with signature 'PIP->P' |
---|
92 | Float: 10 add 2 = 12 |
---|
93 | FooFloat: 10 add 2 = Multiple Dispatch: No suitable candidate found for 'add_int', with signature 'PIP->P' |
---|
94 | Float: 10 sub 2 = 8 |
---|
95 | FooFloat: 10 sub 2 = Multiple Dispatch: No suitable candidate found for 'subtract_int', with signature 'PIP->P' |
---|
96 | Float: 10 mul 2 = 20 |
---|
97 | FooFloat: 10 mul 2 = Multiple Dispatch: No suitable candidate found for 'multiply_int', with signature 'PIP->P' |
---|
98 | Float: 10 div 2 = 5 |
---|
99 | FooFloat: 10 div 2 = Multiple Dispatch: No suitable candidate found for 'divide_int', with signature 'PIP->P' |
---|
100 | Complex: 10 add 2 = 12+0i |
---|
101 | FooComplex: 10 add 2 = Multiple Dispatch: No suitable candidate found for 'add_int', with signature 'PIP->P' |
---|
102 | Complex: 10 sub 2 = 8+0i |
---|
103 | FooComplex: 10 sub 2 = Multiple Dispatch: No suitable candidate found for 'subtract_int', with signature 'PIP->P' |
---|
104 | Complex: 10 mul 2 = 20+0i |
---|
105 | FooComplex: 10 mul 2 = Multiple Dispatch: No suitable candidate found for 'multiply_int', with signature 'PIP->P' |
---|
106 | Complex: 10 div 2 = 5+0i |
---|
107 | FooComplex: 10 div 2 = Multiple Dispatch: No suitable candidate found for 'divide_int', with signature 'PIP->P' |
---|
108 | FINISH |
---|
109 | |
---|
110 | =end output |
---|
111 | |
---|