Compare commits

..

21 Commits

Author SHA1 Message Date
fda33112a7 fix: load maps when attaching debugger 2024-03-30 11:13:45 +02:00
67b2413d7c bump2 2024-03-30 10:36:55 +02:00
3a05416510 bump 2024-03-30 10:30:26 +02:00
c291328cc3 fix: detach debugger after close 2024-03-30 10:22:12 +02:00
7cb267b0d9 fix: some issues with debugger 2024-03-30 09:55:20 +02:00
4e31766665 fix: add new vscode debugger functions 2024-03-29 21:53:15 +02:00
b5b63c4342 fix: make global cache of native wrappers 2024-03-28 16:08:07 +02:00
18f70a0d58 fix: i hate wrappers 2024-03-28 15:10:21 +02:00
d38b600366 fix: some more wrapper issues 2024-03-28 14:52:49 +02:00
0ac7af2ea3 fix: take into account empty classes 2024-03-28 14:21:23 +02:00
5185c93663 fix: don't include non-exposing wrappers in proto chain
feat: allow adding custom wrappers
2024-03-28 00:57:09 +02:00
510422cab7 feat: implement logic for exposing non-static fields 2024-03-27 23:39:33 +02:00
79e1d1cfaf Merge branch 'master' of https://github.com/TopchetoEU/java-jscript 2024-03-27 23:08:25 +02:00
e0f3274a95 feat: add simple for-of loop (not intended for production usage) 2024-03-27 23:08:21 +02:00
ef5d29105f Update README.md 2024-03-10 02:17:18 +02:00
d8ea6557df fix: buildline expects tag to start with 'v' 2024-03-09 00:45:00 +02:00
5ba858545a fix: defer handles of async functions 2024-03-09 00:28:30 +02:00
446ecd8f2b fix: promise defers callback twice 2024-03-08 17:23:50 +02:00
fbf103439a bump 2024-03-08 16:55:46 +02:00
b30f94de8f refactor: move function pushMsg signatures in EventLoop 2024-03-08 16:53:47 +02:00
47b4dd3c15 refactor: rename code to runtime 2024-03-06 23:23:01 +02:00
82 changed files with 637 additions and 402 deletions

View File

@@ -3,7 +3,7 @@ name: "tagged-release"
on: on:
push: push:
tags: tags:
- "v*" - "*"
jobs: jobs:
tagged-release: tagged-release:

View File

@@ -23,7 +23,3 @@ engine.run(true);
// Get our result // Get our result
System.out.println(awaitable.await()); System.out.println(awaitable.await());
``` ```
## NOTE:
To setup the typescript bundle in your sources, run `node build.js init-ts`. This will download the latest version of typescript, minify it, and add it to your src folder. If you are going to work with the `node build.js debug|release` command, this is not a necessary step.

View File

@@ -1,4 +1,4 @@
project_group = me.topchetoeu project_group = me.topchetoeu
project_name = jscript project_name = jscript
project_version = 0.9.7-beta project_version = 0.9.25-beta
main_class = me.topchetoeu.jscript.utils.JScriptRepl main_class = me.topchetoeu.jscript.utils.JScriptRepl

View File

@@ -5,7 +5,7 @@ import java.io.DataOutputStream;
import java.io.IOException; import java.io.IOException;
import java.util.HashMap; import java.util.HashMap;
import me.topchetoeu.jscript.core.exceptions.SyntaxException; import me.topchetoeu.jscript.runtime.exceptions.SyntaxException;
public class Instruction { public class Instruction {
public static enum Type { public static enum Type {

View File

@@ -1,6 +1,6 @@
package me.topchetoeu.jscript.common.events; package me.topchetoeu.jscript.common.events;
import me.topchetoeu.jscript.core.exceptions.InterruptException; import me.topchetoeu.jscript.runtime.exceptions.InterruptException;
public class Notifier { public class Notifier {
private boolean ok = false; private boolean ok = false;

View File

@@ -9,12 +9,12 @@ import me.topchetoeu.jscript.compilation.parsing.Operator;
import me.topchetoeu.jscript.compilation.parsing.ParseRes; import me.topchetoeu.jscript.compilation.parsing.ParseRes;
import me.topchetoeu.jscript.compilation.parsing.Parsing; import me.topchetoeu.jscript.compilation.parsing.Parsing;
import me.topchetoeu.jscript.compilation.parsing.Token; import me.topchetoeu.jscript.compilation.parsing.Token;
import me.topchetoeu.jscript.core.Context; import me.topchetoeu.jscript.runtime.Context;
import me.topchetoeu.jscript.core.values.ArrayValue; import me.topchetoeu.jscript.runtime.exceptions.EngineException;
import me.topchetoeu.jscript.core.values.ObjectValue; import me.topchetoeu.jscript.runtime.exceptions.SyntaxException;
import me.topchetoeu.jscript.core.values.Values; import me.topchetoeu.jscript.runtime.values.ArrayValue;
import me.topchetoeu.jscript.core.exceptions.EngineException; import me.topchetoeu.jscript.runtime.values.ObjectValue;
import me.topchetoeu.jscript.core.exceptions.SyntaxException; import me.topchetoeu.jscript.runtime.values.Values;
public class JSON { public class JSON {
public static Object toJs(JSONElement val) { public static Object toJs(JSONElement val) {

View File

@@ -1,7 +1,7 @@
package me.topchetoeu.jscript.compilation; package me.topchetoeu.jscript.compilation;
import me.topchetoeu.jscript.common.Instruction; import me.topchetoeu.jscript.common.Instruction;
import me.topchetoeu.jscript.core.exceptions.SyntaxException; import me.topchetoeu.jscript.runtime.exceptions.SyntaxException;
public class ThrowSyntaxStatement extends Statement { public class ThrowSyntaxStatement extends Statement {
public final String name; public final String name;

View File

@@ -0,0 +1,73 @@
package me.topchetoeu.jscript.compilation.control;
import me.topchetoeu.jscript.common.Instruction;
import me.topchetoeu.jscript.common.Location;
import me.topchetoeu.jscript.common.Instruction.BreakpointType;
import me.topchetoeu.jscript.compilation.CompileResult;
import me.topchetoeu.jscript.compilation.Statement;
public class ForOfStatement extends Statement {
public final String varName;
public final boolean isDeclaration;
public final Statement iterable, body;
public final String label;
public final Location varLocation;
@Override
public void declare(CompileResult target) {
body.declare(target);
if (isDeclaration) target.scope.define(varName);
}
@Override
public void compile(CompileResult target, boolean pollute) {
var key = target.scope.getKey(varName);
if (key instanceof String) target.add(Instruction.makeVar((String)key));
iterable.compile(target, true, BreakpointType.STEP_OVER);
target.add(Instruction.dup());
target.add(Instruction.loadVar("Symbol"));
target.add(Instruction.pushValue("iterator"));
target.add(Instruction.loadMember()).setLocation(iterable.loc());
target.add(Instruction.loadMember()).setLocation(iterable.loc());
target.add(Instruction.call(0)).setLocation(iterable.loc());
int start = target.size();
target.add(Instruction.dup());
target.add(Instruction.dup());
target.add(Instruction.pushValue("next"));
target.add(Instruction.loadMember()).setLocation(iterable.loc());
target.add(Instruction.call(0)).setLocation(iterable.loc());
target.add(Instruction.dup());
target.add(Instruction.pushValue("done"));
target.add(Instruction.loadMember()).setLocation(iterable.loc());
int mid = target.temp();
target.add(Instruction.pushValue("value"));
target.add(Instruction.loadMember()).setLocation(varLocation);
target.add(Instruction.storeVar(key)).setLocationAndDebug(iterable.loc(), BreakpointType.STEP_OVER);
body.compile(target, false, BreakpointType.STEP_OVER);
int end = target.size();
WhileStatement.replaceBreaks(target, label, mid + 1, end, start, end + 1);
target.add(Instruction.jmp(start - end));
target.add(Instruction.discard());
target.add(Instruction.discard());
target.set(mid, Instruction.jmpIf(end - mid + 1));
if (pollute) target.add(Instruction.pushUndefined());
}
public ForOfStatement(Location loc, Location varLocation, String label, boolean isDecl, String varName, Statement object, Statement body) {
super(loc);
this.varLocation = varLocation;
this.label = label;
this.isDeclaration = isDecl;
this.varName = varName;
this.iterable = object;
this.body = body;
}
}

View File

@@ -18,7 +18,7 @@ import me.topchetoeu.jscript.compilation.control.SwitchStatement.SwitchCase;
import me.topchetoeu.jscript.compilation.parsing.ParseRes.State; import me.topchetoeu.jscript.compilation.parsing.ParseRes.State;
import me.topchetoeu.jscript.compilation.scope.LocalScopeRecord; import me.topchetoeu.jscript.compilation.scope.LocalScopeRecord;
import me.topchetoeu.jscript.compilation.values.*; import me.topchetoeu.jscript.compilation.values.*;
import me.topchetoeu.jscript.core.exceptions.SyntaxException; import me.topchetoeu.jscript.runtime.exceptions.SyntaxException;
// TODO: this has to be rewritten // TODO: this has to be rewritten
public class Parsing { public class Parsing {
@@ -1777,6 +1777,46 @@ public class Parsing {
return ParseRes.res(new ForInStatement(loc, nameLoc, labelRes.result, isDecl, nameRes.result, varVal, objRes.result, bodyRes.result), n); return ParseRes.res(new ForInStatement(loc, nameLoc, labelRes.result, isDecl, nameRes.result, varVal, objRes.result, bodyRes.result), n);
} }
public static ParseRes<ForOfStatement> parseForOf(Filename filename, List<Token> tokens, int i) {
var loc = getLoc(filename, tokens, i);
int n = 0;
var labelRes = parseLabel(tokens, i + n);
var isDecl = false;
n += labelRes.n;
if (!isIdentifier(tokens, i + n++, "for")) return ParseRes.failed();
if (!isOperator(tokens, i + n++, Operator.PAREN_OPEN)) return ParseRes.error(loc, "Expected a open paren after 'for'.");
if (isIdentifier(tokens, i + n, "var")) {
isDecl = true;
n++;
}
var nameRes = parseIdentifier(tokens, i + n);
if (!nameRes.isSuccess()) return ParseRes.error(loc, "Expected a variable name for 'for' loop.");
var nameLoc = getLoc(filename, tokens, i + n);
n += nameRes.n;
if (!isIdentifier(tokens, i + n++, "of")) {
if (nameRes.result.equals("const")) return ParseRes.error(loc, "'const' declarations are not supported.");
else if (nameRes.result.equals("let")) return ParseRes.error(loc, "'let' declarations are not supported.");
else return ParseRes.error(loc, "Expected 'of' keyword after variable declaration.");
}
var objRes = parseValue(filename, tokens, i + n, 0);
if (!objRes.isSuccess()) return ParseRes.error(loc, "Expected a value.", objRes);
n += objRes.n;
if (!isOperator(tokens, i + n++, Operator.PAREN_CLOSE)) return ParseRes.error(loc, "Expected a closing paren after for.");
var bodyRes = parseStatement(filename, tokens, i + n);
if (!bodyRes.isSuccess()) return ParseRes.error(loc, "Expected a for body.", bodyRes);
n += bodyRes.n;
return ParseRes.res(new ForOfStatement(loc, nameLoc, labelRes.result, isDecl, nameRes.result, objRes.result, bodyRes.result), n);
}
public static ParseRes<TryStatement> parseCatch(Filename filename, List<Token> tokens, int i) { public static ParseRes<TryStatement> parseCatch(Filename filename, List<Token> tokens, int i) {
var loc = getLoc(filename, tokens, i); var loc = getLoc(filename, tokens, i);
int n = 0; int n = 0;
@@ -1833,6 +1873,7 @@ public class Parsing {
parseSwitch(filename, tokens, i), parseSwitch(filename, tokens, i),
parseFor(filename, tokens, i), parseFor(filename, tokens, i),
parseForIn(filename, tokens, i), parseForIn(filename, tokens, i),
parseForOf(filename, tokens, i),
parseDoWhile(filename, tokens, i), parseDoWhile(filename, tokens, i),
parseCatch(filename, tokens, i), parseCatch(filename, tokens, i),
parseCompound(filename, tokens, i), parseCompound(filename, tokens, i),

View File

@@ -7,7 +7,7 @@ import me.topchetoeu.jscript.common.Instruction.Type;
import me.topchetoeu.jscript.compilation.CompileResult; import me.topchetoeu.jscript.compilation.CompileResult;
import me.topchetoeu.jscript.compilation.CompoundStatement; import me.topchetoeu.jscript.compilation.CompoundStatement;
import me.topchetoeu.jscript.compilation.Statement; import me.topchetoeu.jscript.compilation.Statement;
import me.topchetoeu.jscript.core.exceptions.SyntaxException; import me.topchetoeu.jscript.runtime.exceptions.SyntaxException;
public class FunctionStatement extends Statement { public class FunctionStatement extends Statement {
public final CompoundStatement body; public final CompoundStatement body;

View File

@@ -1,5 +0,0 @@
package me.topchetoeu.jscript.core;
public class Key<T> {
}

View File

@@ -1,32 +0,0 @@
package me.topchetoeu.jscript.core.values;
import me.topchetoeu.jscript.core.Context;
public class NativeWrapper extends ObjectValue {
private static final Object NATIVE_PROTO = new Object();
public final Object wrapped;
@Override
public ObjectValue getPrototype(Context ctx) {
if (ctx.environment != null && prototype == NATIVE_PROTO) return ctx.environment.wrappers.getProto(wrapped.getClass());
else return super.getPrototype(ctx);
}
@Override
public String toString() {
return wrapped.toString();
}
@Override
public boolean equals(Object obj) {
return wrapped.equals(obj);
}
@Override
public int hashCode() {
return wrapped.hashCode();
}
public NativeWrapper(Object wrapped) {
this.wrapped = wrapped;
prototype = NATIVE_PROTO;
}
}

View File

@@ -3,11 +3,11 @@ package me.topchetoeu.jscript.lib;
import java.util.Iterator; import java.util.Iterator;
import java.util.Stack; import java.util.Stack;
import me.topchetoeu.jscript.core.values.ArrayValue; import me.topchetoeu.jscript.runtime.values.ArrayValue;
import me.topchetoeu.jscript.core.values.FunctionValue; import me.topchetoeu.jscript.runtime.values.FunctionValue;
import me.topchetoeu.jscript.core.values.NativeFunction; import me.topchetoeu.jscript.runtime.values.NativeFunction;
import me.topchetoeu.jscript.core.values.ObjectValue; import me.topchetoeu.jscript.runtime.values.ObjectValue;
import me.topchetoeu.jscript.core.values.Values; import me.topchetoeu.jscript.runtime.values.Values;
import me.topchetoeu.jscript.utils.interop.Arguments; import me.topchetoeu.jscript.utils.interop.Arguments;
import me.topchetoeu.jscript.utils.interop.Expose; import me.topchetoeu.jscript.utils.interop.Expose;
import me.topchetoeu.jscript.utils.interop.ExposeConstructor; import me.topchetoeu.jscript.utils.interop.ExposeConstructor;

View File

@@ -1,13 +1,13 @@
package me.topchetoeu.jscript.lib; package me.topchetoeu.jscript.lib;
import me.topchetoeu.jscript.core.Context;
import me.topchetoeu.jscript.core.Frame;
import me.topchetoeu.jscript.core.values.CodeFunction;
import me.topchetoeu.jscript.core.values.FunctionValue;
import me.topchetoeu.jscript.core.values.NativeFunction;
import me.topchetoeu.jscript.core.values.Values;
import me.topchetoeu.jscript.core.exceptions.EngineException;
import me.topchetoeu.jscript.lib.PromiseLib.Handle; import me.topchetoeu.jscript.lib.PromiseLib.Handle;
import me.topchetoeu.jscript.runtime.Context;
import me.topchetoeu.jscript.runtime.Frame;
import me.topchetoeu.jscript.runtime.exceptions.EngineException;
import me.topchetoeu.jscript.runtime.values.CodeFunction;
import me.topchetoeu.jscript.runtime.values.FunctionValue;
import me.topchetoeu.jscript.runtime.values.NativeFunction;
import me.topchetoeu.jscript.runtime.values.Values;
import me.topchetoeu.jscript.utils.interop.Arguments; import me.topchetoeu.jscript.utils.interop.Arguments;
import me.topchetoeu.jscript.utils.interop.WrapperName; import me.topchetoeu.jscript.utils.interop.WrapperName;
@@ -54,7 +54,7 @@ public class AsyncFunctionLib extends FunctionValue {
public void onReject(EngineException err) { public void onReject(EngineException err) {
next(ctx, Values.NO_RETURN, err); next(ctx, Values.NO_RETURN, err);
} }
}); }.defer(ctx));
} }
} }

View File

@@ -1,11 +1,11 @@
package me.topchetoeu.jscript.lib; package me.topchetoeu.jscript.lib;
import me.topchetoeu.jscript.core.Context; import me.topchetoeu.jscript.runtime.Context;
import me.topchetoeu.jscript.core.Frame; import me.topchetoeu.jscript.runtime.Frame;
import me.topchetoeu.jscript.core.values.CodeFunction; import me.topchetoeu.jscript.runtime.exceptions.EngineException;
import me.topchetoeu.jscript.core.values.FunctionValue; import me.topchetoeu.jscript.runtime.values.CodeFunction;
import me.topchetoeu.jscript.core.values.NativeFunction; import me.topchetoeu.jscript.runtime.values.FunctionValue;
import me.topchetoeu.jscript.core.exceptions.EngineException; import me.topchetoeu.jscript.runtime.values.NativeFunction;
import me.topchetoeu.jscript.utils.interop.WrapperName; import me.topchetoeu.jscript.utils.interop.WrapperName;
@WrapperName("AsyncGeneratorFunction") @WrapperName("AsyncGeneratorFunction")

View File

@@ -2,12 +2,12 @@ package me.topchetoeu.jscript.lib;
import java.util.Map; import java.util.Map;
import me.topchetoeu.jscript.core.Context;
import me.topchetoeu.jscript.core.Frame;
import me.topchetoeu.jscript.core.values.ObjectValue;
import me.topchetoeu.jscript.core.values.Values;
import me.topchetoeu.jscript.core.exceptions.EngineException;
import me.topchetoeu.jscript.lib.PromiseLib.Handle; import me.topchetoeu.jscript.lib.PromiseLib.Handle;
import me.topchetoeu.jscript.runtime.Context;
import me.topchetoeu.jscript.runtime.Frame;
import me.topchetoeu.jscript.runtime.exceptions.EngineException;
import me.topchetoeu.jscript.runtime.values.ObjectValue;
import me.topchetoeu.jscript.runtime.values.Values;
import me.topchetoeu.jscript.utils.interop.Arguments; import me.topchetoeu.jscript.utils.interop.Arguments;
import me.topchetoeu.jscript.utils.interop.Expose; import me.topchetoeu.jscript.utils.interop.Expose;
import me.topchetoeu.jscript.utils.interop.WrapperName; import me.topchetoeu.jscript.utils.interop.WrapperName;
@@ -62,7 +62,7 @@ public class AsyncGeneratorLib {
@Override public void onReject(EngineException err) { @Override public void onReject(EngineException err) {
next(ctx, Values.NO_RETURN, Values.NO_RETURN, err); next(ctx, Values.NO_RETURN, Values.NO_RETURN, err);
} }
}); }.defer(ctx));
} }
else if (state == 2) { else if (state == 2) {
var obj = new ObjectValue(); var obj = new ObjectValue();

View File

@@ -1,7 +1,7 @@
package me.topchetoeu.jscript.lib; package me.topchetoeu.jscript.lib;
import me.topchetoeu.jscript.core.values.ObjectValue; import me.topchetoeu.jscript.runtime.values.ObjectValue;
import me.topchetoeu.jscript.core.values.Values; import me.topchetoeu.jscript.runtime.values.Values;
import me.topchetoeu.jscript.utils.interop.Arguments; import me.topchetoeu.jscript.utils.interop.Arguments;
import me.topchetoeu.jscript.utils.interop.Expose; import me.topchetoeu.jscript.utils.interop.Expose;
import me.topchetoeu.jscript.utils.interop.ExposeConstructor; import me.topchetoeu.jscript.utils.interop.ExposeConstructor;

View File

@@ -2,7 +2,7 @@ package me.topchetoeu.jscript.lib;
import java.io.IOException; import java.io.IOException;
import me.topchetoeu.jscript.core.values.Values; import me.topchetoeu.jscript.runtime.values.Values;
import me.topchetoeu.jscript.utils.filesystem.File; import me.topchetoeu.jscript.utils.filesystem.File;
import me.topchetoeu.jscript.utils.interop.Arguments; import me.topchetoeu.jscript.utils.interop.Arguments;
import me.topchetoeu.jscript.utils.interop.Expose; import me.topchetoeu.jscript.utils.interop.Expose;

View File

@@ -4,9 +4,9 @@ import java.util.ArrayList;
import me.topchetoeu.jscript.common.Buffer; import me.topchetoeu.jscript.common.Buffer;
import me.topchetoeu.jscript.compilation.parsing.Parsing; import me.topchetoeu.jscript.compilation.parsing.Parsing;
import me.topchetoeu.jscript.core.values.ArrayValue; import me.topchetoeu.jscript.runtime.exceptions.EngineException;
import me.topchetoeu.jscript.core.values.Values; import me.topchetoeu.jscript.runtime.values.ArrayValue;
import me.topchetoeu.jscript.core.exceptions.EngineException; import me.topchetoeu.jscript.runtime.values.Values;
import me.topchetoeu.jscript.utils.interop.Arguments; import me.topchetoeu.jscript.utils.interop.Arguments;
import me.topchetoeu.jscript.utils.interop.Expose; import me.topchetoeu.jscript.utils.interop.Expose;
import me.topchetoeu.jscript.utils.interop.ExposeTarget; import me.topchetoeu.jscript.utils.interop.ExposeTarget;

View File

@@ -1,10 +1,10 @@
package me.topchetoeu.jscript.lib; package me.topchetoeu.jscript.lib;
import me.topchetoeu.jscript.core.Context; import me.topchetoeu.jscript.runtime.Context;
import me.topchetoeu.jscript.core.values.ObjectValue; import me.topchetoeu.jscript.runtime.exceptions.ConvertException;
import me.topchetoeu.jscript.core.values.Values; import me.topchetoeu.jscript.runtime.values.ObjectValue;
import me.topchetoeu.jscript.core.values.ObjectValue.PlaceholderProto; import me.topchetoeu.jscript.runtime.values.Values;
import me.topchetoeu.jscript.core.exceptions.ConvertException; import me.topchetoeu.jscript.runtime.values.ObjectValue.PlaceholderProto;
import me.topchetoeu.jscript.utils.interop.Arguments; import me.topchetoeu.jscript.utils.interop.Arguments;
import me.topchetoeu.jscript.utils.interop.Expose; import me.topchetoeu.jscript.utils.interop.Expose;
import me.topchetoeu.jscript.utils.interop.ExposeConstructor; import me.topchetoeu.jscript.utils.interop.ExposeConstructor;

View File

@@ -1,7 +1,7 @@
package me.topchetoeu.jscript.lib; package me.topchetoeu.jscript.lib;
import me.topchetoeu.jscript.core.values.ArrayValue; import me.topchetoeu.jscript.runtime.values.ArrayValue;
import me.topchetoeu.jscript.core.values.Values; import me.topchetoeu.jscript.runtime.values.Values;
import me.topchetoeu.jscript.utils.filesystem.File; import me.topchetoeu.jscript.utils.filesystem.File;
import me.topchetoeu.jscript.utils.filesystem.FilesystemException; import me.topchetoeu.jscript.utils.filesystem.FilesystemException;
import me.topchetoeu.jscript.utils.interop.Arguments; import me.topchetoeu.jscript.utils.interop.Arguments;

View File

@@ -4,10 +4,10 @@ import java.io.IOException;
import java.util.Iterator; import java.util.Iterator;
import java.util.Stack; import java.util.Stack;
import me.topchetoeu.jscript.core.Context; import me.topchetoeu.jscript.runtime.Context;
import me.topchetoeu.jscript.core.values.ObjectValue; import me.topchetoeu.jscript.runtime.exceptions.EngineException;
import me.topchetoeu.jscript.core.values.Values; import me.topchetoeu.jscript.runtime.values.ObjectValue;
import me.topchetoeu.jscript.core.exceptions.EngineException; import me.topchetoeu.jscript.runtime.values.Values;
import me.topchetoeu.jscript.utils.filesystem.ActionType; import me.topchetoeu.jscript.utils.filesystem.ActionType;
import me.topchetoeu.jscript.utils.filesystem.EntryType; import me.topchetoeu.jscript.utils.filesystem.EntryType;
import me.topchetoeu.jscript.utils.filesystem.ErrorReason; import me.topchetoeu.jscript.utils.filesystem.ErrorReason;

View File

@@ -1,9 +1,9 @@
package me.topchetoeu.jscript.lib; package me.topchetoeu.jscript.lib;
import me.topchetoeu.jscript.core.values.ArrayValue; import me.topchetoeu.jscript.runtime.values.ArrayValue;
import me.topchetoeu.jscript.core.values.CodeFunction; import me.topchetoeu.jscript.runtime.values.CodeFunction;
import me.topchetoeu.jscript.core.values.FunctionValue; import me.topchetoeu.jscript.runtime.values.FunctionValue;
import me.topchetoeu.jscript.core.values.NativeFunction; import me.topchetoeu.jscript.runtime.values.NativeFunction;
import me.topchetoeu.jscript.utils.interop.Arguments; import me.topchetoeu.jscript.utils.interop.Arguments;
import me.topchetoeu.jscript.utils.interop.Expose; import me.topchetoeu.jscript.utils.interop.Expose;
import me.topchetoeu.jscript.utils.interop.ExposeTarget; import me.topchetoeu.jscript.utils.interop.ExposeTarget;

View File

@@ -1,11 +1,11 @@
package me.topchetoeu.jscript.lib; package me.topchetoeu.jscript.lib;
import me.topchetoeu.jscript.core.Context; import me.topchetoeu.jscript.runtime.Context;
import me.topchetoeu.jscript.core.Frame; import me.topchetoeu.jscript.runtime.Frame;
import me.topchetoeu.jscript.core.values.CodeFunction; import me.topchetoeu.jscript.runtime.exceptions.EngineException;
import me.topchetoeu.jscript.core.values.FunctionValue; import me.topchetoeu.jscript.runtime.values.CodeFunction;
import me.topchetoeu.jscript.core.values.NativeFunction; import me.topchetoeu.jscript.runtime.values.FunctionValue;
import me.topchetoeu.jscript.core.exceptions.EngineException; import me.topchetoeu.jscript.runtime.values.NativeFunction;
import me.topchetoeu.jscript.utils.interop.WrapperName; import me.topchetoeu.jscript.utils.interop.WrapperName;
@WrapperName("GeneratorFunction") @WrapperName("GeneratorFunction")

View File

@@ -1,10 +1,10 @@
package me.topchetoeu.jscript.lib; package me.topchetoeu.jscript.lib;
import me.topchetoeu.jscript.core.Context; import me.topchetoeu.jscript.runtime.Context;
import me.topchetoeu.jscript.core.Frame; import me.topchetoeu.jscript.runtime.Frame;
import me.topchetoeu.jscript.core.values.ObjectValue; import me.topchetoeu.jscript.runtime.exceptions.EngineException;
import me.topchetoeu.jscript.core.values.Values; import me.topchetoeu.jscript.runtime.values.ObjectValue;
import me.topchetoeu.jscript.core.exceptions.EngineException; import me.topchetoeu.jscript.runtime.values.Values;
import me.topchetoeu.jscript.utils.interop.Arguments; import me.topchetoeu.jscript.utils.interop.Arguments;
import me.topchetoeu.jscript.utils.interop.Expose; import me.topchetoeu.jscript.utils.interop.Expose;
import me.topchetoeu.jscript.utils.interop.WrapperName; import me.topchetoeu.jscript.utils.interop.WrapperName;

View File

@@ -2,14 +2,14 @@ package me.topchetoeu.jscript.lib;
import java.util.HashMap; import java.util.HashMap;
import me.topchetoeu.jscript.core.Context; import me.topchetoeu.jscript.runtime.Context;
import me.topchetoeu.jscript.core.Environment; import me.topchetoeu.jscript.runtime.Environment;
import me.topchetoeu.jscript.core.EventLoop; import me.topchetoeu.jscript.runtime.EventLoop;
import me.topchetoeu.jscript.core.Key; import me.topchetoeu.jscript.runtime.Key;
import me.topchetoeu.jscript.core.scope.GlobalScope; import me.topchetoeu.jscript.runtime.exceptions.EngineException;
import me.topchetoeu.jscript.core.values.FunctionValue; import me.topchetoeu.jscript.runtime.scope.GlobalScope;
import me.topchetoeu.jscript.core.values.Values; import me.topchetoeu.jscript.runtime.values.FunctionValue;
import me.topchetoeu.jscript.core.exceptions.EngineException; import me.topchetoeu.jscript.runtime.values.Values;
import me.topchetoeu.jscript.utils.filesystem.Filesystem; import me.topchetoeu.jscript.utils.filesystem.Filesystem;
import me.topchetoeu.jscript.utils.filesystem.Mode; import me.topchetoeu.jscript.utils.filesystem.Mode;
import me.topchetoeu.jscript.utils.interop.Arguments; import me.topchetoeu.jscript.utils.interop.Arguments;

View File

@@ -1,8 +1,8 @@
package me.topchetoeu.jscript.lib; package me.topchetoeu.jscript.lib;
import me.topchetoeu.jscript.common.json.JSON; import me.topchetoeu.jscript.common.json.JSON;
import me.topchetoeu.jscript.core.exceptions.EngineException; import me.topchetoeu.jscript.runtime.exceptions.EngineException;
import me.topchetoeu.jscript.core.exceptions.SyntaxException; import me.topchetoeu.jscript.runtime.exceptions.SyntaxException;
import me.topchetoeu.jscript.utils.interop.Arguments; import me.topchetoeu.jscript.utils.interop.Arguments;
import me.topchetoeu.jscript.utils.interop.Expose; import me.topchetoeu.jscript.utils.interop.Expose;
import me.topchetoeu.jscript.utils.interop.ExposeTarget; import me.topchetoeu.jscript.utils.interop.ExposeTarget;

View File

@@ -4,10 +4,10 @@ import java.util.ArrayList;
import java.util.LinkedHashMap; import java.util.LinkedHashMap;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import me.topchetoeu.jscript.core.Context; import me.topchetoeu.jscript.runtime.Context;
import me.topchetoeu.jscript.core.values.ArrayValue; import me.topchetoeu.jscript.runtime.values.ArrayValue;
import me.topchetoeu.jscript.core.values.ObjectValue; import me.topchetoeu.jscript.runtime.values.ObjectValue;
import me.topchetoeu.jscript.core.values.Values; import me.topchetoeu.jscript.runtime.values.Values;
import me.topchetoeu.jscript.utils.interop.Arguments; import me.topchetoeu.jscript.utils.interop.Arguments;
import me.topchetoeu.jscript.utils.interop.Expose; import me.topchetoeu.jscript.utils.interop.Expose;
import me.topchetoeu.jscript.utils.interop.ExposeConstructor; import me.topchetoeu.jscript.utils.interop.ExposeConstructor;

View File

@@ -1,7 +1,7 @@
package me.topchetoeu.jscript.lib; package me.topchetoeu.jscript.lib;
import me.topchetoeu.jscript.core.values.ObjectValue; import me.topchetoeu.jscript.runtime.values.ObjectValue;
import me.topchetoeu.jscript.core.values.Values; import me.topchetoeu.jscript.runtime.values.Values;
import me.topchetoeu.jscript.utils.interop.Arguments; import me.topchetoeu.jscript.utils.interop.Arguments;
import me.topchetoeu.jscript.utils.interop.Expose; import me.topchetoeu.jscript.utils.interop.Expose;
import me.topchetoeu.jscript.utils.interop.ExposeConstructor; import me.topchetoeu.jscript.utils.interop.ExposeConstructor;

View File

@@ -1,11 +1,11 @@
package me.topchetoeu.jscript.lib; package me.topchetoeu.jscript.lib;
import me.topchetoeu.jscript.core.values.ArrayValue; import me.topchetoeu.jscript.runtime.exceptions.EngineException;
import me.topchetoeu.jscript.core.values.FunctionValue; import me.topchetoeu.jscript.runtime.values.ArrayValue;
import me.topchetoeu.jscript.core.values.ObjectValue; import me.topchetoeu.jscript.runtime.values.FunctionValue;
import me.topchetoeu.jscript.core.values.Symbol; import me.topchetoeu.jscript.runtime.values.ObjectValue;
import me.topchetoeu.jscript.core.values.Values; import me.topchetoeu.jscript.runtime.values.Symbol;
import me.topchetoeu.jscript.core.exceptions.EngineException; import me.topchetoeu.jscript.runtime.values.Values;
import me.topchetoeu.jscript.utils.interop.Arguments; import me.topchetoeu.jscript.utils.interop.Arguments;
import me.topchetoeu.jscript.utils.interop.Expose; import me.topchetoeu.jscript.utils.interop.Expose;
import me.topchetoeu.jscript.utils.interop.ExposeConstructor; import me.topchetoeu.jscript.utils.interop.ExposeConstructor;

View File

@@ -4,16 +4,16 @@ import java.util.ArrayList;
import java.util.List; import java.util.List;
import me.topchetoeu.jscript.common.ResultRunnable; import me.topchetoeu.jscript.common.ResultRunnable;
import me.topchetoeu.jscript.core.Context; import me.topchetoeu.jscript.runtime.Context;
import me.topchetoeu.jscript.core.EventLoop; import me.topchetoeu.jscript.runtime.EventLoop;
import me.topchetoeu.jscript.core.Extensions; import me.topchetoeu.jscript.runtime.Extensions;
import me.topchetoeu.jscript.core.values.ArrayValue; import me.topchetoeu.jscript.runtime.exceptions.EngineException;
import me.topchetoeu.jscript.core.values.FunctionValue; import me.topchetoeu.jscript.runtime.exceptions.InterruptException;
import me.topchetoeu.jscript.core.values.NativeFunction; import me.topchetoeu.jscript.runtime.values.ArrayValue;
import me.topchetoeu.jscript.core.values.ObjectValue; import me.topchetoeu.jscript.runtime.values.FunctionValue;
import me.topchetoeu.jscript.core.values.Values; import me.topchetoeu.jscript.runtime.values.NativeFunction;
import me.topchetoeu.jscript.core.exceptions.EngineException; import me.topchetoeu.jscript.runtime.values.ObjectValue;
import me.topchetoeu.jscript.core.exceptions.InterruptException; import me.topchetoeu.jscript.runtime.values.Values;
import me.topchetoeu.jscript.utils.interop.Arguments; import me.topchetoeu.jscript.utils.interop.Arguments;
import me.topchetoeu.jscript.utils.interop.Expose; import me.topchetoeu.jscript.utils.interop.Expose;
import me.topchetoeu.jscript.utils.interop.ExposeConstructor; import me.topchetoeu.jscript.utils.interop.ExposeConstructor;
@@ -53,9 +53,6 @@ public class PromiseLib {
private Object val; private Object val;
private void resolveSynchronized(Context ctx, Object val, int newState) { private void resolveSynchronized(Context ctx, Object val, int newState) {
if (!ctx.hasNotNull(EventLoop.KEY)) throw EngineException.ofError("No event loop");
ctx.get(EventLoop.KEY).pushMsg(() -> {
this.val = val; this.val = val;
this.state = newState; this.state = newState;
@@ -72,7 +69,13 @@ public class PromiseLib {
} }
handles = null; handles = null;
}, true);
// ctx.get(EventLoop.KEY).pushMsg(() -> {
// if (!ctx.hasNotNull(EventLoop.KEY)) throw EngineException.ofError("No event loop");
// handles = null;
// }, true);
} }
private synchronized void resolve(Context ctx, Object val, int newState) { private synchronized void resolve(Context ctx, Object val, int newState) {

View File

@@ -1,7 +1,7 @@
package me.topchetoeu.jscript.lib; package me.topchetoeu.jscript.lib;
import me.topchetoeu.jscript.core.values.ObjectValue; import me.topchetoeu.jscript.runtime.values.ObjectValue;
import me.topchetoeu.jscript.core.values.ObjectValue.PlaceholderProto; import me.topchetoeu.jscript.runtime.values.ObjectValue.PlaceholderProto;
import me.topchetoeu.jscript.utils.interop.Arguments; import me.topchetoeu.jscript.utils.interop.Arguments;
import me.topchetoeu.jscript.utils.interop.ExposeConstructor; import me.topchetoeu.jscript.utils.interop.ExposeConstructor;
import me.topchetoeu.jscript.utils.interop.ExposeField; import me.topchetoeu.jscript.utils.interop.ExposeField;

View File

@@ -4,12 +4,12 @@ import java.util.ArrayList;
import java.util.Iterator; import java.util.Iterator;
import java.util.regex.Pattern; import java.util.regex.Pattern;
import me.topchetoeu.jscript.core.Context; import me.topchetoeu.jscript.runtime.Context;
import me.topchetoeu.jscript.core.values.ArrayValue; import me.topchetoeu.jscript.runtime.values.ArrayValue;
import me.topchetoeu.jscript.core.values.FunctionValue; import me.topchetoeu.jscript.runtime.values.FunctionValue;
import me.topchetoeu.jscript.core.values.NativeWrapper; import me.topchetoeu.jscript.runtime.values.NativeWrapper;
import me.topchetoeu.jscript.core.values.ObjectValue; import me.topchetoeu.jscript.runtime.values.ObjectValue;
import me.topchetoeu.jscript.core.values.Values; import me.topchetoeu.jscript.runtime.values.Values;
import me.topchetoeu.jscript.utils.interop.Arguments; import me.topchetoeu.jscript.utils.interop.Arguments;
import me.topchetoeu.jscript.utils.interop.Expose; import me.topchetoeu.jscript.utils.interop.Expose;
import me.topchetoeu.jscript.utils.interop.ExposeConstructor; import me.topchetoeu.jscript.utils.interop.ExposeConstructor;

View File

@@ -4,10 +4,10 @@ import java.util.ArrayList;
import java.util.LinkedHashSet; import java.util.LinkedHashSet;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import me.topchetoeu.jscript.core.Context; import me.topchetoeu.jscript.runtime.Context;
import me.topchetoeu.jscript.core.values.ArrayValue; import me.topchetoeu.jscript.runtime.values.ArrayValue;
import me.topchetoeu.jscript.core.values.ObjectValue; import me.topchetoeu.jscript.runtime.values.ObjectValue;
import me.topchetoeu.jscript.core.values.Values; import me.topchetoeu.jscript.runtime.values.Values;
import me.topchetoeu.jscript.utils.interop.Arguments; import me.topchetoeu.jscript.utils.interop.Arguments;
import me.topchetoeu.jscript.utils.interop.Expose; import me.topchetoeu.jscript.utils.interop.Expose;
import me.topchetoeu.jscript.utils.interop.ExposeConstructor; import me.topchetoeu.jscript.utils.interop.ExposeConstructor;

View File

@@ -2,13 +2,13 @@ package me.topchetoeu.jscript.lib;
import java.util.regex.Pattern; import java.util.regex.Pattern;
import me.topchetoeu.jscript.core.Environment; import me.topchetoeu.jscript.runtime.Environment;
import me.topchetoeu.jscript.core.values.ArrayValue; import me.topchetoeu.jscript.runtime.exceptions.EngineException;
import me.topchetoeu.jscript.core.values.FunctionValue; import me.topchetoeu.jscript.runtime.values.ArrayValue;
import me.topchetoeu.jscript.core.values.ObjectValue; import me.topchetoeu.jscript.runtime.values.FunctionValue;
import me.topchetoeu.jscript.core.values.Symbol; import me.topchetoeu.jscript.runtime.values.ObjectValue;
import me.topchetoeu.jscript.core.values.Values; import me.topchetoeu.jscript.runtime.values.Symbol;
import me.topchetoeu.jscript.core.exceptions.EngineException; import me.topchetoeu.jscript.runtime.values.Values;
import me.topchetoeu.jscript.utils.interop.Arguments; import me.topchetoeu.jscript.utils.interop.Arguments;
import me.topchetoeu.jscript.utils.interop.Expose; import me.topchetoeu.jscript.utils.interop.Expose;
import me.topchetoeu.jscript.utils.interop.ExposeConstructor; import me.topchetoeu.jscript.utils.interop.ExposeConstructor;

View File

@@ -3,10 +3,10 @@ package me.topchetoeu.jscript.lib;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import me.topchetoeu.jscript.core.values.ObjectValue; import me.topchetoeu.jscript.runtime.exceptions.EngineException;
import me.topchetoeu.jscript.core.values.Symbol; import me.topchetoeu.jscript.runtime.values.ObjectValue;
import me.topchetoeu.jscript.core.values.Values; import me.topchetoeu.jscript.runtime.values.Symbol;
import me.topchetoeu.jscript.core.exceptions.EngineException; import me.topchetoeu.jscript.runtime.values.Values;
import me.topchetoeu.jscript.utils.interop.Arguments; import me.topchetoeu.jscript.utils.interop.Arguments;
import me.topchetoeu.jscript.utils.interop.Expose; import me.topchetoeu.jscript.utils.interop.Expose;
import me.topchetoeu.jscript.utils.interop.ExposeConstructor; import me.topchetoeu.jscript.utils.interop.ExposeConstructor;

View File

@@ -1,7 +1,7 @@
package me.topchetoeu.jscript.lib; package me.topchetoeu.jscript.lib;
import me.topchetoeu.jscript.core.values.ObjectValue; import me.topchetoeu.jscript.runtime.values.ObjectValue;
import me.topchetoeu.jscript.core.values.ObjectValue.PlaceholderProto; import me.topchetoeu.jscript.runtime.values.ObjectValue.PlaceholderProto;
import me.topchetoeu.jscript.utils.interop.Arguments; import me.topchetoeu.jscript.utils.interop.Arguments;
import me.topchetoeu.jscript.utils.interop.ExposeConstructor; import me.topchetoeu.jscript.utils.interop.ExposeConstructor;
import me.topchetoeu.jscript.utils.interop.ExposeField; import me.topchetoeu.jscript.utils.interop.ExposeField;

View File

@@ -1,7 +1,7 @@
package me.topchetoeu.jscript.lib; package me.topchetoeu.jscript.lib;
import me.topchetoeu.jscript.core.values.ObjectValue; import me.topchetoeu.jscript.runtime.values.ObjectValue;
import me.topchetoeu.jscript.core.values.ObjectValue.PlaceholderProto; import me.topchetoeu.jscript.runtime.values.ObjectValue.PlaceholderProto;
import me.topchetoeu.jscript.utils.interop.Arguments; import me.topchetoeu.jscript.utils.interop.Arguments;
import me.topchetoeu.jscript.utils.interop.ExposeConstructor; import me.topchetoeu.jscript.utils.interop.ExposeConstructor;
import me.topchetoeu.jscript.utils.interop.ExposeField; import me.topchetoeu.jscript.utils.interop.ExposeField;

View File

@@ -1,10 +1,10 @@
package me.topchetoeu.jscript.core; package me.topchetoeu.jscript.runtime;
import me.topchetoeu.jscript.common.Filename; import me.topchetoeu.jscript.common.Filename;
import me.topchetoeu.jscript.common.FunctionBody; import me.topchetoeu.jscript.common.FunctionBody;
import me.topchetoeu.jscript.core.exceptions.EngineException; import me.topchetoeu.jscript.runtime.exceptions.EngineException;
import me.topchetoeu.jscript.core.scope.ValueVariable; import me.topchetoeu.jscript.runtime.scope.ValueVariable;
import me.topchetoeu.jscript.core.values.CodeFunction; import me.topchetoeu.jscript.runtime.values.CodeFunction;
public interface Compiler { public interface Compiler {
public Key<Compiler> KEY = new Key<>(); public Key<Compiler> KEY = new Key<>();

View File

@@ -1,14 +1,14 @@
package me.topchetoeu.jscript.core; package me.topchetoeu.jscript.runtime;
import java.util.Iterator; import java.util.Iterator;
import java.util.List; import java.util.List;
import me.topchetoeu.jscript.common.Filename; import me.topchetoeu.jscript.common.Filename;
import me.topchetoeu.jscript.core.debug.DebugContext; import me.topchetoeu.jscript.runtime.debug.DebugContext;
import me.topchetoeu.jscript.core.values.CodeFunction; import me.topchetoeu.jscript.runtime.exceptions.EngineException;
import me.topchetoeu.jscript.core.values.FunctionValue; import me.topchetoeu.jscript.runtime.scope.ValueVariable;
import me.topchetoeu.jscript.core.exceptions.EngineException; import me.topchetoeu.jscript.runtime.values.CodeFunction;
import me.topchetoeu.jscript.core.scope.ValueVariable; import me.topchetoeu.jscript.runtime.values.FunctionValue;
public class Context implements Extensions { public class Context implements Extensions {
public static final Context NULL = new Context(); public static final Context NULL = new Context();

View File

@@ -1,12 +1,10 @@
package me.topchetoeu.jscript.core; package me.topchetoeu.jscript.runtime;
import java.util.concurrent.PriorityBlockingQueue; import java.util.concurrent.PriorityBlockingQueue;
import me.topchetoeu.jscript.common.Filename;
import me.topchetoeu.jscript.common.ResultRunnable; import me.topchetoeu.jscript.common.ResultRunnable;
import me.topchetoeu.jscript.common.events.DataNotifier; import me.topchetoeu.jscript.common.events.DataNotifier;
import me.topchetoeu.jscript.core.exceptions.InterruptException; import me.topchetoeu.jscript.runtime.exceptions.InterruptException;
import me.topchetoeu.jscript.core.values.FunctionValue;
public class Engine implements EventLoop { public class Engine implements EventLoop {
private static class Task<T> implements Comparable<Task<?>> { private static class Task<T> implements Comparable<Task<?>> {
@@ -78,18 +76,6 @@ public class Engine implements EventLoop {
return this.thread != null; return this.thread != null;
} }
public DataNotifier<Object> pushMsg(boolean micro, Environment env, FunctionValue func, Object thisArg, Object ...args) {
return pushMsg(() -> {
return func.call(new Context(env), thisArg, args);
}, micro);
}
public DataNotifier<Object> pushMsg(boolean micro, Environment env, Filename filename, String raw, Object thisArg, Object ...args) {
return pushMsg(() -> {
var ctx = new Context(env);
return ctx.compile(filename, raw).call(new Context(env), thisArg, args);
}, micro);
}
public Engine() { public Engine() {
} }
} }

View File

@@ -1,12 +1,12 @@
package me.topchetoeu.jscript.core; package me.topchetoeu.jscript.runtime;
import java.util.HashMap; import java.util.HashMap;
import me.topchetoeu.jscript.core.scope.GlobalScope; import me.topchetoeu.jscript.runtime.exceptions.EngineException;
import me.topchetoeu.jscript.core.values.FunctionValue; import me.topchetoeu.jscript.runtime.scope.GlobalScope;
import me.topchetoeu.jscript.core.values.NativeFunction; import me.topchetoeu.jscript.runtime.values.FunctionValue;
import me.topchetoeu.jscript.core.values.ObjectValue; import me.topchetoeu.jscript.runtime.values.NativeFunction;
import me.topchetoeu.jscript.core.exceptions.EngineException; import me.topchetoeu.jscript.runtime.values.ObjectValue;
import me.topchetoeu.jscript.utils.interop.NativeWrapperProvider; import me.topchetoeu.jscript.utils.interop.NativeWrapperProvider;
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")

View File

@@ -1,8 +1,10 @@
package me.topchetoeu.jscript.core; package me.topchetoeu.jscript.runtime;
import me.topchetoeu.jscript.common.Filename;
import me.topchetoeu.jscript.common.ResultRunnable; import me.topchetoeu.jscript.common.ResultRunnable;
import me.topchetoeu.jscript.common.events.DataNotifier; import me.topchetoeu.jscript.common.events.DataNotifier;
import me.topchetoeu.jscript.core.exceptions.EngineException; import me.topchetoeu.jscript.runtime.exceptions.EngineException;
import me.topchetoeu.jscript.runtime.values.FunctionValue;
public interface EventLoop { public interface EventLoop {
public static final Key<EventLoop> KEY = new Key<>(); public static final Key<EventLoop> KEY = new Key<>();
@@ -20,4 +22,16 @@ public interface EventLoop {
public default DataNotifier<Void> pushMsg(Runnable runnable, boolean micro) { public default DataNotifier<Void> pushMsg(Runnable runnable, boolean micro) {
return pushMsg(() -> { runnable.run(); return null; }, micro); return pushMsg(() -> { runnable.run(); return null; }, micro);
} }
public default DataNotifier<Object> pushMsg(boolean micro, Environment env, FunctionValue func, Object thisArg, Object ...args) {
return pushMsg(() -> {
return func.call(new Context(env), thisArg, args);
}, micro);
}
public default DataNotifier<Object> pushMsg(boolean micro, Environment env, Filename filename, String raw, Object thisArg, Object ...args) {
return pushMsg(() -> {
var ctx = new Context(env);
return ctx.compile(filename, raw).call(new Context(env), thisArg, args);
}, micro);
}
} }

View File

@@ -1,6 +1,17 @@
package me.topchetoeu.jscript.core; package me.topchetoeu.jscript.runtime;
import java.util.List;
public interface Extensions { public interface Extensions {
public static Extensions EMPTY = new Extensions() {
@Override public <T> void add(Key<T> key, T obj) { }
@Override public boolean remove(Key<?> key) { return false; }
@Override public <T> T get(Key<T> key) { return null; }
@Override public boolean has(Key<?> key) { return false; }
@Override public Iterable<Key<?>> keys() { return List.of(); }
};
<T> T get(Key<T> key); <T> T get(Key<T> key);
<T> void add(Key<T> key, T obj); <T> void add(Key<T> key, T obj);
Iterable<Key<?>> keys(); Iterable<Key<?>> keys();
@@ -35,4 +46,9 @@ public interface Extensions {
add((Key<Object>)key, (Object)source.get(key)); add((Key<Object>)key, (Object)source.get(key));
} }
} }
public static Extensions wrap(Extensions ext) {
if (ext == null) return EMPTY;
else return ext;
}
} }

View File

@@ -1,19 +1,19 @@
package me.topchetoeu.jscript.core; package me.topchetoeu.jscript.runtime;
import java.util.List; import java.util.List;
import java.util.Stack; import java.util.Stack;
import me.topchetoeu.jscript.common.Instruction; import me.topchetoeu.jscript.common.Instruction;
import me.topchetoeu.jscript.core.debug.DebugContext; import me.topchetoeu.jscript.runtime.debug.DebugContext;
import me.topchetoeu.jscript.core.scope.LocalScope; import me.topchetoeu.jscript.runtime.exceptions.EngineException;
import me.topchetoeu.jscript.core.scope.ValueVariable; import me.topchetoeu.jscript.runtime.exceptions.InterruptException;
import me.topchetoeu.jscript.core.values.ArrayValue; import me.topchetoeu.jscript.runtime.scope.LocalScope;
import me.topchetoeu.jscript.core.values.CodeFunction; import me.topchetoeu.jscript.runtime.scope.ValueVariable;
import me.topchetoeu.jscript.core.values.ObjectValue; import me.topchetoeu.jscript.runtime.values.ArrayValue;
import me.topchetoeu.jscript.core.values.ScopeValue; import me.topchetoeu.jscript.runtime.values.CodeFunction;
import me.topchetoeu.jscript.core.values.Values; import me.topchetoeu.jscript.runtime.values.ObjectValue;
import me.topchetoeu.jscript.core.exceptions.EngineException; import me.topchetoeu.jscript.runtime.values.ScopeValue;
import me.topchetoeu.jscript.core.exceptions.InterruptException; import me.topchetoeu.jscript.runtime.values.Values;
public class Frame { public class Frame {
public static enum TryState { public static enum TryState {

View File

@@ -1,17 +1,17 @@
package me.topchetoeu.jscript.core; package me.topchetoeu.jscript.runtime;
import java.util.Collections; import java.util.Collections;
import me.topchetoeu.jscript.core.scope.ValueVariable;
import me.topchetoeu.jscript.core.values.ArrayValue;
import me.topchetoeu.jscript.core.values.CodeFunction;
import me.topchetoeu.jscript.core.values.FunctionValue;
import me.topchetoeu.jscript.core.values.ObjectValue;
import me.topchetoeu.jscript.core.values.Symbol;
import me.topchetoeu.jscript.core.values.Values;
import me.topchetoeu.jscript.common.Instruction; import me.topchetoeu.jscript.common.Instruction;
import me.topchetoeu.jscript.common.Operation; import me.topchetoeu.jscript.common.Operation;
import me.topchetoeu.jscript.core.exceptions.EngineException; import me.topchetoeu.jscript.runtime.exceptions.EngineException;
import me.topchetoeu.jscript.runtime.scope.ValueVariable;
import me.topchetoeu.jscript.runtime.values.ArrayValue;
import me.topchetoeu.jscript.runtime.values.CodeFunction;
import me.topchetoeu.jscript.runtime.values.FunctionValue;
import me.topchetoeu.jscript.runtime.values.ObjectValue;
import me.topchetoeu.jscript.runtime.values.Symbol;
import me.topchetoeu.jscript.runtime.values.Values;
public class InstructionRunner { public class InstructionRunner {
private static Object execReturn(Context ctx, Instruction instr, Frame frame) { private static Object execReturn(Context ctx, Instruction instr, Frame frame) {

View File

@@ -0,0 +1,5 @@
package me.topchetoeu.jscript.runtime;
public class Key<T> {
}

View File

@@ -1,7 +1,7 @@
package me.topchetoeu.jscript.core; package me.topchetoeu.jscript.runtime;
import me.topchetoeu.jscript.core.values.FunctionValue; import me.topchetoeu.jscript.runtime.values.FunctionValue;
import me.topchetoeu.jscript.core.values.ObjectValue; import me.topchetoeu.jscript.runtime.values.ObjectValue;
public interface WrapperProvider { public interface WrapperProvider {
public ObjectValue getProto(Class<?> obj); public ObjectValue getProto(Class<?> obj);

View File

@@ -1,4 +1,4 @@
package me.topchetoeu.jscript.core.debug; package me.topchetoeu.jscript.runtime.debug;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
@@ -10,13 +10,13 @@ import me.topchetoeu.jscript.common.FunctionBody;
import me.topchetoeu.jscript.common.Instruction; import me.topchetoeu.jscript.common.Instruction;
import me.topchetoeu.jscript.common.Location; import me.topchetoeu.jscript.common.Location;
import me.topchetoeu.jscript.common.mapping.FunctionMap; import me.topchetoeu.jscript.common.mapping.FunctionMap;
import me.topchetoeu.jscript.core.Context; import me.topchetoeu.jscript.runtime.Context;
import me.topchetoeu.jscript.core.Extensions; import me.topchetoeu.jscript.runtime.Extensions;
import me.topchetoeu.jscript.core.Frame; import me.topchetoeu.jscript.runtime.Frame;
import me.topchetoeu.jscript.core.Key; import me.topchetoeu.jscript.runtime.Key;
import me.topchetoeu.jscript.core.values.CodeFunction; import me.topchetoeu.jscript.runtime.exceptions.EngineException;
import me.topchetoeu.jscript.core.values.FunctionValue; import me.topchetoeu.jscript.runtime.values.CodeFunction;
import me.topchetoeu.jscript.core.exceptions.EngineException; import me.topchetoeu.jscript.runtime.values.FunctionValue;
public class DebugContext { public class DebugContext {
public static final Key<DebugContext> KEY = new Key<>(); public static final Key<DebugContext> KEY = new Key<>();
@@ -32,10 +32,17 @@ public class DebugContext {
if (sources != null) { if (sources != null) {
for (var source : sources.entrySet()) debugger.onSourceLoad(source.getKey(), source.getValue()); for (var source : sources.entrySet()) debugger.onSourceLoad(source.getKey(), source.getValue());
} }
if (maps != null) {
for (var map : maps.entrySet()) debugger.onFunctionLoad(map.getKey(), map.getValue());
}
this.debugger = debugger; this.debugger = debugger;
return true; return true;
} }
public boolean detachDebugger(DebugHandler debugger) {
if (this.debugger != debugger) return false;
return detachDebugger();
}
public boolean detachDebugger() { public boolean detachDebugger() {
this.debugger = null; this.debugger = null;
return true; return true;

View File

@@ -1,12 +1,12 @@
package me.topchetoeu.jscript.core.debug; package me.topchetoeu.jscript.runtime.debug;
import me.topchetoeu.jscript.common.Filename; import me.topchetoeu.jscript.common.Filename;
import me.topchetoeu.jscript.common.FunctionBody; import me.topchetoeu.jscript.common.FunctionBody;
import me.topchetoeu.jscript.common.Instruction; import me.topchetoeu.jscript.common.Instruction;
import me.topchetoeu.jscript.common.mapping.FunctionMap; import me.topchetoeu.jscript.common.mapping.FunctionMap;
import me.topchetoeu.jscript.core.Context; import me.topchetoeu.jscript.runtime.Context;
import me.topchetoeu.jscript.core.Frame; import me.topchetoeu.jscript.runtime.Frame;
import me.topchetoeu.jscript.core.exceptions.EngineException; import me.topchetoeu.jscript.runtime.exceptions.EngineException;
public interface DebugHandler { public interface DebugHandler {
/** /**

View File

@@ -1,4 +1,4 @@
package me.topchetoeu.jscript.core.exceptions; package me.topchetoeu.jscript.runtime.exceptions;
public class ConvertException extends RuntimeException { public class ConvertException extends RuntimeException {
public final String source, target; public final String source, target;

View File

@@ -1,14 +1,14 @@
package me.topchetoeu.jscript.core.exceptions; package me.topchetoeu.jscript.runtime.exceptions;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import me.topchetoeu.jscript.common.Location; import me.topchetoeu.jscript.common.Location;
import me.topchetoeu.jscript.core.Context; import me.topchetoeu.jscript.runtime.Context;
import me.topchetoeu.jscript.core.Environment; import me.topchetoeu.jscript.runtime.Environment;
import me.topchetoeu.jscript.core.values.ObjectValue; import me.topchetoeu.jscript.runtime.values.ObjectValue;
import me.topchetoeu.jscript.core.values.Values; import me.topchetoeu.jscript.runtime.values.Values;
import me.topchetoeu.jscript.core.values.ObjectValue.PlaceholderProto; import me.topchetoeu.jscript.runtime.values.ObjectValue.PlaceholderProto;
public class EngineException extends RuntimeException { public class EngineException extends RuntimeException {
public static class StackElement { public static class StackElement {

View File

@@ -1,4 +1,4 @@
package me.topchetoeu.jscript.core.exceptions; package me.topchetoeu.jscript.runtime.exceptions;
public class InterruptException extends RuntimeException { public class InterruptException extends RuntimeException {
public InterruptException() { } public InterruptException() { }

View File

@@ -1,4 +1,4 @@
package me.topchetoeu.jscript.core.exceptions; package me.topchetoeu.jscript.runtime.exceptions;
import me.topchetoeu.jscript.common.Location; import me.topchetoeu.jscript.common.Location;

View File

@@ -1,14 +1,14 @@
package me.topchetoeu.jscript.core.scope; package me.topchetoeu.jscript.runtime.scope;
import java.util.HashSet; import java.util.HashSet;
import java.util.Set; import java.util.Set;
import me.topchetoeu.jscript.core.Context; import me.topchetoeu.jscript.runtime.Context;
import me.topchetoeu.jscript.core.values.FunctionValue; import me.topchetoeu.jscript.runtime.exceptions.EngineException;
import me.topchetoeu.jscript.core.values.NativeFunction; import me.topchetoeu.jscript.runtime.values.FunctionValue;
import me.topchetoeu.jscript.core.values.ObjectValue; import me.topchetoeu.jscript.runtime.values.NativeFunction;
import me.topchetoeu.jscript.core.values.Values; import me.topchetoeu.jscript.runtime.values.ObjectValue;
import me.topchetoeu.jscript.core.exceptions.EngineException; import me.topchetoeu.jscript.runtime.values.Values;
public class GlobalScope { public class GlobalScope {
public final ObjectValue obj; public final ObjectValue obj;

View File

@@ -1,4 +1,4 @@
package me.topchetoeu.jscript.core.scope; package me.topchetoeu.jscript.runtime.scope;
import java.util.ArrayList; import java.util.ArrayList;

View File

@@ -1,7 +1,7 @@
package me.topchetoeu.jscript.core.scope; package me.topchetoeu.jscript.runtime.scope;
import me.topchetoeu.jscript.core.Context; import me.topchetoeu.jscript.runtime.Context;
import me.topchetoeu.jscript.core.values.Values; import me.topchetoeu.jscript.runtime.values.Values;
public class ValueVariable implements Variable { public class ValueVariable implements Variable {
public boolean readonly; public boolean readonly;

View File

@@ -1,6 +1,6 @@
package me.topchetoeu.jscript.core.scope; package me.topchetoeu.jscript.runtime.scope;
import me.topchetoeu.jscript.core.Context; import me.topchetoeu.jscript.runtime.Context;
public interface Variable { public interface Variable {
Object get(Context ctx); Object get(Context ctx);

View File

@@ -1,4 +1,4 @@
package me.topchetoeu.jscript.core.values; package me.topchetoeu.jscript.runtime.values;
import java.util.Arrays; import java.util.Arrays;
import java.util.Collection; import java.util.Collection;
@@ -6,7 +6,7 @@ import java.util.Comparator;
import java.util.Iterator; import java.util.Iterator;
import java.util.List; import java.util.List;
import me.topchetoeu.jscript.core.Context; import me.topchetoeu.jscript.runtime.Context;
// TODO: Make methods generic // TODO: Make methods generic
public class ArrayValue extends ObjectValue implements Iterable<Object> { public class ArrayValue extends ObjectValue implements Iterable<Object> {

View File

@@ -1,10 +1,10 @@
package me.topchetoeu.jscript.core.values; package me.topchetoeu.jscript.runtime.values;
import me.topchetoeu.jscript.common.FunctionBody; import me.topchetoeu.jscript.common.FunctionBody;
import me.topchetoeu.jscript.core.Context; import me.topchetoeu.jscript.runtime.Context;
import me.topchetoeu.jscript.core.Environment; import me.topchetoeu.jscript.runtime.Environment;
import me.topchetoeu.jscript.core.Frame; import me.topchetoeu.jscript.runtime.Frame;
import me.topchetoeu.jscript.core.scope.ValueVariable; import me.topchetoeu.jscript.runtime.scope.ValueVariable;
public class CodeFunction extends FunctionValue { public class CodeFunction extends FunctionValue {
public final FunctionBody body; public final FunctionBody body;

View File

@@ -1,4 +1,4 @@
package me.topchetoeu.jscript.core.values; package me.topchetoeu.jscript.runtime.values;
public enum ConvertHint { public enum ConvertHint {
TOSTRING, TOSTRING,

View File

@@ -1,8 +1,8 @@
package me.topchetoeu.jscript.core.values; package me.topchetoeu.jscript.runtime.values;
import java.util.List; import java.util.List;
import me.topchetoeu.jscript.core.Context; import me.topchetoeu.jscript.runtime.Context;
public abstract class FunctionValue extends ObjectValue { public abstract class FunctionValue extends ObjectValue {
public String name = ""; public String name = "";

View File

@@ -1,6 +1,6 @@
package me.topchetoeu.jscript.core.values; package me.topchetoeu.jscript.runtime.values;
import me.topchetoeu.jscript.core.Context; import me.topchetoeu.jscript.runtime.Context;
import me.topchetoeu.jscript.utils.interop.Arguments; import me.topchetoeu.jscript.utils.interop.Arguments;
public class NativeFunction extends FunctionValue { public class NativeFunction extends FunctionValue {

View File

@@ -0,0 +1,53 @@
package me.topchetoeu.jscript.runtime.values;
import java.util.WeakHashMap;
import me.topchetoeu.jscript.runtime.Context;
import me.topchetoeu.jscript.runtime.Extensions;
import me.topchetoeu.jscript.runtime.Key;
public class NativeWrapper extends ObjectValue {
private static final Key<WeakHashMap<Object, NativeWrapper>> WRAPPERS = new Key<>();
private static final Object NATIVE_PROTO = new Object();
public final Object wrapped;
@Override
public ObjectValue getPrototype(Context ctx) {
if (ctx.environment != null && prototype == NATIVE_PROTO) {
var clazz = wrapped.getClass();
var res = ctx.environment.wrappers.getProto(clazz);
if (res != null) return res;
}
return super.getPrototype(ctx);
}
@Override
public String toString() {
return wrapped.toString();
}
@Override
public boolean equals(Object obj) {
return wrapped.equals(obj);
}
@Override
public int hashCode() {
return wrapped.hashCode();
}
private NativeWrapper(Object wrapped) {
this.wrapped = wrapped;
prototype = NATIVE_PROTO;
}
public static NativeWrapper of(Extensions exts, Object wrapped) {
var wrappers = exts == null ? null : exts.get(WRAPPERS);
if (wrappers == null) return new NativeWrapper(wrapped);
if (wrappers.containsKey(wrapped)) return wrappers.get(wrapped);
var res = new NativeWrapper(wrapped);
wrappers.put(wrapped, res);
return res;
}
}

View File

@@ -1,4 +1,4 @@
package me.topchetoeu.jscript.core.values; package me.topchetoeu.jscript.runtime.values;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.LinkedHashMap; import java.util.LinkedHashMap;
@@ -6,8 +6,8 @@ import java.util.LinkedHashSet;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import me.topchetoeu.jscript.core.Context; import me.topchetoeu.jscript.runtime.Context;
import me.topchetoeu.jscript.core.Environment; import me.topchetoeu.jscript.runtime.Environment;
public class ObjectValue { public class ObjectValue {
public static enum PlaceholderProto { public static enum PlaceholderProto {
@@ -153,18 +153,18 @@ public class ObjectValue {
} }
public ObjectValue getPrototype(Context ctx) { public ObjectValue getPrototype(Context ctx) {
if (prototype instanceof ObjectValue || prototype == null) return (ObjectValue)prototype;
try { try {
if (prototype == OBJ_PROTO) return ctx.get(Environment.OBJECT_PROTO);
if (prototype == ARR_PROTO) return ctx.get(Environment.ARRAY_PROTO); if (prototype == ARR_PROTO) return ctx.get(Environment.ARRAY_PROTO);
if (prototype == FUNC_PROTO) return ctx.get(Environment.FUNCTION_PROTO); if (prototype == FUNC_PROTO) return ctx.get(Environment.FUNCTION_PROTO);
if (prototype == ERR_PROTO) return ctx.get(Environment.ERROR_PROTO); if (prototype == ERR_PROTO) return ctx.get(Environment.ERROR_PROTO);
if (prototype == RANGE_ERR_PROTO) return ctx.get(Environment.RANGE_ERR_PROTO); if (prototype == RANGE_ERR_PROTO) return ctx.get(Environment.RANGE_ERR_PROTO);
if (prototype == SYNTAX_ERR_PROTO) return ctx.get(Environment.SYNTAX_ERR_PROTO); if (prototype == SYNTAX_ERR_PROTO) return ctx.get(Environment.SYNTAX_ERR_PROTO);
if (prototype == TYPE_ERR_PROTO) return ctx.get(Environment.TYPE_ERR_PROTO); if (prototype == TYPE_ERR_PROTO) return ctx.get(Environment.TYPE_ERR_PROTO);
return ctx.get(Environment.OBJECT_PROTO);
} }
catch (NullPointerException e) { return null; } catch (NullPointerException e) { return null; }
return (ObjectValue)prototype;
} }
public final boolean setPrototype(PlaceholderProto val) { public final boolean setPrototype(PlaceholderProto val) {
if (!extensible()) return false; if (!extensible()) return false;

View File

@@ -1,10 +1,10 @@
package me.topchetoeu.jscript.core.values; package me.topchetoeu.jscript.runtime.values;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import me.topchetoeu.jscript.core.Context; import me.topchetoeu.jscript.runtime.Context;
import me.topchetoeu.jscript.core.scope.ValueVariable; import me.topchetoeu.jscript.runtime.scope.ValueVariable;
public class ScopeValue extends ObjectValue { public class ScopeValue extends ObjectValue {
public final ValueVariable[] variables; public final ValueVariable[] variables;

View File

@@ -1,4 +1,4 @@
package me.topchetoeu.jscript.core.values; package me.topchetoeu.jscript.runtime.values;
import java.util.HashMap; import java.util.HashMap;

View File

@@ -1,4 +1,4 @@
package me.topchetoeu.jscript.core.values; package me.topchetoeu.jscript.runtime.values;
import java.io.ByteArrayOutputStream; import java.io.ByteArrayOutputStream;
import java.io.PrintStream; import java.io.PrintStream;
@@ -13,13 +13,13 @@ import java.util.List;
import java.util.Map; import java.util.Map;
import me.topchetoeu.jscript.common.Operation; import me.topchetoeu.jscript.common.Operation;
import me.topchetoeu.jscript.core.Context;
import me.topchetoeu.jscript.core.Environment;
import me.topchetoeu.jscript.core.debug.DebugContext;
import me.topchetoeu.jscript.core.exceptions.ConvertException;
import me.topchetoeu.jscript.core.exceptions.EngineException;
import me.topchetoeu.jscript.core.exceptions.SyntaxException;
import me.topchetoeu.jscript.lib.PromiseLib; import me.topchetoeu.jscript.lib.PromiseLib;
import me.topchetoeu.jscript.runtime.Context;
import me.topchetoeu.jscript.runtime.Environment;
import me.topchetoeu.jscript.runtime.debug.DebugContext;
import me.topchetoeu.jscript.runtime.exceptions.ConvertException;
import me.topchetoeu.jscript.runtime.exceptions.EngineException;
import me.topchetoeu.jscript.runtime.exceptions.SyntaxException;
public class Values { public class Values {
public static enum CompareResult { public static enum CompareResult {
@@ -58,9 +58,8 @@ public class Values {
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
public static <T> T wrapper(Object val, Class<T> clazz) { public static <T> T wrapper(Object val, Class<T> clazz) {
if (!isWrapper(val)) val = new NativeWrapper(val); if (isWrapper(val)) val = ((NativeWrapper)val).wrapped;
var res = (NativeWrapper)val; if (val != null && clazz.isInstance(val)) return (T)val;
if (res != null && clazz.isInstance(res.wrapped)) return (T)res.wrapped;
else return null; else return null;
} }
@@ -471,7 +470,7 @@ public class Values {
else return ctx.environment.wrappers.getConstr((Class<?>)val); else return ctx.environment.wrappers.getConstr((Class<?>)val);
} }
return new NativeWrapper(val); return NativeWrapper.of(ctx, val);
} }
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
@@ -536,7 +535,7 @@ public class Values {
if (obj == null) return null; if (obj == null) return null;
if (clazz.isInstance(obj)) return (T)obj; if (clazz.isInstance(obj)) return (T)obj;
if (clazz.isAssignableFrom(NativeWrapper.class)) { if (clazz.isAssignableFrom(NativeWrapper.class)) {
return (T)new NativeWrapper(obj); return (T)NativeWrapper.of(ctx, obj);
} }
throw new ConvertException(type(obj), clazz.getSimpleName()); throw new ConvertException(type(obj), clazz.getSimpleName());

View File

@@ -4,9 +4,9 @@ import me.topchetoeu.jscript.common.Filename;
import me.topchetoeu.jscript.common.FunctionBody; import me.topchetoeu.jscript.common.FunctionBody;
import me.topchetoeu.jscript.compilation.CompileResult; import me.topchetoeu.jscript.compilation.CompileResult;
import me.topchetoeu.jscript.compilation.parsing.Parsing; import me.topchetoeu.jscript.compilation.parsing.Parsing;
import me.topchetoeu.jscript.core.Compiler; import me.topchetoeu.jscript.runtime.Compiler;
import me.topchetoeu.jscript.core.Extensions; import me.topchetoeu.jscript.runtime.Extensions;
import me.topchetoeu.jscript.core.debug.DebugContext; import me.topchetoeu.jscript.runtime.debug.DebugContext;
public class JSCompiler implements Compiler { public class JSCompiler implements Compiler {
public final Extensions ext; public final Extensions ext;

View File

@@ -8,18 +8,18 @@ import java.nio.file.Path;
import me.topchetoeu.jscript.common.Filename; import me.topchetoeu.jscript.common.Filename;
import me.topchetoeu.jscript.common.Metadata; import me.topchetoeu.jscript.common.Metadata;
import me.topchetoeu.jscript.common.Reading; import me.topchetoeu.jscript.common.Reading;
import me.topchetoeu.jscript.core.Compiler;
import me.topchetoeu.jscript.core.Context;
import me.topchetoeu.jscript.core.Engine;
import me.topchetoeu.jscript.core.Environment;
import me.topchetoeu.jscript.core.EventLoop;
import me.topchetoeu.jscript.core.debug.DebugContext;
import me.topchetoeu.jscript.core.values.NativeFunction;
import me.topchetoeu.jscript.core.values.Values;
import me.topchetoeu.jscript.core.exceptions.EngineException;
import me.topchetoeu.jscript.core.exceptions.InterruptException;
import me.topchetoeu.jscript.core.exceptions.SyntaxException;
import me.topchetoeu.jscript.lib.Internals; import me.topchetoeu.jscript.lib.Internals;
import me.topchetoeu.jscript.runtime.Compiler;
import me.topchetoeu.jscript.runtime.Context;
import me.topchetoeu.jscript.runtime.Engine;
import me.topchetoeu.jscript.runtime.Environment;
import me.topchetoeu.jscript.runtime.EventLoop;
import me.topchetoeu.jscript.runtime.debug.DebugContext;
import me.topchetoeu.jscript.runtime.exceptions.EngineException;
import me.topchetoeu.jscript.runtime.exceptions.InterruptException;
import me.topchetoeu.jscript.runtime.exceptions.SyntaxException;
import me.topchetoeu.jscript.runtime.values.NativeFunction;
import me.topchetoeu.jscript.runtime.values.Values;
import me.topchetoeu.jscript.utils.debug.DebugServer; import me.topchetoeu.jscript.utils.debug.DebugServer;
import me.topchetoeu.jscript.utils.debug.SimpleDebugger; import me.topchetoeu.jscript.utils.debug.SimpleDebugger;
import me.topchetoeu.jscript.utils.filesystem.Filesystem; import me.topchetoeu.jscript.utils.filesystem.Filesystem;

View File

@@ -15,8 +15,8 @@ import me.topchetoeu.jscript.common.events.Notifier;
import me.topchetoeu.jscript.common.json.JSON; import me.topchetoeu.jscript.common.json.JSON;
import me.topchetoeu.jscript.common.json.JSONList; import me.topchetoeu.jscript.common.json.JSONList;
import me.topchetoeu.jscript.common.json.JSONMap; import me.topchetoeu.jscript.common.json.JSONMap;
import me.topchetoeu.jscript.runtime.exceptions.SyntaxException;
import me.topchetoeu.jscript.utils.debug.WebSocketMessage.Type; import me.topchetoeu.jscript.utils.debug.WebSocketMessage.Type;
import me.topchetoeu.jscript.core.exceptions.SyntaxException;
public class DebugServer { public class DebugServer {
public static String browserDisplayName = Metadata.name() + "/" + Metadata.version(); public static String browserDisplayName = Metadata.name() + "/" + Metadata.version();

View File

@@ -1,8 +1,9 @@
package me.topchetoeu.jscript.utils.debug; package me.topchetoeu.jscript.utils.debug;
import me.topchetoeu.jscript.core.debug.DebugHandler;
import java.io.IOException; import java.io.IOException;
import me.topchetoeu.jscript.runtime.debug.DebugHandler;
public interface Debugger extends DebugHandler { public interface Debugger extends DebugHandler {
void close(); void close();

View File

@@ -23,25 +23,28 @@ import me.topchetoeu.jscript.common.json.JSONList;
import me.topchetoeu.jscript.common.json.JSONMap; import me.topchetoeu.jscript.common.json.JSONMap;
import me.topchetoeu.jscript.common.mapping.FunctionMap; import me.topchetoeu.jscript.common.mapping.FunctionMap;
import me.topchetoeu.jscript.compilation.parsing.Parsing; import me.topchetoeu.jscript.compilation.parsing.Parsing;
import me.topchetoeu.jscript.core.Context; import me.topchetoeu.jscript.runtime.Context;
import me.topchetoeu.jscript.core.Engine; import me.topchetoeu.jscript.runtime.Engine;
import me.topchetoeu.jscript.core.Environment; import me.topchetoeu.jscript.runtime.Environment;
import me.topchetoeu.jscript.core.EventLoop; import me.topchetoeu.jscript.runtime.EventLoop;
import me.topchetoeu.jscript.core.Frame; import me.topchetoeu.jscript.runtime.Frame;
import me.topchetoeu.jscript.core.debug.DebugContext; import me.topchetoeu.jscript.runtime.debug.DebugContext;
import me.topchetoeu.jscript.core.scope.GlobalScope; import me.topchetoeu.jscript.runtime.exceptions.EngineException;
import me.topchetoeu.jscript.core.values.ArrayValue; import me.topchetoeu.jscript.runtime.exceptions.SyntaxException;
import me.topchetoeu.jscript.core.values.FunctionValue; import me.topchetoeu.jscript.runtime.scope.GlobalScope;
import me.topchetoeu.jscript.core.values.ObjectValue; import me.topchetoeu.jscript.runtime.values.ArrayValue;
import me.topchetoeu.jscript.core.values.Symbol; import me.topchetoeu.jscript.runtime.values.FunctionValue;
import me.topchetoeu.jscript.core.values.Values; import me.topchetoeu.jscript.runtime.values.ObjectValue;
import me.topchetoeu.jscript.core.exceptions.EngineException; import me.topchetoeu.jscript.runtime.values.Symbol;
import me.topchetoeu.jscript.runtime.values.Values;
// very simple indeed // very simple indeed
public class SimpleDebugger implements Debugger { public class SimpleDebugger implements Debugger {
public static final Set<String> VSCODE_EMPTY = Set.of( public static final Set<String> VSCODE_EMPTY = Set.of(
"function(...runtimeArgs){\n let t = 1024; let e = null;\n if(e)try{let r=\"<<default preview>>\",i=e.call(this,r);if(i!==r)return String(i)}catch(r){return`<<indescribable>>${JSON.stringify([String(r),\"object\"])}`}if(typeof this==\"object\"&&this){let r;for(let i of[Symbol.for(\"debug.description\"),Symbol.for(\"nodejs.util.inspect.custom\")])try{r=this[i]();break}catch{}if(!r&&!String(this.toString).includes(\"[native code]\")&&(r=String(this)),r&&!r.startsWith(\"[object \"))return r.length>=t?r.slice(0,t)+\"\\u2026\":r}\n ;\n\n}", "function(...runtimeArgs){\n let t = 1024; let e = null;\n if(e)try{let r=\"<<default preview>>\",i=e.call(this,r);if(i!==r)return String(i)}catch(r){return`<<indescribable>>${JSON.stringify([String(r),\"object\"])}`}if(typeof this==\"object\"&&this){let r;for(let i of[Symbol.for(\"debug.description\"),Symbol.for(\"nodejs.util.inspect.custom\")])try{r=this[i]();break}catch{}if(!r&&!String(this.toString).includes(\"[native code]\")&&(r=String(this)),r&&!r.startsWith(\"[object \"))return r.length>=t?r.slice(0,t)+\"\\u2026\":r}\n ;\n\n}",
"function(...runtimeArgs){\n let r = 1024; let e = null;\n if(e)try{let t=\"<<default preview>>\",n=e.call(this,t);if(n!==t)return String(n)}catch(t){return`<<indescribable>>${JSON.stringify([String(t),\"object\"])}`}if(typeof this==\"object\"&&this){let t;for(let n of[Symbol.for(\"debug.description\"),Symbol.for(\"nodejs.util.inspect.custom\")])if(typeof this[n]==\"function\")try{t=this[n]();break}catch{}if(!t&&!String(this.toString).includes(\"[native code]\")&&(t=String(this)),t&&!t.startsWith(\"[object\"))return t.length>=r?t.slice(0,r)+\"\\u2026\":t};}",
"function(...runtimeArgs){\n let t = 1024; let e = null;\n let r={},i=\"<<default preview>>\";if(typeof this!=\"object\"||!this)return r;for(let[n,s]of Object.entries(this)){if(e)try{let o=e.call(s,i);if(o!==i){r[n]=String(o);continue}}catch(o){r[n]=`<<indescribable>>${JSON.stringify([String(o),n])}`;continue}if(typeof s==\"object\"&&s){let o;for(let a of runtimeArgs[0])try{o=s[a]();break}catch{}!o&&!String(s.toString).includes(\"[native code]\")&&(o=String(s)),o&&!o.startsWith(\"[object \")&&(r[n]=o.length>=t?o.slice(0,t)+\"\\u2026\":o)}}return r\n ;\n\n}", "function(...runtimeArgs){\n let t = 1024; let e = null;\n let r={},i=\"<<default preview>>\";if(typeof this!=\"object\"||!this)return r;for(let[n,s]of Object.entries(this)){if(e)try{let o=e.call(s,i);if(o!==i){r[n]=String(o);continue}}catch(o){r[n]=`<<indescribable>>${JSON.stringify([String(o),n])}`;continue}if(typeof s==\"object\"&&s){let o;for(let a of runtimeArgs[0])try{o=s[a]();break}catch{}!o&&!String(s.toString).includes(\"[native code]\")&&(o=String(s)),o&&!o.startsWith(\"[object \")&&(r[n]=o.length>=t?o.slice(0,t)+\"\\u2026\":o)}}return r\n ;\n\n}",
"function(...runtimeArgs){\n let r = 1024; let e = null;\n let t={},n=\"<<default preview>>\";if(typeof this!=\"object\"||!this)return t;for(let[i,o]of Object.entries(this)){if(e)try{let s=e.call(o,n);if(s!==n){t[i]=String(s);continue}}catch(s){t[i]=`<<indescribable>>${JSON.stringify([String(s),i])}`;continue}if(typeof o==\"object\"&&o){let s;for(let a of runtimeArgs[0])if(typeof o[a]==\"function\")try{s=o[a]();break}catch{}!s&&!String(o.toString).includes(\"[native code]\")&&(s=String(o)),s&&!s.startsWith(\"[object \")&&(t[i]=s.length>=r?s.slice(0,r)+\"\\u2026\":s)}}return t\n ;\n\n}",
"function(){let t={__proto__:this.__proto__\n},e=Object.getOwnPropertyNames(this);for(let r=0;r<e.length;++r){let i=e[r],n=i>>>0;if(String(n>>>0)===i&&n>>>0!==4294967295)continue;let s=Object.getOwnPropertyDescriptor(this,i);s&&Object.defineProperty(t,i,s)}return t}", "function(){let t={__proto__:this.__proto__\n},e=Object.getOwnPropertyNames(this);for(let r=0;r<e.length;++r){let i=e[r],n=i>>>0;if(String(n>>>0)===i&&n>>>0!==4294967295)continue;let s=Object.getOwnPropertyDescriptor(this,i);s&&Object.defineProperty(t,i,s)}return t}",
"function(){return[Symbol.for(\"debug.description\"),Symbol.for(\"nodejs.util.inspect.custom\")]\n}" "function(){return[Symbol.for(\"debug.description\"),Symbol.for(\"nodejs.util.inspect.custom\")]\n}"
); );
@@ -202,6 +205,7 @@ public class SimpleDebugger implements Debugger {
private ObjectValue emptyObject = new ObjectValue(); private ObjectValue emptyObject = new ObjectValue();
private WeakHashMap<DebugContext, DebugContext> contexts = new WeakHashMap<>();
private WeakHashMap<FunctionBody, FunctionMap> mappings = new WeakHashMap<>(); private WeakHashMap<FunctionBody, FunctionMap> mappings = new WeakHashMap<>();
private WeakHashMap<FunctionBody, HashMap<Location, Breakpoint>> bpLocs = new WeakHashMap<>(); private WeakHashMap<FunctionBody, HashMap<Location, Breakpoint>> bpLocs = new WeakHashMap<>();
@@ -226,6 +230,8 @@ public class SimpleDebugger implements Debugger {
private int stepOutPtr = 0; private int stepOutPtr = 0;
private boolean compare(String src, String target) { private boolean compare(String src, String target) {
src = src.replaceAll("\\s", "");
target = target.replaceAll("\\s", "");
if (src.length() != target.length()) return false; if (src.length() != target.length()) return false;
var diff = 0; var diff = 0;
var all = 0; var all = 0;
@@ -333,10 +339,10 @@ public class SimpleDebugger implements Debugger {
} }
private JSONMap serializeObj(Context ctx, Object val, boolean byValue) { private JSONMap serializeObj(Context ctx, Object val, boolean byValue) {
val = Values.normalize(null, val); val = Values.normalize(null, val);
var newCtx = new Context(); var newEnv = new Environment();
newCtx.addAll(ctx); newEnv.addAll(ctx);
newCtx.add(DebugContext.IGNORE); newEnv.add(DebugContext.IGNORE);
ctx = newCtx; ctx = newEnv.context();
if (val == Values.NULL) { if (val == Values.NULL) {
return new JSONMap() return new JSONMap()
@@ -366,6 +372,7 @@ public class SimpleDebugger implements Debugger {
if (subtype != null) res.set("subtype", subtype); if (subtype != null) res.set("subtype", subtype);
if (className != null) { if (className != null) {
res.set("className", className); res.set("className", className);
res.set("description", className);
} }
if (obj instanceof ArrayValue) res.set("description", "Array(" + ((ArrayValue)obj).size() + ")"); if (obj instanceof ArrayValue) res.set("description", "Array(" + ((ArrayValue)obj).size() + ")");
@@ -381,7 +388,7 @@ public class SimpleDebugger implements Debugger {
catch (Exception e) { } catch (Exception e) { }
try { res.set("description", className + (defaultToString ? "" : " { " + Values.toString(ctx, obj) + " }")); } try { res.set("description", className + (defaultToString ? "" : " { " + Values.toString(ctx, obj) + " }")); }
catch (EngineException e) { res.set("description", className); } catch (EngineException e) { }
} }
@@ -537,10 +544,12 @@ public class SimpleDebugger implements Debugger {
var ctx = new Context(env); var ctx = new Context(env);
var awaiter = engine.pushMsg(false, ctx.environment, new Filename("jscript", "eval"), code, codeFrame.frame.thisArg, codeFrame.frame.args); var awaiter = engine.pushMsg(false, ctx.environment, new Filename("jscript", "eval"), code, codeFrame.frame.thisArg, codeFrame.frame.args);
try {
engine.run(true); engine.run(true);
return new RunResult(ctx, awaiter.await(), null);
try { return new RunResult(ctx, awaiter.await(), null); } }
catch (EngineException e) { return new RunResult(ctx, null, e); } catch (EngineException e) { return new RunResult(ctx, null, e); }
catch (SyntaxException e) { return new RunResult(ctx, null, EngineException.ofSyntax(e.toString())); }
} }
private ObjectValue vscodeAutoSuggest(Context ctx, Object target, String query, boolean variable) { private ObjectValue vscodeAutoSuggest(Context ctx, Object target, String query, boolean variable) {
@@ -634,11 +643,10 @@ public class SimpleDebugger implements Debugger {
execptionType = CatchType.NONE; execptionType = CatchType.NONE;
state = State.RESUMED; state = State.RESUMED;
// idToBptCand.clear(); mappings.clear();
bpLocs.clear();
idToBreakpoint.clear(); idToBreakpoint.clear();
// locToBreakpoint.clear();
// tmpBreakpts.clear();
filenameToId.clear(); filenameToId.clear();
idToSource.clear(); idToSource.clear();
@@ -656,6 +664,9 @@ public class SimpleDebugger implements Debugger {
stepOutFrame = currFrame = null; stepOutFrame = currFrame = null;
stepOutPtr = 0; stepOutPtr = 0;
for (var ctx : contexts.keySet()) ctx.detachDebugger(this);
contexts.clear();
updateNotifier.next(); updateNotifier.next();
} }
@@ -1033,6 +1044,7 @@ public class SimpleDebugger implements Debugger {
public SimpleDebugger attach(DebugContext ctx) { public SimpleDebugger attach(DebugContext ctx) {
ctx.attachDebugger(this); ctx.attachDebugger(this);
contexts.put(ctx, ctx);
return this; return this;
} }

View File

@@ -1,7 +1,7 @@
package me.topchetoeu.jscript.utils.filesystem; package me.topchetoeu.jscript.utils.filesystem;
import me.topchetoeu.jscript.core.Extensions; import me.topchetoeu.jscript.runtime.Extensions;
import me.topchetoeu.jscript.core.Key; import me.topchetoeu.jscript.runtime.Key;
public interface Filesystem { public interface Filesystem {
public static final Key<Filesystem> KEY = new Key<>(); public static final Key<Filesystem> KEY = new Key<>();

View File

@@ -2,8 +2,8 @@ package me.topchetoeu.jscript.utils.filesystem;
import java.util.ArrayList; import java.util.ArrayList;
import me.topchetoeu.jscript.core.values.Values; import me.topchetoeu.jscript.runtime.exceptions.EngineException;
import me.topchetoeu.jscript.core.exceptions.EngineException; import me.topchetoeu.jscript.runtime.values.Values;
public class FilesystemException extends RuntimeException { public class FilesystemException extends RuntimeException {
public final ErrorReason reason; public final ErrorReason reason;

View File

@@ -2,9 +2,9 @@ package me.topchetoeu.jscript.utils.interop;
import java.lang.reflect.Array; import java.lang.reflect.Array;
import me.topchetoeu.jscript.core.Context; import me.topchetoeu.jscript.runtime.Context;
import me.topchetoeu.jscript.core.values.NativeWrapper; import me.topchetoeu.jscript.runtime.values.NativeWrapper;
import me.topchetoeu.jscript.core.values.Values; import me.topchetoeu.jscript.runtime.values.Values;
public class Arguments { public class Arguments {
public final Object self; public final Object self;

View File

@@ -10,21 +10,22 @@ import java.util.HashSet;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import me.topchetoeu.jscript.common.Location; import me.topchetoeu.jscript.common.Location;
import me.topchetoeu.jscript.core.Context; import me.topchetoeu.jscript.runtime.Context;
import me.topchetoeu.jscript.core.Environment; import me.topchetoeu.jscript.runtime.Environment;
import me.topchetoeu.jscript.core.WrapperProvider; import me.topchetoeu.jscript.runtime.WrapperProvider;
import me.topchetoeu.jscript.core.values.FunctionValue; import me.topchetoeu.jscript.runtime.exceptions.EngineException;
import me.topchetoeu.jscript.core.values.NativeFunction; import me.topchetoeu.jscript.runtime.exceptions.InterruptException;
import me.topchetoeu.jscript.core.values.ObjectValue; import me.topchetoeu.jscript.runtime.values.FunctionValue;
import me.topchetoeu.jscript.core.values.Symbol; import me.topchetoeu.jscript.runtime.values.NativeFunction;
import me.topchetoeu.jscript.core.values.Values; import me.topchetoeu.jscript.runtime.values.ObjectValue;
import me.topchetoeu.jscript.core.exceptions.EngineException; import me.topchetoeu.jscript.runtime.values.Symbol;
import me.topchetoeu.jscript.core.exceptions.InterruptException; import me.topchetoeu.jscript.runtime.values.Values;
public class NativeWrapperProvider implements WrapperProvider { public class NativeWrapperProvider implements WrapperProvider {
private final HashMap<Class<?>, FunctionValue> constructors = new HashMap<>(); private final HashMap<Class<?>, FunctionValue> constructors = new HashMap<>();
private final HashMap<Class<?>, ObjectValue> prototypes = new HashMap<>(); private final HashMap<Class<?>, ObjectValue> prototypes = new HashMap<>();
private final HashMap<Class<?>, ObjectValue> namespaces = new HashMap<>(); private final HashMap<Class<?>, ObjectValue> namespaces = new HashMap<>();
private final HashSet<Class<?>> ignore = new HashSet<>();
private final Environment env; private final Environment env;
private static Object call(Context ctx, String name, Method method, Object thisArg, Object... args) { private static Object call(Context ctx, String name, Method method, Object thisArg, Object... args) {
@@ -106,11 +107,12 @@ public class NativeWrapperProvider implements WrapperProvider {
else return name; else return name;
} }
private static void apply(ObjectValue obj, Environment env, ExposeTarget target, Class<?> clazz) { private static boolean apply(ObjectValue obj, Environment env, ExposeTarget target, Class<?> clazz) {
var getters = new HashMap<Object, FunctionValue>(); var getters = new HashMap<Object, FunctionValue>();
var setters = new HashMap<Object, FunctionValue>(); var setters = new HashMap<Object, FunctionValue>();
var props = new HashSet<Object>(); var props = new HashSet<Object>();
var nonProps = new HashSet<Object>(); var nonProps = new HashSet<Object>();
var any = false;
for (var method : clazz.getDeclaredMethods()) { for (var method : clazz.getDeclaredMethods()) {
for (var annotation : method.getAnnotationsByType(Expose.class)) { for (var annotation : method.getAnnotationsByType(Expose.class)) {
@@ -120,6 +122,7 @@ public class NativeWrapperProvider implements WrapperProvider {
var name = getName(method, annotation.value()); var name = getName(method, annotation.value());
var key = getKey(name); var key = getKey(name);
var repeat = false; var repeat = false;
any = true;
switch (annotation.type()) { switch (annotation.type()) {
case INIT: case INIT:
@@ -168,6 +171,7 @@ public class NativeWrapperProvider implements WrapperProvider {
var name = getName(method, annotation.value()); var name = getName(method, annotation.value());
var key = getKey(name); var key = getKey(name);
var repeat = false; var repeat = false;
any = true;
if (props.contains(key) || nonProps.contains(key)) repeat = true; if (props.contains(key) || nonProps.contains(key)) repeat = true;
else { else {
@@ -191,11 +195,29 @@ public class NativeWrapperProvider implements WrapperProvider {
var name = getName(field, annotation.value()); var name = getName(field, annotation.value());
var key = getKey(name); var key = getKey(name);
var repeat = false; var repeat = false;
any = true;
if (props.contains(key) || nonProps.contains(key)) repeat = true; if (props.contains(key) || nonProps.contains(key)) repeat = true;
else { else {
try { try {
if (Modifier.isStatic(field.getModifiers())) {
obj.defineProperty(null, key, Values.normalize(new Context(env), field.get(null)), true, true, false); obj.defineProperty(null, key, Values.normalize(new Context(env), field.get(null)), true, true, false);
}
else {
obj.defineProperty(
null, key,
new NativeFunction("get " + key, args -> {
try { return field.get(args.self(clazz)); }
catch (IllegalAccessException e) { e.printStackTrace(); return null; }
}),
Modifier.isFinal(field.getModifiers()) ? null : new NativeFunction("get " + key, args -> {
try { field.set(args.self(clazz), args.convert(0, field.getType())); }
catch (IllegalAccessException e) { e.printStackTrace(); }
return null;
}),
true, false
);
}
nonProps.add(key); nonProps.add(key);
} }
catch (IllegalArgumentException | IllegalAccessException e) { } catch (IllegalArgumentException | IllegalAccessException e) { }
@@ -210,6 +232,8 @@ public class NativeWrapperProvider implements WrapperProvider {
} }
for (var key : props) obj.defineProperty(null, key, getters.get(key), setters.get(key), true, false); for (var key : props) obj.defineProperty(null, key, getters.get(key), setters.get(key), true, false);
return any;
} }
private static Method getConstructor(Environment env, Class<?> clazz) { private static Method getConstructor(Environment env, Class<?> clazz) {
@@ -231,7 +255,7 @@ public class NativeWrapperProvider implements WrapperProvider {
public static ObjectValue makeProto(Environment env, Class<?> clazz) { public static ObjectValue makeProto(Environment env, Class<?> clazz) {
var res = new ObjectValue(); var res = new ObjectValue();
res.defineProperty(null, Symbol.get("Symbol.typeName"), getName(clazz)); res.defineProperty(null, Symbol.get("Symbol.typeName"), getName(clazz));
apply(res, env, ExposeTarget.PROTOTYPE, clazz); if (!apply(res, env, ExposeTarget.PROTOTYPE, clazz)) return null;
return res; return res;
} }
/** /**
@@ -260,12 +284,27 @@ public class NativeWrapperProvider implements WrapperProvider {
public static ObjectValue makeNamespace(Environment ctx, Class<?> clazz) { public static ObjectValue makeNamespace(Environment ctx, Class<?> clazz) {
var res = new ObjectValue(); var res = new ObjectValue();
res.defineProperty(null, Symbol.get("Symbol.typeName"), getName(clazz)); res.defineProperty(null, Symbol.get("Symbol.typeName"), getName(clazz));
apply(res, ctx, ExposeTarget.NAMESPACE, clazz); if (!apply(res, ctx, ExposeTarget.NAMESPACE, clazz)) return null;
return res; return res;
} }
private void updateProtoChain(Class<?> clazz, ObjectValue proto, FunctionValue constr) {
var parent = clazz;
while (true) {
parent = parent.getSuperclass();
if (parent == null) return;
var parentProto = getProto(parent);
var parentConstr = getConstr(parent);
if (parentProto != null) Values.setPrototype(Context.NULL, proto, parentProto);
if (parentConstr != null) Values.setPrototype(Context.NULL, constr, parentConstr);
}
}
private void initType(Class<?> clazz, FunctionValue constr, ObjectValue proto) { private void initType(Class<?> clazz, FunctionValue constr, ObjectValue proto) {
if (constr != null && proto != null) return; if (constr != null && proto != null || ignore.contains(clazz)) return;
// i vomit // i vomit
if ( if (
clazz == Object.class || clazz == Object.class ||
@@ -284,44 +323,72 @@ public class NativeWrapperProvider implements WrapperProvider {
if (constr == null) constr = makeConstructor(env, clazz); if (constr == null) constr = makeConstructor(env, clazz);
if (proto == null) proto = makeProto(env, clazz); if (proto == null) proto = makeProto(env, clazz);
if (constr == null || proto == null) return;
proto.defineProperty(null, "constructor", constr, true, false, false); proto.defineProperty(null, "constructor", constr, true, false, false);
constr.defineProperty(null, "prototype", proto, true, false, false); constr.defineProperty(null, "prototype", proto, true, false, false);
prototypes.put(clazz, proto); prototypes.put(clazz, proto);
constructors.put(clazz, constr); constructors.put(clazz, constr);
var parent = clazz.getSuperclass(); updateProtoChain(clazz, proto, constr);
if (parent == null) return;
var parentProto = getProto(parent);
var parentConstr = getConstr(parent);
if (parentProto != null) Values.setPrototype(Context.NULL, proto, parentProto);
if (parentConstr != null) Values.setPrototype(Context.NULL, constr, parentConstr);
} }
public ObjectValue getProto(Class<?> clazz) { public ObjectValue getProto(Class<?> clazz) {
initType(clazz, constructors.get(clazz), prototypes.get(clazz)); initType(clazz, constructors.get(clazz), prototypes.get(clazz));
return prototypes.get(clazz); while (clazz != null) {
var res = prototypes.get(clazz);
if (res != null) return res;
clazz = clazz.getSuperclass();
}
return null;
} }
public ObjectValue getNamespace(Class<?> clazz) { public ObjectValue getNamespace(Class<?> clazz) {
if (!namespaces.containsKey(clazz)) namespaces.put(clazz, makeNamespace(env, clazz)); if (!namespaces.containsKey(clazz)) namespaces.put(clazz, makeNamespace(env, clazz));
return namespaces.get(clazz); while (clazz != null) {
var res = namespaces.get(clazz);
if (res != null) return res;
clazz = clazz.getSuperclass();
}
return null;
} }
public FunctionValue getConstr(Class<?> clazz) { public FunctionValue getConstr(Class<?> clazz) {
initType(clazz, constructors.get(clazz), prototypes.get(clazz)); initType(clazz, constructors.get(clazz), prototypes.get(clazz));
return constructors.get(clazz); while (clazz != null) {
var res = constructors.get(clazz);
if (res != null) return res;
clazz = clazz.getSuperclass();
}
return null;
} }
@Override public WrapperProvider fork(Environment env) { @Override public WrapperProvider fork(Environment env) {
return new NativeWrapperProvider(env); return new NativeWrapperProvider(env);
} }
public void setProto(Class<?> clazz, ObjectValue value) { public void set(Class<?> clazz, Class<?> wrapper) {
prototypes.put(clazz, value); if (wrapper == null) set(clazz, null, null);
else set(clazz, makeProto(env, wrapper), makeConstructor(env, wrapper));
}
public void set(Class<?> clazz, ObjectValue proto, FunctionValue constructor) {
if (proto != null && constructor != null) {
prototypes.put(clazz, proto);
constructors.put(clazz, constructor);
ignore.remove(clazz);
for (var el : prototypes.keySet()) {
if (clazz.isAssignableFrom(el)) {
updateProtoChain(el, getProto(el), getConstr(el));
}
}
}
else {
prototypes.remove(clazz);
constructors.remove(clazz);
ignore.remove(clazz);
initType(clazz, constructor, proto);
} }
public void setConstr(Class<?> clazz, FunctionValue value) {
constructors.put(clazz, value);
} }
private void initError() { private void initError() {
@@ -337,8 +404,7 @@ public class NativeWrapperProvider implements WrapperProvider {
proto.defineProperty(null, "constructor", constr, true, false, false); proto.defineProperty(null, "constructor", constr, true, false, false);
constr.defineProperty(null, "prototype", proto, true, false, false); constr.defineProperty(null, "prototype", proto, true, false, false);
setProto(Throwable.class, proto); set(Throwable.class, proto, constr);
setConstr(Throwable.class, constr);
} }
public NativeWrapperProvider(Environment env) { public NativeWrapperProvider(Environment env) {

View File

@@ -1,6 +1,6 @@
package me.topchetoeu.jscript.utils.modules; package me.topchetoeu.jscript.utils.modules;
import me.topchetoeu.jscript.core.Context; import me.topchetoeu.jscript.runtime.Context;
public abstract class Module { public abstract class Module {
private Object value; private Object value;

View File

@@ -3,9 +3,9 @@ package me.topchetoeu.jscript.utils.modules;
import java.util.HashMap; import java.util.HashMap;
import me.topchetoeu.jscript.common.Filename; import me.topchetoeu.jscript.common.Filename;
import me.topchetoeu.jscript.core.Context; import me.topchetoeu.jscript.runtime.Context;
import me.topchetoeu.jscript.core.Extensions; import me.topchetoeu.jscript.runtime.Extensions;
import me.topchetoeu.jscript.core.Key; import me.topchetoeu.jscript.runtime.Key;
import me.topchetoeu.jscript.utils.filesystem.Filesystem; import me.topchetoeu.jscript.utils.filesystem.Filesystem;
import me.topchetoeu.jscript.utils.filesystem.Mode; import me.topchetoeu.jscript.utils.filesystem.Mode;

View File

@@ -2,8 +2,8 @@ package me.topchetoeu.jscript.utils.modules;
import java.util.HashMap; import java.util.HashMap;
import me.topchetoeu.jscript.core.Context; import me.topchetoeu.jscript.runtime.Context;
import me.topchetoeu.jscript.core.exceptions.EngineException; import me.topchetoeu.jscript.runtime.exceptions.EngineException;
public class RootModuleRepo implements ModuleRepo { public class RootModuleRepo implements ModuleRepo {
public final HashMap<String, ModuleRepo> repos = new HashMap<>(); public final HashMap<String, ModuleRepo> repos = new HashMap<>();

View File

@@ -1,8 +1,8 @@
package me.topchetoeu.jscript.utils.modules; package me.topchetoeu.jscript.utils.modules;
import me.topchetoeu.jscript.common.Filename; import me.topchetoeu.jscript.common.Filename;
import me.topchetoeu.jscript.core.Context; import me.topchetoeu.jscript.runtime.Context;
import me.topchetoeu.jscript.core.Environment; import me.topchetoeu.jscript.runtime.Environment;
public class SourceModule extends Module { public class SourceModule extends Module {
public final Filename filename; public final Filename filename;

View File

@@ -1,7 +1,7 @@
package me.topchetoeu.jscript.utils.permissions; package me.topchetoeu.jscript.utils.permissions;
import me.topchetoeu.jscript.core.Extensions; import me.topchetoeu.jscript.runtime.Extensions;
import me.topchetoeu.jscript.core.Key; import me.topchetoeu.jscript.runtime.Key;
public interface PermissionsProvider { public interface PermissionsProvider {
public static final Key<PermissionsProvider> KEY = new Key<>(); public static final Key<PermissionsProvider> KEY = new Key<>();