code: private SoyValue eval(ExprNode expr, SoyNode node) {
  
      if (expr == null) {
        throw RenderException.create("Cannot evaluate expression in V1 syntax.")
            .addStackTraceElement(node);
      }
  
      // Lazily initialize evalVisitor.
      if (evalVisitor == null) {
        evalVisitor =
            evalVisitorFactory.create(
                env,
                cssRenamingMap,
                xidRenamingMap,
                msgBundle,
                debugSoyTemplateInfo,
                pluginInstances);
      }
  
      try {
        return evalVisitor.exec(expr);
      } catch (RenderException e) {
        // RenderExceptions can be thrown when evaluating lazy transclusions.
        throw RenderException.createFromRenderException(
            "When evaluating \"" + expr.toSourceString() + "\": " + e.getMessage(), e, node);
      } catch (Exception e) {
        throw RenderException.createWithSource(
            "When evaluating \"" + expr.toSourceString() + "\": " + e.getMessage(), e, node);
      }
    }
docs: Private helper to evaluate an expression. Always use this helper instead of using evalVisitor
  directly, because this helper creates and throws a RenderException if there's an error.