Learning ColdFusion 9: Bug Using Implicit Structs Within Nested Function Calls
Posted July 30, 2009 at 1:40 PM
Last night, when I was playing around with ColdFusion 9's new Object-Relational Mapping (ORM) functionality, I think I found a compile-time bug. I say compile-time because the following code throws an error even if I put a CFAbort at the top:
Launch code in new window » Download code as text file »
- <!--- Load the girl object based on the name. --->
- <cfset joanna = entityLoad(
- "Girl",
- { name = "Joanna" },
- true
- ) />
-
- <!---
- Override Joanna's properties with a new collection.
- Because we don't know the IDs of the given properties,
- we need to search for them by name.
-
- NOTE: Use the "TRUE" uniqueness parameter to make sure that
- these entityLoad() methods return a CFC, not an array.
- --->
- <cfset joanna.setProperties(
- [
- entityLoad(
- "Property",
- { name = "Athletic" },
- true
- ),
- entityLoad(
- "Property",
- { name = "Brunette" },
- true
- )
- ]
- ) />
As you can see, all I'm doing here is loading a Girl.cfc instance and then overriding its collection of Property.cfcs. This throws the following ColdFusion error:
Unable to complete CFML to Java translation. Error information unknown node type coldfusion.compiler.ASTStructInitializer@189eab7
I narrowed down the problem to the fact that I was calling EntityLoad() as part of an implicit array that was being passed to a function call. When I moved the EntityLoad() calls outside of the SetProperties() call, everything worked fine.
At first, I thought maybe this was a bug with EntityLoad() or some other ORM feature; but, because this appears to be a compile-time issue, I wanted to see if I could duplicate the error with a much smaller bit of code:
Launch code in new window » Download code as text file »
- <!--- Test method returns a struct. --->
- <cffunction name="test">
- <cfreturn arguments[ 1 ] />
- </cffunction>
-
- <!---
- Get an array containing our nested struct that is returned
- from the method.
- --->
- <cfset data = test(
- [
- test(
- { foo = "Bar" }
- )
- ]
- ) />
This simple demo also throws the ColdFusion error:
Unable to complete CFML to Java translation. Error information unknown node type coldfusion.compiler.ASTStructInitializer@1b5027d
I tried a whole bunch of different combinations of nested structs and arrays - it didn't matter. As long as the outer expression was a method call and as long as there were at least two levels of implicit object creation (struct or array) in which the inner-most one was wrapped inside of another method call, the error was thrown.
ColdFusion 9 definitely made some good steps forward with allowing us to pass implicit structs and arrays to method calls; but, it looks like they still need to iron some of the complex nesting that this sort of syntax invites.
Download Code Snippet ZIP File
Post Comment | Ask Ben | Permalink | Other Searches | Print Page
Newer Post
Learning ColdFusion 9: Refreshing And Rebuilding An ORM Application
Older Post
Learning ColdFusion 9: Exploring Object-Relational Mapping (ORM)
Reader Comments
I have filed a bug for this:
http://cfbugs.adobe.com/cfbugreport/flexbugui/cfbugtracker/main.html#bugId=79175
After searching the Bug database, looks like CFLoop was having a similar bug, which has since been closed. Hopefully, this has already been fixed.




