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