Merge branch 'development' into pre-release-9.5.0

This commit is contained in:
Theo Arends 2021-06-14 14:32:38 +02:00
commit 6f03368c85
5 changed files with 35 additions and 9 deletions

View File

@ -184,13 +184,14 @@ static binstance* newobject(bvm *vm, bclass *c)
return obj;
}
bbool be_class_newobj(bvm *vm, bclass *c, bvalue *reg, int argc)
bbool be_class_newobj(bvm *vm, bclass *c, bvalue *reg, int argc, int mode)
{
bvalue init;
size_t pos = reg - vm->reg;
binstance *obj = newobject(vm, c);
reg = vm->reg + pos; /* the stack may have changed */
reg = vm->reg + pos - mode; /* the stack may have changed */
var_setinstance(reg, obj);
var_setinstance(reg + mode, obj);
/* find constructor */
obj = instance_member(vm, obj, str_literal(vm, "init"), &init);
if (obj && var_type(&init) != MT_VARIABLE) {

View File

@ -55,7 +55,7 @@ void be_prim_method_bind(bvm *vm, bclass *c, bstring *name, bntvfunc f);
void be_closure_method_bind(bvm *vm, bclass *c, bstring *name, bclosure *cl);
int be_class_closure_count(bclass *c);
void be_class_upvalue_init(bvm *vm, bclass *c);
bbool be_class_newobj(bvm *vm, bclass *c, bvalue *argv, int argc);
bbool be_class_newobj(bvm *vm, bclass *c, bvalue *argv, int argc, int mode);
int be_instance_member(bvm *vm, binstance *obj, bstring *name, bvalue *dst);
bbool be_instance_setmember(bvm *vm, binstance *obj, bstring *name, bvalue *src);

View File

@ -990,8 +990,9 @@ newframe: /* a new call frame */
++var, --argc, mode = 1;
goto recall;
case BE_CLASS:
if (be_class_newobj(vm, var_toobj(var), var, ++argc)) {
reg = vm->reg;
if (be_class_newobj(vm, var_toobj(var), var, ++argc, mode)) {
reg = vm->reg + mode;
mode = 0;
var = RA() + 1; /* to next register */
goto recall; /* call constructor */
}
@ -1109,7 +1110,7 @@ static void do_ntvfunc(bvm *vm, bvalue *reg, int argc)
static void do_class(bvm *vm, bvalue *reg, int argc)
{
if (be_class_newobj(vm, var_toobj(reg), reg, ++argc)) {
if (be_class_newobj(vm, var_toobj(reg), reg, ++argc, 0)) {
be_incrtop(vm);
be_dofunc(vm, reg + 1, argc);
be_stackpop(vm, 1);

View File

@ -20,3 +20,28 @@ for i : Test(10)
sum += i
end
assert(sum == 55, 'iteraion sum is ' + str(sum) + ' (expected 55).')
#- test case for class instanciated from module member #103 -#
m = module()
g_i = 0 #- detect side effect from init() -#
class C def init() g_i += 1 end end
m.C = C
#- normal invocation -#
assert(type(C()) == 'instance')
assert(g_i == 1)
#- invoke from module member -#
assert(type(m.C()) == 'instance')
assert(g_i == 2)
class C2 var C1 def init(c) self.C1 = c end end
m.C2 = C2
c2 = m.C2(m.C)
assert(c2.C1 == C)
c3 = m.C2(m.C())
assert(type(c3.C1) == 'instance')
assert(classname(c3.C1) == 'C')

View File

@ -220,10 +220,9 @@ void Pcf8574Show(bool json)
{
uint8_t gpio = Pcf8574Read(idx);
ResponseAppend_P(PSTR(",\"PCF8574%c%d\":{\"D0\":%i,\"D1\":%i,\"D2\":%i,\"D3\":%i,\"D4\":%i,\"D5\":%i,\"D6\":%i,\"D7\":%i}"),
IndexSeparator(), idx +1,
(gpio>>0)&1,(gpio>>1)&1,(gpio>>2)&1,(gpio>>3)&1,(gpio>>4)&1,(gpio>>5)&1,(gpio>>6)&1,(gpio>>7)&1);
IndexSeparator(), idx +1,
(gpio>>0)&1,(gpio>>1)&1,(gpio>>2)&1,(gpio>>3)&1,(gpio>>4)&1,(gpio>>5)&1,(gpio>>6)&1,(gpio>>7)&1);
}
ResponseJsonEnd();
}
#endif // #ifdef USE_PCF8574_SENSOR
#if defined(USE_WEBSERVER) && defined(USE_PCF8574_DISPLAYINPUT)