Ribbon: readerをネイティブ版に置き換えたい
とりあえずネイティブ版のreaderはテストを通過したので、ネイティブ版に置き換えて常識的な速度でスクリプトを起動できるようにしたい。
... 適当に置き換えても動かなかったので、その辺をデバッグしていく。
read-bytevector
が壊れていた
そもそも
どうしようもねぇ。。
とりあえず、これでデバッグできる環境になった。 ... というか今なんでソースコードのreadがちゃんと動いてるんだ。。?
読取りindexの更新忘れ
... APIを途中で変えたのをすっかり忘れてた。。これでとりあえずReadが完了するようになった。
読み取ったデータは依然おかしい。上がネイティブ版、下がScheme版。ネイティブ版の出力は短かすぎる。
Tokenバッファの分割があやしい
ReaderはソースコードをTokenに分割するが、そのTokenの情報を可変長のバッファに格納している。そのバッファの初期サイズを大きくすると正常に読み取れる。
diff --git a/c-proto/reader.inc.h b/c-proto/reader.inc.h
index 70ed45a..ff095ad 100644
--- a/c-proto/reader.inc.h
+++ b/c-proto/reader.inc.h
@@ -1,4 +1,4 @@
-#define MR_SECTOR_SIZE 128
+#define MR_SECTOR_SIZE 0x1000
static RnResult
mr_sector_new(RnCtx* ctx, Value* out){
このため、バッファの更新ロジックがあやしい。... よく見たらリストを1つ飛ばしにしていた。
これを直しても途中でクラッシュする。データが化けているので、これはリストを積む側かな。。
処理中のバッファがGCに回収されている
とりあえず適当にprintfを入れたら回収されてしまっていることが直ぐわかった。
Consume 0000027E68CDEC80:4 14
Freeing buf 0000027E68CDEC80
Consume 0000027E68CDEC80:5 -572662307
この値 -572662307
は 0xdd 、つまりVisual Studioでデバッグビルドすると解放済ヒープに含まれる値なのですぐわかる。
If the
_CRTDBG_DELAY_FREE_MEM_DF
bit field of the _crtDbgFlag flag is set, the freed block is filled with the value 0xDD,
まぁ参照を残すようにすれば良いかな。
ちょっと解法が安直な気もするが。。
ここまでで、とりあえず長めのソースコードを読んでも正常に完了するようになった。
ネイティブReaderに切り替え
とりあえずチェック入りで切り替えてデバッグするか。。
Schemeフロントエンドでは、ネイティブ版のreaderである、 miniread-utf8-read
を呼ぶように変更する。
... さっそく、 +
がsymbolとして読まれていないバグが見つかった。
SchemeのS式では1文字の +
と -
はsymbolとして読むという特別ルールがある。数字が続くと数値としてreadされる。
というかホストがSchemeじゃないんだから +Infとかは手で実装しないとダメじゃん。。 → strtod
がちゃんと inf
とか nan
を読めるっぽいので問題なかった。。
テストも概ね通った
quasiquoteだけ正常に動いてないけど、元のReaderでも動いてないので置き換えの所為ではないようだ。
Scheme側もquasiquoteが連続すると正常に読み取れないバグがったので修正した。
切り替え
とりあえずネイティブ版に切り替えたけど全然早くなんねぇな。。