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の下に追加することになります。
必要なConstants-Indexは事前に追加しておきます。
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
以下の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と*は共有できません。)
がおきてしまいました。
これは何でしょうか? ということで次回へ続く。