Berry added introspect.set() for class attributes (#20339)

This commit is contained in:
s-hadinger 2023-12-29 10:17:10 +01:00 committed by GitHub
parent 1f662a6dad
commit 6a8435b731
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 28 additions and 1 deletions

View File

@ -12,6 +12,7 @@ All notable changes to this project will be documented in this file.
- Display of active drivers using command ``status 4``
- ESP32 used UART information
- HASPmota added `haspmota.page_show()` to change page
- Berry added `introspect.set()` for class attributes
### Breaking Changed
- Refactoring of Berry `animate` module for WS2812 Leds (#20236)

View File

@ -643,6 +643,10 @@ BERRY_API bbool be_setmember(bvm *vm, int index, const char *k)
bstring *key = be_newstr(vm, k);
bmodule *mod = var_toobj(o);
return be_module_setmember(vm, mod, key, v);
} else if (var_isclass(o)) {
bstring *key = be_newstr(vm, k);
bclass *cl = var_toobj(o);
return be_class_setmember(vm, cl, key, v);
}
return bfalse;
}

View File

@ -96,7 +96,7 @@ static int m_findmember(bvm *vm)
static int m_setmember(bvm *vm)
{
int top = be_top(vm);
if (top >= 3 && (be_isinstance(vm, 1) || be_ismodule(vm, 1)) && be_isstring(vm, 2)) {
if (top >= 3 && (be_isinstance(vm, 1) || be_ismodule(vm, 1) || be_isclass(vm, 1)) && be_isstring(vm, 2)) {
be_setmember(vm, 1, be_tostring(vm, 2));
be_return(vm);
}

View File

@ -42,3 +42,25 @@ assert(introspect.name(A) == 'A')
assert(introspect.name(A.a) == 'a')
assert(introspect.name(A.b) == 'b')
assert(introspect.name(A.c) == nil)
# test introspect get and set
# class and instance
class A
static var a
var b
end
a = A()
introspect.set(A, "a", 10)
assert(A.a == 10)
assert(introspect.get(A, "a") == 10)
introspect.set(a, "b", 20)
assert(a.b == 20)
assert(introspect.get(a, "b") == 20)
# module
m = module('m')
introspect.set(m, 'c', 30)
assert(m.c == 30)
assert(introspect.get(m, 'c') == 30)