regress: remove ES6 instructions
This commit is contained in:
parent
20f2c3c5e9
commit
754648fbf6
@ -17,10 +17,7 @@ public class Instruction {
|
|||||||
TRY_END(0x06),
|
TRY_END(0x06),
|
||||||
|
|
||||||
CALL(0x10),
|
CALL(0x10),
|
||||||
@Deprecated
|
|
||||||
CALL_MEMBER(0x11),
|
|
||||||
CALL_NEW(0x12),
|
CALL_NEW(0x12),
|
||||||
CALL_SUPER(0x13),
|
|
||||||
JMP_IF(0x18),
|
JMP_IF(0x18),
|
||||||
JMP_IFN(0x19),
|
JMP_IFN(0x19),
|
||||||
JMP(0x1A),
|
JMP(0x1A),
|
||||||
@ -40,11 +37,12 @@ public class Instruction {
|
|||||||
|
|
||||||
LOAD_GLOB(0x38),
|
LOAD_GLOB(0x38),
|
||||||
LOAD_INTRINSICS(0x39),
|
LOAD_INTRINSICS(0x39),
|
||||||
LOAD_ARGS(0x3A),
|
LOAD_ARG(0x3A),
|
||||||
LOAD_REST_ARGS(0x3B),
|
LOAD_ARGS_N(0x3B),
|
||||||
LOAD_CALLEE(0x3C),
|
LOAD_ARGS(0x3C),
|
||||||
LOAD_THIS(0x3D),
|
LOAD_CALLED(0x3D),
|
||||||
LOAD_ERROR(0x3E),
|
LOAD_THIS(0x3E),
|
||||||
|
LOAD_ERROR(0x3F),
|
||||||
|
|
||||||
LOAD_VAR(0x40),
|
LOAD_VAR(0x40),
|
||||||
LOAD_MEMBER(0x41),
|
LOAD_MEMBER(0x41),
|
||||||
@ -61,16 +59,10 @@ public class Instruction {
|
|||||||
KEYS(0x52),
|
KEYS(0x52),
|
||||||
TYPEOF(0x53),
|
TYPEOF(0x53),
|
||||||
OPERATION(0x54),
|
OPERATION(0x54),
|
||||||
EXTEND(0x55),
|
|
||||||
|
|
||||||
GLOB_GET(0x60),
|
GLOB_GET(0x60),
|
||||||
GLOB_SET(0x61),
|
GLOB_SET(0x61),
|
||||||
GLOB_DEF(0x62),
|
GLOB_DEF(0x62);
|
||||||
|
|
||||||
// CAP_INIT(0x70),
|
|
||||||
VAR_INIT(0x71),
|
|
||||||
CAP_FREE(0x72),
|
|
||||||
VAR_FREE(0x73);
|
|
||||||
|
|
||||||
private static final HashMap<Integer, Type> types = new HashMap<>();
|
private static final HashMap<Integer, Type> types = new HashMap<>();
|
||||||
public final int numeric;
|
public final int numeric;
|
||||||
@ -88,8 +80,19 @@ public class Instruction {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
public static enum BreakpointType {
|
public static enum BreakpointType {
|
||||||
|
/**
|
||||||
|
* A debugger should never stop at such instruction, unless a breakpoint has been set on it
|
||||||
|
*/
|
||||||
NONE,
|
NONE,
|
||||||
|
/**
|
||||||
|
* Debuggers should pause at instructions marked with this breakpoint type
|
||||||
|
* after any step command
|
||||||
|
*/
|
||||||
STEP_OVER,
|
STEP_OVER,
|
||||||
|
/**
|
||||||
|
* Debuggers should pause at instructions marked with this breakpoint type
|
||||||
|
* only after a step-in command
|
||||||
|
*/
|
||||||
STEP_IN;
|
STEP_IN;
|
||||||
|
|
||||||
public boolean shouldStepIn() {
|
public boolean shouldStepIn() {
|
||||||
@ -108,27 +111,6 @@ public class Instruction {
|
|||||||
if (i >= params.length || i < 0) return null;
|
if (i >= params.length || i < 0) return null;
|
||||||
return (T)params[i];
|
return (T)params[i];
|
||||||
}
|
}
|
||||||
@SuppressWarnings("unchecked")
|
|
||||||
public <T> T get(int i, T defaultVal) {
|
|
||||||
if (i >= params.length || i < 0) return defaultVal;
|
|
||||||
return (T)params[i];
|
|
||||||
}
|
|
||||||
public boolean match(Object ...args) {
|
|
||||||
if (args.length != params.length) return false;
|
|
||||||
for (int i = 0; i < args.length; i++) {
|
|
||||||
var a = params[i];
|
|
||||||
var b = args[i];
|
|
||||||
if (a == null || b == null) {
|
|
||||||
if (!(a == null && b == null)) return false;
|
|
||||||
}
|
|
||||||
if (!a.equals(b)) return false;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
public boolean is(int i, Object arg) {
|
|
||||||
if (params.length <= i) return false;
|
|
||||||
return params[i].equals(arg);
|
|
||||||
}
|
|
||||||
|
|
||||||
// public void write(DataOutputStream writer) throws IOException {
|
// public void write(DataOutputStream writer) throws IOException {
|
||||||
// var rawType = type.numeric;
|
// var rawType = type.numeric;
|
||||||
@ -253,60 +235,79 @@ public class Instruction {
|
|||||||
// }
|
// }
|
||||||
// }
|
// }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Signals the start of a protected context
|
||||||
|
* @param catchStart The point to witch to jump if an error has been caught
|
||||||
|
* @param finallyStart The point to witch to jump after either the try or catch bodies have exited
|
||||||
|
* @param end The point to which to jump after exiting the whole protected context
|
||||||
|
*/
|
||||||
public static Instruction tryStart(int catchStart, int finallyStart, int end) {
|
public static Instruction tryStart(int catchStart, int finallyStart, int end) {
|
||||||
return new Instruction(Type.TRY_START, catchStart, finallyStart, end);
|
return new Instruction(Type.TRY_START, catchStart, finallyStart, end);
|
||||||
}
|
}
|
||||||
|
/**
|
||||||
|
* Signifies that the current protected section (try, catch or finally) has ended
|
||||||
|
*/
|
||||||
public static Instruction tryEnd() {
|
public static Instruction tryEnd() {
|
||||||
return new Instruction(Type.TRY_END);
|
return new Instruction(Type.TRY_END);
|
||||||
}
|
}
|
||||||
|
/**
|
||||||
|
* Throws the top stack value
|
||||||
|
*/
|
||||||
public static Instruction throwInstr() {
|
public static Instruction throwInstr() {
|
||||||
return new Instruction(Type.THROW);
|
return new Instruction(Type.THROW);
|
||||||
}
|
}
|
||||||
|
/**
|
||||||
|
* Converts the given exception to a runtime syntax error and throws it
|
||||||
|
*/
|
||||||
public static Instruction throwSyntax(SyntaxException err) {
|
public static Instruction throwSyntax(SyntaxException err) {
|
||||||
return new Instruction(Type.THROW_SYNTAX, err.getMessage());
|
return new Instruction(Type.THROW_SYNTAX, err.getMessage());
|
||||||
}
|
}
|
||||||
|
/**
|
||||||
|
* Converts the given exception to a runtime syntax error and throws it
|
||||||
|
*/
|
||||||
public static Instruction throwSyntax(String err) {
|
public static Instruction throwSyntax(String err) {
|
||||||
return new Instruction(Type.THROW_SYNTAX, err);
|
return new Instruction(Type.THROW_SYNTAX, err);
|
||||||
}
|
}
|
||||||
|
/**
|
||||||
|
* Converts the given exception to a runtime syntax error and throws it
|
||||||
|
*/
|
||||||
public static Instruction throwSyntax(Location loc, String err) {
|
public static Instruction throwSyntax(Location loc, String err) {
|
||||||
return new Instruction(Type.THROW_SYNTAX, new SyntaxException(loc, err).getMessage());
|
return new Instruction(Type.THROW_SYNTAX, new SyntaxException(loc, err).getMessage());
|
||||||
}
|
}
|
||||||
|
/**
|
||||||
|
* Performs a JS object property deletion.
|
||||||
|
* Operands:
|
||||||
|
* 1. Object to manipulate
|
||||||
|
* 2. Key to delete
|
||||||
|
*/
|
||||||
public static Instruction delete() {
|
public static Instruction delete() {
|
||||||
return new Instruction(Type.DELETE);
|
return new Instruction(Type.DELETE);
|
||||||
}
|
}
|
||||||
|
/**
|
||||||
|
* Returns the top stack value
|
||||||
|
*/
|
||||||
public static Instruction ret() {
|
public static Instruction ret() {
|
||||||
return new Instruction(Type.RETURN);
|
return new Instruction(Type.RETURN);
|
||||||
}
|
}
|
||||||
|
/**
|
||||||
|
* A special NOP instruction telling any debugger to pause
|
||||||
|
*/
|
||||||
public static Instruction debug() {
|
public static Instruction debug() {
|
||||||
return new Instruction(Type.NOP, "debug");
|
return new Instruction(Type.NOP, "debug");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Does nothing. May be used for metadata or implementation-specific instructions that don't alter the behavior
|
||||||
|
*/
|
||||||
public static Instruction nop(Object ...params) {
|
public static Instruction nop(Object ...params) {
|
||||||
return new Instruction(Type.NOP, params);
|
return new Instruction(Type.NOP, params);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Instruction call(int argn, boolean hasSelf, String name) {
|
|
||||||
return new Instruction(Type.CALL, argn, hasSelf, name);
|
|
||||||
}
|
|
||||||
public static Instruction call(int argn, boolean hasSelf) {
|
public static Instruction call(int argn, boolean hasSelf) {
|
||||||
return call(argn, hasSelf, "");
|
return new Instruction(Type.CALL, argn, hasSelf);
|
||||||
}
|
|
||||||
@Deprecated
|
|
||||||
public static Instruction callMember(int argn, String name) {
|
|
||||||
return new Instruction(Type.CALL_MEMBER, argn, name);
|
|
||||||
}
|
|
||||||
@Deprecated
|
|
||||||
public static Instruction callMember(int argn) {
|
|
||||||
return new Instruction(Type.CALL_MEMBER, argn, "");
|
|
||||||
}
|
|
||||||
public static Instruction callNew(int argn, String name) {
|
|
||||||
return new Instruction(Type.CALL_NEW, argn, name);
|
|
||||||
}
|
}
|
||||||
public static Instruction callNew(int argn) {
|
public static Instruction callNew(int argn) {
|
||||||
return new Instruction(Type.CALL_NEW, argn, "");
|
return new Instruction(Type.CALL_NEW, argn);
|
||||||
}
|
|
||||||
public static Instruction callSuper(int argn) {
|
|
||||||
return new Instruction(Type.CALL_SUPER, argn);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Instruction jmp(int offset) {
|
public static Instruction jmp(int offset) {
|
||||||
@ -362,14 +363,30 @@ public class Instruction {
|
|||||||
public static Instruction loadThis() {
|
public static Instruction loadThis() {
|
||||||
return new Instruction(Type.LOAD_THIS);
|
return new Instruction(Type.LOAD_THIS);
|
||||||
}
|
}
|
||||||
public static Instruction loadArgs(boolean real) {
|
/**
|
||||||
return new Instruction(Type.LOAD_ARGS, real);
|
* Loads the given argument
|
||||||
|
* @param i The index of the argument to load. If -1, will get the index from the stack instead
|
||||||
|
*/
|
||||||
|
public static Instruction loadArg(int i) {
|
||||||
|
return new Instruction(Type.LOAD_ARG, i);
|
||||||
}
|
}
|
||||||
public static Instruction loadRestArgs(int offset) {
|
/**
|
||||||
return new Instruction(Type.LOAD_REST_ARGS, offset);
|
* Pushes the amount of arguments to the stack
|
||||||
|
*/
|
||||||
|
public static Instruction loadArgsN() {
|
||||||
|
return new Instruction(Type.LOAD_ARGS_N);
|
||||||
}
|
}
|
||||||
public static Instruction loadCallee() {
|
/**
|
||||||
return new Instruction(Type.LOAD_CALLEE);
|
* Pushes the arguments object to the stack
|
||||||
|
*/
|
||||||
|
public static Instruction loadArgs() {
|
||||||
|
return new Instruction(Type.LOAD_ARGS);
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Loads a reference to the function being called
|
||||||
|
*/
|
||||||
|
public static Instruction loadCalled() {
|
||||||
|
return new Instruction(Type.LOAD_CALLED);
|
||||||
}
|
}
|
||||||
public static Instruction loadGlob() {
|
public static Instruction loadGlob() {
|
||||||
return new Instruction(Type.LOAD_GLOB);
|
return new Instruction(Type.LOAD_GLOB);
|
||||||
@ -394,17 +411,11 @@ public class Instruction {
|
|||||||
return new Instruction(Type.LOAD_REGEX, pattern, flags);
|
return new Instruction(Type.LOAD_REGEX, pattern, flags);
|
||||||
}
|
}
|
||||||
// TODO: make this capturing a concern of the compiler
|
// TODO: make this capturing a concern of the compiler
|
||||||
public static Instruction loadFunc(int id, boolean callable, boolean constructible, boolean captureThis, boolean noThis, String name, int[] captures) {
|
public static Instruction loadFunc(int id, String name, int[] captures) {
|
||||||
if (name == null) name = "";
|
var args = new Object[2 + captures.length];
|
||||||
|
|
||||||
var args = new Object[6 + captures.length];
|
|
||||||
args[0] = id;
|
args[0] = id;
|
||||||
args[1] = name;
|
args[1] = name;
|
||||||
args[2] = callable;
|
for (var i = 0; i < captures.length; i++) args[i + 2] = captures[i];
|
||||||
args[3] = constructible;
|
|
||||||
args[4] = captureThis;
|
|
||||||
args[5] = noThis;
|
|
||||||
for (var i = 0; i < captures.length; i++) args[i + 6] = captures[i];
|
|
||||||
return new Instruction(Type.LOAD_FUNC, args);
|
return new Instruction(Type.LOAD_FUNC, args);
|
||||||
}
|
}
|
||||||
public static Instruction loadObj() {
|
public static Instruction loadObj() {
|
||||||
@ -463,36 +474,17 @@ public class Instruction {
|
|||||||
return new Instruction(Type.KEYS, own, onlyEnumerable);
|
return new Instruction(Type.KEYS, own, onlyEnumerable);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Instruction defProp(boolean setter, boolean enumerable) {
|
public static Instruction defProp(boolean setter) {
|
||||||
return new Instruction(Type.DEF_PROP, setter, enumerable);
|
return new Instruction(Type.DEF_PROP, setter);
|
||||||
}
|
}
|
||||||
public static Instruction defField(boolean enumerable) {
|
public static Instruction defField() {
|
||||||
return new Instruction(Type.DEF_FIELD, enumerable);
|
return new Instruction(Type.DEF_FIELD);
|
||||||
}
|
|
||||||
public static Instruction extend() {
|
|
||||||
return new Instruction(Type.EXTEND);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Instruction operation(Operation op) {
|
public static Instruction operation(Operation op) {
|
||||||
return new Instruction(Type.OPERATION, op);
|
return new Instruction(Type.OPERATION, op);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Instruction capFree(int i) {
|
|
||||||
return new Instruction(Type.CAP_FREE, i);
|
|
||||||
}
|
|
||||||
public static Instruction varFree(int i) {
|
|
||||||
return new Instruction(Type.VAR_FREE, i);
|
|
||||||
}
|
|
||||||
public static Instruction varInit(int i, boolean force) {
|
|
||||||
return new Instruction(Type.VAR_INIT, i, force);
|
|
||||||
}
|
|
||||||
// public static Instruction stackAlloc(int start, int n) {
|
|
||||||
// return new Instruction(Type.STACK_ALLOC, start, start + n);
|
|
||||||
// }
|
|
||||||
// public static Instruction stackRealloc(int start, int n) {
|
|
||||||
// return new Instruction(Type.STACK_REALLOC, start, start + n);
|
|
||||||
// }
|
|
||||||
|
|
||||||
@Override public String toString() {
|
@Override public String toString() {
|
||||||
var res = type.toString();
|
var res = type.toString();
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user