From 63ccd5757e0dba7ee1523acc7fac283ab262ae34 Mon Sep 17 00:00:00 2001 From: TopchetoEU <36534413+TopchetoEU@users.noreply.github.com> Date: Fri, 6 Sep 2024 10:02:11 +0300 Subject: [PATCH] feat: implement spread_obj intrinsic --- .../jscript/runtime/SimpleRepl.java | 22 ++++++++++++++++ src/main/resources/lib/index.js | 25 +++++++++++++++++-- 2 files changed, 45 insertions(+), 2 deletions(-) diff --git a/src/main/java/me/topchetoeu/jscript/runtime/SimpleRepl.java b/src/main/java/me/topchetoeu/jscript/runtime/SimpleRepl.java index 8fc9e68..65f32a3 100644 --- a/src/main/java/me/topchetoeu/jscript/runtime/SimpleRepl.java +++ b/src/main/java/me/topchetoeu/jscript/runtime/SimpleRepl.java @@ -195,6 +195,19 @@ public class SimpleRepl { args.get(0).setPrototype(env, proto); return args.get(0); })); + res.defineOwnMember(env, "getOwnMembers", new NativeFunction(args -> { + var val = new ArrayValue(); + + for (var key : args.get(0).getOwnMembers(env, args.get(1).toBoolean())) { + val.set(val.size(), new StringValue(key)); + } + + return val; + })); + res.defineOwnMember(env, "getOwnSymbolMembers", new NativeFunction(args -> { + return ArrayValue.of(args.get(0).getOwnSymbolMembers(env, args.get(1).toBoolean())); + })); + return res; } @@ -294,9 +307,18 @@ public class SimpleRepl { return Value.UNDEFINED; })); + res.defineOwnMember(env, "setIntrinsic", new NativeFunction(args -> { + var name = args.get(0).toString(env).value; + var val = args.get(1); + + Value.intrinsics(environment).put(name, val); + + return Value.UNDEFINED; + })); res.defineOwnMember(env, "compile", new NativeFunction(args -> { return Compiler.compileFunc(env, new Filename("jscript", "func" + i[0]++ + ".js"), args.get(0).toString(env).value); })); + return res; } diff --git a/src/main/resources/lib/index.js b/src/main/resources/lib/index.js index 43e8837..b901359 100644 --- a/src/main/resources/lib/index.js +++ b/src/main/resources/lib/index.js @@ -30,10 +30,11 @@ const setConstructable = primordials.function.setConstructable; const setCallable = primordials.function.setCallable; const invoke = primordials.function.invoke; +const json = primordials.json; + const setGlobalPrototype = primordials.setGlobalPrototype; const compile = primordials.compile; - -const json = primordials.json; +const setIntrinsic = primordials.setIntrinsic; const valueKey = makeSymbol("Primitive.value"); const undefined = ({}).definitelyDefined; @@ -304,6 +305,26 @@ defineField(Function.prototype, "valueOf", true, false, true, function() { target.Function = Function; +let spread_obj; + +setIntrinsic("spread_obj", spread_obj = (target, obj) => { + if (obj === null || obj === undefined) return; + const members = getOwnMembers(obj, true); + const symbols = getOwnSymbolMembers(obj, true); + + for (let i = 0; i < members.length; i++) { + const member = members[i]; + target[member] = obj[member]; + } + + for (let i = 0; i < symbols.length; i++) { + const member = symbols[i]; + target[member] = obj[member]; + } +}); + +target.spread_obj = spread_obj; + setGlobalPrototype("string", String.prototype); setGlobalPrototype("number", Number.prototype); setGlobalPrototype("boolean", Boolean.prototype);