Skip to content

Commit 013f2d8

Browse files
s-hadingerhawa-lc4
authored andcommitted
Berry remove reuse of methods for interface-like code reuse arendst#21500 (arendst#22055)
1 parent 575c690 commit 013f2d8

File tree

9 files changed

+30
-82
lines changed

9 files changed

+30
-82
lines changed

CHANGELOG.md

+1
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ All notable changes to this project will be documented in this file.
2525
- Matter fix Waterleak broken after Berry solidification optimisation #21885
2626

2727
### Removed
28+
- Berry remove reuse of methods for interface-like code reuse #21500
2829

2930
## [14.2.0.2] 20240823
3031
### Changed

lib/libesp32/berry/src/be_code.c

+3-3
Original file line numberDiff line numberDiff line change
@@ -695,7 +695,7 @@ static void setsfxvar(bfuncinfo *finfo, bopcode op, bexpdesc *e1, int src)
695695
/* e1 must be in a register and have a valid idx */
696696
/* if `keep_reg` is true, do not release register */
697697
/* return 1 if assignment was possible, 0 if type is not compatible */
698-
int be_code_setvar(bfuncinfo *finfo, bexpdesc *e1, bexpdesc *e2, bbool keep_reg, bbool ismethod)
698+
int be_code_setvar(bfuncinfo *finfo, bexpdesc *e1, bexpdesc *e2, bbool keep_reg)
699699
{
700700
/* free_e2 indicates special case where ETINDEX or ETMEMBER need to be freed if top of registers */
701701
bbool free_e2 = (e2->type == ETINDEX || e2->type == ETMEMBER) && (e2->v.ss.idx != e1->v.idx) && (e2->v.ss.idx == finfo->freereg - 1);
@@ -729,7 +729,7 @@ int be_code_setvar(bfuncinfo *finfo, bexpdesc *e1, bexpdesc *e2, bbool keep_reg,
729729
break;
730730
case ETMEMBER: /* store to member R(A).RK(B) <- RK(C) */
731731
case ETINDEX: /* store to member R(A)[RK(B)] <- RK(C) */
732-
setsfxvar(finfo, (e1->type == ETMEMBER) ? (ismethod ? OP_SETMET : OP_SETMBR) : OP_SETIDX, e1, src);
732+
setsfxvar(finfo, (e1->type == ETMEMBER) ? OP_SETMBR : OP_SETIDX, e1, src);
733733
if (keep_reg && e2->type == ETREG && e1->v.ss.obj >= be_list_count(finfo->local)) {
734734
/* special case of walrus assignemnt when we need to recreate an ETREG */
735735
code_move(finfo, e1->v.ss.obj, src); /* move from ETREG to MEMBER instance*/
@@ -923,7 +923,7 @@ void be_code_import(bfuncinfo *finfo, bexpdesc *m, bexpdesc *v)
923923
codeABC(finfo, OP_IMPORT, dst, src, 0);
924924
m->type = ETREG;
925925
m->v.idx = dst;
926-
be_code_setvar(finfo, v, m, bfalse, bfalse);
926+
be_code_setvar(finfo, v, m, bfalse);
927927
}
928928
}
929929

lib/libesp32/berry/src/be_code.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ int be_code_allocregs(bfuncinfo *finfo, int count);
1616
void be_code_prebinop(bfuncinfo *finfo, int op, bexpdesc *e);
1717
void be_code_binop(bfuncinfo *finfo, int op, bexpdesc *e1, bexpdesc *e2, int dst);
1818
int be_code_unop(bfuncinfo *finfo, int op, bexpdesc *e);
19-
int be_code_setvar(bfuncinfo *finfo, bexpdesc *e1, bexpdesc *e2, bbool keep_reg, bbool ismethod);
19+
int be_code_setvar(bfuncinfo *finfo, bexpdesc *e1, bexpdesc *e2, bbool keep_reg);
2020
int be_code_nextreg(bfuncinfo *finfo, bexpdesc *e);
2121
int be_code_jump(bfuncinfo *finfo);
2222
void be_code_jumpto(bfuncinfo *finfo, int dst);

lib/libesp32/berry/src/be_debug.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ void be_print_inst(binstruction ins, int pc, void* fout)
6262
case OP_ADD: case OP_SUB: case OP_MUL: case OP_DIV:
6363
case OP_MOD: case OP_LT: case OP_LE: case OP_EQ:
6464
case OP_NE: case OP_GT: case OP_GE: case OP_CONNECT:
65-
case OP_GETMBR: case OP_SETMBR: case OP_GETMET: case OP_SETMET:
65+
case OP_GETMBR: case OP_SETMBR: case OP_GETMET:
6666
case OP_GETIDX: case OP_SETIDX: case OP_AND:
6767
case OP_OR: case OP_XOR: case OP_SHL: case OP_SHR:
6868
logbuf("%s\tR%d\t%c%d\t%c%d", opc2str(op), IGET_RA(ins),

lib/libesp32/berry/src/be_opcodes.h

+1-2
Original file line numberDiff line numberDiff line change
@@ -54,5 +54,4 @@ OPCODE(CATCH), /* A, B, C | ... */
5454
OPCODE(RAISE), /* A, B, C | RAISE(B,C) B is code, C is description. A==0 only B provided, A==1 B and C are provided, A==2 rethrow with both parameters already on stack */
5555
OPCODE(CLASS), /* Bx | init class in K[Bx] */
5656
OPCODE(GETNGBL), /* A, B | R(A) <- GLOBAL[RK(B)] by name */
57-
OPCODE(SETNGBL), /* A, B | R(A) -> GLOBAL[RK(B)] by name */
58-
OPCODE(SETMET), /* A, B, C | R(A).RK(B) <- RK(C) only if R(A) is a class, and RK(C) is marked as non-static */
57+
OPCODE(SETNGBL) /* A, B | R(A) -> GLOBAL[RK(B)] by name */

lib/libesp32/berry/src/be_parser.c

+21-32
Original file line numberDiff line numberDiff line change
@@ -634,7 +634,7 @@ static bproto* funcbody(bparser *parser, bstring *name, bclass *c, int type)
634634
new_var(parser, parser_newstr(parser, "_class"), &e1); /* new implicit variable '_class' */
635635
init_exp(&e2, ETCONST, 0);
636636
be_code_implicit_class(parser->finfo, &e2, c);
637-
be_code_setvar(parser->finfo, &e1, &e2, bfalse, bfalse);
637+
be_code_setvar(parser->finfo, &e1, &e2, bfalse);
638638
finfo.proto->varg |= BE_VA_STATICMETHOD;
639639
}
640640
stmtlist(parser); /* parse statement without final `end` */
@@ -738,7 +738,7 @@ static void map_nextmember(bparser *parser, bexpdesc *l)
738738
match_token(parser, OptColon); /* ':' */
739739
expr(parser, &e); /* value in `e` */
740740
check_var(parser, &e); /* check if value is correct */
741-
be_code_setvar(finfo, &v, &e, bfalse, bfalse); /* set suffi INDEX value to e */
741+
be_code_setvar(finfo, &v, &e, bfalse); /* set suffi INDEX value to e */
742742
}
743743

744744
static void list_expr(bparser *parser, bexpdesc *e)
@@ -1018,7 +1018,7 @@ static void assign_expr(bparser *parser)
10181018
if (check_newvar(parser, &e)) { /* new variable */
10191019
new_var(parser, e.v.s, &e);
10201020
}
1021-
if (be_code_setvar(parser->finfo, &e, &e1, bfalse, bfalse)) {
1021+
if (be_code_setvar(parser->finfo, &e, &e1, bfalse)) {
10221022
parser->lexer.linenumber = line;
10231023
parser_error(parser,
10241024
"try to assign constant expressions.");
@@ -1121,7 +1121,7 @@ static void walrus_expr(bparser *parser, bexpdesc *e)
11211121
if (check_newvar(parser, &e1)) { /* new variable */
11221122
new_var(parser, e1.v.s, &e1);
11231123
}
1124-
if (be_code_setvar(parser->finfo, &e1, e, btrue /* do not release register */, bfalse)) {
1124+
if (be_code_setvar(parser->finfo, &e1, e, btrue /* do not release register */ )) {
11251125
parser->lexer.linenumber = line;
11261126
parser_error(parser,
11271127
"try to assign constant expressions.");
@@ -1254,7 +1254,7 @@ static void for_iter(bparser *parser, bstring *var, bexpdesc *it)
12541254
finfo->binfo->beginpc = finfo->pc;
12551255
/* itvar = .it() */
12561256
init_exp(&e, ETLOCAL, new_localvar(parser, var)); /* new itvar */
1257-
be_code_setvar(finfo, &e, it, bfalse, bfalse); /* code function to variable '.it' */
1257+
be_code_setvar(finfo, &e, it, bfalse); /* code function to variable '.it' */
12581258
be_code_call(finfo, e.v.idx, 0); /* itvar <- call .it() */
12591259
stmtlist(parser);
12601260
}
@@ -1435,7 +1435,7 @@ static void classvar_stmt(bparser *parser, bclass *c)
14351435
}
14361436
}
14371437

1438-
static void class_static_assignment_expr(bparser *parser, bexpdesc *e, bstring *name, bbool ismethod)
1438+
static void class_static_assignment_expr(bparser *parser, bexpdesc *e, bstring *name)
14391439
{
14401440
if (match_skip(parser, OptAssign)) { /* '=' */
14411441
bexpdesc e1, e2;
@@ -1448,32 +1448,22 @@ static void class_static_assignment_expr(bparser *parser, bexpdesc *e, bstring *
14481448
key.v.s = name;
14491449

14501450
be_code_member(parser->finfo, &e1, &key); /* compute member accessor */
1451-
be_code_setvar(parser->finfo, &e1, &e2, bfalse, ismethod); /* set member */
1451+
be_code_setvar(parser->finfo, &e1, &e2, bfalse); /* set member */
14521452
}
14531453
}
14541454

1455-
static void classdef_stmt(bparser *parser, bclass *c, bexpdesc *e, bbool is_static)
1455+
static void classdef_stmt(bparser *parser, bclass *c, bbool is_static)
14561456
{
1457-
bexpdesc e1;
1457+
bexpdesc e;
14581458
bstring *name;
14591459
bproto *proto;
14601460
/* 'def' ID '(' varlist ')' block 'end' */
1461-
/* 'def' ID = funcname */
1462-
/* 'def' ID = classname '.' method */
14631461
scan_next_token(parser); /* skip 'def' */
1464-
name = func_name(parser, &e1, 1);
1465-
check_class_attr(parser, c, name); /* check that we don't redefine an existing name within the class */
1466-
if (next_type(parser) == OptAssign) {
1467-
/* 'def' ID = funcname */
1468-
/* 'def' ID = classname '.' method */
1469-
be_class_member_bind(parser->vm, c, name, bfalse);
1470-
class_static_assignment_expr(parser, e, name, !is_static);
1471-
} else {
1472-
/* 'def' ID '(' varlist ')' block 'end' */
1473-
proto = funcbody(parser, name, c, is_static ? FUNC_STATIC : FUNC_METHOD);
1474-
be_class_method_bind(parser->vm, c, proto->name, proto, is_static);
1475-
be_stackpop(parser->vm, 1);
1476-
}
1462+
name = func_name(parser, &e, 1);
1463+
check_class_attr(parser, c, name);
1464+
proto = funcbody(parser, name, c, is_static ? FUNC_STATIC : FUNC_METHOD);
1465+
be_class_method_bind(parser->vm, c, proto->name, proto, is_static);
1466+
be_stackpop(parser->vm, 1);
14771467
}
14781468

14791469
static void classstaticclass_stmt(bparser *parser, bclass *c_out, bexpdesc *e_out);
@@ -1483,10 +1473,9 @@ static void classstatic_stmt(bparser *parser, bclass *c, bexpdesc *e)
14831473
bstring *name;
14841474
/* 'static' ['var'] ID ['=' expr] {',' ID ['=' expr] } */
14851475
/* 'static' 'def' ID '(' varlist ')' block 'end' */
1486-
/* 'static' 'def' ID '=' func */
14871476
scan_next_token(parser); /* skip 'static' */
14881477
if (next_type(parser) == KeyDef) { /* 'static' 'def' ... */
1489-
classdef_stmt(parser, c, e, btrue);
1478+
classdef_stmt(parser, c, btrue);
14901479
} else if (next_type(parser) == KeyClass) { /* 'static' 'class' ... */
14911480
classstaticclass_stmt(parser, c, e);
14921481
} else {
@@ -1496,13 +1485,13 @@ static void classstatic_stmt(bparser *parser, bclass *c, bexpdesc *e)
14961485
if (match_id(parser, name) != NULL) {
14971486
check_class_attr(parser, c, name);
14981487
be_class_member_bind(parser->vm, c, name, bfalse);
1499-
class_static_assignment_expr(parser, e, name, bfalse);
1488+
class_static_assignment_expr(parser, e, name);
15001489

15011490
while (match_skip(parser, OptComma)) { /* ',' */
15021491
if (match_id(parser, name) != NULL) {
15031492
check_class_attr(parser, c, name);
15041493
be_class_member_bind(parser->vm, c, name, bfalse);
1505-
class_static_assignment_expr(parser, e, name, bfalse);
1494+
class_static_assignment_expr(parser, e, name);
15061495
} else {
15071496
parser_error(parser, "class static error");
15081497
}
@@ -1532,7 +1521,7 @@ static void class_block(bparser *parser, bclass *c, bexpdesc *e)
15321521
switch (next_type(parser)) {
15331522
case KeyVar: classvar_stmt(parser, c); break;
15341523
case KeyStatic: classstatic_stmt(parser, c, e); break;
1535-
case KeyDef: classdef_stmt(parser, c, e, bfalse); break;
1524+
case KeyDef: classdef_stmt(parser, c, bfalse); break;
15361525
case OptSemic: scan_next_token(parser); break;
15371526
default: push_error(parser,
15381527
"unexpected token '%s'", token2str(parser));
@@ -1559,7 +1548,7 @@ static void class_stmt(bparser *parser)
15591548
bexpdesc e1; /* if inline class, we add a second local variable for _class */
15601549
init_exp(&e1, ETLOCAL, 0);
15611550
e1.v.idx = new_localvar(parser, class_str);
1562-
be_code_setvar(parser->finfo, &e1, &e, btrue, bfalse);
1551+
be_code_setvar(parser->finfo, &e1, &e, btrue);
15631552

15641553
begin_varinfo(parser, class_str);
15651554

@@ -1597,7 +1586,7 @@ static void classstaticclass_stmt(bparser *parser, bclass *c_out, bexpdesc *e_ou
15971586
key.v.s = name;
15981587
/* assign the class to the static member */
15991588
be_code_member(parser->finfo, &e1, &key); /* compute member accessor */
1600-
be_code_setvar(parser->finfo, &e1, &e_class, bfalse, bfalse); /* set member */
1589+
be_code_setvar(parser->finfo, &e1, &e_class, bfalse); /* set member */
16011590
} else {
16021591
parser_error(parser, "class name error");
16031592
}
@@ -1649,7 +1638,7 @@ static void var_field(bparser *parser)
16491638
init_exp(&e2, ETNIL, 0);
16501639
}
16511640
new_var(parser, name, &e1); /* new variable */
1652-
be_code_setvar(parser->finfo, &e1, &e2, bfalse, bfalse);
1641+
be_code_setvar(parser->finfo, &e1, &e2, bfalse);
16531642
}
16541643

16551644
static void var_stmt(bparser *parser)

lib/libesp32/berry/src/be_solidifylib.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -699,7 +699,7 @@ static void m_compact_class(bvm *vm, bbool str_literal, const bclass *cla, void*
699699
case OP_ADD: case OP_SUB: case OP_MUL: case OP_DIV:
700700
case OP_MOD: case OP_LT: case OP_LE: case OP_EQ:
701701
case OP_NE: case OP_GT: case OP_GE: case OP_CONNECT:
702-
case OP_GETMBR: case OP_SETMBR: case OP_GETMET: case OP_SETMET:
702+
case OP_GETMBR: case OP_SETMBR: case OP_GETMET:
703703
case OP_GETIDX: case OP_SETIDX: case OP_AND:
704704
case OP_OR: case OP_XOR: case OP_SHL: case OP_SHR:
705705
case OP_RAISE:

lib/libesp32/berry/src/be_vm.c

+1-2
Original file line numberDiff line numberDiff line change
@@ -994,7 +994,6 @@ static void vm_exec(bvm *vm)
994994
}
995995
dispatch();
996996
}
997-
opcase(SETMET):
998997
opcase(SETMBR): {
999998
#if BE_USE_PERF_COUNTERS
1000999
vm->counter_set++;
@@ -1021,7 +1020,7 @@ static void vm_exec(bvm *vm)
10211020
bclass *obj = var_toobj(a);
10221021
bstring *attr = var_tostr(b);
10231022
bvalue result = *c;
1024-
if (var_isfunction(&result) && (IGET_OP(ins) == OP_SETMBR)) { /* don't mark as static if SETMET was used */
1023+
if (var_isfunction(&result)) {
10251024
var_markstatic(&result);
10261025
}
10271026
if (!be_class_setmember(vm, obj, attr, &result)) {

lib/libesp32/berry/tests/set_method.be

-40
This file was deleted.

0 commit comments

Comments
 (0)