lua 支持int64

lua number & protobuf int32 int64 repeated issue: Value out of range

1.encoder.lua

function _VarintSize(value)
if value <= 0x7f then return 1 end
if value <= 0x3fff then return 2 end
if value <= 0x1fffff then return 3 end
if value <= 0xfffffff then return 4 end
return 5
end

function _SignedVarintSize(value)
if value < 0 then return 10 end
if value <= 0x7f then return 1 end
if value <= 0x3fff then return 2 end
if value <= 0x1fffff then return 3 end
if value <= 0xfffffff then return 4 end
return 5
end

改成

function _VarintSize(value)
if value <= 0x7f then return 1 end
if value <= 0x3fff then return 2 end
if value <= 0x1fffff then return 3 end
if value <= 0xfffffff then return 4 end
if value <= 0x7ffffffff then return 5 end
if value <= 0x3ffffffffff then return 6 end
if value <= 0x1ffffffffffff then return 7 end
if value <= 0xffffffffffffff then return 8 end
if value <= 0x7fffffffffffffff then return 9 end
return 10
end

function _SignedVarintSize(value)
if value < 0 then return 10 end
if value <= 0x7f then return 1 end
if value <= 0x3fff then return 2 end
if value <= 0x1fffff then return 3 end
if value <= 0xfffffff then return 4 end
if value <= 0x7ffffffff then return 5 end
if value <= 0x3ffffffffff then return 6 end
if value <= 0x1ffffffffffff then return 7 end
if value <= 0xffffffffffffff then return 8 end
if value <= 0x7fffffffffffffff then return 9 end
return 10
end

2.ware_format里 (非必要?)

local function _VarUInt64ByteSizeNoTag(uint64)
if uint64 <= 0x7f then return 1 end
if uint64 <= 0x3fff then return 2 end
if uint64 <= 0x1fffff then return 3 end
if uint64 <= 0xfffffff then return 4 end
return 5
end

改成

local function _VarUInt64ByteSizeNoTag(uint64)
if uint64 <= 0x7f then return 1 end
if uint64 <= 0x3fff then return 2 end
if uint64 <= 0x1fffff then return 3 end
if uint64 <= 0xfffffff then return 4 end
if uint64 <= 0x7ffffffff then return 5 end
if uint64 <= 0x3ffffffffff then return 6 end
if uint64 <= 0x1ffffffffffff then return 7 end
if uint64 <= 0xffffffffffffff then return 8 end
if uint64 <= 0x7fffffffffffffff then return 9 end
return 10
end

type_checkers.lua里 (这个范围是我们自己根据一些情况 设定了一个范围)
增加
function Int64ValueChecker()
local _MIN = -562949953421312
local _MAX = 562949953421312
return function(proposed_value)
if type(proposed_value) ~= 'number' then
error(string.format('%s has type %s, but expected one of: number',
proposed_value, type(proposed_value)))
end
if _MIN > proposed_value or proposed_value > _MAX then
error('Value out of range: ' .. proposed_value)
end
end
end

function Uint64ValueChecker(IntValueChecker)
local _MIN = 0
local _MAX = 1125899906842624

return function(proposed_value)
    if type(proposed_value) ~= 'number' then
        error(string.format('%s has type %s, but expected one of: number',
            proposed_value, type(proposed_value)))
    end
    if _MIN > proposed_value or proposed_value > _MAX then
        error('Value out of range: ' .. proposed_value)
    end
end
end

4.protobuf.lua
里

[FieldDescriptor.CPPTYPE_INT64] = type_checkers.Int32ValueChecker(),

[FieldDescriptor.CPPTYPE_UINT64] = type_checkers.Uint32ValueChecker(),
改成

[FieldDescriptor.CPPTYPE_INT64] = type_checkers.Int64ValueChecker(),

[FieldDescriptor.CPPTYPE_UINT64] = type_checkers.Uint64ValueChecker(),
仅供参考

转自:https://github.com/sean-lin/protoc-gen-lua/issues/23

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值