Как вызвать компилятор Tamarin ESC из кода AS3?

Я пытаюсь вызвать компилятор Tamarin ESC из кода AS3. У меня есть байт-код компилятора ESC, загруженный во Flash Player, но когда я его вызываю, компилятор ESC всегда возвращает один и тот же байт-код бездействия, независимо от того, какой исходный код я ему передаю. Удобочитаемый код ESC выглядит так:

function compileStringToBytes(input, context="(string)", start_line=1) {
    let [_,_,res] = compile( (function () input),
                             (function (abc) abc.getBytes()),
                             context,
                             start_line );
    return res;
}

Я вызываю его, используя следующий код AS3:

var compile:Function = getDefinitionByName("ESC::compileStringToBytes") as Function;
var array:ByteArray = compile( function():String { return "trace(\"hi\");" },
                "test" );

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

Это байтовый код, который он возвращает (метаданные удалены, преобразованы в удобочитаемый):

script0
const <#internal test>::internal:Namespace = <#internal test>   /* slot_id 0 */
const <#internal test>::public:Namespace =  /* slot_id 0 */
var Function:*  /* slot_id 0 */

function script0$init():*   /* disp_id 0*/
{
  // local_count=2 max_scope=1 max_stack=2 code_len=11
  0         getlocal0       
  1         pushscope       
  2         findpropstrict  Function
  4         newfunction     function ():*   /* disp_id 0*/
  6         setproperty     Function
  8         getlocal1       
  9         returnvalue     
  10        returnvoid      
}


function ():*   /* disp_id 0*/
{
  // local_count=1 max_scope=0 max_stack=0 code_len=1
  0         returnvoid      
}

Заранее спасибо! Я знаю, что это хардкорный вопрос, но я надеюсь, что какой-нибудь хардкорный кодер сможет пролить на него свет!


person DoomGoober    schedule 01.05.2011    source источник


Ответы (1)


Нашла ответ на свой вопрос.

На следующем сайте используются новейшие биты ABC компилятора ESC Tamarin для динамического запуска кода через Flash (панель слева показывает исходный код, который запускает компилятор):

http://wonderfl.net/c/2pBs/read

На самом деле он загружает биты Tamarin Redux с помощью загрузчика HTTP-интерфейса Mercurial: http://hg.mozilla.org/tamarin-redux/raw-file/db3ebe261f68/esc/bin/

Код Wonderfl, в свою очередь, использует codeazur as3swf Клауса Уолерса для переноса битов ABC для загрузки во Flash (как самого компилятора, так и скомпилированных битов):

https://github.com/claus/as3swf

Спасибо, Клаус и чудес! Открытый исходный код рулит.

person DoomGoober    schedule 14.06.2011