Compare commits

...

2 Commits

Author SHA1 Message Date
86e150903c Merge remote-tracking branch 'home/v4' into v4
All checks were successful
Build / build (push) Successful in 3m57s
2024-09-24 15:26:06 +09:00
9496b357c5 [obsidian] vault backup: 2024-09-23 01:06:09[ 2024-09-23 01:06:09 +09:00

View File

@ -0,0 +1,65 @@
---
date: 2024-09-22 21:15
---
Reference Countにする場合、Dropをどう実装するか
drop_array()、drop_closure()をプリミティブ命令として用意する?
プリミティブな値の配列ならそのまま開放してよし、オブジェクトを含む配列の配列とか、クロージャの配列なら再帰的にdropする必要あり
drop命令をどのタイミングで挿入するか
mirgenでletの生存期間を調べるしかない
bindsでArgumentの区別はされてるから、環境参照してArgument以外を全部dropする、みたいな感じでええのか
```rust
enum UpvalueKind{
Open{base_ptr:u64,offset:u64},
Closed(ObjectIdx)
}
struct Upvalue{
data:UpvalueKind,
ty: ObjType,
}
type SharedUpValue = Rc<RefCell<Upvalue>>
struct Closure{
pub fnproto_i: u64,
pub base_ptr: u64, //base pointer to current closure, to calculate open upvalue
pub is_closed: bool,
pub upvalues: Vec<SharedUpValue>,
pub state_storage:StateStorage,
}
struct Array{
pub d_size:TypeSize,
pub raw_data: Vec<RawVal>,
}
union HeapObject{
clousre: Closure,
array: Array,
primitive: Vec<RawVal>,
}
struct RcObject{
refcount:u64,
data: HeapObject
}
type = ObjectStorage=SlotMap<DefaultKey, RcObject>;
type = ObjectIdx = DefaultKey;
impl Machine{
...
fn drop_closure(&mut self, objectid:ObjectIdx){
let obj = self.get_object_mut(objectid);
obj.refcount-=1;
if obj.refcount==0{
let cls = unsafe{ &obj.data.closure };
cls.upvalue.iter().for_each(|upv|{
upv
})
self.object_storage.remove(objectid)
}
}
}
```