Ошибка ColdFusion: невозможно преобразовать coldfusion.compiler.FactoredNodeAggregation в coldfusion.compiler.ASTfunctionDefinition - PullRequest
2 голосов
/ 14 марта 2009

coldfusion.compiler.FactoredNodeAggregation не может быть приведен к coldfusion.compiler.ASTfunctionDefinition

Я получаю вышеуказанную ошибку при попытке заменить действительно старый устаревший пользовательский тег новым пользовательским тегом, в котором есть некоторые существенные улучшения рабочего процесса. У меня есть только одна идея, как это отладить: закомментировать разные части кода (стиль двоичного поиска), пока он не скомпилируется, сузив поиск, пока я не найду код проблемы.

Кто-нибудь еще видел эту ошибку раньше? Есть идеи, что это может быть? Контекстуально это звучит так, будто я пытаюсь использовать ... что-то ... как функцию, которая не определена как функция. Это не звонит в колокол, поэтому я собираюсь попробовать идею бинарного поиска.

Обновление: Он работает на CF 8.0.1 и вообще не использует блоки <cfscript>. Используя бинарный поиск для комментирования, я сузил его до CFThread, который запускает фоновый поток, который никогда не присоединяется к странице (по замыслу).

Если я закомментирую все содержимое потока, ошибка исчезнет (поэтому сам тег cfthread, похоже, сам по себе не имеет проблем ...). Если я скопирую содержимое потока в его собственный шаблон, этот шаблон будет хорошо скомпилирован (поэтому содержимое потока, похоже, не имеет проблем само по себе ...) ... так ... теоретически это должно работать? Я не знаю. Это я с поднятыми вверх руками. (WTF?)

Я думаю, что я уже опроверг эту идею, откомментировав небольшой раздел без возврата ошибки, но CFThread должен иметь доступ к локальным настраиваемым тегам, которые будет иметь шаблон, создающий поток, верно? так что, если есть foo.cfm, он может быть доступен со страницы как <cf_foo>, и поток может сделать то же самое?

Ответы [ 7 ]

3 голосов
/ 28 апреля 2009

На прошлой неделе я связывался с командой ColdFusion Engineering в Adobe по поводу этой проблемы, и они подтвердили мне, что это ошибка в ColdFusion.

В частности, если число строк кода внутри тела тега потока будет слишком большим, это приведет к ошибке компиляции. Обходной путь, который я обнаружил за день или два до того, как получил свой ответ, заключается в использовании <cfinclude /> для импорта содержимого вашего потока из другого файла; или поместить код в метод где-нибудь и вызвать этот метод из тела потока. (Предположительно, пользовательский тег или другие умные методы инкапсуляции также будут работать.)

Это объясняет ту часть всего, что сводило меня с ума: то, что комментирование различных частей тела потока иногда приводило к его компиляции ... и теперь я знаю, что это было потому, что достаточно тело потока было закомментировано.

Они сообщают, что исправили ошибку, поэтому я предполагаю, что она будет исправлена ​​в следующем накопительном оперативном исправлении (если оно есть) и в ColdFusion 9.

1 голос
/ 28 апреля 2009

Поскольку я пока не могу комментировать, Адам, это действительно ошибка с CF или с JVM? Существует аналогичное ограничение на количество строк кода, которые могут быть скомпилированы в CFFUNCTION, но ограничение действительно в JVM, а не в теге CF.

0 голосов
/ 13 апреля 2009

Вы пытались переустановить CF8.01? Может быть, некоторые файлы были повреждены?

0 голосов
/ 13 апреля 2009

Вы удалили скомпилированные файлы классов и сохранили исходный код в новом файле на случай, если во время сохранения произойдет что-то странное?

0 голосов
/ 16 марта 2009

Странно, что это ошибка компиляции. Если база кода не слишком велика, я бы позаботился о том, чтобы все переменные в потоке и вызываемые udfs были явно определены.

Далее я бы переместил как можно больше внешних данных в область аргументов потока, чтобы изолировать взаимодействия со страницей.

Наконец, если это не проясняет ситуацию, я бы попытался изменить имена каждой переменной, функции и udf, к которым поток обращается немного с некоторым префиксом теста, просто чтобы убедиться, что вы не столкнулись с ошибкой, где один из ваших переменных funcs вызывает конфликт пространства имен в jvm в контексте исходной страницы.

Хитрая проблема.

0 голосов
/ 15 марта 2009

эта ошибка обычно возникает, когда у вас есть функция, которая установлена ​​на дистанционное управление. довольно забавно, что вы получаете его с пользовательским тегом, хотя. Вы уверены, что в пользовательском теге нет никаких функций? Вы можете разместить код?

0 голосов
/ 14 марта 2009

Ооо, такого я еще не видел.

В зависимости от того, что делает пользовательский тег, вместо того, чтобы комментировать различные части, вы можете попытаться использовать cfabort - та же техника, но только одна строка для изменения, а не раскомментирование и повторное комментирование (что может быть неудобным и временным). потребляя).

Кроме того, можете ли вы протестировать пользовательский тег изолированно, с полностью упрощенными аргументами / etc?


Если вы можете разместить код, может быть что-то странное, что выпрыгивает на свежую пару глаз?

...