Berry minor changes in ctypes class wrapper

This commit is contained in:
Stephan Hadinger 2022-03-21 19:10:07 +01:00
parent 1e57161c83
commit b72754ab06
2 changed files with 24 additions and 23 deletions

View File

@ -309,16 +309,14 @@ int be_check_arg_type(bvm *vm, int arg_start, int argc, const char * arg_type, i
p_idx++; p_idx++;
} }
// special case when no parameters are passed but all are optional
if (NULL != arg_type && arg_type[arg_idx] == '[') {
arg_optional = btrue;
arg_idx++;
}
for (uint32_t i = 0; i < argc; i++) { for (uint32_t i = 0; i < argc; i++) {
type_short_name[0] = 0; // clear string type_short_name[0] = 0; // clear string
// extract individual type // extract individual type
if (NULL != arg_type) { if (arg_type) {
if (arg_type[arg_idx] == '[' || arg_type[arg_idx] == ']') { // '[' is a marker that following parameters are optional and default to NULL
arg_optional = btrue;
arg_idx++;
}
switch (arg_type[arg_idx]) { switch (arg_type[arg_idx]) {
case '-': case '-':
arg_idx++; arg_idx++;
@ -355,10 +353,6 @@ int be_check_arg_type(bvm *vm, int arg_start, int argc, const char * arg_type, i
arg_type = NULL; // stop iterations arg_type = NULL; // stop iterations
break; break;
} }
if (arg_type && (arg_type[arg_idx] == '[' || arg_type[arg_idx] == ']')) { // '[' is a marker that following parameters are optional and default to NULL
arg_optional = btrue;
arg_idx++;
}
} }
// berry_log_C(">> be_call_c_func arg %i, type %s", i, arg_type_check ? type_short_name : "<null>"); // berry_log_C(">> be_call_c_func arg %i, type %s", i, arg_type_check ? type_short_name : "<null>");
p[p_idx] = be_convert_single_elt(vm, i + arg_start, arg_type_check ? type_short_name : NULL, &buf_len); p[p_idx] = be_convert_single_elt(vm, i + arg_start, arg_type_check ? type_short_name : NULL, &buf_len);
@ -376,7 +370,7 @@ int be_check_arg_type(bvm *vm, int arg_start, int argc, const char * arg_type, i
} }
// check if we are missing arguments // check if we are missing arguments
if (!arg_optional && arg_type && arg_type[arg_idx] != 0) { if (!arg_optional && arg_type && arg_type[arg_idx] != 0 && arg_type[arg_idx] != '[') {
be_raisef(vm, "value_error", "Missing arguments, remaining type '%s'", &arg_type[arg_idx]); be_raisef(vm, "value_error", "Missing arguments, remaining type '%s'", &arg_type[arg_idx]);
} }
return p_idx; return p_idx;
@ -487,9 +481,8 @@ int be_call_c_func(bvm *vm, const void * func, const char * return_type, const c
} else { // class name } else { // class name
be_find_global_or_module_member(vm, return_type); be_find_global_or_module_member(vm, return_type);
be_pushcomptr(vm, (void*) ret); // stack = class, ptr be_pushcomptr(vm, (void*) ret); // stack = class, ptr
be_pushcomptr(vm, (void*) -1); // stack = class, ptr, -1 be_call(vm, 1); // instanciate with 2 arguments, stack = instance, ptr, -1
be_call(vm, 2); // instanciate with 2 arguments, stack = instance, ptr, -1 be_pop(vm, 1); // stack = instance
be_pop(vm, 2); // stack = instance
be_return(vm); be_return(vm);
} }
} }

View File

@ -168,19 +168,27 @@ int lv_x_member(bvm *vm) {
be_raise(vm, "type_error", NULL); be_raise(vm, "type_error", NULL);
} }
// lv_color // lv_color - constructor
// First arg is a 24 bits RGB color //
// If first arg is `nil` second arg is the native value of color // Supports either new initialization taking 24 bits RGB
// or an existing color using native enconding
//
// Arg1 - the instance of the new lv_color object created
// Arg2 - 1/ if `int` then color is 24 bits 0xRRGGBB
// 2/ if `comptr` then color is native format (probably 16 bits)
// 3/ if no Arg2, color is 0x000000 (black)
int lco_init(bvm *vm) { int lco_init(bvm *vm) {
int argc = be_top(vm); int argc = be_top(vm);
lv_color_t lv_color = {}; // default value is all zeroes (black)
uint32_t color32 = 0x000000; // default to black uint32_t color32 = 0x000000; // default to black
if (argc > 1) { if (argc > 1) {
color32 = be_toint(vm, 2); if (be_isint(vm, 2)) { // color is RGB 24 bits
lv_color = lv_color_hex(be_toint(vm, 2));
} else if (be_iscomptr(vm, 2)) {
lv_color.full = (intptr_t) be_tocomptr(vm, 2);
} }
lv_color_t lv_color = lv_color_hex(color32);
if (argc > 2 && be_toint(vm, 3) == -1) {
lv_color.full = be_toint(vm, 2);
} }
be_pushint(vm, lv_color_to_uint32(lv_color)); be_pushint(vm, lv_color_to_uint32(lv_color));
be_setmember(vm, 1, "_p"); be_setmember(vm, 1, "_p");