cloudwu / pbc

A protocol buffers library for C
MIT License
1.62k stars 567 forks source link

mingw环境下编译pbc的lua绑定库protobuf会出怪异现象,引用的skynet里lua5.4版本: #156

Closed 253980289 closed 2 years ago

253980289 commented 2 years ago

修改protobuf.lua里代码如下:

print("1")
local c1 = require "protobuf.c"
local c = {}
-- c["_env_new"] = function() end
-- print(c._env_new)
-- do return end
for k,v in pairs(c1) do
    print(k,v)
    local s = string.format("%s", k)
    if "_env_new" == s then
        print(k, type(k), v, type(v))
        c[k] = v
    else
        print("no _env_new", k, type(k), v, type(v))
    end
end
print("for c")
for k,v in pairs(c) do
    print(k,v)
end
print("ok", c, c._env_new)
do return end

发现调用c._env_new时会报nil异常,最后定位到是两个字符串内容打印一至,但却不相等,通过string.format复制一份才相等。 其中具体原因看看大家有谁指导下?

cloudwu commented 2 years ago
  1. 你可以用 # 求长度看是否一样。format 会阶段 \0 以后的字符,而 lua string 允许包含 \0
  2. 确保只 link 了唯一一份 lua 库。
253980289 commented 2 years ago

目前取长度显示均为8: 8 8 _env_new string function: 68141dc0 function

cloudwu commented 2 years ago

skynet 的 lua 对短字符串处理有异于官方 lua 。你必须确保只 link 了唯一一份 lua 。

253980289 commented 2 years ago

skynet 的 lua 对短字符串处理有异于官方 lua 。你必须确保只 link 了唯一一份 lua 。

经测试证明是这样原因,用原版lua或者连接时只链接一份skynet里的lua都是ok的

cloudwu commented 2 years ago

在任何场景下,都不应链接多份 lua ,即使是链接的原版,链接的同一个版本。