定期ミートアップ 第46回
BiwaScheme リリースした
Shiika リリースしようとしている
→exampleが通らない
クロージャまわりにバグがあるっぽい
特に、2段にネストしている場合
code:sk
# @user_main()
var i = 0
a.each do # @lambda_1_in_toplevel(...)
b.each do # @lambda_2_in_toplevel(...)
i += 1
end
end
storeの間違いを検知する
inkwellは変なstoreも生成してしまう
→.bcをリンクする段階でエラーになる
error: Explicit load/store type does not match pointee type of pointer operand (Producer: 'LLVM12.0.1' Reader: 'LLVM APPLE_1_1400.0.29.202_0')
% /opt/homebrew/Cellar/llvm@12/12.0.1_1/bin/opt a.ll
/opt/homebrew/Cellar/llvm@12/12.0.1_1/bin/opt: a.ll:1352:9: error: stored value and pointer type do not match
store %Int* %ret, %Int*** %addr_capture_0th, align 8
^
生成時にチェックするようにしてみた
code:txt
PointerType {
ptr_type: Type {
address: 0x000000015684ef30,
llvm_type: "%Int*",
},
},
)
ptr_type: Type {
address: 0x0000000156026438,
llvm_type: "%Int**",
},
}
thread 'main' panicked at 'assertion failed: self.store_type_matches(gen, idx, value)', lib/skc_codegen/src/lambda.rs:79:9
bitcastの間違いを検知する
これは難しい
%Int*と%Int**のbitcastなら明らかにおかしそう
→と思ったが実際に使っていることがわかった
バグかもしれないが(未調査)