Berry add `string` to `bytes()` (#20420)

This commit is contained in:
s-hadinger 2024-01-07 15:38:29 +01:00 committed by GitHub
parent 0d300aebff
commit 298ee22ebf
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 57 additions and 7 deletions

View File

@ -34,6 +34,7 @@ All notable changes to this project will be documented in this file.
- HASPmota `haspmota.page_show()` to change page (#20333)
- Berry `introspect.set()` for class attributes (#20339)
- Support negative power on BL0942 using index 5..8 (#20322)
- Berry add `string` to `bytes()`
### Breaking Changed
- Refactoring of Berry `animate` module for WS2812 Leds (#20236)

View File

@ -309,6 +309,17 @@ static size_t buf_add_buf(buf_impl* attr, buf_impl* attr2)
return attr->len;
}
static size_t buf_add_raw(buf_impl* attr, const void* buf_raw, int32_t len)
{
uint8_t *buf = (uint8_t*) buf_raw;
if ((len > 0) && (attr->len + len <= attr->size)) {
for (int32_t i = 0; i < len; i++) {
attr->bufptr[attr->len++] = buf[i];
}
}
return attr->len;
}
static uint8_t buf_get1(buf_impl* attr, int offset)
{
if ((offset >= 0) && (offset < attr->len)) {
@ -1211,17 +1222,26 @@ static int m_merge(bvm *vm)
int argc = be_top(vm);
buf_impl attr = m_read_attributes(vm, 1); /* no resize yet */
check_ptr(vm, &attr);
if (argc >= 2 && be_isbytes(vm, 2)) {
buf_impl attr2 = m_read_attributes(vm, 2);
check_ptr(vm, &attr2);
if (argc >= 2 && (be_isbytes(vm, 2) || be_isstring(vm, 2))) {
const uint8_t * buf;
int32_t buf_len;
if (be_isbytes(vm, 2)) {
buf_impl attr2 = m_read_attributes(vm, 2);
check_ptr(vm, &attr2);
buf = attr2.bufptr;
buf_len = attr2.len;
} else {
buf = (const uint8_t *)be_tostring(vm, 2);
buf_len = strlen((const char *)buf);
}
/* allocate new object */
bytes_new_object(vm, attr.len + attr2.len);
bytes_new_object(vm, attr.len + buf_len);
buf_impl attr3 = m_read_attributes(vm, -1);
check_ptr(vm, &attr3);
buf_add_buf(&attr3, &attr);
buf_add_buf(&attr3, &attr2);
buf_add_raw(&attr3, buf, buf_len);
m_write_attributes(vm, -1, &attr3); /* update instance */
be_return(vm); /* return self */
@ -1249,13 +1269,23 @@ static int m_connect(bvm *vm)
buf_impl attr = m_read_attributes(vm, 1);
check_ptr(vm, &attr);
if (attr.fixed) { be_raise(vm, BYTES_RESIZE_ERROR, BYTES_RESIZE_MESSAGE); }
if (argc >= 2 && (be_isbytes(vm, 2) || be_isint(vm, 2))) {
if (argc >= 2 && (be_isbytes(vm, 2) || be_isint(vm, 2) || be_isstring(vm, 2))) {
if (be_isint(vm, 2)) {
bytes_resize(vm, &attr, attr.len + 1); /* resize */
buf_add1(&attr, be_toint(vm, 2));
m_write_attributes(vm, 1, &attr); /* update instance */
be_pushvalue(vm, 1);
be_return(vm); /* return self */
} else if (be_isstring(vm, 2)) {
const char *str = be_tostring(vm, 2);
size_t str_len = strlen(str);
if (str_len > 0) {
bytes_resize(vm, &attr, attr.len + str_len); /* resize */
buf_add_raw(&attr, str, str_len);
m_write_attributes(vm, 1, &attr); /* update instance */
}
be_pushvalue(vm, 1);
be_return(vm); /* return self */
} else {
buf_impl attr2 = m_read_attributes(vm, 2);
check_ptr(vm, &attr2);
@ -1266,7 +1296,7 @@ static int m_connect(bvm *vm)
be_return(vm); /* return self */
}
}
be_raise(vm, "type_error", "operand must be bytes or int");
be_raise(vm, "type_error", "operand must be bytes or int or string");
be_return_nil(vm); /* return self */
}

View File

@ -103,6 +103,13 @@ assert(str(b) == "bytes('1122334455')")
b = b2 + b1
assert(str(b) == "bytes('3344551122')")
#- + for string -#
b1 = bytes("AA")
b = b1 + ''
assert(str(b) == "bytes('AA')")
b = b1 + '01'
assert(str(b) == "bytes('AA3031')")
#- .. -#
b1 = bytes("1122")
b2 = bytes("334455")
@ -111,6 +118,13 @@ assert(str(b1) == "bytes('1122334455')")
assert(str(b2) == "bytes('334455')")
assert(str(b) == "bytes('1122334455')")
#- .. with string -#
b1 = bytes("AA")
b1 .. ''
assert(str(b1) == "bytes('AA')")
b1 .. '01'
assert(str(b1) == "bytes('AA3031')")
#- item -#
b = bytes("334455")
assert(b[0] == 0x33)
@ -257,3 +271,8 @@ assert(!bytes())
assert(bool(bytes("00")) == true)
assert(bytes("01").tobool() == true)
assert(bytes("02"))
# retrieving 3-bytes little/big endian
a = bytes("01020304")
assert(a.get(1, 3) == 0x040302)
assert(a.get(1, -3) == 0x020304)