This commit is contained in:
2024-11-04 17:04:35 +09:00
parent 56e5f290e2
commit 43ee7b8e5b
25 changed files with 414 additions and 21 deletions

View File

@ -209,3 +209,35 @@ fn filterbank (n,filter){ //n:0 filter: 1
あ、でも`callcls`命令実行の時だけ、最初にgetstateを実行、暗黙的に読み出して、その中身のポインタへ飛べばいいのか
Closureを作った時にどうやってstateのメモリを拡張するかというと、ヒープ上のクロージャのデータ構造自体にstateへのポインタを持たせないと無理
---
最小限の表現としてはCall(Stateポインタをいじる可能性がある)とCallClsの2種類で対応可能なんだろうけど、最適化を考えると
- Call (ほぼ純粋な関数)
- CallState (後々SelfとかDelayを呼び出しうる関数)
- CallClosure
- CallExtFunction
ここにTailCallとか加えると、それぞれに一つずつTailCall用の命令が映えるみたいな感じになるのだろうか
コンパイル時ifが使える想定として
```rust
call_function<is_tailcall,is_stateful>(&mut self,f:F){
ifc !is_tailcall{
self.stack.push_return_address();
}
ifc is_closure{
self.stateptr_stack.push(f.state_stack_ptr)
}
let nret = f(self);
ifc is_closure{
self.stateptr_stack.pop()
}
ifc !is_tailcall{
self.stack.push_return_address();
}
}
```