mirror of
https://github.com/neovim/neovim.git
synced 2025-09-20 10:18:18 +00:00
api: Allow kObjectTypeNil to be zero without breaking compatibility
This commit is contained in:
@@ -100,15 +100,16 @@ typedef struct {
|
|||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
kObjectTypeNil = 0,
|
kObjectTypeNil = 0,
|
||||||
kObjectTypeBuffer,
|
|
||||||
kObjectTypeWindow,
|
|
||||||
kObjectTypeTabpage,
|
|
||||||
kObjectTypeBoolean,
|
kObjectTypeBoolean,
|
||||||
kObjectTypeInteger,
|
kObjectTypeInteger,
|
||||||
kObjectTypeFloat,
|
kObjectTypeFloat,
|
||||||
kObjectTypeString,
|
kObjectTypeString,
|
||||||
kObjectTypeArray,
|
kObjectTypeArray,
|
||||||
kObjectTypeDictionary,
|
kObjectTypeDictionary,
|
||||||
|
// EXT types, cannot be split or reordered, see #EXT_OBJECT_TYPE_SHIFT
|
||||||
|
kObjectTypeBuffer,
|
||||||
|
kObjectTypeWindow,
|
||||||
|
kObjectTypeTabpage,
|
||||||
} ObjectType;
|
} ObjectType;
|
||||||
|
|
||||||
struct object {
|
struct object {
|
||||||
|
@@ -20,13 +20,20 @@
|
|||||||
static msgpack_zone zone;
|
static msgpack_zone zone;
|
||||||
static msgpack_sbuffer sbuffer;
|
static msgpack_sbuffer sbuffer;
|
||||||
|
|
||||||
|
/// Value by which objects represented as EXT type are shifted
|
||||||
|
///
|
||||||
|
/// Subtracted when packing, added when unpacking. Used to allow moving
|
||||||
|
/// buffer/window/tabpage block inside ObjectType enum. This block yet cannot be
|
||||||
|
/// split or reordered.
|
||||||
|
#define EXT_OBJECT_TYPE_SHIFT kObjectTypeBuffer
|
||||||
|
|
||||||
#define HANDLE_TYPE_CONVERSION_IMPL(t, lt) \
|
#define HANDLE_TYPE_CONVERSION_IMPL(t, lt) \
|
||||||
bool msgpack_rpc_to_##lt(const msgpack_object *const obj, \
|
bool msgpack_rpc_to_##lt(const msgpack_object *const obj, \
|
||||||
Integer *const arg) \
|
Integer *const arg) \
|
||||||
FUNC_ATTR_NONNULL_ALL \
|
FUNC_ATTR_NONNULL_ALL \
|
||||||
{ \
|
{ \
|
||||||
if (obj->type != MSGPACK_OBJECT_EXT \
|
if (obj->type != MSGPACK_OBJECT_EXT \
|
||||||
|| obj->via.ext.type != kObjectType##t) { \
|
|| obj->via.ext.type + EXT_OBJECT_TYPE_SHIFT != kObjectType##t) { \
|
||||||
return false; \
|
return false; \
|
||||||
} \
|
} \
|
||||||
\
|
\
|
||||||
@@ -51,7 +58,8 @@ static msgpack_sbuffer sbuffer;
|
|||||||
msgpack_packer pac; \
|
msgpack_packer pac; \
|
||||||
msgpack_packer_init(&pac, &sbuffer, msgpack_sbuffer_write); \
|
msgpack_packer_init(&pac, &sbuffer, msgpack_sbuffer_write); \
|
||||||
msgpack_pack_int64(&pac, (handle_T)o); \
|
msgpack_pack_int64(&pac, (handle_T)o); \
|
||||||
msgpack_pack_ext(res, sbuffer.size, kObjectType##t); \
|
msgpack_pack_ext(res, sbuffer.size, \
|
||||||
|
kObjectType##t - EXT_OBJECT_TYPE_SHIFT); \
|
||||||
msgpack_pack_ext_body(res, sbuffer.data, sbuffer.size); \
|
msgpack_pack_ext_body(res, sbuffer.data, sbuffer.size); \
|
||||||
msgpack_sbuffer_clear(&sbuffer); \
|
msgpack_sbuffer_clear(&sbuffer); \
|
||||||
}
|
}
|
||||||
@@ -211,7 +219,7 @@ bool msgpack_rpc_to_object(const msgpack_object *const obj, Object *const arg)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case MSGPACK_OBJECT_EXT: {
|
case MSGPACK_OBJECT_EXT: {
|
||||||
switch (cur.mobj->via.ext.type) {
|
switch ((ObjectType)(cur.mobj->via.ext.type + EXT_OBJECT_TYPE_SHIFT)) {
|
||||||
case kObjectTypeBuffer: {
|
case kObjectTypeBuffer: {
|
||||||
cur.aobj->type = kObjectTypeBuffer;
|
cur.aobj->type = kObjectTypeBuffer;
|
||||||
ret = msgpack_rpc_to_buffer(cur.mobj, &cur.aobj->data.integer);
|
ret = msgpack_rpc_to_buffer(cur.mobj, &cur.aobj->data.integer);
|
||||||
@@ -227,6 +235,15 @@ bool msgpack_rpc_to_object(const msgpack_object *const obj, Object *const arg)
|
|||||||
ret = msgpack_rpc_to_tabpage(cur.mobj, &cur.aobj->data.integer);
|
ret = msgpack_rpc_to_tabpage(cur.mobj, &cur.aobj->data.integer);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case kObjectTypeNil:
|
||||||
|
case kObjectTypeBoolean:
|
||||||
|
case kObjectTypeInteger:
|
||||||
|
case kObjectTypeFloat:
|
||||||
|
case kObjectTypeString:
|
||||||
|
case kObjectTypeArray:
|
||||||
|
case kObjectTypeDictionary: {
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -350,6 +367,9 @@ void msgpack_rpc_from_object(const Object result, msgpack_packer *const res)
|
|||||||
kv_push(stack, ((APIToMPObjectStackItem) { &result, false, 0 }));
|
kv_push(stack, ((APIToMPObjectStackItem) { &result, false, 0 }));
|
||||||
while (kv_size(stack)) {
|
while (kv_size(stack)) {
|
||||||
APIToMPObjectStackItem cur = kv_last(stack);
|
APIToMPObjectStackItem cur = kv_last(stack);
|
||||||
|
STATIC_ASSERT(kObjectTypeWindow == kObjectTypeBuffer + 1
|
||||||
|
&& kObjectTypeTabpage == kObjectTypeWindow + 1,
|
||||||
|
"Buffer, window and tabpage enum items are in order");
|
||||||
switch (cur.aobj->type) {
|
switch (cur.aobj->type) {
|
||||||
case kObjectTypeNil: {
|
case kObjectTypeNil: {
|
||||||
msgpack_pack_nil(res);
|
msgpack_pack_nil(res);
|
||||||
|
Reference in New Issue
Block a user