Open8

Ribbon: readerをネイティブ版に置き換えたい

okuokuokuoku

とりあえずネイティブ版のreaderはテストを通過したので、ネイティブ版に置き換えて常識的な速度でスクリプトを起動できるようにしたい。

... 適当に置き換えても動かなかったので、その辺をデバッグしていく。

okuokuokuoku

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つ飛ばしにしていた。

https://github.com/okuoku/ribbon/commit/69e9973da4ff6b9600fa4b62484ddeaa0ac434b1

これを直しても途中でクラッシュする。データが化けているので、これはリストを積む側かな。。

okuokuokuoku

処理中のバッファがGCに回収されている

とりあえず適当にprintfを入れたら回収されてしまっていることが直ぐわかった。

Consume 0000027E68CDEC80:4      14
Freeing buf 0000027E68CDEC80
Consume 0000027E68CDEC80:5      -572662307

この値 -572662307 は 0xdd 、つまりVisual Studioでデバッグビルドすると解放済ヒープに含まれる値なのですぐわかる。

https://learn.microsoft.com/en-us/cpp/c-runtime-library/reference/free-dbg?view=msvc-170

If the _CRTDBG_DELAY_FREE_MEM_DF bit field of the _crtDbgFlag flag is set, the freed block is filled with the value 0xDD,

まぁ参照を残すようにすれば良いかな。

https://github.com/okuoku/ribbon/commit/1392a0af43cc99591a5656214e2d9469e1cf1dfe

ちょっと解法が安直な気もするが。。

ここまでで、とりあえず長めのソースコードを読んでも正常に完了するようになった。

okuokuokuoku

ネイティブReaderに切り替え

とりあえずチェック入りで切り替えてデバッグするか。。

https://github.com/okuoku/yuniribbit-proto/commit/539f1266c0e38661d8bd0e178d1ff2de4e4f4fe7

Schemeフロントエンドでは、ネイティブ版のreaderである、 miniread-utf8-read を呼ぶように変更する。

... さっそく、 + がsymbolとして読まれていないバグが見つかった。

https://github.com/okuoku/ribbon/commit/18642343dab7e7072842228ec1d413ca547d1c27

SchemeのS式では1文字の +- はsymbolとして読むという特別ルールがある。数字が続くと数値としてreadされる。

というかホストがSchemeじゃないんだから +Infとかは手で実装しないとダメじゃん。。 → strtod がちゃんと inf とか nan を読めるっぽいので問題なかった。。