mirror of
				https://github.com/superseriousbusiness/gotosocial.git
				synced 2025-11-03 21:42:25 -06:00 
			
		
		
		
	
		
			
	
	
		
			56 lines
		
	
	
	
		
			1 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
		
		
			
		
	
	
			56 lines
		
	
	
	
		
			1 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| 
								 | 
							
								package mangler
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								import (
							 | 
						||
| 
								 | 
							
									"unsafe"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									"codeberg.org/gruf/go-xunsafe"
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// iterArrayType returns a Mangler capable of iterating
							 | 
						||
| 
								 | 
							
								// and mangling the given array type currently in TypeIter{}.
							 | 
						||
| 
								 | 
							
								// note this will fetch sub-Mangler for array element type.
							 | 
						||
| 
								 | 
							
								func iterArrayType(t xunsafe.TypeIter) Mangler {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									// Array element type.
							 | 
						||
| 
								 | 
							
									elem := t.Type.Elem()
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									// Get nested elem TypeIter with appropriate flags.
							 | 
						||
| 
								 | 
							
									flags := xunsafe.ReflectArrayElemFlags(t.Flag, elem)
							 | 
						||
| 
								 | 
							
									et := t.Child(elem, flags)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									// Get elem mangler.
							 | 
						||
| 
								 | 
							
									fn := loadOrGet(et)
							 | 
						||
| 
								 | 
							
									if fn == nil {
							 | 
						||
| 
								 | 
							
										return nil
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									// Array element in-memory size.
							 | 
						||
| 
								 | 
							
									esz := t.Type.Elem().Size()
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									// No of elements.
							 | 
						||
| 
								 | 
							
									n := t.Type.Len()
							 | 
						||
| 
								 | 
							
									switch n {
							 | 
						||
| 
								 | 
							
									case 0:
							 | 
						||
| 
								 | 
							
										return empty_mangler
							 | 
						||
| 
								 | 
							
									case 1:
							 | 
						||
| 
								 | 
							
										return fn
							 | 
						||
| 
								 | 
							
									default:
							 | 
						||
| 
								 | 
							
										return func(buf []byte, ptr unsafe.Pointer) []byte {
							 | 
						||
| 
								 | 
							
											for i := 0; i < n; i++ {
							 | 
						||
| 
								 | 
							
												// Mangle data at array index.
							 | 
						||
| 
								 | 
							
												offset := esz * uintptr(i)
							 | 
						||
| 
								 | 
							
												eptr := add(ptr, offset)
							 | 
						||
| 
								 | 
							
												buf = fn(buf, eptr)
							 | 
						||
| 
								 | 
							
												buf = append(buf, ',')
							 | 
						||
| 
								 | 
							
											}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
											if n > 0 {
							 | 
						||
| 
								 | 
							
												// Drop final comma.
							 | 
						||
| 
								 | 
							
												buf = buf[:len(buf)-1]
							 | 
						||
| 
								 | 
							
											}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
											return buf
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								}
							 |