Skip to content

Commit 11c446d

Browse files
committed
COMMON: fix reference func issue
1 parent cbcee6c commit 11c446d

File tree

4 files changed

+42
-61
lines changed

4 files changed

+42
-61
lines changed
Lines changed: 2 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,4 @@
11
cat= cat
22
dog= dog
3-
3= 3
4-
1= 1
5-
a=b a=b
6-
a<>b a<>b
7-
{"name":"kitchen"}
8-
{"name":"hall"}
9-
{"fridge":"empty","name":"Kitchen"}
10-
{"name":"toilet","occupied":1}
11-
{"fridge":"empty","name":"Kitchen"}
12-
{"name":"hall"}
13-
toilet
3+
10
4+
20
Lines changed: 22 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -1,44 +1,26 @@
1-
' reference variable tests
2-
3-
a = "cat"
4-
b = @a
5-
6-
print "cat=", b
1+
rem reference variables not supported
72
a = "dog"
3+
b = @a
4+
a = "cat"
5+
print "cat=", a
86
print "dog=", b
9-
print "3=", len(b)
10-
print "1=", not empty(b)
11-
print "a=b", iFF(a==b, "a=b", "a<>b")
127

13-
b = "goodbye a"
14-
print "a<>b", iFF(a==b, "a=b", "a<>b")
15-
16-
dim rooms
17-
sub addRoom(byref room)
18-
rooms << byref room
8+
rem complex pseudo class method references
9+
func C
10+
func f(j)
11+
return j
12+
end
13+
local r = {}
14+
r.f = @f
15+
return r
1916
end
20-
21-
dim kitchen,hall,toilet
22-
kitchen.name= "kitchen"
23-
hall.name = "hall"
24-
toilet.name ="toilet"
25-
26-
addRoom(kitchen)
27-
addRoom(hall)
28-
29-
print rooms(0)
30-
print rooms(1)
31-
32-
kitchen.name = "Kitchen"
33-
kitchen.fridge = "empty"
34-
print rooms(0)
35-
36-
insert rooms, 0, @toilet
37-
toilet.occupied = true
38-
39-
print rooms(0)
40-
print rooms(1)
41-
print rooms(2)
42-
43-
roomref = byref rooms(0)
44-
print roomref.name
17+
func Q
18+
local r = {}
19+
r.c = C()
20+
return r
21+
end
22+
c.m = Q()
23+
j = [1,2,3]
24+
for n in c.m.c.f(j)
25+
print n
26+
next n

src/common/var_eval.c

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,9 @@
2121
bcip_t get_array_idx(var_t *array) {
2222
bcip_t idx = 0;
2323
bcip_t lev = 0;
24-
bcip_t m = 0;
25-
var_t var;
2624

2725
do {
26+
var_t var;
2827
v_init(&var);
2928
eval(&var);
3029

@@ -34,13 +33,13 @@ bcip_t get_array_idx(var_t *array) {
3433
err_varnotnum();
3534
break;
3635
} else {
37-
bcip_t i;
3836
bcip_t idim = v_getint(&var);
37+
3938
v_free(&var);
4039
idim = idim - v_lbound(array, lev);
4140

42-
m = idim;
43-
for (i = lev + 1; i < v_maxdim(array); i++) {
41+
bcip_t m = idim;
42+
for (bcip_t i = lev + 1; i < v_maxdim(array); i++) {
4443
m = m * (ABS(v_ubound(array, i) - v_lbound(array, i)) + 1);
4544
}
4645
idx += m;
@@ -228,13 +227,17 @@ var_t *code_resolve_map(var_t *var_p, int until_parens) {
228227
return var_p;
229228
}
230229

231-
var_t *resolve_var_ref(var_t *var_p) {
230+
var_t *resolve_var_ref(var_t *var_p, int *is_ptr) {
232231
switch (code_peek()) {
233232
case kwTYPE_LEVEL_BEGIN:
234-
var_p = resolve_var_ref(code_getvarptr_arridx(var_p));
233+
if (var_p->type == V_PTR) {
234+
*is_ptr = 1;
235+
} else {
236+
var_p = resolve_var_ref(code_getvarptr_arridx(var_p), is_ptr);
237+
}
235238
break;
236239
case kwTYPE_UDS_EL:
237-
var_p = resolve_var_ref(map_resolve_fields(var_p, NULL));
240+
var_p = resolve_var_ref(map_resolve_fields(var_p, NULL), is_ptr);
238241
break;
239242
}
240243
return var_p;
@@ -293,7 +296,12 @@ int code_isvar() {
293296
var_p = code_resolve_varptr(var_p, 0);
294297
break;
295298
case V_REF:
296-
var_p = resolve_var_ref(var_p);
299+
is_ptr = 0;
300+
var_p = resolve_var_ref(var_p, &is_ptr);
301+
if (is_ptr) {
302+
prog_ip = cur_ip;
303+
return 1;
304+
}
297305
break;
298306
default:
299307
if (code_peek() == kwTYPE_LEVEL_BEGIN) {

src/platform/console/Makefile.am

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ sbasic_DEPENDENCIES = $(top_srcdir)/src/common/libsb_common.a
2626
TEST_DIR=../../../samples/distro-examples/tests
2727
UNIT_TESTS=array break byref eval-test iifs matrices metaa ongoto \
2828
uds hash pass1 call_tau short-circuit strings stack-test \
29-
replace-test read-data proc optchk letbug ptr \
29+
replace-test read-data proc optchk letbug ptr ref \
3030
trycatch chain stream-files split-join sprint all scope goto
3131

3232
test: ${bin_PROGRAMS}

0 commit comments

Comments
 (0)