Berry bool( [] ) and bool( {} ) now evaluate as false (#18986)

This commit is contained in:
s-hadinger 2023-06-27 22:07:13 +02:00 committed by GitHub
parent 694bebb574
commit b9588e6192
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 146 additions and 103 deletions

View File

@ -7,6 +7,7 @@ All notable changes to this project will be documented in this file.
### Added ### Added
### Breaking Changed ### Breaking Changed
- Berry `bool( [] )` and `bool( {} )` now evaluate as `false`
### Changed ### Changed

View File

@ -262,6 +262,14 @@ static int m_size(bvm *vm)
be_return(vm); be_return(vm);
} }
static int m_tobool(bvm *vm)
{
be_getmember(vm, 1, ".p");
list_check_data(vm, 1);
be_pushbool(vm, be_data_size(vm, -1) > 0);
be_return(vm);
}
static int m_resize(bvm *vm) static int m_resize(bvm *vm)
{ {
be_getmember(vm, 1, ".p"); be_getmember(vm, 1, ".p");
@ -507,6 +515,7 @@ void be_load_listlib(bvm *vm)
{ "reverse", m_reverse }, { "reverse", m_reverse },
{ "copy", m_copy }, { "copy", m_copy },
{ "keys", m_keys }, { "keys", m_keys },
{ "tobool", m_tobool }
{ "..", m_connect }, { "..", m_connect },
{ "+", m_merge }, { "+", m_merge },
{ "==", m_equal }, { "==", m_equal },
@ -536,6 +545,7 @@ class be_class_list (scope: global, name: list) {
reverse, func(m_reverse) reverse, func(m_reverse)
copy, func(m_copy) copy, func(m_copy)
keys, func(m_keys) keys, func(m_keys)
tobool, func(m_tobool)
.., func(m_connect) .., func(m_connect)
+, func(m_merge) +, func(m_merge)
==, func(m_equal) ==, func(m_equal)

View File

@ -150,6 +150,14 @@ static int m_size(bvm *vm)
be_return(vm); be_return(vm);
} }
static int m_tobool(bvm *vm)
{
be_getmember(vm, 1, ".p");
map_check_data(vm, 1);
be_pushbool(vm, be_data_size(vm, -1) > 0);
be_return(vm);
}
static int iter_closure(bvm *vm) static int iter_closure(bvm *vm)
{ {
/* for better performance, we operate the upvalues /* for better performance, we operate the upvalues
@ -229,6 +237,7 @@ void be_load_maplib(bvm *vm)
{ "insert", m_insert }, { "insert", m_insert },
{ "iter", m_iter }, { "iter", m_iter },
{ "keys", m_keys }, { "keys", m_keys },
{ "tobool", m_tobool }
{ NULL, NULL } { NULL, NULL }
}; };
be_regclass(vm, "map", members); be_regclass(vm, "map", members);
@ -249,6 +258,7 @@ class be_class_map (scope: global, name: map) {
insert, func(m_insert) insert, func(m_insert)
iter, func(m_iter) iter, func(m_iter)
keys, func(m_keys) keys, func(m_keys)
tobool, func(m_tobool)
} }
@const_object_info_end */ @const_object_info_end */
#include "../generate/be_fixed_be_class_map.h" #include "../generate/be_fixed_be_class_map.h"

View File

@ -36,7 +36,13 @@ assert(bool(3.5) == true)
assert(bool('') == false) # changed behavior assert(bool('') == false) # changed behavior
assert(bool('a') == true) assert(bool('a') == true)
assert(bool(list) == true) assert(bool(list) == true)
assert(bool(list()) == true) assert(bool(list()) == false) # changed behavior
assert(bool([]) == false) # changed behavior
assert(bool([0]) == true)
assert(bool(map()) == false) # changed behavior
assert(bool({}) == false) # changed behavior
assert(bool({false:false}) == true)
assert(bool({nil:nil}) == false)# changed behavior - `nil` key is ignored so the map is empty
import introspect import introspect
assert(bool(introspect.toptr(0x1000)) == true) assert(bool(introspect.toptr(0x1000)) == true)

View File

@ -85,7 +85,7 @@ class Tasmota
# Rules # Rules
def add_rule(pat, f, id) def add_rule(pat, f, id)
self.check_not_method(f) self.check_not_method(f)
if !self._rules if self._rules == nil
self._rules = [] self._rules = []
end end
if type(f) == 'function' if type(f) == 'function'
@ -186,7 +186,9 @@ class Tasmota
def set_timer(delay,f,id) def set_timer(delay,f,id)
self.check_not_method(f) self.check_not_method(f)
if !self._timers self._timers=[] end if self._timers == nil
self._timers=[]
end
self._timers.push(Trigger(self.millis(delay),f,id)) self._timers.push(Trigger(self.millis(delay),f,id))
end end
@ -245,7 +247,9 @@ class Tasmota
# crontab style recurring events # crontab style recurring events
def add_cron(pattern,f,id) def add_cron(pattern,f,id)
self.check_not_method(f) self.check_not_method(f)
if !self._crons self._crons=[] end if self._crons == nil
self._crons=[]
end
var cron_obj = ccronexpr(str(pattern)) # can fail, throwing an exception var cron_obj = ccronexpr(str(pattern)) # can fail, throwing an exception
var next_time = cron_obj.next() var next_time = cron_obj.next()
@ -285,7 +289,7 @@ class Tasmota
# Add command to list # Add command to list
def add_cmd(c,f) def add_cmd(c,f)
self.check_not_method(f) self.check_not_method(f)
if !self._ccmd if self._ccmd == nil
self._ccmd = {} self._ccmd = {}
end end
if type(f) == 'function' if type(f) == 'function'
@ -546,7 +550,9 @@ class Tasmota
def add_fast_loop(cl) def add_fast_loop(cl)
self.check_not_method(cl) self.check_not_method(cl)
if !self._fl self._fl = [] end if self._fl == nil
self._fl = []
end
if type(cl) != 'function' raise "value_error", "argument must be a function" end if type(cl) != 'function' raise "value_error", "argument must be a function" end
self.global.fast_loop_enabled = 1 # enable fast_loop at global level: `TasmotaGlobal.fast_loop_enabled = true` self.global.fast_loop_enabled = 1 # enable fast_loop at global level: `TasmotaGlobal.fast_loop_enabled = true`
self._fl.push(cl) self._fl.push(cl)

View File

@ -854,26 +854,28 @@ be_local_closure(Tasmota_set_timer, /* name */
}), }),
&be_const_str_set_timer, &be_const_str_set_timer,
&be_const_str_solidified, &be_const_str_solidified,
( &(const binstruction[19]) { /* code */ ( &(const binstruction[21]) { /* code */
0x8C100100, // 0000 GETMET R4 R0 K0 0x8C100100, // 0000 GETMET R4 R0 K0
0x5C180400, // 0001 MOVE R6 R2 0x5C180400, // 0001 MOVE R6 R2
0x7C100400, // 0002 CALL R4 2 0x7C100400, // 0002 CALL R4 2
0x88100101, // 0003 GETMBR R4 R0 K1 0x88100101, // 0003 GETMBR R4 R0 K1
0x74120002, // 0004 JMPT R4 #0008 0x4C140000, // 0004 LDNIL R5
0x60100012, // 0005 GETGBL R4 G18 0x1C100805, // 0005 EQ R4 R4 R5
0x7C100000, // 0006 CALL R4 0 0x78120002, // 0006 JMPF R4 #000A
0x90020204, // 0007 SETMBR R0 K1 R4 0x60100012, // 0007 GETGBL R4 G18
0x88100101, // 0008 GETMBR R4 R0 K1 0x7C100000, // 0008 CALL R4 0
0x8C100902, // 0009 GETMET R4 R4 K2 0x90020204, // 0009 SETMBR R0 K1 R4
0xB81A0600, // 000A GETNGBL R6 K3 0x88100101, // 000A GETMBR R4 R0 K1
0x8C1C0104, // 000B GETMET R7 R0 K4 0x8C100902, // 000B GETMET R4 R4 K2
0x5C240200, // 000C MOVE R9 R1 0xB81A0600, // 000C GETNGBL R6 K3
0x7C1C0400, // 000D CALL R7 2 0x8C1C0104, // 000D GETMET R7 R0 K4
0x5C200400, // 000E MOVE R8 R2 0x5C240200, // 000E MOVE R9 R1
0x5C240600, // 000F MOVE R9 R3 0x7C1C0400, // 000F CALL R7 2
0x7C180600, // 0010 CALL R6 3 0x5C200400, // 0010 MOVE R8 R2
0x7C100400, // 0011 CALL R4 2 0x5C240600, // 0011 MOVE R9 R3
0x80000000, // 0012 RET 0 0x7C180600, // 0012 CALL R6 3
0x7C100400, // 0013 CALL R4 2
0x80000000, // 0014 RET 0
}) })
) )
); );
@ -903,32 +905,34 @@ be_local_closure(Tasmota_add_cron, /* name */
}), }),
&be_const_str_add_cron, &be_const_str_add_cron,
&be_const_str_solidified, &be_const_str_solidified,
( &(const binstruction[25]) { /* code */ ( &(const binstruction[27]) { /* code */
0x8C100100, // 0000 GETMET R4 R0 K0 0x8C100100, // 0000 GETMET R4 R0 K0
0x5C180400, // 0001 MOVE R6 R2 0x5C180400, // 0001 MOVE R6 R2
0x7C100400, // 0002 CALL R4 2 0x7C100400, // 0002 CALL R4 2
0x88100101, // 0003 GETMBR R4 R0 K1 0x88100101, // 0003 GETMBR R4 R0 K1
0x74120002, // 0004 JMPT R4 #0008 0x4C140000, // 0004 LDNIL R5
0x60100012, // 0005 GETGBL R4 G18 0x1C100805, // 0005 EQ R4 R4 R5
0x7C100000, // 0006 CALL R4 0 0x78120002, // 0006 JMPF R4 #000A
0x90020204, // 0007 SETMBR R0 K1 R4 0x60100012, // 0007 GETGBL R4 G18
0xB8120400, // 0008 GETNGBL R4 K2 0x7C100000, // 0008 CALL R4 0
0x60140008, // 0009 GETGBL R5 G8 0x90020204, // 0009 SETMBR R0 K1 R4
0x5C180200, // 000A MOVE R6 R1 0xB8120400, // 000A GETNGBL R4 K2
0x7C140200, // 000B CALL R5 1 0x60140008, // 000B GETGBL R5 G8
0x7C100200, // 000C CALL R4 1 0x5C180200, // 000C MOVE R6 R1
0x8C140903, // 000D GETMET R5 R4 K3 0x7C140200, // 000D CALL R5 1
0x7C140200, // 000E CALL R5 1 0x7C100200, // 000E CALL R4 1
0x88180101, // 000F GETMBR R6 R0 K1 0x8C140903, // 000F GETMET R5 R4 K3
0x8C180D04, // 0010 GETMET R6 R6 K4 0x7C140200, // 0010 CALL R5 1
0xB8220A00, // 0011 GETNGBL R8 K5 0x88180101, // 0011 GETMBR R6 R0 K1
0x5C240A00, // 0012 MOVE R9 R5 0x8C180D04, // 0012 GETMET R6 R6 K4
0x5C280400, // 0013 MOVE R10 R2 0xB8220A00, // 0013 GETNGBL R8 K5
0x5C2C0600, // 0014 MOVE R11 R3 0x5C240A00, // 0014 MOVE R9 R5
0x5C300800, // 0015 MOVE R12 R4 0x5C280400, // 0015 MOVE R10 R2
0x7C200800, // 0016 CALL R8 4 0x5C2C0600, // 0016 MOVE R11 R3
0x7C180400, // 0017 CALL R6 2 0x5C300800, // 0017 MOVE R12 R4
0x80000000, // 0018 RET 0 0x7C200800, // 0018 CALL R8 4
0x7C180400, // 0019 CALL R6 2
0x80000000, // 001A RET 0
}) })
) )
); );
@ -2068,25 +2072,27 @@ be_local_closure(Tasmota_add_cmd, /* name */
}), }),
&be_const_str_add_cmd, &be_const_str_add_cmd,
&be_const_str_solidified, &be_const_str_solidified,
( &(const binstruction[18]) { /* code */ ( &(const binstruction[20]) { /* code */
0x8C0C0100, // 0000 GETMET R3 R0 K0 0x8C0C0100, // 0000 GETMET R3 R0 K0
0x5C140400, // 0001 MOVE R5 R2 0x5C140400, // 0001 MOVE R5 R2
0x7C0C0400, // 0002 CALL R3 2 0x7C0C0400, // 0002 CALL R3 2
0x880C0101, // 0003 GETMBR R3 R0 K1 0x880C0101, // 0003 GETMBR R3 R0 K1
0x740E0002, // 0004 JMPT R3 #0008 0x4C100000, // 0004 LDNIL R4
0x600C0013, // 0005 GETGBL R3 G19 0x1C0C0604, // 0005 EQ R3 R3 R4
0x7C0C0000, // 0006 CALL R3 0 0x780E0002, // 0006 JMPF R3 #000A
0x90020203, // 0007 SETMBR R0 K1 R3 0x600C0013, // 0007 GETGBL R3 G19
0x600C0004, // 0008 GETGBL R3 G4 0x7C0C0000, // 0008 CALL R3 0
0x5C100400, // 0009 MOVE R4 R2 0x90020203, // 0009 SETMBR R0 K1 R3
0x7C0C0200, // 000A CALL R3 1 0x600C0004, // 000A GETGBL R3 G4
0x1C0C0702, // 000B EQ R3 R3 K2 0x5C100400, // 000B MOVE R4 R2
0x780E0002, // 000C JMPF R3 #0010 0x7C0C0200, // 000C CALL R3 1
0x880C0101, // 000D GETMBR R3 R0 K1 0x1C0C0702, // 000D EQ R3 R3 K2
0x980C0202, // 000E SETIDX R3 R1 R2 0x780E0002, // 000E JMPF R3 #0012
0x70020000, // 000F JMP #0011 0x880C0101, // 000F GETMBR R3 R0 K1
0xB0060704, // 0010 RAISE 1 K3 K4 0x980C0202, // 0010 SETIDX R3 R1 R2
0x80000000, // 0011 RET 0 0x70020000, // 0011 JMP #0013
0xB0060704, // 0012 RAISE 1 K3 K4
0x80000000, // 0013 RET 0
}) })
) )
); );
@ -2178,28 +2184,30 @@ be_local_closure(Tasmota_add_fast_loop, /* name */
}), }),
&be_const_str_add_fast_loop, &be_const_str_add_fast_loop,
&be_const_str_solidified, &be_const_str_solidified,
( &(const binstruction[21]) { /* code */ ( &(const binstruction[23]) { /* code */
0x8C080100, // 0000 GETMET R2 R0 K0 0x8C080100, // 0000 GETMET R2 R0 K0
0x5C100200, // 0001 MOVE R4 R1 0x5C100200, // 0001 MOVE R4 R1
0x7C080400, // 0002 CALL R2 2 0x7C080400, // 0002 CALL R2 2
0x88080101, // 0003 GETMBR R2 R0 K1 0x88080101, // 0003 GETMBR R2 R0 K1
0x740A0002, // 0004 JMPT R2 #0008 0x4C0C0000, // 0004 LDNIL R3
0x60080012, // 0005 GETGBL R2 G18 0x1C080403, // 0005 EQ R2 R2 R3
0x7C080000, // 0006 CALL R2 0 0x780A0002, // 0006 JMPF R2 #000A
0x90020202, // 0007 SETMBR R0 K1 R2 0x60080012, // 0007 GETGBL R2 G18
0x60080004, // 0008 GETGBL R2 G4 0x7C080000, // 0008 CALL R2 0
0x5C0C0200, // 0009 MOVE R3 R1 0x90020202, // 0009 SETMBR R0 K1 R2
0x7C080200, // 000A CALL R2 1 0x60080004, // 000A GETGBL R2 G4
0x20080502, // 000B NE R2 R2 K2 0x5C0C0200, // 000B MOVE R3 R1
0x780A0000, // 000C JMPF R2 #000E 0x7C080200, // 000C CALL R2 1
0xB0060704, // 000D RAISE 1 K3 K4 0x20080502, // 000D NE R2 R2 K2
0x88080105, // 000E GETMBR R2 R0 K5 0x780A0000, // 000E JMPF R2 #0010
0x900A0D07, // 000F SETMBR R2 K6 K7 0xB0060704, // 000F RAISE 1 K3 K4
0x88080101, // 0010 GETMBR R2 R0 K1 0x88080105, // 0010 GETMBR R2 R0 K5
0x8C080508, // 0011 GETMET R2 R2 K8 0x900A0D07, // 0011 SETMBR R2 K6 K7
0x5C100200, // 0012 MOVE R4 R1 0x88080101, // 0012 GETMBR R2 R0 K1
0x7C080400, // 0013 CALL R2 2 0x8C080508, // 0013 GETMET R2 R2 K8
0x80000000, // 0014 RET 0 0x5C100200, // 0014 MOVE R4 R1
0x7C080400, // 0015 CALL R2 2
0x80000000, // 0016 RET 0
}) })
) )
); );
@ -2232,34 +2240,36 @@ be_local_closure(Tasmota_add_rule, /* name */
}), }),
&be_const_str_add_rule, &be_const_str_add_rule,
&be_const_str_solidified, &be_const_str_solidified,
( &(const binstruction[27]) { /* code */ ( &(const binstruction[29]) { /* code */
0x8C100100, // 0000 GETMET R4 R0 K0 0x8C100100, // 0000 GETMET R4 R0 K0
0x5C180400, // 0001 MOVE R6 R2 0x5C180400, // 0001 MOVE R6 R2
0x7C100400, // 0002 CALL R4 2 0x7C100400, // 0002 CALL R4 2
0x88100101, // 0003 GETMBR R4 R0 K1 0x88100101, // 0003 GETMBR R4 R0 K1
0x74120002, // 0004 JMPT R4 #0008 0x4C140000, // 0004 LDNIL R5
0x60100012, // 0005 GETGBL R4 G18 0x1C100805, // 0005 EQ R4 R4 R5
0x7C100000, // 0006 CALL R4 0 0x78120002, // 0006 JMPF R4 #000A
0x90020204, // 0007 SETMBR R0 K1 R4 0x60100012, // 0007 GETGBL R4 G18
0x60100004, // 0008 GETGBL R4 G4 0x7C100000, // 0008 CALL R4 0
0x5C140400, // 0009 MOVE R5 R2 0x90020204, // 0009 SETMBR R0 K1 R4
0x7C100200, // 000A CALL R4 1 0x60100004, // 000A GETGBL R4 G4
0x1C100902, // 000B EQ R4 R4 K2 0x5C140400, // 000B MOVE R5 R2
0x7812000B, // 000C JMPF R4 #0019 0x7C100200, // 000C CALL R4 1
0x88100101, // 000D GETMBR R4 R0 K1 0x1C100902, // 000D EQ R4 R4 K2
0x8C100903, // 000E GETMET R4 R4 K3 0x7812000B, // 000E JMPF R4 #001B
0xB81A0800, // 000F GETNGBL R6 K4 0x88100101, // 000F GETMBR R4 R0 K1
0x881C0105, // 0010 GETMBR R7 R0 K5 0x8C100903, // 0010 GETMET R4 R4 K3
0x8C1C0F06, // 0011 GETMET R7 R7 K6 0xB81A0800, // 0011 GETNGBL R6 K4
0x5C240200, // 0012 MOVE R9 R1 0x881C0105, // 0012 GETMBR R7 R0 K5
0x7C1C0400, // 0013 CALL R7 2 0x8C1C0F06, // 0013 GETMET R7 R7 K6
0x5C200400, // 0014 MOVE R8 R2 0x5C240200, // 0014 MOVE R9 R1
0x5C240600, // 0015 MOVE R9 R3 0x7C1C0400, // 0015 CALL R7 2
0x7C180600, // 0016 CALL R6 3 0x5C200400, // 0016 MOVE R8 R2
0x7C100400, // 0017 CALL R4 2 0x5C240600, // 0017 MOVE R9 R3
0x70020000, // 0018 JMP #001A 0x7C180600, // 0018 CALL R6 3
0xB0060F08, // 0019 RAISE 1 K7 K8 0x7C100400, // 0019 CALL R4 2
0x80000000, // 001A RET 0 0x70020000, // 001A JMP #001C
0xB0060F08, // 001B RAISE 1 K7 K8
0x80000000, // 001C RET 0
}) })
) )
); );