code_get の TYPE_STRUCT でちゃんとチェックしてない
こんなコードで落とせる。
#module #deffunc f var p *a mes p return #deffunc f2 goto *a #global f2
まあ、それを利用(悪用?)して、こんな風に関数本体の定義を下にかけたりできるわけだけど。
#module #deffunc f int a, double b, str c goto *lab_f_body@ #global #cmpopt optcode 0 f 1, 3.14, "foo" #module *lab_f_body@ #deffunc f_body int a, double b, str c mes "a = "+a+", b = "+b+", c = "+c return #global
モジュール変数のメンバの場合は強いチェックをしているようです。
if (( var->magic != MODVAR_MAGICCODE )||( var->subid != prm->subid )||(var->pval->flag != TYPE_STRUCT )) throw HSPERR_INVALID_STRUCT_SOURCE;
でも、頑張れば落とせる。
#module mod x #modfunc f *lab mes x return #deffunc f2 int a, int b goto *lab #global f2 0x55aa0000, 0
( var->subid != prm->subid ) というチェックの仕方で、こういうことがおきる。
#module mod1 x #modfunc f *lab_f mes "x = "+x return #modfunc f2 goto *lab_f ; 同じモジュール内の #modfunc からジャンプした場合: OK #global #module mod2 y #modfunc f3 goto *lab_f@mod1 ; 違うモジュール内の #modfunc からジャンプした場合: NG #global newmod a, mod1 f2 a newmod b, mod2 f3 a