Skip to main content
Ben Nadel at cf.Objective() 2010 (Minneapolis, MN) with: Doug Hughes and Ezra Parker and Dan Wilson and John Mason and Jason Dean and Luis Majano and Mark Mandel and Brian Kotek and Wil Genovese and Rob Brooks-Bilson and Andy Matthews and Simeon Bateman and Ray Camden and Chris Rockett and Joe Bernard and Dan Skaggs and Byron Raines and Barney Boisvert and Simon Free and Steve 'Cutter' Blades and Seth Bienek and Katie Bienek and Jeff Coughlin
Ben Nadel at cf.Objective() 2010 (Minneapolis, MN) with: Doug Hughes Ezra Parker Dan Wilson John Mason Jason Dean Luis Majano Mark Mandel Brian Kotek Wil Genovese Rob Brooks-Bilson Andy Matthews Simeon Bateman Ray Camden Chris Rockett Joe Bernard Dan Skaggs Byron Raines Barney Boisvert Simon Free Steve 'Cutter' Blades Seth Bienek Katie Bienek Jeff Coughlin

ColdFusion CFDump, Circular References, And 500 null

By
Published in

Peter Bell ran into a circular reference problem when using CFDump. He kept getting 500 null because CFDump was entering an infinite loop and basically crapping out. The beauty of CFDump, though is that it provides a really great way of dealing with this. The CFDump TOP attribute limits the levels to which the CFDump algorithm will traverse.

To demonstrate this, let's store an object in the REQUEST scope that has a pointer to its parent scope, REQUEST. The circular reference here is pretty obvious:

<!--- Store an object in REQUEST. --->
<cfset REQUEST.Object = StructNew() />

<!---
	Set the parent scope of the object. This should create
	a circular variarable reference.
--->
<cfset REQUEST.Object.ParentScope = REQUEST />

<!--- Set some other variables for fun. --->
<cfset REQUEST.Object.Type = "Struct" />
<cfset REQUEST.Object.ID = "TEST_CFDUMP" />

Now, let' drying calling CFDump on this object. We know that this will go infinitely, so let's only go over 5 iterations:

<!---
	Now, we want to try different values of CFDump's TOP
	attribute to see how it handles circular references.
--->
<cfloop index="intDepth" from="1" to="5" step="1">

	<h3>
		CFDump Depth: #intDepth#
	</h3>

	<!--- CFDump out this object at the given depth. --->
	<cfdump
		var="#REQUEST.Object#"
		label="REQUEST.Object"
		top="#ToString( intDepth )#"
		/>

</cfloop>

Before we look at what this outputs, notice that I am calling ToString() on the depth variable that I pass to CFDump. This seems odd, and it is, but for some reason, if I try to just pass a numeric value to this attribute, I get the following error:

Invalid parameter type. The value specified, "1.0", must be a valid Integer.

Not sure why, but converting it to a string first seems to do the trick. This is what is output per iteration:

CFDump Depth: 1

ColdFusion CFDump Top 1

CFDump Depth: 2

ColdFusion CFDump Top 2

CFDump Depth: 3

ColdFusion CFDump Top 3

CFDump Depth: 4

ColdFusion CFDump Top 4

CFDump Depth: 5

ColdFusion CFDump Top 5

Want to use code from this post? Check out the license.

Reader Comments

I believe in love. I believe in compassion. I believe in human rights. I believe that we can afford to give more of these gifts to the world around us because it costs us nothing to be decent and kind and understanding. And, I want you to know that when you land on this site, you are accepted for who you are, no matter how you identify, what truths you live, or whatever kind of goofy shit makes you feel alive! Rock on with your bad self!
Ben Nadel
Managed hosting services provided by:
xByte Cloud Logo