Merge branch 'main' of https://github.com/pocketpy/pocketpy into pr/519

This commit is contained in:
blueloveTH 2026-06-18 10:31:01 +08:00
commit fe2d06b9b1
2 changed files with 18 additions and 11 deletions

View File

@ -56,8 +56,10 @@ static bool mpack_to_py(mpack_node_t node) {
for(size_t i = 0; i < count; i++) { for(size_t i = 0; i < count; i++) {
mpack_node_t key_node = mpack_node_map_key_at(node, i); mpack_node_t key_node = mpack_node_map_key_at(node, i);
mpack_node_t val_node = mpack_node_map_value_at(node, i); mpack_node_t val_node = mpack_node_map_value_at(node, i);
if(mpack_node_type(key_node) != mpack_type_str) { mpack_type_t key_type = mpack_node_type(key_node);
return TypeError("msgpack: key must be strings"); if(key_type != mpack_type_str && key_type != mpack_type_int &&
key_type != mpack_type_uint) {
return TypeError("msgpack: key must be string or integer");
} }
if(!mpack_to_py(key_node)) return false; if(!mpack_to_py(key_node)) return false;
if(!mpack_to_py(val_node)) return false; if(!mpack_to_py(val_node)) return false;
@ -101,9 +103,14 @@ static bool py_to_mpack(py_Ref object, mpack_writer_t* writer);
static bool mpack_write_dict_kv(py_Ref k, py_Ref v, void* ctx) { static bool mpack_write_dict_kv(py_Ref k, py_Ref v, void* ctx) {
mpack_writer_t* writer = ctx; mpack_writer_t* writer = ctx;
if(k->type != tp_str) return TypeError("msgpack: key must be strings"); if(k->type == tp_str) {
c11_sv sv = py_tosv(k); c11_sv sv = py_tosv(k);
mpack_write_str(writer, sv.data, (size_t)sv.size); mpack_write_str(writer, sv.data, (size_t)sv.size);
} else if(k->type == tp_int) {
mpack_write_int(writer, py_toint(k));
} else {
return TypeError("msgpack: key must be string or integer");
}
bool ok = py_to_mpack(v, writer); bool ok = py_to_mpack(v, writer);
if(!ok) mpack_write_nil(writer); if(!ok) mpack_write_nil(writer);
return ok; return ok;
@ -160,7 +167,10 @@ static bool msgpack_dumps(int argc, py_Ref argv) {
mpack_writer_init_growable(&writer, &data, &size); mpack_writer_init_growable(&writer, &data, &size);
bool ok = py_to_mpack(argv, &writer); bool ok = py_to_mpack(argv, &writer);
if(mpack_writer_destroy(&writer) != mpack_ok) { assert(false); } if(mpack_writer_destroy(&writer) != mpack_ok) { assert(false); }
if(!ok) return false; if(!ok) {
MPACK_FREE(data);
return false;
}
assert(size <= INT32_MAX); assert(size <= INT32_MAX);
unsigned char* byte_data = py_newbytes(py_retval(), (int)size); unsigned char* byte_data = py_newbytes(py_retval(), (int)size);
memcpy(byte_data, data, size); memcpy(byte_data, data, size);

View File

@ -65,11 +65,8 @@ assert msgpack.dumps([]) == b'\x90'
assert msgpack.dumps([1, 2, 3]) == b'\x93\x01\x02\x03' assert msgpack.dumps([1, 2, 3]) == b'\x93\x01\x02\x03'
assert msgpack.dumps([1]) == b'\x91\x01' assert msgpack.dumps([1]) == b'\x91\x01'
try: _o = msgpack.dumps({1: 2})
msgpack.dumps({1: 2}) assert msgpack.loads(_o) == {1: 2}
assert False
except TypeError:
assert True
try: try:
msgpack.dumps(type) msgpack.dumps(type)