Udon VM 向けのコンパイラを作ろうとしている[2]

- 即値があれば何でもできる回 - EXTERN 関数の一覧を列挙したところ命名規則と矛盾した名前のものが1069個も見つかった回 の二本立てです
1
𝚌𝚊𝚗𝚗𝚘𝚛𝚒𝚗 @cannorin3

@Ram_Type64_Mod0 いえす、そんな感じ private なやつはシンボル一覧から取れないだけでアドレスさえわかればなんでも入れられる/JUMPに使ってるならうまくやればどこにでも飛べそうだよ、ACEは多分できないと思うけど……

2019-12-21 20:59:17
madorama@VRChat @madorama_vrc

@cannorin_vrc UDONSDK-2019.12.19.18.37_Publicしか入れてない!

2019-12-21 21:02:52
𝚌𝚊𝚗𝚗𝚘𝚛𝚒𝚗 @cannorin3

@madorama_vrc 仕様上できないはずだけどできるのかも……帰ったらやってみる

2019-12-21 21:04:21
Ram.Type-0@VRC @RamType0

@cannorin_vrc あとまあこれ思ったのが無駄にアドレスuintにしてる癖に即値じゃないアドレス値をスタックにプッシュできないのでuintのアドレスが息をしていない

2019-12-21 21:06:59
madorama@VRChat @madorama_vrc

@cannorin_vrc できないはずと思いつつも試してみたらエラーも出ないし実行したらログもちゃんと出てきたのでできるらしい pic.twitter.com/oY4bkU8l6L

2019-12-21 21:07:29
拡大
Ram.Type-0@VRC @RamType0

@cannorin_vrc @madorama_vrc アセンブリとバイトコードで仕様が違うのでは バイトコードの仕様だとそもそも変数名じゃなくて全部アドレス即値指定だし

2019-12-21 21:15:44
madorama@VRChat @madorama_vrc

@cannorin_vrc エラー見た感じ少なくともInt32,Single,String(画像にはないけどDoubleも)辺りは特別な処理してる気配がある pic.twitter.com/1P4rpGx6cv

2019-12-21 21:15:59
拡大
拡大
拡大
拡大
榊そら @sora_sakaki_vrc

@Ram_Type64_Mod0 @cannorin_vrc @madorama_vrc ちがうよ、細かいとこまでは調べきれてないけど

2019-12-21 21:21:14
榊そら @sora_sakaki_vrc

あれ、、でもintわたしやったときコケたけどな

2019-12-21 21:21:47
榊そら @sora_sakaki_vrc

@Ram_Type64_Mod0 @cannorin_vrc @madorama_vrc あれ、でもintしたときコケたけどなんだろう

2019-12-21 21:22:24
Ram.Type-0@VRC @RamType0

@sora_sakaki_vrc @cannorin_vrc @madorama_vrc code部の即値にintリテラルだとアドレスとして解釈されるとかじゃないの data部ならアドレスだと勘違いすることはないし

2019-12-21 21:23:50
榊そら @sora_sakaki_vrc

@Ram_Type64_Mod0 @cannorin_vrc @madorama_vrc まぁよくわかんないけどその時のエラーメッセージはthisかnullしか初期化できないだった できてるならいい話

2019-12-21 21:25:40
榊そら @sora_sakaki_vrc

@madorama_vrc heapの0番を参照してるっぽい?

2019-12-21 21:43:03
madorama@VRChat @madorama_vrc

@sora_sakaki_vrc n uでheapのn番目を参照してEXTERNできるっぽいし、String literalをPUSHしたらheapの末尾に追加されるっぽい?

2019-12-21 21:47:20
madorama@VRChat @madorama_vrc

(bytecodeの方はあんまり調べてないのでわからない)

2019-12-21 21:48:17
榊そら @sora_sakaki_vrc

@madorama_vrc たぶん、data領域のやつをheapにつめたあとstringリテラルを詰めてますね、挙動見た感じ。 で、これはdata領域がないので0番は初めにpushしたリテラルになります。 デバッガでassembleしてるとこにbreakpointいれるといいですよ

2019-12-21 21:51:30
madorama@VRChat @madorama_vrc

同じ文字列をPUSHしたらちゃんと同じアドレスを指してくれた pic.twitter.com/YxCi5GthIH

2019-12-21 21:53:49
拡大
榊そら @sora_sakaki_vrc

externだけかとおもったけど任意の文字列リテラルがheapに積まれてるっぽいな

2019-12-21 21:56:52
榊そら @sora_sakaki_vrc

@madorama_vrc @cannorin_vrc もしかするとboolつかったjumpがあるからbooleanも特殊な処理があるかも

2019-12-21 21:59:10
Ram.Type-0@VRC @RamType0

@sora_sakaki_vrc 未初期化値アクセスチェックとかコンパイラ側でやるべきなことやってる癖にjumpのせいでバイトコードのオペラントに飛んだらアドレス値が命令として実行されるガバ仕様

2019-12-21 22:08:06