...что они там курят?! и главное в каких количествах? только что столкнулся с очередной странностью горящего лиса, заставившей меня ругаться матом. а все начиналось так спокойно. зима, солнышко светит, тучки передвигаются как рыбки в аквариуме, сижу, никого не трогаю, пью чай и пишу распаковщик жаба-скриптов.
распаковываю очередной скрипт, а он не распаковывается ни фига совершенно. начинаю разбираться и минут через полчаса понимаю, что весь затык происходит из-за того, что следующий цикл не исполняется (а должен!): for(a=0;a<s[~[]];a++), где s — расшифровываемая строка. под Google v8 цикл исполняется 0 итераций.
включаю мозги. ~[] равно -1 (мину одному), следовательно, хакерский код пытается сделать следующее: for(a=0;a<"hello"[-1];a++). очевидно (по виду цикла), что "hello"[-1] предполагает возвратить длину строки. мелькает догадка, что длина строки хранится в a-ля Pascal формате и перед строкой идет ее размер, находящийся по смещению -1. но это же маразм!!!
а вот и не маразм. пишу print("hello"[-1]), запускаю под SpiderMonkey (фоксовый скриптовый движок) и вижу, что он мне выводит 5. то есть длину. а вот движок от гугла такого не выводит, ибо не должен (по стандарту).
разбираю скрипт дальше. вижу клевую конструкцию. /[\/]/[~[]][~[]]; слегка офигеваю и с пришибленным видом ввожу ее в SpiderMonkey. получаю 4. как четыре, почему четыре? приводу конструкцию к виду /[\/]/[~[]][~[]] --> /[\/]/[-1][-1] --> /[\/]/[-1]. теперь получаю строку '[\/]'. ага, понятно, раз /[\/]/[-1] это строка, то следующий [-1] это ее длина.
оказывается, что /.../[-1] у фокса тоже самое, что и /.../.source, т.е. исходная строка регулярного выражения.
экспериментирую дальше. print(function (){}[-1]) под лисом говорит null, и undefined под гуглом.
var x = new Object; x[-1] = "hello"; print(x[-1]); работает под обоими движками (x[-1] возвращает строку), а вот следующий код уже ни хвоста не работает: x = "1-2-3"; x[-1]=0; print(x[-1]). в том смысле, что под гуглом x[-1] возвращает undefined, а под лисом — 5, т.е. длину строки поменять не удалось.
интересно, что же они все-таки курят?
americans fought a war for a freedom. another one to end slavery. so, what do some of them choose to do with their freedom? become slaves.