Fix closure types not working with void captures
This commit is contained in:
		
							parent
							
								
									da7d9cfcc0
								
							
						
					
					
						commit
						989de70461
					
				| @ -48,20 +48,20 @@ pub fn BiFunction(comptime captures_size: usize, comptime A: type, | |||||||
|                 @compileError("`captures` must be smaller than or equal to " ++ |                 @compileError("`captures` must be smaller than or equal to " ++ | ||||||
|                     std.fmt.comptimePrint("{d}", .{captures_size}) ++ " bytes"); |                     std.fmt.comptimePrint("{d}", .{captures_size}) ++ " bytes"); | ||||||
| 
 | 
 | ||||||
|             const captures_align = @alignOf(Captures); |  | ||||||
| 
 |  | ||||||
|             var function = Self{ |             var function = Self{ | ||||||
|                 .context = undefined, |                 .context = undefined, | ||||||
| 
 | 
 | ||||||
|                 .applyErased = struct { |                 .applyErased = struct { | ||||||
|                     fn do(erased: *anyopaque, a: A, b: B) Out { |                     fn applyErased(erased: *anyopaque, a: A, b: B) Out { | ||||||
|                         return call(@ptrCast(*Captures, @alignCast( |                         return call(if (Captures == void) {} else @ptrCast(*Captures, | ||||||
|                             captures_align, erased)).*, a, b); |                             @alignCast(@alignOf(Captures), erased)).*, a, b); | ||||||
|                     } |                     } | ||||||
|                 }.do, |                 }.applyErased, | ||||||
|             }; |             }; | ||||||
| 
 | 
 | ||||||
|             @ptrCast(*Captures, @alignCast(captures_align, &function.context)).* = captures; |             if (captures != {}) { | ||||||
|  |                 @ptrCast(*Captures, @alignCast(@alignOf(Captures), &function.context)).* = captures; | ||||||
|  |             } | ||||||
| 
 | 
 | ||||||
|             return function; |             return function; | ||||||
|         } |         } | ||||||
| @ -108,11 +108,11 @@ pub fn Function(comptime captures_size: usize, comptime In: type, comptime Out: | |||||||
|                 .context = undefined, |                 .context = undefined, | ||||||
| 
 | 
 | ||||||
|                 .applyErased = struct { |                 .applyErased = struct { | ||||||
|                     fn do(erased: *anyopaque, input: In) Out { |                     fn applyErased(erased: *anyopaque, input: In) Out { | ||||||
|                         return call(@ptrCast(*Captures, @alignCast( |                         return call(if (Captures == void) {} else @ptrCast(*Captures, | ||||||
|                             captures_align, erased)).*, input); |                             @alignCast(@alignOf(Captures), erased)).*, input); | ||||||
|                     } |                     } | ||||||
|                 }.do, |                 }.applyErased, | ||||||
|             }; |             }; | ||||||
| 
 | 
 | ||||||
|             @ptrCast(*Captures, @alignCast(captures_align, &function.context)).* = captures; |             @ptrCast(*Captures, @alignCast(captures_align, &function.context)).* = captures; | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user