feat: 支持访问器描述符与 get/set 语法

This commit is contained in:
爱特每羊队
2026-06-09 16:22:24 +08:00
parent 044c8a4303
commit ed0864d01f
13 changed files with 457 additions and 77 deletions
+12 -8
View File
@@ -30,17 +30,21 @@ impl Vm {
Ok(())
}
Err(err_val) => {
let msg = if err_val.is_string() {
self.kernel()
.string_forge()
.lookup(err_val.as_string_index())
.unwrap_or_else(|| format!("{err_val}"))
let (error, kind) = if err_val.is_object() {
(err_val, self.thrown_error_kind(err_val))
} else {
format!("{err_val}")
let msg = if err_val.is_string() {
self.kernel()
.string_forge()
.lookup(err_val.as_string_index())
.unwrap_or_else(|| format!("{err_val}"))
} else {
format!("{err_val}")
};
(crate::builtins::error::create_error(self, &msg), "Error")
};
let error = crate::builtins::error::create_error(self, &msg);
self.exception_value = Some(error);
self.pending_error_kind = Some("Error");
self.pending_error_kind = Some(kind);
self.unwind()
}
}
+17 -15
View File
@@ -127,21 +127,23 @@ impl Vm {
self.write_ic_back(obj.shape_id(), ptr);
}
} else {
let new_shape_id = self.kernel.shape_forge().make_shape(obj.shape_id(), prop_name_si);
obj.set_shape_id(new_shape_id);
let new_pos = obj.push_prop(value);
obj.bump_generation();
if let Some(ptr) = obj.prop_ptr_at(new_pos) {
self.write_ic_back(new_shape_id, ptr);
self.kernel.prop_forge().upsert(
new_shape_id,
PropTemplate {
shape_id: new_shape_id,
prop_name: prop_name_si,
position: new_pos,
generation: obj.generation(),
},
);
let old_shape = obj.shape_id();
self.ordinary_set(obj, prop_name_si, value, receiver)?;
if old_shape != obj.shape_id() {
if let Some(pos) = self.kernel.shape_forge().lookup_position(obj.shape_id(), prop_name_si) {
if let Some(ptr) = obj.prop_ptr_at(pos) {
self.write_ic_back(obj.shape_id(), ptr);
self.kernel.prop_forge().upsert(
obj.shape_id(),
PropTemplate {
shape_id: obj.shape_id(),
prop_name: prop_name_si,
position: pos,
generation: obj.generation(),
},
);
}
}
}
}