Skip to content

Commit 9498546

Browse files
Merge pull request #507 from Wuerfel21/W21-bc-lookdown-string
P1 Bytecode: fix lookup/lookdown with string argument
2 parents 17787a8 + 4fabc77 commit 9498546

3 files changed

Lines changed: 125 additions & 1 deletion

File tree

Test/Expect/bctest005.lst

Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
00 B4 C4 04 ' CLKFREQ
2+
6F ' CLKMODE
3+
00 ' Placeholder for checksum
4+
10 00 ' PBASE
5+
8C 00 ' VBASE
6+
94 00 ' DBASE
7+
18 00 ' PCURR
8+
A4 00 ' DCURR
9+
'--- Object Header for bctest005
10+
7C 00 ' Object size
11+
02 ' Method count + 1
12+
00 ' OBJ count
13+
08 00 08 00 ' Function lookupdowns @0018 (local size 8)
14+
'--- Function lookupdowns
15+
36 ' CONSTANT 1
16+
38 15 ' FUNDATA_PUSHADDRESS +21
17+
64 ' MEM_READ LONG DBASE+$0004 (short)
18+
36 ' CONSTANT 1
19+
10 ' LOOKUP
20+
38 02 ' CONSTANT 2
21+
10 ' LOOKUP
22+
38 03 ' CONSTANT 3
23+
10 ' LOOKUP
24+
0F ' LOOKEND
25+
'LABEL
26+
3F B4 ' REG_WRITE 1F4(OUTA)
27+
36 ' CONSTANT 1
28+
38 22 ' FUNDATA_PUSHADDRESS +34
29+
64 ' MEM_READ LONG DBASE+$0004 (short)
30+
3F 92 ' REG_READ 1F2(INA)
31+
10 ' LOOKUP
32+
3F 93 ' REG_READ 1F3(INB)
33+
10 ' LOOKUP
34+
0F ' LOOKEND
35+
'LABEL
36+
3F B4 ' REG_WRITE 1F4(OUTA)
37+
36 ' CONSTANT 1
38+
38 32 ' FUNDATA_PUSHADDRESS +50
39+
64 ' MEM_READ LONG DBASE+$0004 (short)
40+
38 61 ' CONSTANT 97
41+
10 ' LOOKUP
42+
38 62 ' CONSTANT 98
43+
10 ' LOOKUP
44+
38 63 ' CONSTANT 99
45+
10 ' LOOKUP
46+
0F ' LOOKEND
47+
'LABEL
48+
3F B4 ' REG_WRITE 1F4(OUTA)
49+
36 ' CONSTANT 1
50+
38 41 ' FUNDATA_PUSHADDRESS +65
51+
64 ' MEM_READ LONG DBASE+$0004 (short)
52+
36 ' CONSTANT 1
53+
11 ' LOOKDOWN
54+
38 02 ' CONSTANT 2
55+
11 ' LOOKDOWN
56+
38 03 ' CONSTANT 3
57+
11 ' LOOKDOWN
58+
0F ' LOOKEND
59+
'LABEL
60+
3F B4 ' REG_WRITE 1F4(OUTA)
61+
36 ' CONSTANT 1
62+
38 4E ' FUNDATA_PUSHADDRESS +78
63+
64 ' MEM_READ LONG DBASE+$0004 (short)
64+
3F 92 ' REG_READ 1F2(INA)
65+
11 ' LOOKDOWN
66+
3F 93 ' REG_READ 1F3(INB)
67+
11 ' LOOKDOWN
68+
0F ' LOOKEND
69+
'LABEL
70+
3F B4 ' REG_WRITE 1F4(OUTA)
71+
36 ' CONSTANT 1
72+
38 5E ' FUNDATA_PUSHADDRESS +94
73+
64 ' MEM_READ LONG DBASE+$0004 (short)
74+
38 61 ' CONSTANT 97
75+
11 ' LOOKDOWN
76+
38 62 ' CONSTANT 98
77+
11 ' LOOKDOWN
78+
38 63 ' CONSTANT 99
79+
11 ' LOOKDOWN
80+
0F ' LOOKEND
81+
'LABEL
82+
3F B4 ' REG_WRITE 1F4(OUTA)
83+
35 ' CONSTANT 0
84+
38 79 ' FUNDATA_PUSHADDRESS +121
85+
64 ' MEM_READ LONG DBASE+$0004 (short)
86+
38 61 ' CONSTANT 97
87+
11 ' LOOKDOWN
88+
38 62 ' CONSTANT 98
89+
11 ' LOOKDOWN
90+
38 63 ' CONSTANT 99
91+
11 ' LOOKDOWN
92+
36 ' CONSTANT 1
93+
11 ' LOOKDOWN
94+
38 02 ' CONSTANT 2
95+
11 ' LOOKDOWN
96+
38 03 ' CONSTANT 3
97+
11 ' LOOKDOWN
98+
3F 92 ' REG_READ 1F2(INA)
99+
11 ' LOOKDOWN
100+
0F ' LOOKEND
101+
'LABEL
102+
3F B4 ' REG_WRITE 1F4(OUTA)
103+
32 ' RETURN_PLAIN

Test/bctest005.spin

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
2+
3+
PUB lookupdowns(i)
4+
outa := lookup(i : 1,2,3)
5+
outa := lookup(i : ina,inb)
6+
outa := lookup(i : "abc")
7+
8+
outa := lookdown(i : 1,2,3)
9+
outa := lookdown(i : ina,inb)
10+
outa := lookdown(i : "abc")
11+
12+
outa := lookdownz(i: "abc",1,2,3,ina)

backends/bytecode/outbc.c

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2239,11 +2239,20 @@ BCCompileExpression(BCIRBuffer *irbuf,AST *node,BCContext context,bool asStateme
22392239
BCCompileExpression(irbuf,list->left->left,context,false);
22402240
BCCompileExpression(irbuf,list->left->right,context,false);
22412241
lookOp.kind = isLookdown ? BOK_LOOKDOWN_RANGE : BOK_LOOKUP_RANGE;
2242+
BIRB_PushCopy(irbuf,&lookOp);
2243+
} else if (list->left->kind == AST_STRING) {
2244+
lookOp.kind = isLookdown ? BOK_LOOKDOWN : BOK_LOOKUP;
2245+
const char *str = list->left->d.string;
2246+
char chr;
2247+
while ((chr = *str++)) {
2248+
BCCompileInteger(irbuf, chr&0xff);
2249+
BIRB_PushCopy(irbuf,&lookOp);
2250+
}
22422251
} else {
22432252
BCCompileExpression(irbuf,list->left,context,false);
22442253
lookOp.kind = isLookdown ? BOK_LOOKDOWN : BOK_LOOKUP;
2254+
BIRB_PushCopy(irbuf,&lookOp);
22452255
}
2246-
BIRB_PushCopy(irbuf,&lookOp);
22472256
}
22482257

22492258
ByteOpIR lookEnd = {.kind = BOK_LOOKEND};

0 commit comments

Comments
 (0)