Browse Source

Merge branch 'workaround_32bitalign'

Miku AuahDark 2 years ago
parent
commit
0768583aaa
2 changed files with 23 additions and 3 deletions
  1. 10 0
      .github/workflows/main.yml
  2. 13 3
      src/common/runtime.cpp

+ 10 - 0
.github/workflows/main.yml

@@ -24,6 +24,16 @@ jobs:
       uses: actions/checkout@v3
       with:
         path: love2d-${{ github.sha }}
+    - name: Get Dependencies for AppImage
+      shell: python
+      env:
+        LOVE_BRANCH: ${{ github.sha }}
+      run: |
+        import os
+        for i in range(250):
+            if os.system(f"make getdeps LOVE_BRANCH={os.environ['LOVE_BRANCH']}") == 0:
+                raise SystemExit(0)
+        raise Exception("make getdeps failed")
     - name: Build AppImage
       run: make LOVE_BRANCH=${{ github.sha }}
     - name: Print LuaJIT branch

+ 13 - 3
src/common/runtime.cpp

@@ -30,6 +30,7 @@
 // C++
 #include <algorithm>
 #include <iostream>
+#include <cstdint>
 #include <cstdio>
 #include <cstddef>
 #include <cmath>
@@ -136,16 +137,25 @@ static ObjectKey luax_computeloveobjectkey(lua_State *L, love::Object *object)
 	// use more than 53 bits if their alignment is guaranteed to be more than 1.
 	// For example an alignment requirement of 8 means we can shift the
 	// pointer's bits by 3.
-	const size_t minalign = LOVE_ALIGNOF(std::max_align_t);
+#if UINTPTR_MAX == 0xffffffff
+	// https://github.com/love2d/love/issues/1916
+	// This appears to be ABI violation on 32-bit platforms. However it seems
+	// there's no reliable way to get the correct alignment pre-C++17. Consider
+	// that 32-bit still fits in 2^53 range, it's perfectly fine to assume
+	// alignment of 1.
+	constexpr size_t minalign = 1;
+#else
+	constexpr size_t minalign = LOVE_ALIGNOF(std::max_align_t);
+#endif
 	uintptr_t key = (uintptr_t) object;
 
 	if ((key & (minalign - 1)) != 0)
 	{
 		luaL_error(L, "Cannot push love object to Lua: unexpected alignment "
-				   "(pointer is %p but alignment should be %d)", object, minalign);
+				   "(pointer is %p but alignment should be %d)", object, (int) minalign);
 	}
 
-	static const size_t shift = (size_t) log2(LOVE_ALIGNOF(std::max_align_t));
+	static const size_t shift = (size_t) log2(minalign);
 
 	key >>= shift;