@method[][local] << переключает на 'все новые $переменные локальны' << а это вариант!
Александр Петросян (PAF) 18.12.2006 22:52
/ 18.12.2006 23:04
кто что скажет?
относительно халявный вариант.
реализация:
сделать два потомка methodFrame, делающих по-разному .putElement:
один, как и сейчас делает .putElement в self.
а другой пусть смотрит, и если переменная новая, делает перед .putElement регистрацию name в списке локальных (и сразу делает put туда, без поиска в родителях).
при компиляции выставлять флажок в Method.
а в execute при создании VMethodFrame, создавать нужную по флажку.
(а чтобы ещё ускорить, можно ввести ещё два байт-кода в дополнение OP_CALL и OP_CALL__WRITE).
конечно, в конструкторе будет не очень понятно, что лучше выбрать.
многие в конструкторе пишут код (сюрприз), и им захочется и там иметь "всё локальное".
таким людям придётся
@constructor[][local]
$variable1[эта локальна]
$self.field1[это поле]
другим так не понравится, и в конструкторе придётся по-старинке
@constructor[][variable1]
$variable1[эта локальна]
$field1[а это поле]
выбор не то чтобы богат.
но этот вариант простой, без спорных «$:», и, думаю, многим понравится.