feat: 支持 String 对象及成员方法

This commit is contained in:
爱特每羊队
2026-06-07 10:36:02 +08:00
parent 2063f4731b
commit ee6fcad370
8 changed files with 804 additions and 2 deletions
+53 -2
View File
@@ -8,7 +8,7 @@ use oxide_compiler::opcode::{self, OpCode};
use crate::coercion;
use crate::native::NativeFn;
use oxide_kernel::builtin::{ArrayMethods, ErrorMethods, ObjectMethods};
use oxide_kernel::builtin::{ArrayMethods, ErrorMethods, ObjectMethods, StringMethods};
use oxide_kernel::kernel::{KernelConfig, OxideKernel};
use oxide_kernel::prop_forge::PropTemplate;
use oxide_kernel::shape_forge::EMPTY_SHAPE_ID;
@@ -131,6 +131,45 @@ pub fn init_kernel_builtins(kernel: &Arc<OxideKernel>) {
let bump3 = bumpalo::Bump::new();
global.set_prop_expand(cur_count, err_val, &bump3);
global.bump_generation();
let string_methods = StringMethods {
index_of: crate::builtins::string::string_index_of as *const (),
includes: crate::builtins::string::string_includes as *const (),
char_at: crate::builtins::string::string_char_at as *const (),
char_code_at: crate::builtins::string::string_char_code_at as *const (),
concat: crate::builtins::string::string_concat as *const (),
slice: crate::builtins::string::string_slice as *const (),
substring: crate::builtins::string::string_substring as *const (),
to_upper_case: crate::builtins::string::string_to_upper_case as *const (),
to_lower_case: crate::builtins::string::string_to_lower_case as *const (),
trim: crate::builtins::string::string_trim as *const (),
repeat: crate::builtins::string::string_repeat as *const (),
pad_start: crate::builtins::string::string_pad_start as *const (),
pad_end: crate::builtins::string::string_pad_end as *const (),
starts_with: crate::builtins::string::string_starts_with as *const (),
ends_with: crate::builtins::string::string_ends_with as *const (),
split: crate::builtins::string::string_split as *const (),
replace: crate::builtins::string::string_replace as *const (),
match_fn: crate::builtins::string::string_match_fn as *const (),
search: crate::builtins::string::string_search as *const (),
};
kernel.builtin_world().bind_string_methods(
&string_methods,
kernel.string_forge().as_ref(),
kernel.shape_forge().as_ref(),
);
let si_str = kernel.string_forge().intern("String").0;
let str_shape = kernel.shape_forge().make_shape(global.shape_id(), si_str);
let str_val = JsValue::from_js_object(
kernel.builtin_world().string_constructor.as_ptr() as *mut JsObject
);
let cur_count = global.prop_count();
global.set_shape_id(str_shape);
global.set_prop_count(cur_count + 1);
let bump4 = bumpalo::Bump::new();
global.set_prop_expand(cur_count, str_val, &bump4);
global.bump_generation();
}
impl Vm {
@@ -552,8 +591,20 @@ impl Vm {
}
OpCode::IC_GET_PROP => {
let obj_ptr = self.regs[a].as_object_ptr() as *mut JsObject;
let val = self.regs[a];
let obj_ptr = val.as_object_ptr() as *mut JsObject;
if obj_ptr.is_null() {
if val.is_string() {
let proto_ptr =
self.kernel.builtin_world().string_proto.as_ptr() as *mut JsObject;
let proto = unsafe { &*proto_ptr };
let prop_name_si = self.regs[b].as_string_index();
if let Some(resolved) = self.resolve_property(proto, prop_name_si) {
self.regs[a] = resolved;
self.pc += 1;
continue;
}
}
return Err("IC_GET_PROP on non-object".into());
}
let obj = unsafe { &*obj_ptr };