fix problem with recursive tables when using the 'process' option
This commit is contained in:
		
							parent
							
								
									a998635207
								
							
						
					
					
						commit
						d372d2ab08
					
				
							
								
								
									
										39
									
								
								inspect.lua
									
									
									
									
									
								
							
							
						
						
									
										39
									
								
								inspect.lua
									
									
									
									
									
								
							| @ -165,28 +165,37 @@ local function makePath(path, ...) | ||||
| end | ||||
| 
 | ||||
| local function processRecursive(process, item, path) | ||||
|   if item == nil then return nil end | ||||
|     local visited = {} | ||||
|      | ||||
|     local function processRecursive2(item, path) | ||||
|       if item == nil then return nil end | ||||
|       if visited[item] then return visited[item] end | ||||
|      | ||||
|       local processed = process(item, path) | ||||
|       if type(processed) == 'table' then | ||||
|         local processedCopy = {} | ||||
|         visited[item] = processedCopy | ||||
|         local processedKey | ||||
| 
 | ||||
|   local processed = process(item, path) | ||||
|   if type(processed) == 'table' then | ||||
|     local processedCopy = {} | ||||
|     local processedKey | ||||
|         for k,v in pairs(processed) do | ||||
|           processedKey = processRecursive2(k, makePath(path, k, inspect.KEY)) | ||||
|           if processedKey ~= nil then | ||||
|             processedCopy[processedKey] = processRecursive2(v, makePath(path, processedKey)) | ||||
|           end | ||||
|         end | ||||
| 
 | ||||
|     for k,v in pairs(processed) do | ||||
|       processedKey = processRecursive(process, k, makePath(path, k, inspect.KEY)) | ||||
|       if processedKey ~= nil then | ||||
|         processedCopy[processedKey] = processRecursive(process, v, makePath(path, processedKey)) | ||||
|         local mt  = processRecursive2(getmetatable(processed), makePath(path, inspect.METATABLE)) | ||||
|         setmetatable(processedCopy, mt) | ||||
|         processed = processedCopy | ||||
|       end | ||||
|       return processed | ||||
|     end | ||||
| 
 | ||||
|     local mt  = processRecursive(process, getmetatable(processed), makePath(path, inspect.METATABLE)) | ||||
|     setmetatable(processedCopy, mt) | ||||
|     processed = processedCopy | ||||
|   end | ||||
|   return processed | ||||
|      | ||||
|     return processRecursive2(item, path) | ||||
| end | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| ------------------------------------------------------------------- | ||||
| 
 | ||||
| local Inspector = {} | ||||
|  | ||||
| @ -315,6 +315,12 @@ describe( 'inspect', function() | ||||
|         }, items) | ||||
| 
 | ||||
|       end) | ||||
|    | ||||
|       it('handles recursive tables correctly', function() | ||||
|           local tbl = { 1,2,3} | ||||
|           tbl.loop = tbl | ||||
|           inspect(tbl, { process=function(x) return x end}) | ||||
|       end) | ||||
|     end) | ||||
| 
 | ||||
|     describe('metatables', function() | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user