Skip to content

Commit

Permalink
Fix 64-bit check_ffi_value for 32-bit platforms
Browse files Browse the repository at this point in the history
  • Loading branch information
Sainan authored and well-in-that-case committed Jan 20, 2025
1 parent f1c8169 commit 4976270
Showing 1 changed file with 16 additions and 16 deletions.
32 changes: 16 additions & 16 deletions src/lffi.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -126,47 +126,47 @@ static int push_ffi_value (lua_State *L, FfiType type, void *value) {
SOUP_UNREACHABLE;
}

static uintptr_t check_ffi_value (lua_State *L, int i, FfiType type) {
static uint64_t check_ffi_value (lua_State *L, int i, FfiType type) {
switch (type) {
case FFI_UNKNOWN:
/* 'handling' this case makes the compiler happy */
break;
case FFI_VOID:
return 0;
case FFI_I8:
return static_cast<uintptr_t>(static_cast<int8_t>(luaL_checkinteger(L, i)));
return static_cast<uint64_t>(static_cast<int8_t>(luaL_checkinteger(L, i)));
case FFI_I16:
return static_cast<uintptr_t>(static_cast<int16_t>(luaL_checkinteger(L, i)));
return static_cast<uint64_t>(static_cast<int16_t>(luaL_checkinteger(L, i)));
case FFI_I32:
return static_cast<uintptr_t>(static_cast<int32_t>(luaL_checkinteger(L, i)));
return static_cast<uint64_t>(static_cast<int32_t>(luaL_checkinteger(L, i)));
case FFI_I64:
return static_cast<uintptr_t>(static_cast<int64_t>(luaL_checkinteger(L, i)));
return static_cast<uint64_t>(static_cast<int64_t>(luaL_checkinteger(L, i)));
case FFI_U8:
return static_cast<uintptr_t>(static_cast<uint8_t>(luaL_checkinteger(L, i)));
return static_cast<uint64_t>(static_cast<uint8_t>(luaL_checkinteger(L, i)));
case FFI_U16:
return static_cast<uintptr_t>(static_cast<uint16_t>(luaL_checkinteger(L, i)));
return static_cast<uint64_t>(static_cast<uint16_t>(luaL_checkinteger(L, i)));
case FFI_U32:
return static_cast<uintptr_t>(static_cast<uint32_t>(luaL_checkinteger(L, i)));
return static_cast<uint64_t>(static_cast<uint32_t>(luaL_checkinteger(L, i)));
case FFI_U64:
return static_cast<uintptr_t>(static_cast<uint64_t>(luaL_checkinteger(L, i)));
return static_cast<uint64_t>(luaL_checkinteger(L, i));
case FFI_F32: {
auto val = static_cast<float>(luaL_checknumber(L, i));
return static_cast<uintptr_t>(*reinterpret_cast<uint32_t*>(&val));
return static_cast<uint64_t>(*reinterpret_cast<uint32_t*>(&val));
static_assert(sizeof(float) == sizeof(uint32_t));
}
case FFI_F64: {
auto val = static_cast<double>(luaL_checknumber(L, i));
return *reinterpret_cast<uintptr_t*>(&val);
static_assert(sizeof(double) == sizeof(uintptr_t));
return *reinterpret_cast<uint64_t*>(&val);
static_assert(sizeof(double) == sizeof(uint64_t));
}
case FFI_PTR:
if (lua_type(L, i) != LUA_TUSERDATA)
luaL_checktype(L, i, LUA_TLIGHTUSERDATA);
return reinterpret_cast<uintptr_t>(lua_touserdata(L, i));
return reinterpret_cast<uint64_t>(lua_touserdata(L, i));
case FFI_STR:
if (lua_type(L, i) == LUA_TNIL)
return 0;
return reinterpret_cast<uintptr_t>(luaL_checkstring(L, i));
return reinterpret_cast<uint64_t>(luaL_checkstring(L, i));
}
SOUP_UNREACHABLE;
}
Expand Down Expand Up @@ -439,8 +439,8 @@ static int ffi_push_new (lua_State *L, int i) {
luaL_error(L, "no member with name '%s'", memname.c_str());
}
const soup::rflType& type = strct->getMemberType(memname);
uintptr_t data = *reinterpret_cast<uintptr_t*>(reinterpret_cast<uintptr_t>(udata) + offset);
uintptr_t new_data = check_ffi_value(L, 3, rfl_type_to_ffi_type(type));
auto data = *reinterpret_cast<uint64_t*>(reinterpret_cast<uintptr_t>(udata) + offset);
auto new_data = check_ffi_value(L, 3, rfl_type_to_ffi_type(type));
memcpy(&data, &new_data, type.getSize());
*reinterpret_cast<uintptr_t*>(reinterpret_cast<uintptr_t>(udata) + offset) = data;
}
Expand Down

0 comments on commit 4976270

Please sign in to comment.