Berry `bytes.resize()` for large sizes (#21716)

This commit is contained in:
s-hadinger 2024-07-01 22:53:49 +02:00 committed by GitHub
parent c8e29dafc6
commit b6c488a883
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 12 additions and 9 deletions

View File

@ -18,6 +18,7 @@ All notable changes to this project will be documented in this file.
- ESP32 TM1621 number overflow from "9999" to "12E3" (#21131) - ESP32 TM1621 number overflow from "9999" to "12E3" (#21131)
### Fixed ### Fixed
- Berry `bytes.resize()` for large sizes
### Removed ### Removed

View File

@ -223,7 +223,7 @@ static unsigned int decode_base64(unsigned char input[], unsigned char output[])
// shrink or increase. If increase, fill with zeores. Cannot go beyond `size` // shrink or increase. If increase, fill with zeores. Cannot go beyond `size`
static void buf_set_len(buf_impl* attr, const size_t len) static void buf_set_len(buf_impl* attr, const size_t len)
{ {
uint16_t old_len = attr->len; int32_t old_len = attr->len;
attr->len = ((int32_t)len <= attr->size) ? (int32_t)len : attr->size; attr->len = ((int32_t)len <= attr->size) ? (int32_t)len : attr->size;
if (old_len < attr->len) { if (old_len < attr->len) {
memset((void*) &attr->bufptr[old_len], 0, attr->len - old_len); memset((void*) &attr->bufptr[old_len], 0, attr->len - old_len);

View File

@ -79,15 +79,17 @@ static int i_readbytes(bvm *vm)
be_call(vm, 2); /* call b.resize(size) */ be_call(vm, 2); /* call b.resize(size) */
be_pop(vm, 3); /* bytes() instance is at top */ be_pop(vm, 3); /* bytes() instance is at top */
char *buffer = (char*) be_tobytes(vm, -1, NULL); /* we get the address of the internam buffer of size 'size' */ char *buffer = (char*) be_tobytes(vm, -1, NULL); /* we get the address of the internal buffer of size 'size' */
size = be_fread(fh, buffer, size); size_t read_size = be_fread(fh, buffer, size);
/* resize if something went wrong */ if (size != read_size) {
be_getmember(vm, -1, "resize"); /* resize if something went wrong */
be_pushvalue(vm, -2); be_getmember(vm, -1, "resize");
be_pushint(vm, size); be_pushvalue(vm, -2);
be_call(vm, 2); /* call b.resize(size) */ be_pushint(vm, read_size);
be_pop(vm, 3); /* bytes() instance is at top */ be_call(vm, 2); /* call b.resize(size) */
be_pop(vm, 3); /* bytes() instance is at top */
}
} else { } else {
be_pushbytes(vm, NULL, 0); be_pushbytes(vm, NULL, 0);
} }