From 2d58ef5ebdc37253bd0e6b889ac3b7b2b14bfbc0 Mon Sep 17 00:00:00 2001 From: Andrew Morris Date: Mon, 24 Jul 2023 17:47:13 +1000 Subject: [PATCH] Implement method props --- inputs/passing/methodProp.ts | 11 +++++++ .../src/expression_compiler.rs | 32 ++++++++++++++++++- 2 files changed, 42 insertions(+), 1 deletion(-) create mode 100644 inputs/passing/methodProp.ts diff --git a/inputs/passing/methodProp.ts b/inputs/passing/methodProp.ts new file mode 100644 index 0000000..1835039 --- /dev/null +++ b/inputs/passing/methodProp.ts @@ -0,0 +1,11 @@ +//! test_output("foo") + +export default () => { + const stuff = { + foo() { + return "foo"; + }, + }; + + return stuff.foo(); +}; diff --git a/valuescript_compiler/src/expression_compiler.rs b/valuescript_compiler/src/expression_compiler.rs index ea77248..766b7ec 100644 --- a/valuescript_compiler/src/expression_compiler.rs +++ b/valuescript_compiler/src/expression_compiler.rs @@ -508,7 +508,37 @@ impl<'a, 'fnc> ExpressionCompiler<'a, 'fnc> { Prop::Assign(assign) => self.todo(assign.span(), "Assign prop"), Prop::Getter(getter) => self.todo(getter.span(), "Getter prop"), Prop::Setter(setter) => self.todo(setter.span(), "Setter prop"), - Prop::Method(method) => self.todo(method.span(), "Method prop"), + Prop::Method(method) => { + let mut compiled_key = self.prop_name(&method.key); + compiled_key.release_checker.has_unreleased_registers = false; + sub_nested_registers.append(&mut compiled_key.nested_registers); + + let prop_key = compiled_key.value; + + let fn_ident = match &method.key { + swc_ecma_ast::PropName::Ident(ident) => Some(ident.clone()), + _ => None, + }; + + let fn_name = fn_ident.clone().map(|ident| ident.sym.to_string()); + + let p = match &fn_name { + Some(name) => self.fnc.allocate_defn(name), + None => self.fnc.allocate_defn_numbered("_anon"), + }; + + self + .fnc + .queue + .add(QueuedFunction { + definition_pointer: p.clone(), + fn_name: fn_name.clone(), + functionish: Functionish::Fn(fn_ident, method.function.clone()), + }) + .expect("Failed to queue function"); + + object_asm.properties.push((prop_key, Value::Pointer(p))); + } }, } }