Uploaded image for project: 'Velocity'
  1. Velocity
  2. VELOCITY-752

Evaluation of macro arguments

    XMLWordPrintableJSON

Details

    • Bug
    • Status: Closed
    • Minor
    • Resolution: Fixed
    • 1.6.2
    • 2.0
    • Engine
    • None
    • Windows XP SP2, Java 1.5

    Description

      I've just come across a little gotcha that has taken a few hours to track down which might help other people.

      An example;

      #macro(myMacro $FieldName)
      #foreach ($Name in $FieldList)
      #if ($FieldName=="empty")
      #set ($tmp=$FieldsFound.put($FieldName,$velocityCount))
      #end
      #end
      #end

      #foreach ($X in $MyFields)
      #myMacro("Field$velocityCount")
      #end

      All looks OK doesn't it, but........

      The problem is one of when arguments are evaluated or in fact to be more precise, are not evaluated at all.
      Once you bear that in mind you can see the logical problem above - the use of $velocityCount (or indeed any variable) in the argument list of myMacro i.e.

      #myMacro("Field$velocityCount")

      This sort of usage is dangerous because in effect, what is happening is that the macro argument literal is being placed within the macro body without being evaluated first.
      So, the body of the macro becomes this;

      #foreach ($Name in $FieldList)
      #if ("Field$velocityCount"=="empty")
      #set ($tmp=$FieldsFound.put("Field$velocityCount",$velocityCount)
      #end
      #end

      Not what you intended at all and depending on the names of your variables, could cause all kinds of mayhem with values coming into scope that you hadn't intended.

      The workaround is to set a variable before the call to the macro and send that instead e.g.

      #foreach ($X in $MyFields)
      #set ($tmp="Field$velocityCount")
      #myMacro($tmp)
      #end

      Attachments

        Issue Links

          Activity

            People

              cbrisson Claude Brisson
              sohara Steve O'Hara
              Votes:
              0 Vote for this issue
              Watchers:
              1 Start watching this issue

              Dates

                Created:
                Updated:
                Resolved: