Flex-SWFに自動try-catchを埋め込み( その3 )

概要

SWFからABC部をとりだしパッチしてSWFにもどす、の続きで、EvalSupporterクラスの説明とパッチしてみた結果です。

SWFからABC部をとりだしパッチしてSWFにもどす (2)

EvalSupporter
EvalSupportクラスを下にのせますが別に読まなくても結構です。

class EvalSupporter {
//------------------------------------------------------------------
var abc:RemakeABCFile;
var u8_main:uint;
var u8_e:uint;
var u8_Error:uint;
var u8_AbcTrace:uint;
var u8_logging:uint;
var u8_getLog:uint;
var u8_blank:uint;
//------------------------------------------------------------------
var ns_AbcTrace:uint;
var ns_blank:uint;
//------------------------------------------------------------------
var np_e:uint;
var np_Error:uint;
var np_logging:uint;
var np_getLog:uint;
//------------------------------------------------------------------
const CONSTANT_Namespace = 0x08;
const CONSTANT_QName = 0x07;
const CONSTANT_Multiname = 0x09;
//------------------------------------------------------------------
function EvalSupporter(abcByteStream){
abc = Remake::parseAbcFile(abcByteStream);
var bytes = abc.getBytes();
var bytesLength = bytes.length;
}
//------------------------------------------------------------------
function codeGen(code,cond=false){
//for(var i=0;i

このクラスを使い以下のような変換が可能です。

var a:Array =[];
var b:uint =0;
for(var i:uint=0;i<a.length;i++){
  a[i] = b;
}

try{
  var a:Array =[];
  var b:uint =0;
  for(var i:uint=0;i<a.length;i++){
    a[i] = b;
  }
}
catch(e:*){
  ABCAlert.show(e);
}

ABCAlert.show( e:Error ) は、Alert.show(e.message)的なことをするstaticなクラスです。


ABC的にいうと、以下のコードをmethodの下に追加することになります。


28 getlocal0
29 pushscope
30 newcatch 0
32 dup
33 pushscope
34 swap
35 setproperty e
38 findpropstrict {}::ABCAlert
41 getproperty {}::ABCAlert
44 findpropstrict e
47 getproperty e
50 callproplex show (1)
54 pop
55 popscope
56 returnvoid
必要なConstants-Indexは事前に追加しておきます。

以下のException Infoも追加します。

first_pc : 0 , <== 元のCodeの最初のライン
last_pc : 27 , <== 元のCodeの最後のライン
target_pc : 28 , <== Exception Handlerが開始するライン
exc_type : 0 , <== Errorのタイプ(*)
var_name : e <== Error変数Index



上のようにパッチすると、うまく例外をキャッチしてくれるはずと考えて作成したSWFを実行してみると、


VerifyError: Error #1068: Array and * cannot be reconciled.

(Arrayと*は共有できません。)



がおきてしまいました。


これは何でしょうか? ということで次回へ続く。