@@ -260,7 +260,7 @@ pub const Lua = struct {
260
260
const alignment = @alignOf (std .c .max_align_t );
261
261
262
262
// the data pointer is an Allocator, so the @alignCast is safe
263
- const allocator = @ptrCast ( * Allocator , @alignCast ( @alignOf ( Allocator ), data ) );
263
+ const allocator = opaqueCast ( Allocator , data .? );
264
264
265
265
if (@ptrCast (? [* ]align (alignment ) u8 , @alignCast (alignment , ptr ))) | prev_ptr | {
266
266
const prev_slice = prev_ptr [0.. osize ];
@@ -1649,6 +1649,12 @@ pub const Buffer = struct {
1649
1649
1650
1650
// Helper functions to make the ziglua API easier to use
1651
1651
1652
+ /// Casts the opaque pointer to a pointer of the given type with the proper alignment
1653
+ /// Useful for casting pointers from the Lua API like userdata or other data
1654
+ pub inline fn opaqueCast (comptime T : type , ptr : * anyopaque ) * T {
1655
+ return @ptrCast (* T , @alignCast (@alignOf (T ), ptr ));
1656
+ }
1657
+
1652
1658
pub const ZigFn = fn (lua : * Lua ) i32 ;
1653
1659
pub const ZigHookFn = fn (lua : * Lua , ar : * DebugInfo ) void ;
1654
1660
pub const ZigContFn = fn (lua : * Lua , status : bool , ctx : KContext ) c_int ;
@@ -2443,7 +2449,7 @@ test "dump and load" {
2443
2449
const writer = struct {
2444
2450
fn inner (l : * Lua , buf : []const u8 , data : * anyopaque ) bool {
2445
2451
_ = l ;
2446
- var arr = @ptrCast ( * std .ArrayList (u8 ), @alignCast ( @alignOf ( std . ArrayList ( u8 )), data ) );
2452
+ var arr = opaqueCast ( std .ArrayList (u8 ), data );
2447
2453
arr .appendSlice (buf ) catch return false ;
2448
2454
return true ;
2449
2455
}
@@ -2461,7 +2467,7 @@ test "dump and load" {
2461
2467
const reader = struct {
2462
2468
fn inner (l : * Lua , data : * anyopaque ) ? []const u8 {
2463
2469
_ = l ;
2464
- var arr = @ptrCast ( * std .ArrayList (u8 ), @alignCast ( @alignOf ( std . ArrayList ( u8 )), data ) );
2470
+ var arr = opaqueCast ( std .ArrayList (u8 ), data );
2465
2471
return arr .items ;
2466
2472
}
2467
2473
}.inner ;
0 commit comments