diff --git a/.gitignore b/.gitignore index f940269..02bdb0a 100644 --- a/.gitignore +++ b/.gitignore @@ -352,3 +352,4 @@ MigrationBackup/ # custom hasmer ignore **/launchSettings.json /hasmer/docs +.netcoredbg_hist diff --git a/hasmer/README.md b/hasmer/README.md index 46bd46e..b881daa 100644 --- a/hasmer/README.md +++ b/hasmer/README.md @@ -1,6 +1,6 @@ # hasmer -This directory contains the C# source code for `hasmer`, using the .NET 5.0 platform. +This directory contains the C# source code for `hasmer`, using the .NET 8.0 platform. # Setup @@ -16,7 +16,7 @@ dotnet build ``` Ensure you run the above command with the current working directory being the one containing the `hasmer.sln` file. -Building with the .NET SDK CLI will generate the executable in the `.hasmer-cli/bin/Debug/net5.0` directory. You can make a release build using: +Building with the .NET SDK CLI will generate the executable in the `.hasmer-cli/bin/Debug/net8.0` directory. You can make a release build using: ``` dotnet build -c Release ``` diff --git a/hasmer/hasmer-cli/Program.cs b/hasmer/hasmer-cli/Program.cs index 407c30b..11c77a3 100644 --- a/hasmer/hasmer-cli/Program.cs +++ b/hasmer/hasmer-cli/Program.cs @@ -19,7 +19,7 @@ public class DecodeOptions { public bool IsApk { get; set; } } - [Verb("disassemble", HelpText = "Disassembles the bytecode into a Hasm file.")] + [Verb("disassemble", HelpText = "Disassembles Hermes bytecode into a Hasm file.")] public class DisassembleOptions : DecodeOptions { [Option("exact", Required = false, HelpText = "Disassembles the exact instructions instead of optimizing them at assemble time.")] public bool IsExact { get; set; } @@ -28,7 +28,7 @@ public class DisassembleOptions : DecodeOptions { public bool IsVerbose { get; set; } } - [Verb("decompile", HelpText = "Decompiles the bytecode into a JavaScript file.")] + [Verb("decompile", HelpText = "Decompiles Hermes bytecode into a JavaScript file.")] public class DecompileOptions : DecodeOptions { [Option('p', "omit-protoype", Required = false, HelpText = "Omit prototypes being passed to constructors.", Default = true)] public bool OmitPrototypeFromConstructorInvocation { get; set; } @@ -89,7 +89,7 @@ private static void Assemble(AssembleOptions options) { } string fileName = Path.GetFileName(options.InputPath); if (fileName.Contains(".")) { - fileName = fileName.Substring(0, fileName.IndexOf('.')); + fileName = fileName.Substring(0, fileName.LastIndexOf('.')); } string outputDirectory = Path.GetDirectoryName(options.InputPath); @@ -110,7 +110,7 @@ private static DecoderParameters Decode(DecodeOptions options) { string fileName = Path.GetFileName(options.InputPath); if (fileName.Contains(".")) { - fileName = fileName.Substring(0, fileName.IndexOf('.')); + fileName = fileName.Substring(0, fileName.LastIndexOf('.')); } string outputDirectory = Path.GetDirectoryName(options.InputPath); byte[] hermesBytecode; @@ -121,7 +121,8 @@ private static DecoderParameters Decode(DecodeOptions options) { using MemoryStream fileStream = new MemoryStream((int)bundleEntry.UncompressedSize); bundleEntry.Extract(fileStream); hermesBytecode = fileStream.ToArray(); - } else { + } + else { hermesBytecode = File.ReadAllBytes(options.InputPath); } diff --git a/hasmer/hasmer-cli/hasmer-cli.csproj b/hasmer/hasmer-cli/hasmer-cli.csproj index d3ad3e8..7806152 100644 --- a/hasmer/hasmer-cli/hasmer-cli.csproj +++ b/hasmer/hasmer-cli/hasmer-cli.csproj @@ -2,9 +2,10 @@ Exe - net5.0 + net8.0 Hasmer.CLI hasmer + true diff --git a/hasmer/hasmer-lsp/hasmer-lsp.csproj b/hasmer/hasmer-lsp/hasmer-lsp.csproj index 91b4522..47cb45f 100644 --- a/hasmer/hasmer-lsp/hasmer-lsp.csproj +++ b/hasmer/hasmer-lsp/hasmer-lsp.csproj @@ -2,11 +2,12 @@ Exe - net5.0 + net8.0 Hasmer.LSP + > diff --git a/hasmer/libhasmer/Assembler/DataDisassembler.cs b/hasmer/libhasmer/Assembler/DataDisassembler.cs index d8363ef..4244ee6 100644 --- a/hasmer/libhasmer/Assembler/DataDisassembler.cs +++ b/hasmer/libhasmer/Assembler/DataDisassembler.cs @@ -74,9 +74,18 @@ public PrimitiveValue[] GetElementSeries(List buffer, uint o private void AppendDisassembly(StringBuilder builder, List buffer, char prefix) { for (int i = 0; i < buffer.Count; i++) { HbcDataBufferItems items = buffer[i]; + switch (items.Prefix.TagType) { + case HbcDataBufferTagType.Null: + case HbcDataBufferTagType.True: + case HbcDataBufferTagType.False: + builder.AppendLine($".data {prefix}{i} {items.Prefix.TagType}[{items.Items.Length}]"); + continue; + default: + break; + } IEnumerable mapped = items.Items.Select(x => { if (x.TypeCode == TypeCode.String) { - x.SetValue('"' + x.GetValue().Replace("\"", "\\\"") + '"'); + x.SetValue(StringEscape.Escape(x.GetValue())); } return x; }); @@ -85,7 +94,7 @@ private void AppendDisassembly(StringBuilder builder, List b _ => items.Prefix.TagType.ToString() }; string joined = string.Join(", ", mapped); - builder.AppendLine($".data {prefix}{i} {tagType}[{joined}] # offset = {items.Offset}"); + builder.AppendLine($".data {prefix}{i} {tagType}[] {{ {joined} }}"); } if (buffer.Count > 0) { builder.AppendLine(); @@ -93,8 +102,11 @@ private void AppendDisassembly(StringBuilder builder, List b } public void DisassembleData() { + Console.WriteLine("Parsing array buffer..."); ArrayBuffer = Source.ArrayBuffer.ReadAll(Source); + Console.WriteLine("Parsing object key buffer..."); KeyBuffer = Source.ObjectKeyBuffer.ReadAll(Source); + Console.WriteLine("Parsing object value buffer..."); ValueBuffer = Source.ObjectValueBuffer.ReadAll(Source); } diff --git a/hasmer/libhasmer/Assembler/FunctionDisassembler.cs b/hasmer/libhasmer/Assembler/FunctionDisassembler.cs index 07ed82b..67155c6 100644 --- a/hasmer/libhasmer/Assembler/FunctionDisassembler.cs +++ b/hasmer/libhasmer/Assembler/FunctionDisassembler.cs @@ -178,7 +178,7 @@ private string AnnotateObject(uint keyBufferIndex, uint valueBufferIndex, ushort /// Adds a comment to an instruction if neccessary. /// private void AnnotateVerbose(SourceCodeBuilder builder, HbcInstruction insn) { - builder.Write("# offset = 0x"); + builder.Write("// offset = 0x"); builder.Write(insn.Offset.ToString("X")); builder.Write(", length = "); builder.Write(insn.Length.ToString()); @@ -205,7 +205,7 @@ private void AnnotateInstruction(SourceCodeBuilder builder, HbcInstruction insn) }; if (annotation != null) { - builder.Write("# "); + builder.Write("// "); builder.Write(annotation); } } diff --git a/hasmer/libhasmer/Assembler/HbcAssembler.cs b/hasmer/libhasmer/Assembler/HbcAssembler.cs index 47e055a..7cf8ec1 100644 --- a/hasmer/libhasmer/Assembler/HbcAssembler.cs +++ b/hasmer/libhasmer/Assembler/HbcAssembler.cs @@ -12,16 +12,6 @@ namespace Hasmer.Assembler { /// Represents a Hasm assembler, which assembles into Hermes bytecode. /// public class HbcAssembler { - /// - /// Represents the data contained with in the header of the Hasm file (i.e. the initial ".hasm" declaration)./ - /// - public HasmHeaderReader Header { get; set; } - - /// - /// The file builder instance which creates the final to be serialized. - /// - public HbcFileBuilder FileBuilder { get; set; } - /// /// The data assembler instance. /// @@ -32,6 +22,13 @@ public class HbcAssembler { /// public FunctionAssembler FunctionAssembler { get; set; } + /// + /// The Hermes bytecode file being assembled. + /// + public HbcFile File { get; set; } + + public bool IsExact { get; set; } + /// /// The Hasm assembly to disassemble. /// @@ -48,21 +45,41 @@ public HbcAssembler(string source) { /// Assembles the given Hasm assembly into a Hermes bytecode file, serialized into a byte array. /// public byte[] Assemble() { - HasmTokenStream stream = new HasmTokenStream(Source); + Console.WriteLine("Parsing Hasm file..."); + HasmTokenizer tokenizer = new HasmTokenizer(); + tokenizer.TokenizeProgram(Source); + + // List tokens = null; + + // IsExact = tokenStream.State.IsExact; + // File = new HbcFile { + // Header = new HbcHeader { + // Magic = HbcHeader.HBC_MAGIC_HEADER, + // Version = tokenStream.State.BytecodeFormat.Version, + // SourceHash = new byte[20], + // GlobalCodeIndex = 0, + // Padding = new byte[31], + // }, + // BytecodeFormat = tokenStream.State.BytecodeFormat, + // }; - Header = new HasmHeaderReader(stream); - Header.Read(); + // Console.WriteLine("Assembling data..."); + // DataAssembler = new DataAssembler(tokens); + // DataAssembler.Assemble(); - FileBuilder = new HbcFileBuilder(this); + // Console.WriteLine("Assembling functions..."); + // FunctionAssembler = new FunctionAssembler(this, tokens); + // FunctionAssembler.Assemble(); - DataAssembler = new DataAssembler(stream); - DataAssembler.Assemble(); + // Console.WriteLine("Assembling Hermes bytecode file..."); + // File.StringTable = DataAssembler.StringTable.ToArray(); + // File.ArrayBuffer = new HbcDataBuffer(DataAssembler.ArrayBuffer.RawBuffer.ToArray()); + // File.ObjectKeyBuffer = new HbcDataBuffer(DataAssembler.ObjectKeyBuffer.RawBuffer.ToArray()); + // File.ObjectValueBuffer = new HbcDataBuffer(DataAssembler.ObjectValueBuffer.RawBuffer.ToArray()); - FunctionAssembler = new FunctionAssembler(this, stream); - FunctionAssembler.Assemble(); + // return File.Write(); - HbcFile hbcFile = FileBuilder.Build(); - return hbcFile.Write(); + return new byte[0]; } } } diff --git a/hasmer/libhasmer/Assembler/HbcDisassembler.cs b/hasmer/libhasmer/Assembler/HbcDisassembler.cs index 4f2a847..5755ae6 100644 --- a/hasmer/libhasmer/Assembler/HbcDisassembler.cs +++ b/hasmer/libhasmer/Assembler/HbcDisassembler.cs @@ -50,11 +50,18 @@ public string Disassemble() { builder.AppendLine(); builder.AppendLine(DataDisassembler.Disassemble()); - foreach (HbcSmallFuncHeader func in Source.SmallFuncHeaders) { - FunctionDisassembler decompiler = new FunctionDisassembler(this, func.GetAssemblerHeader()); - builder.AppendLine(decompiler.Disassemble()); - builder.AppendLine(); + Console.Write("Disassembling functions... "); + using (ConsoleProgressBar progress = new ConsoleProgressBar()) { + for (int i = 0; i < Source.SmallFuncHeaders.Length; i++) { + progress.Report(i / (double)Source.SmallFuncHeaders.Length); + + HbcSmallFuncHeader func = Source.SmallFuncHeaders[i]; + FunctionDisassembler decompiler = new FunctionDisassembler(this, func.GetAssemblerHeader()); + builder.AppendLine(decompiler.Disassemble()); + builder.AppendLine(); + } } + Console.WriteLine("done!"); return builder.ToString(); } diff --git a/hasmer/libhasmer/Assembler/Parser/HasmCommentParser.cs b/hasmer/libhasmer/Assembler/Parser/HasmCommentParser.cs index 67c881c..b2a537a 100644 --- a/hasmer/libhasmer/Assembler/Parser/HasmCommentParser.cs +++ b/hasmer/libhasmer/Assembler/Parser/HasmCommentParser.cs @@ -6,11 +6,11 @@ namespace Hasmer.Assembler.Parser { /// - /// Parses a comment (starting with a '#') from the stream. + /// Parses a comment (starting with a '//') from the stream. /// public class HasmCommentParser : IHasmTokenParser { public bool CanParse(HasmReaderState asm) { - return asm.Stream.PeekCharacters(1) == "#"; + return asm.Stream.Peek(2) == "//"; } public HasmToken Parse(HasmReaderState asm) { @@ -18,8 +18,17 @@ public HasmToken Parse(HasmReaderState asm) { throw new HasmParserException(asm.Stream, "invalid comment"); } - asm.Stream.CurrentLine++; - asm.Stream.CurrentColumn = 0; + while (true) { + char c = asm.Stream.PeekChar(); + if (c == '\0') { + break; + } + asm.Stream.Advance(1); + if (c == '\n') { + break; + } + } + if (!asm.Stream.IsFinished) { asm.Stream.SkipWhitespace(); } diff --git a/hasmer/libhasmer/Assembler/Parser/HasmDataDeclaration.cs b/hasmer/libhasmer/Assembler/Parser/HasmDataDeclaration.cs new file mode 100644 index 0000000..dc807b1 --- /dev/null +++ b/hasmer/libhasmer/Assembler/Parser/HasmDataDeclaration.cs @@ -0,0 +1,43 @@ +using System.Collections.Generic; + +namespace Hasmer.Assembler.Parser { + /// + /// The kind of data being declared in a ".data" declaration. + /// + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.StringEnumConverter))] + public enum HasmDataDeclarationKind { + String, + Integer, + Number, + Null, + True, + False + } + + /// + /// Represents a ".data" declaration. + /// + public class HasmDataDeclaration { + /// + /// The label of the data. + /// + public HasmLabelToken Label { get; set; } + + /// + /// The kind of the data. + /// + public HasmDataDeclarationKind Kind { get; set; } + + /// + /// The amount of distinct items in the data declaration. + /// In declarations where there are specific elements, this is equal to . + /// In declarations where elements are repeated (i.e. Null, True, or False), this is equal to the supplied repeat count. + /// + public int Count { get; set; } + + /// + /// The tokens that define the contents of the data, if there are specific elements. + /// + public List Elements { get; set; } + } +} diff --git a/hasmer/libhasmer/Assembler/Parser/HasmDeclarationParser.cs.old b/hasmer/libhasmer/Assembler/Parser/HasmDeclarationParser.cs.old new file mode 100644 index 0000000..d6df2af --- /dev/null +++ b/hasmer/libhasmer/Assembler/Parser/HasmDeclarationParser.cs.old @@ -0,0 +1,193 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Hasmer.Assembler.Parser { + /// + /// Represents a ".hasm" header declaration, the first token of a Hasm file. + /// + public class HasmHeaderDeclarationToken : HasmToken { + /// + /// The token which declares the version of the Hasm bytecode. + /// + public HasmIntegerToken Version { get; set; } + + /// + /// True if the version declaration specified that the instructions should be interpretered literally, + /// and not as abstracted forms. See for more information. + /// + public bool IsExact { get; set; } + + public HasmHeaderDeclarationToken(int state) : base(state) { } + } + + /// + /// Parses a declaration (i.e. a token which starts with "."). + /// + public class HasmDeclarationParser : IHasmTokenParser { + public bool CanParse(HasmReaderState asm) { + string op = asm.Stream.PeekOperator(); + if (op != ".") { + return false; + } + asm.Stream.AdvanceOperator(); + + string word = asm.Stream.PeekWord(); + if (word == null) { + return false; + } + + return word == "hasm" || + word == "data" || + word == "start" || + word == "end" || + word == "id" || + word == "params" || + word == "registers" || + word == "symbols" || + word == "strict" || + word == "label"; + } + + public HasmToken Parse(HasmReaderState asm) { + int state = asm.Stream.SaveState(); + + asm.Stream.AdvanceOperator(); // skip "." before declaration + string word = asm.Stream.AdvanceWord(); + if (word == "hasm") { + HasmIntegerToken version = (HasmIntegerToken)IHasmTokenParser.IntegerParser.Parse(asm); + bool isExact; + if (asm.Stream.PeekWord() == "exact") { + isExact = true; + } else if (asm.Stream.PeekWord() == "auto") { + isExact = false; + } else { + throw new HasmParserException(asm.Stream, "expecting either 'auto' or 'exact' after version declaration"); + } + asm.Stream.AdvanceWord(); + + return new HasmHeaderDeclarationToken(state) { + Version = version, + IsExact = isExact + }; + } else if (word == "data") { + HasmLabelToken label = (HasmLabelToken)IHasmTokenParser.LabelParser.Parse(asm); + string dataTypeRaw = asm.Stream.PeekWord(); + if (dataTypeRaw == null) { + throw new HasmParserException(asm.Stream, "expecting data type"); + } + asm.Stream.AdvanceWord(); + if (!Enum.IsDefined(typeof(HasmDataDeclarationKind), dataTypeRaw)) { + throw new HasmParserException(asm.Stream, $"invalid data type: '{dataTypeRaw}'"); + } + HasmDataDeclarationKind dataType = Enum.Parse(dataTypeRaw); + if (asm.Stream.PeekOperator() != "[") { + throw new HasmParserException(asm.Stream, "expecting '['"); + } + asm.Stream.AdvanceOperator(); + + IHasmTokenParser dataParser = dataType switch { + HasmDataDeclarationKind.String => IHasmTokenParser.StringParser, + HasmDataDeclarationKind.Integer => IHasmTokenParser.IntegerParser, + HasmDataDeclarationKind.Number => IHasmTokenParser.NumberParser, + HasmDataDeclarationKind.Null => new HasmSimpleParser("null"), + HasmDataDeclarationKind.True => new HasmSimpleParser("true"), + HasmDataDeclarationKind.False => new HasmSimpleParser("false"), + _ => throw new NotImplementedException() + }; + + List data = new List(); + while (true) { + data.Add((HasmLiteralToken)dataParser.Parse(asm)); + string peek = asm.Stream.PeekOperator(); + if (peek == "]") { + asm.Stream.AdvanceOperator(); + break; + } + if (peek != ",") { + throw new HasmParserException(asm.Stream, "expecting either ']' or ','"); + } + asm.Stream.AdvanceOperator(); + } + + return new HasmDataDeclarationToken(state) { + Label = label, + DataType = dataType, + Data = data + }; + } else if (word == "start") { + string functionType = asm.Stream.PeekWord(); + if (functionType != "Function" && functionType != "Constructor" && functionType != "NCFunction") { + throw new HasmParserException(asm.Stream, "expecting either 'Function', 'Constructor', or 'NCFunction'"); + } + asm.Stream.AdvanceWord(); + + string functionName; + int preNameState = asm.Stream.SaveState(); + HasmToken identToken = IHasmTokenParser.StringParser.Parse(asm); + if (identToken is HasmIdentifierToken ident) { + functionName = ident.Value; + } else { + throw new HasmParserException(preNameState, "expecting function name identifier"); + } + + // the cursor is currently at the start of the parameters, which we ignore, so skip to the next line + // .start Function (this, foo, bar, baz) + // .id XYZ ^ + // ... + asm.Stream.CurrentLine++; + asm.Stream.CurrentColumn = 0; + + List body = new List(); + HasmFunctionToken function = new HasmFunctionToken(state) { + FunctionName = functionName, + Body = body + }; + asm.CurrentFunction = function; + + HasmTokenStream bodyStream = new HasmTokenStream(asm); + foreach (HasmToken token in bodyStream.ReadTokens()) { + if (token is HasmSimpleToken simple && simple.Value == "end") { + asm.CurrentFunction = null; + break; + } + body.Add(token); + } + + return function; + } else if (word == "end") { + return new HasmSimpleToken(state) { + Value = "end" + }; + } else if (word == "id" || word == "params" || word == "registers" || word == "symbols") { + if (!IHasmTokenParser.IntegerParser.CanParse(asm)) { + throw new HasmParserException(asm.Stream, "expecting value after declaration"); + } + HasmIntegerToken intToken = (HasmIntegerToken)IHasmTokenParser.IntegerParser.Parse(asm); + HasmFunctionModifierType modType = word switch { + "id" => HasmFunctionModifierType.Id, + "params" => HasmFunctionModifierType.Params, + "registers" => HasmFunctionModifierType.Registers, + "symbols" => HasmFunctionModifierType.Symbols, + _ => throw new Exception("unreachable"), + }; + return new HasmFunctionModifierToken(state) { + ModifierType = modType, + Value = intToken.GetValueAsUInt32(), + }; + } else if (word == "strict") { + return new HasmFunctionModifierToken(state) { + ModifierType = HasmFunctionModifierType.Strict + }; + } else if (word == "label") { + // TODO + asm.Stream.AdvanceWord(); + return null; + } + + throw new Exception($"invalid declaration '.{word}'"); + } + } +} diff --git a/hasmer/libhasmer/Assembler/Parser/HasmFunctionModifierToken.cs b/hasmer/libhasmer/Assembler/Parser/HasmFunctionModifierToken.cs new file mode 100644 index 0000000..a28e0ba --- /dev/null +++ b/hasmer/libhasmer/Assembler/Parser/HasmFunctionModifierToken.cs @@ -0,0 +1,31 @@ + +namespace Hasmer.Assembler.Parser { + /// + /// The type of declaration for a function modifier. + /// + public enum HasmFunctionModifierType { + Id, + Params, + Registers, + Symbols, + Strict + } + + /// + /// Represents a declaration that modifiers a function header. + /// + public class HasmFunctionModifierToken : HasmToken { + /// + /// The type of modifier. + /// + public HasmFunctionModifierType ModifierType { get; set; } + + /// + /// The value associated with the modifier, or null if the modifier does not have a value. + /// + public uint? Value { get; set; } + + + public HasmFunctionModifierToken(HasmStringStreamState state) : base(state) { } + } +} diff --git a/hasmer/libhasmer/Assembler/Parser/HasmFunctionToken.cs b/hasmer/libhasmer/Assembler/Parser/HasmFunctionToken.cs index 388d408..4ed1f62 100644 --- a/hasmer/libhasmer/Assembler/Parser/HasmFunctionToken.cs +++ b/hasmer/libhasmer/Assembler/Parser/HasmFunctionToken.cs @@ -12,7 +12,7 @@ public class HasmFunctionToken : HasmToken { /// /// The name of the function. /// - public string FunctionName { get; set; } + public HasmIdentifierToken Name { get; set; } /// /// The tokens in the body of the function. diff --git a/hasmer/libhasmer/Assembler/Parser/HasmHeader.cs b/hasmer/libhasmer/Assembler/Parser/HasmHeader.cs new file mode 100644 index 0000000..eb192e1 --- /dev/null +++ b/hasmer/libhasmer/Assembler/Parser/HasmHeader.cs @@ -0,0 +1,18 @@ + +namespace Hasmer.Assembler.Parser { + /// + /// Represents a ".hasm" header declaration. + /// + public class HasmHeader { + /// + /// The token which declares the version of the Hasm bytecode. + /// + public HasmIntegerToken Version { get; set; } + + /// + /// True if the version declaration specified that the instructions should be interpretered literally, + /// and not as abstracted forms. See for more information. + /// + public bool IsExact { get; set; } + } +} diff --git a/hasmer/libhasmer/Assembler/Parser/HasmInstructionParser.cs.old b/hasmer/libhasmer/Assembler/Parser/HasmInstructionParser.cs.old new file mode 100644 index 0000000..f0f37e7 --- /dev/null +++ b/hasmer/libhasmer/Assembler/Parser/HasmInstructionParser.cs.old @@ -0,0 +1,79 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Hasmer.Assembler.Parser { + /// + /// Represents a Hasm instruction and its operands. + /// + public class HasmInstructionToken : HasmToken { + /// + /// The name of the instruction. + /// + public string Instruction { get; set; } + + /// + /// The operands passed to the instruction. + /// + public List Operands { get; set; } + + public HasmInstructionToken(int state) : base(state) { } + } + + /// + /// Parses a Hasm instruction. + /// + public class HasmInstructionParser : IHasmTokenParser { + public bool CanParse(HasmReaderState asm) { + // throw new NotImplementedException(); + + string instruction = asm.Stream.PeekWord(); + return instruction != null; + } + + public HasmToken Parse(HasmReaderState asm) { + int state = asm.Stream.SaveState(); + string instruction = asm.Stream.AdvanceWord(); + + HbcInstructionDefinition def = asm.BytecodeFormat.Definitions.Find(def => def.Name == instruction); + if (def == null) { + throw new HasmParserException(asm.Stream, $"unknown instruction: '{instruction}'"); + } + + if (!asm.IsExact) { + // any instruction which takes a cache index should have the cache index removed in auto mode + if (def.Name == "GetById" || def.Name == "TryGetById" || def.Name == "PutById" || def.Name == "TryPutById" + || def.Name == "GetByIdShort" || def.Name == "GetByIdLong" || def.Name == "TryGetByIdLong" || def.Name == "PutByIdLong" || def.Name == "TryPutByIdLong") { + List operandTypes = new List(def.OperandTypes); + operandTypes.RemoveAt(2); // remove the cache index + + def = new HbcInstructionDefinition { + Name = def.Name, + AbstractDefinition = def.AbstractDefinition, + IsJump = def.IsJump, + Opcode = def.Opcode, + OperandTypes = operandTypes + }; + } + } + + HasmInstructionToken token = new HasmInstructionToken(state) { + Instruction = instruction, + Operands = new List() + }; + for (int i = 0; i < def.OperandTypes.Count; i++) { + if (token.Operands.Count > 0) { + if (asm.Stream.AdvanceOperator() != ",") { + throw new HasmParserException(asm.Stream, "expecting ','"); + } + } + HasmOperandParser parser = new HasmOperandParser(def, i); + token.Operands.Add((HasmOperandToken)parser.Parse(asm)); + } + + return token; + } + } +} diff --git a/hasmer/libhasmer/Assembler/Parser/HasmInstructionToken.cs b/hasmer/libhasmer/Assembler/Parser/HasmInstructionToken.cs new file mode 100644 index 0000000..a5ee475 --- /dev/null +++ b/hasmer/libhasmer/Assembler/Parser/HasmInstructionToken.cs @@ -0,0 +1,20 @@ +using System.Collections.Generic; + +namespace Hasmer.Assembler.Parser { + /// + /// Represents a Hasm instruction and its operands. + /// + public class HasmInstructionToken : HasmToken { + /// + /// The name of the instruction. + /// + public string Instruction { get; set; } + + /// + /// The operands passed to the instruction. + /// + public List Operands { get; set; } + + public HasmInstructionToken(HasmStringStreamState state) : base(state) { } + } +} diff --git a/hasmer/libhasmer/Assembler/Parser/HasmIntegerParser.cs.old b/hasmer/libhasmer/Assembler/Parser/HasmIntegerParser.cs.old new file mode 100644 index 0000000..6b08a0a --- /dev/null +++ b/hasmer/libhasmer/Assembler/Parser/HasmIntegerParser.cs.old @@ -0,0 +1,45 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Hasmer.Assembler.Parser { + /// + /// Parses an integer. + /// + public class HasmIntegerParser : IHasmTokenParser { + public bool CanParse(HasmReaderState asm) { + int state = asm.Stream.SaveState(); + if (asm.Stream.PeekOperator() == "-") { // negative number + asm.Stream.AdvanceOperator(); + } + + string word = asm.Stream.PeekWord(); + if (word == null) { + asm.Stream.LoadState(state); + return false; + } + + asm.Stream.LoadState(state); + return long.TryParse(word, out long _); + } + + public HasmToken Parse(HasmReaderState asm) { + if (!CanParse(asm)) { + throw new HasmParserException(asm.Stream, "invalid integer"); + } + + int state = asm.Stream.SaveState(); + + int multiplier = 1; + if (asm.Stream.PeekOperator() == "-") { // negative number + asm.Stream.AdvanceOperator(); + multiplier = -1; + } + + string word = asm.Stream.AdvanceWord(); + return new HasmIntegerToken(state, long.Parse(word) * multiplier); + } + } +} diff --git a/hasmer/libhasmer/Assembler/Parser/HasmIntegerToken.cs b/hasmer/libhasmer/Assembler/Parser/HasmIntegerToken.cs new file mode 100644 index 0000000..3c9eb83 --- /dev/null +++ b/hasmer/libhasmer/Assembler/Parser/HasmIntegerToken.cs @@ -0,0 +1,105 @@ + +namespace Hasmer.Assembler.Parser { + /// + /// Represents an integer, either a 4-byte signed integer or a 4-byte unsigned integer specifically. + /// + public class HasmIntegerToken : HasmLiteralToken { + /// + /// The integer value. This is stored a long to be able to handle both int and uint types. + /// + private long Value { get; set; } + + /// + /// Returns a PrimitiveValue whose underlying byte count is equal to the smallest multiple of 2 that can hold . + /// + public PrimitiveValue GetCompactValue(bool signed) { + if (signed) { + if (Value >= sbyte.MinValue && Value <= sbyte.MaxValue) { + return new PrimitiveValue((sbyte)Value); + } else if (Value >= short.MinValue && Value <= short.MaxValue) { + return new PrimitiveValue((short)Value); + } else if (Value >= int.MinValue && Value <= int.MaxValue) { + return new PrimitiveValue((int)Value); + } + } else { + if (Value >= byte.MinValue && Value <= byte.MaxValue) { + return new PrimitiveValue((byte)Value); + } else if (Value >= ushort.MinValue && Value <= ushort.MaxValue) { + return new PrimitiveValue((ushort)Value); + } else if (Value >= uint.MinValue && Value <= uint.MaxValue) { + return new PrimitiveValue((uint)Value); + } + } + + throw new HasmParserException(this, $"Value is too large to store in a PrimitiveValue: {Value}"); + } + + /// + /// Returns a PrimitiveValue containing as an integer of width. + /// If cannot be represented in bytes, an exception is thrown. + /// + public PrimitiveValue GetValue(bool signed, int size) { + if (signed) { + if (size == 1) { + if (Value < sbyte.MinValue || Value > sbyte.MaxValue) { + throw new HasmParserException(this, $"integer is not sbyte: {Value}"); + } + return new PrimitiveValue((sbyte)Value); + } else if (size == 2) { + if (Value < short.MinValue || Value > short.MaxValue) { + throw new HasmParserException(this, $"integer is not short: {Value}"); + } + return new PrimitiveValue((short)Value); + } else if (size == 4) { + if (Value < int.MinValue || Value > int.MaxValue) { + throw new HasmParserException(this, $"integer is not int: {Value}"); + } + return new PrimitiveValue((int)Value); + } + } else { + if (size == 1) { + if (Value < byte.MinValue || Value > byte.MaxValue) { + throw new HasmParserException(this, $"integer is not byte: {Value}"); + } + return new PrimitiveValue((byte)Value); + } else if (size == 2) { + if (Value < ushort.MinValue || Value > ushort.MaxValue) { + throw new HasmParserException(this, $"integer is not ushort: {Value}"); + } + return new PrimitiveValue((ushort)Value); + } else if (size == 4) { + if (Value < uint.MinValue || Value > uint.MaxValue) { + throw new HasmParserException(this, $"integer is not int: {Value}"); + } + return new PrimitiveValue((uint)Value); + } + } + + throw new HasmParserException(this, $"invalid integer size: {size}"); + } + + /// + /// Returns the value as a 4-byte unsigned integer; throws an exception if the value is not in bounds. + /// + public uint GetValueAsUInt32() { + if (Value < uint.MinValue || Value > uint.MaxValue) { + throw new HasmParserException(this, $"integer is not uint: {Value}"); + } + return (uint)Value; + } + + /// + /// Returns the value as a 4-byte signed integer; throws an exception if the value is not in bounds. + /// + public int GetValueAsInt32() { + if (Value < int.MinValue || Value > int.MaxValue) { + throw new HasmParserException(this, $"integer is not int: {Value}"); + } + return (int)Value; + } + + public HasmIntegerToken(HasmStringStreamState state, long value) : base(state) { + Value = value; + } + } +} diff --git a/hasmer/libhasmer/Assembler/Parser/HasmLabelToken.cs b/hasmer/libhasmer/Assembler/Parser/HasmLabelToken.cs new file mode 100644 index 0000000..a2a2c15 --- /dev/null +++ b/hasmer/libhasmer/Assembler/Parser/HasmLabelToken.cs @@ -0,0 +1,46 @@ +namespace Hasmer.Assembler.Parser { + /// + /// Represents the type of a Hasm label. + /// + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.StringEnumConverter))] + public enum HasmLabelKind { + /// + /// A reference or declaration in the array buffer. + /// + ArrayBuffer = 'A', + /// + /// A reference or declaration in the object key buffer. + /// + ObjectKeyBuffer = 'K', + /// + /// A reference or declaration in the object value buffer. + /// + ObjectValueBuffer = 'V', + /// + /// A reference or declaration of an offset of code in a function's body, used for jump instructions. + /// + CodeLabel = 'L' + } + + /// + /// Represents a label definition or reference. + /// + public class HasmLabelToken : HasmToken { + /// + /// The type of the label, e.g. label = "L5", LabelType = 'L' + /// + public HasmLabelKind Kind { get; set; } + + /// + /// The index of the label, e.g. label = "L5", LabelIndex = 5 + /// + public HasmIntegerToken Index { get; set; } + + /// + /// The offset after the label, used in label references. Example: label reference = "L5-6", Offset = -6 + /// + public HasmIntegerToken ReferenceOffset { get; set; } + + public HasmLabelToken(HasmStringStreamState state) : base(state) { } + } +} diff --git a/hasmer/libhasmer/Assembler/Parser/HasmNumberToken.cs b/hasmer/libhasmer/Assembler/Parser/HasmNumberToken.cs new file mode 100644 index 0000000..3b85978 --- /dev/null +++ b/hasmer/libhasmer/Assembler/Parser/HasmNumberToken.cs @@ -0,0 +1,21 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Hasmer.Assembler.Parser { + /// + /// Represents an 8-byte IEEE754 floating-point value. + /// + /// This is directly equivalent to the "number" type in JavaScript. + /// + public class HasmNumberToken : HasmLiteralToken { + /// + /// The parsed value. + /// + public double Value { get; set; } + + public HasmNumberToken(HasmStringStreamState state) : base(state) { } + } +} diff --git a/hasmer/libhasmer/Assembler/Parser/HasmOperandParser.cs.old b/hasmer/libhasmer/Assembler/Parser/HasmOperandParser.cs.old new file mode 100644 index 0000000..ed2d8c2 --- /dev/null +++ b/hasmer/libhasmer/Assembler/Parser/HasmOperandParser.cs.old @@ -0,0 +1,88 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Hasmer.Assembler.Parser { + /// + /// Parses a Hasm instruction's operand. + /// + public class HasmOperandParser : IHasmTokenParser { + private HbcInstructionDefinition Instruction; + private int OperandIndex; + private HbcInstructionOperandType Type => Instruction.OperandTypes[OperandIndex]; + + public HasmOperandParser(HbcInstructionDefinition insn, int operand) { + Instruction = insn; + OperandIndex = operand; + } + + public bool CanParse(HasmReaderState asm) { + throw new NotImplementedException(); + } + + public HasmToken Parse(HasmReaderState asm) { + int state = asm.Stream.SaveState(); + if (Type == HbcInstructionOperandType.Reg8 || Type == HbcInstructionOperandType.Reg32) { + string reg = asm.Stream.PeekWord(); + if (reg == null || !reg.StartsWith("r") || reg.Length < 2) { + throw new HasmParserException(asm.Stream, "expecting register"); + } + if (!long.TryParse(reg.Substring(1), out long regIndex)) { + throw new HasmParserException(asm.Stream, "invalid register format"); + } + asm.Stream.AdvanceWord(); + + HasmIntegerToken token = new HasmIntegerToken(state, regIndex); + return new HasmOperandToken(state) { + OperandType = HasmOperandTokenType.Register, + Value = asm.IsExact ? token.GetValue(false, Type.GetSizeof()) : token.GetCompactValue(false), + }; + } else if (Type == HbcInstructionOperandType.Addr8 || Type == HbcInstructionOperandType.Addr32) { + HasmLabelToken labelToken = (HasmLabelToken)IHasmTokenParser.LabelParser.Parse(asm); + return new HasmOperandToken(state) { + OperandType = HasmOperandTokenType.Label, + Value = asm.IsExact ? labelToken.LabelIndex.GetValue(true, Type.GetSizeof()) : labelToken.LabelIndex.GetCompactValue(true), + }; + } else if (Type == HbcInstructionOperandType.UInt8 || Type == HbcInstructionOperandType.UInt16 || Type == HbcInstructionOperandType.UInt32 || Type == HbcInstructionOperandType.Imm32) { + if (OperandIndex == 3 && (Instruction.Name == "NewArrayWithBuffer" || Instruction.Name == "NewArrayWithBufferLong")) { + HasmLabelToken labelToken = (HasmLabelToken)IHasmTokenParser.LabelParser.Parse(asm); + return new HasmOperandToken(state) { + OperandType = HasmOperandTokenType.Label, + Value = asm.IsExact ? labelToken.LabelIndex.GetValue(false, Type.GetSizeof()) : labelToken.LabelIndex.GetCompactValue(false), + }; + } + + HasmIntegerToken intToken = (HasmIntegerToken)IHasmTokenParser.IntegerParser.Parse(asm); + return new HasmOperandToken(state) { + OperandType = HasmOperandTokenType.UInt, + Value = asm.IsExact ? intToken.GetValue(false, Type.GetSizeof()) : intToken.GetCompactValue(false), + }; + } else if (Type == HbcInstructionOperandType.UInt8S || Type == HbcInstructionOperandType.UInt16S || Type == HbcInstructionOperandType.UInt32S) { + HasmToken token = IHasmTokenParser.StringParser.Parse(asm); + if (token is HasmStringToken s) { + return new HasmOperandToken(state) { + OperandType = HasmOperandTokenType.String, + Value = new PrimitiveValue(s.Value), + }; + } else if (token is HasmIdentifierToken i) { + return new HasmOperandToken(state) { + OperandType = HasmOperandTokenType.Identifier, + Value = new PrimitiveValue(i.Value), + }; + } else { + throw new Exception($"expecting a string literal or identifier, got {token.GetType().Name}"); + } + } else if (Type == HbcInstructionOperandType.Double) { + HasmNumberToken doubleToken = (HasmNumberToken)IHasmTokenParser.NumberParser.Parse(asm); + return new HasmOperandToken(state) { + OperandType = HasmOperandTokenType.Double, + Value = new PrimitiveValue(doubleToken.Value) + }; + } + + throw new NotImplementedException(Type.ToString()); + } + } +} diff --git a/hasmer/libhasmer/Assembler/Parser/HasmOperandToken.cs b/hasmer/libhasmer/Assembler/Parser/HasmOperandToken.cs new file mode 100644 index 0000000..845da98 --- /dev/null +++ b/hasmer/libhasmer/Assembler/Parser/HasmOperandToken.cs @@ -0,0 +1,30 @@ +using System; + +namespace Hasmer.Assembler.Parser { + /// + /// Represents a Hasm instruction's operand. + /// + public class HasmOperandToken : HasmToken { + /// + /// The type of the operand. + /// + public HasmOperandTokenType OperandType { get; set; } + + /// + /// If the operand represents a string, then its kind is returned (literal or identifier). + /// Otherwise, if this operand is something other than a string, an exception is thrown. + /// + public StringKind OperandStringKind => OperandType switch { + HasmOperandTokenType.String => StringKind.Literal, + HasmOperandTokenType.Identifier => StringKind.Identifier, + _ => throw new Exception("operand is not a string") + }; + + /// + /// The value represented by the operand. + /// + public PrimitiveValue Value { get; set; } + + public HasmOperandToken(HasmStringStreamState? state) : base(state) { } + } +} diff --git a/hasmer/libhasmer/Assembler/Parser/HasmOperandTokenType.cs b/hasmer/libhasmer/Assembler/Parser/HasmOperandTokenType.cs new file mode 100644 index 0000000..e642e8a --- /dev/null +++ b/hasmer/libhasmer/Assembler/Parser/HasmOperandTokenType.cs @@ -0,0 +1,36 @@ +namespace Hasmer.Assembler.Parser { + /// + /// The type of the operand. + /// + public enum HasmOperandTokenType { + /// + /// The operand is a register reference. + /// + Register, + + /// + /// The operand is a code label reference. + /// + Label, + + /// + /// The operand is an unsigned integer. + /// + UInt, + + /// + /// The operand is a string literal. + /// + String, + + /// + /// The operand is an identifier. + /// + Identifier, + + /// + /// The operand is an eight-byte IEEE754 float-point number. + /// + Double + } +} diff --git a/hasmer/libhasmer/Assembler/Parser/HasmParserException.cs b/hasmer/libhasmer/Assembler/Parser/HasmParserException.cs index 8c61154..5d51920 100644 --- a/hasmer/libhasmer/Assembler/Parser/HasmParserException.cs +++ b/hasmer/libhasmer/Assembler/Parser/HasmParserException.cs @@ -34,20 +34,29 @@ public HasmParserException(HasmStringStream stream, string message) { } /// - /// Creates a new HasmParserException given the current stream and an exception. + /// Creates a new HasmParserException given a token and a message. /// - public HasmParserException(HasmStringStream stream, Exception e) : base(e.Message, e) { - Line = stream.CurrentLine + 1; - Column = stream.CurrentColumn + 1; + public HasmParserException(HasmToken token, string message) { + Line = token.Line + 1; + Column = token.Column + 1; + ErrorMessage = message; } /// - /// Creates a new HasmParserException given the line and column of the error as well as a message. + /// Creates a new HasmParserException given a token and a message. /// - public HasmParserException(int line, int col, string message) { - Line = line + 1; - Column = col + 1; + public HasmParserException(HasmStringStreamState state, string message) { + Line = state.Line + 1; + Column = state.Column + 1; ErrorMessage = message; } + + /// + /// Creates a new HasmParserException given the current stream and an exception. + /// + public HasmParserException(HasmStringStream stream, Exception e) : base(e.Message, e) { + Line = stream.CurrentLine + 1; + Column = stream.CurrentColumn + 1; + } } } diff --git a/hasmer/libhasmer/Assembler/Parser/HasmProgram.cs b/hasmer/libhasmer/Assembler/Parser/HasmProgram.cs new file mode 100644 index 0000000..0a631e7 --- /dev/null +++ b/hasmer/libhasmer/Assembler/Parser/HasmProgram.cs @@ -0,0 +1,9 @@ +using System.Collections.Generic; + +namespace Hasmer.Assembler.Parser { + public class HasmProgram { + public HasmHeader Header { get; set; } + public List Data { get; set; } + public List Functions { get; set; } + } +} diff --git a/hasmer/libhasmer/Assembler/Parser/HasmSimpleToken.cs b/hasmer/libhasmer/Assembler/Parser/HasmSimpleToken.cs new file mode 100644 index 0000000..2aec8e1 --- /dev/null +++ b/hasmer/libhasmer/Assembler/Parser/HasmSimpleToken.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Hasmer.Assembler.Parser { + /// + /// Represents a "simple" value, generally a constant identifier (e.g. "true" or "false"). + /// + public class HasmSimpleToken : HasmLiteralToken { + /// + /// The simple value. + /// + public string Value { get; set; } + + public HasmSimpleToken(HasmStringStreamState state) : base(state) { } + } +} diff --git a/hasmer/libhasmer/Assembler/Parser/HasmStringParser.cs b/hasmer/libhasmer/Assembler/Parser/HasmStringParser.cs index bf70977..e9d8c99 100644 --- a/hasmer/libhasmer/Assembler/Parser/HasmStringParser.cs +++ b/hasmer/libhasmer/Assembler/Parser/HasmStringParser.cs @@ -17,58 +17,130 @@ public class HasmStringToken : HasmLiteralToken { public HasmStringToken(HasmStringStreamState state) : base(state) { } } + /// + /// Represents an identifier. + /// + public class HasmIdentifierToken : HasmLiteralToken { + /// + /// The name of the identifier, without the angled brackets. + /// + public string Value { get; set; } + + public HasmIdentifierToken(HasmStringStreamState state) : base(state) { } + } + /// /// Parses an escaped string surrounded by double quotes. /// public class HasmStringParser : IHasmTokenParser { - public bool CanParse(HasmReaderState asm) { - string op = asm.Stream.PeekCharacters(1); - if (op != "\"") { - return false; + enum ParserState { + Normal, + Escape + } + + private HasmLiteralToken TryParse(HasmReaderState asm) { + HasmStringStreamWhitespaceMode prevMode = asm.Stream.WhitespaceMode; + asm.Stream.WhitespaceMode = HasmStringStreamWhitespaceMode.Keep; + + char c = asm.Stream.PeekChar(); + if (c == '\0' || c != '"' && c != '<') { + return null; } + HasmStringStreamState streamState = asm.Stream.SaveState(); + asm.Stream.Advance(1); - HasmStringStreamState state = asm.Stream.SaveState(); - asm.Stream.AdvanceCharacters(1); + StringBuilder res = new StringBuilder(); + ParserState parserState = ParserState.Normal; + if (c == '"') { + while ((c = asm.Stream.AdvanceChar()) != '\0') { + if (parserState == ParserState.Normal) { + if (c == '"') { + asm.Stream.WhitespaceMode = prevMode; + return new HasmStringToken(streamState) { + Value = res.ToString(), + }; + } else if (c == '\\') { + parserState = ParserState.Escape; + } else { + res.Append(c); + } + } else if (parserState == ParserState.Escape) { + char m; + switch (c) { + case '"': m = '"'; break; + case '\\': m = '\\'; break; + case '0': m = '\0'; break; + case 'a': m = '\a'; break; + case 'b': m = '\b'; break; + case 'f': m = '\f'; break; + case 'n': m = '\n'; break; + case 'r': m = '\r'; break; + case 't': m = '\t'; break; + case 'v': m = '\v'; break; + case 'u': + string hex = asm.Stream.AdvanceCharacters(4); + if (hex == null) { + asm.Stream.WhitespaceMode = prevMode; + return null; + } + m = (char)Convert.ToInt32(hex, 16); + break; + default: + throw new Exception($"invalid string escape code: \\{c}"); + } + + parserState = ParserState.Normal; + res.Append(m); + } + } + } else if (c == '<') { + while ((c = asm.Stream.AdvanceChar()) != '\0') { + if (parserState == ParserState.Normal) { + if (c == '>') { + asm.Stream.WhitespaceMode = prevMode; + return new HasmIdentifierToken(streamState) { + Value = res.ToString(), + }; + } else if (c == '\\') { + parserState = ParserState.Escape; + } else { + res.Append(c); + } + } else if (parserState == ParserState.Escape) { + char m; + switch (c) { + case '<': m = '<'; break; + case '>': m = '>'; break; + case '\\': m = '\\'; break; + default: + throw new Exception($"invalid identifier escape code: \\{c}"); + } - char lastChar = '\0'; - while (asm.Stream.PeekCharacters(1) != null) { - string character = asm.Stream.AdvanceCharacters(1); - if (character == "\"" && lastChar != '\\') { - asm.Stream.LoadState(state); - return true; + parserState = ParserState.Normal; + res.Append(m); + } } - lastChar = character[0]; } + asm.Stream.WhitespaceMode = prevMode; + return null; + } + + public bool CanParse(HasmReaderState asm) { + HasmStringStreamState state = asm.Stream.SaveState(); + HasmLiteralToken s = TryParse(asm); asm.Stream.LoadState(state); - return false; + return s != null; } public HasmToken Parse(HasmReaderState asm) { - if (!CanParse(asm)) { - throw new HasmParserException(asm.Stream, "invalid string"); - } - HasmStringStreamState state = asm.Stream.SaveState(); - asm.Stream.AdvanceCharacters(1); // skip first double quote - - asm.Stream.WhitespaceMode = HasmStringStreamWhitespaceMode.Keep; - StringBuilder builder = new StringBuilder(); - char lastChar = '\0'; - while (asm.Stream.PeekCharacters(1) != null) { - string character = asm.Stream.AdvanceCharacters(1); - if (character == "\"" && lastChar != '\\') { - break; - } - builder.Append(character); - lastChar = character[0]; + HasmLiteralToken s = TryParse(asm); + if (s == null) { + throw new HasmParserException(asm.Stream, "invalid string literal or identifier"); } - asm.Stream.WhitespaceMode = HasmStringStreamWhitespaceMode.Remove; - string toString = builder.ToString(); - return new HasmStringToken(state) { - Value = toString - }; + return s; } } } diff --git a/hasmer/libhasmer/Assembler/Parser/HasmStringStream.cs b/hasmer/libhasmer/Assembler/Parser/HasmStringStream.cs index 0f6d648..9a4b127 100644 --- a/hasmer/libhasmer/Assembler/Parser/HasmStringStream.cs +++ b/hasmer/libhasmer/Assembler/Parser/HasmStringStream.cs @@ -1,22 +1,14 @@ -using System; +using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Hasmer.Assembler.Parser { - /// - /// Represents the state of a . - /// public struct HasmStringStreamState { - /// - /// The line the stream was on. - /// - public int CurrentLine { get; set; } - /// - /// The column the stream was on. - /// - public int CurrentColumn { get; set; } + public int Offset { get; set; } + public int Line { get; set; } + public int Column { get; set; } } /// @@ -40,93 +32,114 @@ public class HasmStringStream { /// /// The characters that are valid in a word, returned by . /// - private const string WordCharacters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_"; + private const string WordCharacters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_$"; + /// /// The valid characters for operators, returned by /// private const string OperatorCharacters = "<>[]()+-/*{},."; /// - /// The current line of the file the stream is on. + /// The current offset of the file the stream is currently at. /// - public int CurrentLine { get; set; } - /// - /// The current column of the current line of the file the stream is on. - /// - public int CurrentColumn { get; set; } - /// + public int Cursor { get; set; } + + public int CurrentLine { + get { + if (Cursor == 0) { + return 0; + } + + // returns the amount of new lines between the start and the cursor + string s = Source.Substring(0, Cursor); + return s.Count(c => c == '\n'); + } + } + + public int CurrentColumn { + get { + if (Cursor == 0) { + return 0; + } + + // returns the amount of characters between the cursor and the last new line + int i = Source.LastIndexOf('\n', Cursor); + return Cursor - i; + } + } + /// Contains each individual line of the Hasm file. /// - public string[] Lines { get; set; } + public string Source { get; set; } + /// /// The method that the stream should use to treat whitespace. /// public HasmStringStreamWhitespaceMode WhitespaceMode { get; set; } - /// - /// The content of the current line, starting at the current column and ending at the end of the line. - /// - private string CurrentContent => Lines[CurrentLine].Substring(CurrentColumn); - /// /// true if the stream is finished (i.e. all data has been read from it), otherwise false. /// - public bool IsFinished => CurrentLine == Lines.Length; + public bool IsFinished => Cursor == Source.Length; /// /// Returns a new HasmStringStream given the raw Hasm assembly. /// public HasmStringStream(string hasm) { - string lineSeparator = hasm.Contains("\r\n") ? "\r\n" : "\n"; - Lines = hasm.Split(lineSeparator).ToArray(); + Source = hasm; WhitespaceMode = HasmStringStreamWhitespaceMode.Remove; } /// - /// Returns *length* characters of the . - ///
- /// If the requested length is the beyond the amount of characters in the CurrentContent, null is returned. - ///
- /// If the stream is finished, an exception is thrown. + /// Returns *length* characters of the starting at the . + /// If the requested length is the beyond the amount of characters in the Source, null is returned. ///
- private string Peek(int length) { - if (IsFinished) { - throw new Exception("asm.Stream is finished"); - } - if (length > CurrentContent.Length) { + public string Peek(int length) { + SkipWhitespace(); + + int r = Cursor + length; + if (r < 0 || r > Source.Length) { return null; } - return CurrentContent.Substring(0, length); + return Source.Substring(Cursor, length); + } + + public char PeekChar() { + SkipWhitespace(); + + if (IsFinished) { + return '\0'; + } + return Source[Cursor]; } /// - /// Skips all whitespace starting at the current column until there is a character which is not whitespace. - ///
- /// This will not advance the stream to another line. + /// Skips all whitespace until there is a character which is not whitespace or the end of the input. ///
public void SkipWhitespace() { if (WhitespaceMode == HasmStringStreamWhitespaceMode.Remove) { - while (Peek(1) == " ") { - Advance(1); + while (!IsFinished) { + char c = Source[Cursor]; + if (c == '\0') { + break; + } + if (!char.IsWhiteSpace(c)) { + break; + } + Cursor++; } } } - /// - /// Peeks *length* arbitray characters from the stream. - /// - public string PeekCharacters(int length) { - SkipWhitespace(); - return Peek(length); - } - /// /// Advances the stream by *length* characters. /// public string AdvanceCharacters(int length) { - string chars = PeekCharacters(length); + string chars = Peek(length); + if (chars == null) { + return null; + } Advance(chars.Length); - SkipWhitespace(); return chars; } @@ -135,29 +148,41 @@ public string AdvanceCharacters(int length) { ///
/// If the stream has ended, or the operator is not contained within , null is returned. ///
- public string PeekOperator() { - SkipWhitespace(); - string peeked = Peek(1); - if (peeked == null) { - return null; + public char PeekOperator() { + char peeked = PeekChar(); + if (peeked == '\0') { + return '\0'; } if (!OperatorCharacters.Contains(peeked)) { - return null; + return '\0'; } - SkipWhitespace(); return peeked; } /// /// Advances the stream beyond the current operator. /// - public string AdvanceOperator() { - string op = PeekOperator(); - Advance(op.Length); - SkipWhitespace(); + public char AdvanceOperator() { + char op = PeekOperator(); + if (op == '\0') { + return '\0'; + } + AdvanceChar(); return op; } + /// + /// Advances the stream beyond the current character. + /// + public char AdvanceChar() { + char c = PeekChar(); + if (c == '\0') { + return '\0'; + } + Advance(1); + return c; + } + /// /// Peeks a word. /// A "word" is defined as an arbitrary length of characters, read until either the end of the current line or the presence of a character that is not contained by . @@ -178,21 +203,31 @@ public string AdvanceOperator() { /// /// public string PeekWord() { - SkipWhitespace(); + int cursor = Cursor; + HasmStringStreamWhitespaceMode wm = WhitespaceMode; + + WhitespaceMode = HasmStringStreamWhitespaceMode.Keep; + + StringBuilder builder = new StringBuilder(); for (int i = 1; ; i++) { - string peeked = Peek(i); - if (peeked == null) { // end of line, return token - return Peek(i - 1); + char peeked = AdvanceChar(); + if (peeked == '\0') { // end of input, return token + break; } - if (!WordCharacters.Contains(peeked[peeked.Length - 1])) { - string word = peeked.Substring(0, peeked.Length - 1); - if (word == "") { - return null; - } - SkipWhitespace(); - return word; + if (!WordCharacters.Contains(peeked)) { // end of word, return token + break; } + builder.Append(peeked); } + + Cursor = cursor; + WhitespaceMode = wm; + + string word = builder.ToString(); + if (word == "") { + return null; + } + return word; } /// @@ -201,8 +236,10 @@ public string PeekWord() { /// the word that was read public string AdvanceWord() { string word = PeekWord(); + if (word == null) { + return null; + } Advance(word.Length); - SkipWhitespace(); return word; } @@ -214,17 +251,14 @@ public string AdvanceWord() { /// If length advances the stream to the end of the current line, the stream goes to the next line and sets the current column to zero. /// public void Advance(int length) { - if (IsFinished) { - throw new Exception("asm.Stream is finished"); - } - if (length > CurrentContent.Length) { - throw new Exception("cannot advance beyond line length"); - } - CurrentColumn += length; - if (CurrentColumn == Lines[CurrentLine].Length) { - CurrentLine++; - CurrentColumn = 0; + int r = Cursor + length; + if (r < 0 || r > Source.Length) { + throw new IndexOutOfRangeException($"new cursor position out of bounds: {r}"); } + + Cursor = r; + + SkipWhitespace(); } /// @@ -232,8 +266,9 @@ public void Advance(int length) { /// public HasmStringStreamState SaveState() { return new HasmStringStreamState { - CurrentLine = CurrentLine, - CurrentColumn = CurrentColumn + Offset = Cursor, + Line = CurrentLine, + Column = CurrentColumn, }; } @@ -241,8 +276,11 @@ public HasmStringStreamState SaveState() { /// Sets the current state of the stream to *state*, which is generally used as the value returned by . ///
public void LoadState(HasmStringStreamState state) { - CurrentLine = state.CurrentLine; - CurrentColumn = state.CurrentColumn; + int cursor = state.Offset; + if (cursor < 0 || cursor > Source.Length) { + throw new IndexOutOfRangeException($"loaded cursor position out of bounds: {cursor}"); + } + Cursor = cursor; } } } diff --git a/hasmer/libhasmer/Assembler/Parser/HasmStringStream.cs.old b/hasmer/libhasmer/Assembler/Parser/HasmStringStream.cs.old new file mode 100644 index 0000000..0c78e23 --- /dev/null +++ b/hasmer/libhasmer/Assembler/Parser/HasmStringStream.cs.old @@ -0,0 +1,256 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Hasmer.Assembler.Parser { + /// + /// Represents the state of a . + /// + public struct int { + /// + /// The line the stream was on. + /// + public int CurrentLine { get; set; } + /// + /// The column the stream was on. + /// + public int CurrentColumn { get; set; } + } + + /// + /// Represents how the stream should treat whitespace. + /// + public enum HasmStringStreamWhitespaceMode { + /// + /// Removes all whitespace between tokens. + /// + Remove, + /// + /// Keeps all whitespace between tokens. + /// + Keep + } + + /// + /// Represents a stream that parses a Hasm assembly file. + /// + public class HasmStringStream { + /// + /// The characters that are valid in a word, returned by . + /// + private const string WordCharacters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_$"; + /// + /// The valid characters for operators, returned by + /// + private const string OperatorCharacters = "<>[]()+-/*{},."; + + /// + /// The current line of the file the stream is on. + /// + public int CurrentLine { get; set; } + /// + /// The current column of the current line of the file the stream is on. + /// + public int CurrentColumn { get; set; } + /// + /// Contains each individual line of the Hasm file. + /// + public string[] Lines { get; set; } + /// + /// The method that the stream should use to treat whitespace. + /// + public HasmStringStreamWhitespaceMode WhitespaceMode { get; set; } + + /// + /// The content of the current line, starting at the current column and ending at the end of the line. + /// + private string CurrentContent => Lines[CurrentLine].Substring(CurrentColumn); + + /// + /// true if the stream is finished (i.e. all data has been read from it), otherwise false. + /// + public bool IsFinished => CurrentLine == Lines.Length; + + /// + /// Returns a new HasmStringStream given the raw Hasm assembly. + /// + public HasmStringStream(string hasm) { + Lines = hasm.Split("\n").ToArray(); + WhitespaceMode = HasmStringStreamWhitespaceMode.Remove; + } + + /// + /// Returns *length* characters of the . + ///
+ /// If the requested length is the beyond the amount of characters in the CurrentContent, null is returned. + ///
+ /// If the stream is finished, an exception is thrown. + ///
+ private string Peek(int length) { + if (IsFinished) { + throw new Exception("asm.Stream is finished"); + } + if (length > CurrentContent.Length) { + return null; + } + return CurrentContent.Substring(0, length); + } + + /// + /// Skips all whitespace starting at the current column until there is a character which is not whitespace. + ///
+ /// This will not advance the stream to another line. + ///
+ public void SkipWhitespace() { + if (WhitespaceMode == HasmStringStreamWhitespaceMode.Remove) { + while (Peek(1) == " ") { + Advance(1); + } + } + } + + /// + /// Peeks *length* arbitray characters from the stream. + /// + public string PeekCharacters(int length) { + SkipWhitespace(); + return Peek(length); + } + + /// + /// Advances the stream by *length* characters. + /// + public string AdvanceCharacters(int length) { + string chars = PeekCharacters(length); + if (chars == null) { + return null; + } + Advance(chars.Length); + SkipWhitespace(); + return chars; + } + + /// + /// Peeks a single-character operator from the stream. + ///
+ /// If the stream has ended, or the operator is not contained within , null is returned. + ///
+ public string PeekOperator() { + SkipWhitespace(); + string peeked = Peek(1); + if (peeked == null) { + return null; + } + if (!OperatorCharacters.Contains(peeked)) { + return null; + } + SkipWhitespace(); + return peeked; + } + + /// + /// Advances the stream beyond the current operator. + /// + public string AdvanceOperator() { + string op = PeekOperator(); + if (op == null) { + return null; + } + Advance(op.Length); + SkipWhitespace(); + return op; + } + + /// + /// Peeks a word. + /// A "word" is defined as an arbitrary length of characters, read until either the end of the current line or the presence of a character that is not contained by . + /// + /// + /// line = "hello my na[jeff]me is"
+ /// AdvanceWord() = hello
+ /// AdvanceWord() = my
+ /// AdvanceWord() = na
+ /// AdvanceOperator() // skip the [
+ /// AdvanceWord() = jeff
+ /// AdvanceOperator() // skip the ]
+ /// AdvanceWord() = me
+ /// AdvanceWord() = is + ///
+ ///
+ /// + ///
+ ///
+ public string PeekWord() { + SkipWhitespace(); + for (int i = 1; ; i++) { + string peeked = Peek(i); + if (peeked == null) { // end of line, return token + return Peek(i - 1); + } + if (!WordCharacters.Contains(peeked[peeked.Length - 1])) { + string word = peeked.Substring(0, peeked.Length - 1); + if (word == "") { + return null; + } + SkipWhitespace(); + return word; + } + } + } + + /// + /// Advances the stream beyond the current word. + /// + /// the word that was read + public string AdvanceWord() { + string word = PeekWord(); + if (word == null) { + return null; + } + Advance(word.Length); + SkipWhitespace(); + return word; + } + + /// + /// Advances the stream by *length* characters. + /// + /// length cannot be greater than the length of the . + /// + /// If length advances the stream to the end of the current line, the stream goes to the next line and sets the current column to zero. + /// + public void Advance(int length) { + if (IsFinished) { + throw new Exception("asm.Stream is finished"); + } + if (length > CurrentContent.Length) { + throw new Exception("cannot advance beyond line length"); + } + CurrentColumn += length; + if (CurrentColumn == Lines[CurrentLine].Length) { + CurrentLine++; + CurrentColumn = 0; + } + } + + /// + /// Gets the current state of the stream. + /// + public int SaveState() { + return new int { + CurrentLine = CurrentLine, + CurrentColumn = CurrentColumn + }; + } + + /// + /// Sets the current state of the stream to *state*, which is generally used as the value returned by . + /// + public void LoadState(int state) { + CurrentLine = state.CurrentLine; + CurrentColumn = state.CurrentColumn; + } + } +} diff --git a/hasmer/libhasmer/Assembler/Parser/HasmToken.cs b/hasmer/libhasmer/Assembler/Parser/HasmToken.cs index 9cc59aa..5c31585 100644 --- a/hasmer/libhasmer/Assembler/Parser/HasmToken.cs +++ b/hasmer/libhasmer/Assembler/Parser/HasmToken.cs @@ -12,42 +12,33 @@ namespace Hasmer.Assembler.Parser { /// public class HasmToken { /// - /// The line of the file that the token is on. This is zero-indexed, i.e. the first line (Line = 0), the second line (Line = 1), etc. + /// The offset in characters from the start of the file. /// [JsonIgnore] + public int Offset { get; set; } + public int Line { get; set; } - /// - /// The column of the line of the file that the token is on. This is zero-indexed, i.e. the first column (Column = 0), the second column (Column = 1), etc. - /// - [JsonIgnore] public int Column { get; set; } -#pragma warning disable IDE0051 // Remove unused private members - /// - /// Gets the type of the token (the class name of the implementation) as information when JSON serializing the token (used for debug). - /// - [JsonProperty("TokenType")] - private string JsonTokenType => GetType().Name; - - /// - /// Gets the line of the token (except 1-indexed) as information when JSON serializing the token (used for debug). - /// - [JsonProperty("Line")] - private int JsonLine => Line + 1; - - /// - /// Gets the column of the token (except 1-indexed) as information when JSON serializing the token (used for debug). - /// - [JsonProperty("Column")] - private int JsonColumn => Column + 1; -#pragma warning restore IDE0051 // Remove unused private members - /// /// Creates a new HasmToken from the given state. This does not parse anything. /// - public HasmToken(HasmStringStreamState state) { - Line = state.CurrentLine; - Column = state.CurrentColumn; + public HasmToken(HasmStringStreamState? state) { + if (state == null) { + return; + } + HasmStringStreamState s = state.Value; + Offset = s.Offset; + Line = s.Line; + Column = s.Column; + } + + public HasmStringStreamState AsStreamState() { + return new HasmStringStreamState{ + Offset = Offset, + Line = Line, + Column = Column, + }; } /// diff --git a/hasmer/libhasmer/Assembler/Parser/HasmTokenStream.cs.old b/hasmer/libhasmer/Assembler/Parser/HasmTokenStream.cs.old new file mode 100644 index 0000000..a681578 --- /dev/null +++ b/hasmer/libhasmer/Assembler/Parser/HasmTokenStream.cs.old @@ -0,0 +1,95 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Hasmer.Assembler.Parser { + /// + /// Represents a stream of Hasm tokens parsed from a Hasm file. + /// + public class HasmTokenStream { + /// + /// The current state of the reader. + /// + public HasmReaderState State { get; set; } + + /// + /// Creates a new HasmTokenStream from raw Hasm assembly. + /// + public HasmTokenStream(string hasm) { + State = new HasmReaderState { + Stream = new HasmStringStream(hasm) + }; + } + + /// + /// Creates a new HasmTokenStream from an existing state. + /// + public HasmTokenStream(HasmReaderState state) { + State = state; + } + + /// + /// Gets an enumerator returning each next token, parsed from the Hasm file. + /// + public IEnumerable ReadTokens() { + while (!State.Stream.IsFinished) { + if (State.Stream.Lines[State.Stream.CurrentLine].Trim() == "") { + State.Stream.CurrentLine++; + continue; + } + + State.Stream.SkipWhitespace(); + + List tokenParsers = new List { + IHasmTokenParser.DeclarationParser, + IHasmTokenParser.CommentParser + }; + if (State.CurrentFunction != null) { + tokenParsers.Add(IHasmTokenParser.InstructionParser); + } + + bool parsed = false; + foreach (IHasmTokenParser parser in tokenParsers) { + int state = State.Stream.SaveState(); + if (parser.CanParse(State)) { + State.Stream.LoadState(state); + HasmToken token; + try { + token = parser.Parse(State); + } catch (HasmParserException) { + throw; + } catch (Exception e) { + throw new HasmParserException(State.Stream, e); + } + if (token != null) { // tokens like comments can return null, just ignore them + yield return token; + } + + if (State.BytecodeFormat == null) { + if (token is HasmHeaderDeclarationToken header) { + uint value = header.Version.GetValueAsUInt32(); + State.BytecodeFormat = ResourceManager.ReadEmbeddedResource($"Bytecode{value}"); + State.IsExact = header.IsExact; + } else { + throw new HasmParserException(State.Stream, "expecting '.hasm' declaration"); + } + } + + parsed = true; + break; + } else { + State.Stream.LoadState(state); + } + } + + State.Stream.SkipWhitespace(); + + if (!parsed) { + throw new HasmParserException(State.Stream, "invalid statement"); + } + } + } + } +} diff --git a/hasmer/libhasmer/Assembler/Parser/HasmTokenizer.cs b/hasmer/libhasmer/Assembler/Parser/HasmTokenizer.cs new file mode 100644 index 0000000..b527114 --- /dev/null +++ b/hasmer/libhasmer/Assembler/Parser/HasmTokenizer.cs @@ -0,0 +1,685 @@ +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace Hasmer.Assembler.Parser { + enum StringParserState { + Normal, + Escape + } + + public class TokenDefinition { + [JsonProperty] + public string Kind { get; set; } + + [JsonProperty] + public dynamic Match { get; set; } + + [JsonProperty] + public string Var { get; set; } + + [JsonProperty] + public string Modifier { get; set; } + + [JsonProperty] + public bool Repeated { get; set; } + + [JsonProperty] + public bool Optional { get; set; } + } + + public class TokenizerState { + public HasmStringStream Stream { get; set; } + + public Dictionary> Vars { get; set; } + public bool Moved { get; set; } + public HasmStringStreamWhitespaceMode WhitespaceMode { get; set; } + + public void AddVar(string name, TokenMatch token) { + if (Vars.TryGetValue(name, out List l)) { + l.Add(token); + } else { + l = new List(1); + l.Add(token); + Vars[name] = l; + } + } + + public TokenizerState Derive() { + return new TokenizerState { + WhitespaceMode = HasmStringStreamWhitespaceMode.Remove, + Stream = Stream, + Vars = new Dictionary>(), + Moved = false, + }; + } + } + + public class TokenMatch { + public object Value; + + public TokenMatch(Dictionary> matches) { + Value = matches; + } + + public TokenMatch(HasmToken token) { + Value = token; + } + + public Dictionary> AsToken() { + return (Dictionary>) Value; + } + + public HasmIntegerToken AsInteger() { + return (HasmIntegerToken) Value; + } + + public HasmStringToken AsString() { + return (HasmStringToken) Value; + } + + public HasmSimpleToken AsSimple() { + return (HasmSimpleToken) Value; + } + } + + public enum TokenizerResultKind { + TokenMatch, + EmptyMatch, + FailedMatch + } + + public struct TokenizerResult { + public TokenizerResultKind Kind { get; set; } + public TokenMatch Token { get; set; } + + public static TokenizerResult Matched(HasmToken token) { + return new TokenizerResult { + Kind = TokenizerResultKind.TokenMatch, + Token = new TokenMatch(token), + }; + } + + public static TokenizerResult Empty { + get { + return new TokenizerResult { + Kind = TokenizerResultKind.EmptyMatch + }; + } + } + + public static TokenizerResult Failed { + get { + return new TokenizerResult { + Kind = TokenizerResultKind.FailedMatch + }; + } + } + } + + public delegate TokenizerResult Tokenizer(TokenizerState state); + + public class HasmTokenizer { + private List ParseStack = new List(); + private Dictionary Tokenizers = new Dictionary(); + + private string ParseStackText => string.Join(" -> ", ParseStack); + + public HasmTokenizer() : this(ResourceManager.ReadEmbeddedResource>>("HasmTokenDefinitions")) { } + + public HasmTokenizer(Dictionary> defsMap) { + foreach (KeyValuePair> pair in defsMap) { + string name = pair.Key; + IEnumerable defs = pair.Value; + + Tokenizers[name] = CreateMultiTokenParser(defs.Select(CreateFullParser).ToList()); + } + } + + private HasmHeader TokenizeHeader(TokenMatch match) { + Dictionary> vars = match.AsToken(); + HasmIntegerToken version = vars["version"][0].AsInteger(); + HasmSimpleToken mode = vars["mode"][0].AsSimple(); + + bool isExact; + if (mode.Value == "auto") { + isExact = false; + } else if (mode.Value == "exact") { + isExact = true; + } else { + throw new HasmParserException(mode, "invalid mode; expecting either 'auto' or 'exact'"); + } + + return new HasmHeader { + Version = version, + IsExact = isExact, + }; + } + + private HasmLabelToken TokenizeLabel(TokenMatch match) { + Dictionary> vars = match.AsToken(); + HasmSimpleToken kind = vars["kind"][0].AsSimple(); + HasmLabelKind label = kind.Value switch { + "A" => HasmLabelKind.ArrayBuffer, + "K" => HasmLabelKind.ObjectKeyBuffer, + "V" => HasmLabelKind.ObjectValueBuffer, + "L" => HasmLabelKind.CodeLabel, + _ => throw new HasmParserException(kind, "invalid label type; expecting 'A', 'K', 'V', or 'L'") + }; + HasmIntegerToken index = vars["index"][0].AsInteger(); + HasmIntegerToken offset = null; + if (vars.ContainsKey("offset")) { + offset = vars["offset"][0].AsInteger(); + } + + return new HasmLabelToken(kind.AsStreamState()) { + Kind = label, + Index = index, + ReferenceOffset = offset, + }; + } + + private HasmLiteralToken TokenizeLiteral(TokenMatch match) { + if (match.Value is Dictionary> vars) { + Console.WriteLine($"vars: {vars.Count}"); + foreach (KeyValuePair> entry in vars) { + Console.WriteLine($" {entry.Key} = {entry.Value}"); + } + } + if (match.Value is HasmLiteralToken lit) { + return lit; + } + throw new Exception($"invalid literal match value type: {match.Value.GetType().FullName}"); + } + + private HasmOperandToken TokenizeOperand(TokenMatch match) { + // if (match.Value is HasmStringToken str) { + // return new HasmOperandToken(str.AsStreamState()) { + // OperandType = HasmOperandTokenType.String, + // Value = new PrimitiveType(str.Value), + // }; + // } + // if (match.Value is HasmIdentifierToken ident) { + // return new HasmOperandToken(ident.AsStreamState()) { + // OperandType = HasmOperandTokenType.Identifier, + // Value = new PrimitiveType(ident.Value), + // }; + // } + // if (match.Value is HasmIntegerToken integer) { + // return new HasmOperandToken(ident.AsStreamState()) { + // OperandType = HasmOperandTokenType.UInt, + // Value = new PrimitiveType(integer.Value), + // }; + // } + // if (match.Value is Dictionary> vars) { + // if (vars.ContainsKey("reg")) { + + // } else { + // throw new Exception("invalid operand"); + // } + // } + throw new Exception($"invalid operand match value type: {match.Value.GetType().FullName}"); + } + + private HasmDataDeclaration TokenizeDataDeclaration(TokenMatch match) { + Dictionary> vars = match.AsToken(); + + HasmSimpleToken declToken = vars["decl"][0].AsSimple(); + HasmLabelToken label = TokenizeLabel(vars["label"][0]); + HasmSimpleToken kindToken = vars["kind"][0].AsSimple(); + + if (!vars.ContainsKey("length") && !vars.ContainsKey("elements")) { + throw new HasmParserException(declToken, $"expecting either data length or specified elements"); + } + + HasmDataDeclarationKind kind = kindToken.Value switch { + "String" => HasmDataDeclarationKind.String, + "Integer" => HasmDataDeclarationKind.Integer, + "Number" => HasmDataDeclarationKind.Number, + "Null" => HasmDataDeclarationKind.Null, + "True" => HasmDataDeclarationKind.True, + "False" => HasmDataDeclarationKind.False, + _ => throw new HasmParserException(kindToken, "invalid data kind") + }; + + bool isConstType = kind switch { + HasmDataDeclarationKind.Null or HasmDataDeclarationKind.True or HasmDataDeclarationKind.False => true, + _ => false + }; + if (isConstType && vars.ContainsKey("elements")) { + throw new HasmParserException(declToken, $"data declaration of kind {kindToken.Value} cannot have specified elements"); + } + if (!isConstType && vars.ContainsKey("length")) { + throw new HasmParserException(declToken, $"data declaration of kind {kindToken.Value} must have specified elements"); + } + + if (isConstType) { + HasmIntegerToken length = vars["length"][0].AsInteger(); + + return new HasmDataDeclaration { + Label = label, + Kind = kind, + Count = length.GetValueAsInt32(), + }; + } else { + List elements = vars["elements"].Select(TokenizeLiteral).ToList(); + + return new HasmDataDeclaration { + Label = label, + Kind = kind, + Count = elements.Count, + Elements = elements, + }; + } + } + + public HasmProgram TokenizeProgram(string input) { + TokenizerState state = new TokenizerState { + Stream = new HasmStringStream(input), + Vars = new Dictionary>(), + Moved = false, + WhitespaceMode = HasmStringStreamWhitespaceMode.Remove, + }; + + ParseStack.Add("Program"); + TokenizerResult res = Tokenizers["Program"](state); + ParseStack.RemoveAt(0); + if (res.Kind == TokenizerResultKind.FailedMatch) { + throw new Exception($"failed @ {state.Stream.CurrentLine},{state.Stream.CurrentColumn}"); + } + HasmHeader header = TokenizeHeader(state.Vars["header"][0]); + List data = state.Vars["data"].Select(TokenizeDataDeclaration).ToList(); + + return new HasmProgram { + Header = header, + Data = data, + }; + } + + private Tokenizer CreateMultiTokenParser(List parsers) { + return state => { + TokenizerResult res; + HasmStringStreamState sss = state.Stream.SaveState(); + foreach (Tokenizer parser in parsers) { + state.Stream.WhitespaceMode = state.WhitespaceMode; + Console.WriteLine($"{ParseStackText}: MultiToken parser moving to next"); + res = parser(state); + if (res.Kind == TokenizerResultKind.FailedMatch) { + Console.WriteLine($"{ParseStackText}: MultiTokenParser failed match (moved = {state.Moved})"); + if (state.Moved) { + throw new HasmParserException(sss, "fatal parser error"); + } + + state.Stream.LoadState(sss); + return TokenizerResult.Failed; + } + } + + return TokenizerResult.Empty; + }; + } + + private Tokenizer CreateFullParser(TokenDefinition def) { + Tokenizer inner = CreateCapturingParser(def); + if (def.Optional && def.Repeated) { + return state => { + while (true) { + HasmStringStreamState sss = state.Stream.SaveState(); + + Console.WriteLine($"{ParseStackText}: OptionalRepeated FullParser reading next"); + TokenizerResult res = inner(state); + Console.WriteLine($"{ParseStackText}: OptionalRepeated FullParser read {res.Kind}"); + if (res.Kind == TokenizerResultKind.FailedMatch) { + state.Stream.LoadState(sss); + break; + } + } + return TokenizerResult.Empty; + }; + } else if (def.Optional) { + return state => { + HasmStringStreamState sss = state.Stream.SaveState(); + + TokenizerResult res = inner(state); + if (res.Kind == TokenizerResultKind.FailedMatch) { + Console.WriteLine(ParseStackText + ": Optional FullParser failed to match (skipping)"); + state.Stream.LoadState(sss); + return TokenizerResult.Empty; + } + return res; + }; + } else if (def.Repeated) { + return state => { + TokenizerResult res = inner(state); + if (res.Kind == TokenizerResultKind.FailedMatch) { + Console.WriteLine(ParseStackText + ": Repeated FullParser failed to match initial"); + return TokenizerResult.Failed; + } + while (true) { + HasmStringStreamState sss = state.Stream.SaveState(); + + res = inner(state); + if (res.Kind == TokenizerResultKind.FailedMatch) { + Console.WriteLine(ParseStackText + ": Repeated FullParser stopped matching"); + state.Stream.LoadState(sss); + break; + } + } + return TokenizerResult.Empty; + }; + } else { + return inner; + } + } + + int offset = 0; + + private Tokenizer CreateCapturingParser(TokenDefinition def) { + Tokenizer inner = CreateSimpleParser(def); + return state => { + TokenizerResult res = inner(state); + if (res.Kind == TokenizerResultKind.TokenMatch && !string.IsNullOrEmpty(def.Var)) { + state.AddVar(def.Var, res.Token); + } + return res; + }; + } + + private Tokenizer CreateSimpleParser(TokenDefinition def) { + switch (def.Kind) { + case "literal": + string match = (string)def.Match; + return state => { + HasmStringStreamState sss = state.Stream.SaveState(); + + string take = state.Stream.AdvanceCharacters(match.Length); + if (take == null) { + return TokenizerResult.Failed; + } + if (match == take) { + return TokenizerResult.Matched(new HasmSimpleToken(sss) { + Value = take + }); + } else { + return TokenizerResult.Failed; + } + }; + case "string": + return state => { + HasmToken token = ParseStringLike(state); + if (token is HasmStringToken) { + return TokenizerResult.Matched(token); + } else { + return TokenizerResult.Failed; + } + }; + case "ident": + return state => { + HasmToken token = ParseStringLike(state); + if (token is HasmIdentifierToken) { + return TokenizerResult.Matched(token); + } else { + return TokenizerResult.Failed; + } + }; + case "word": + return state => { + HasmStringStreamState sss = state.Stream.SaveState(); + + string take = state.Stream.AdvanceWord(); + if (take == null) { + return TokenizerResult.Failed; + } + return TokenizerResult.Matched(new HasmSimpleToken(sss) { + Value = take + }); + }; + case "integer": + return state => { + HasmStringStreamState sss = state.Stream.SaveState(); + + long multiplier = 1; + char op = state.Stream.PeekOperator(); + if (op == '-') { // negative number + state.Stream.AdvanceOperator(); + multiplier = -1; + } else if (op == '+') { + state.Stream.AdvanceOperator(); + } else if (op != '\0') { + return TokenizerResult.Failed; + } + + string word = state.Stream.AdvanceWord(); + if (word == null) { + return TokenizerResult.Failed; + } + long parsed = long.Parse(word); + return TokenizerResult.Matched(new HasmIntegerToken(sss, parsed * multiplier)); + }; + case "number": + return state => { + HasmStringStreamState sss = state.Stream.SaveState(); + + double multiplier = 1.0; + char op = state.Stream.PeekOperator(); + if (op == '-') { // negative number + state.Stream.AdvanceOperator(); + multiplier = -1.0; + } else if (op == '+') { + state.Stream.AdvanceOperator(); + } else if (op != '\0') { + return TokenizerResult.Failed; + } + + string intPart = state.Stream.AdvanceWord(); + if (intPart == null) { + return TokenizerResult.Failed; + } + char separator = state.Stream.PeekOperator(); + HasmNumberToken token; + if (separator == '.') { // separator == ".", it's a fraction + state.Stream.AdvanceOperator(); + string fractionPart = state.Stream.AdvanceWord(); + if (fractionPart == null) { + return TokenizerResult.Failed; + } + token = new HasmNumberToken(sss) { + Value = double.Parse($"{intPart}.{fractionPart}") * multiplier + }; + } else { + if (intPart == "Infinity") { + token = new HasmNumberToken(sss) { + Value = multiplier == 1.0 ? double.PositiveInfinity : double.NegativeInfinity + }; + } else if (intPart == "NaN") { + token = new HasmNumberToken(sss) { + Value = double.NaN + }; + } else { + token = new HasmNumberToken(sss) { + Value = double.Parse(intPart) * multiplier + }; + } + } + + return TokenizerResult.Matched(token); + }; + case "enum": + JArray matchArr = (JArray)def.Match; + IEnumerable values = matchArr.Values(); + return state => { + HasmStringStreamState sss = state.Stream.SaveState(); + foreach (string value in values) { + state.Stream.LoadState(sss); + + string take = state.Stream.AdvanceCharacters(value.Length); + if (take == null) { + continue; + } + if (value == take) { + return TokenizerResult.Matched(new HasmSimpleToken(sss) { + Value = value + }); + } + } + + state.Stream.LoadState(sss); + return TokenizerResult.Failed; + }; + case "or": + JArray matches = (JArray)def.Match; + IEnumerable tokenizers = matches.ToObject>().Select(CreateFullParser); + return state => { + HasmStringStreamState sss = state.Stream.SaveState(); + foreach (Tokenizer tokenizer in tokenizers) { + state.Stream.LoadState(sss); + TokenizerResult res = tokenizer(state); + if (res.Kind != TokenizerResultKind.FailedMatch) { + return res; + } + } + + state.Stream.LoadState(sss); + return TokenizerResult.Failed; + }; + default: + if (def.Modifier != null) { + switch (def.Modifier) { + case "contiguous": + return state => { + state.WhitespaceMode = HasmStringStreamWhitespaceMode.Keep; + return TokenizerResult.Empty; + }; + case "move": + return state => { + state.Moved = true; + return TokenizerResult.Empty; + }; + default: + throw new Exception($"invalid modifier: {def.Modifier}"); + } + } + + if (def.Match is JArray matchArray) { + List tokens = matchArray.ToObject>(); + return CreateMultiTokenParser(tokens.Select(CreateFullParser).ToList()); + } + + if (def.Kind[0] == '$') { + Tokenizer tokenizer = Tokenizers[def.Kind[1..]]; + return state => { + ParseStack.Add(def.Kind[1..]); + TokenizerState derived = state.Derive(); + TokenizerResult res = tokenizer(derived); + if (res.Kind == TokenizerResultKind.FailedMatch) { + ParseStack.RemoveAt(ParseStack.Count - 1); + return res; + } + if (!string.IsNullOrEmpty(def.Var)) { + if (derived.Vars.Count > 0) { + state.AddVar(def.Var, new TokenMatch(derived.Vars)); + } else if (res.Token != null) { + state.AddVar(def.Var, res.Token); + } + } + ParseStack.RemoveAt(ParseStack.Count - 1); + return TokenizerResult.Empty; + }; + } else { + throw new Exception($"invalid token kind: {def.Kind}"); + } + } + } + + private static HasmLiteralToken ParseStringLike(TokenizerState state) { + HasmStringStreamWhitespaceMode prevMode = state.Stream.WhitespaceMode; + state.Stream.WhitespaceMode = HasmStringStreamWhitespaceMode.Keep; + + char c = state.Stream.PeekChar(); + if (c == '\0' || c != '"' && c != '<') { + return null; + } + HasmStringStreamState streamState = state.Stream.SaveState(); + state.Stream.Advance(1); + + StringBuilder res = new StringBuilder(); + StringParserState parserState = StringParserState.Normal; + if (c == '"') { + while ((c = state.Stream.AdvanceChar()) != '\0') { + if (parserState == StringParserState.Normal) { + if (c == '"') { + state.Stream.WhitespaceMode = prevMode; + return new HasmStringToken(streamState) { + Value = res.ToString(), + }; + } else if (c == '\\') { + parserState = StringParserState.Escape; + } else { + res.Append(c); + } + } else if (parserState == StringParserState.Escape) { + char m; + switch (c) { + case '"': m = '"'; break; + case '\\': m = '\\'; break; + case '0': m = '\0'; break; + case 'a': m = '\a'; break; + case 'b': m = '\b'; break; + case 'f': m = '\f'; break; + case 'n': m = '\n'; break; + case 'r': m = '\r'; break; + case 't': m = '\t'; break; + case 'v': m = '\v'; break; + case 'u': + string hex = state.Stream.AdvanceCharacters(4); + if (hex == null) { + state.Stream.WhitespaceMode = prevMode; + return null; + } + m = (char)Convert.ToInt32(hex, 16); + break; + default: + throw new Exception($"invalid string escape code: \\{c}"); + } + + parserState = StringParserState.Normal; + res.Append(m); + } + } + } else if (c == '<') { + while ((c = state.Stream.AdvanceChar()) != '\0') { + if (parserState == StringParserState.Normal) { + if (c == '>') { + state.Stream.WhitespaceMode = prevMode; + return new HasmIdentifierToken(streamState) { + Value = res.ToString(), + }; + } else if (c == '\\') { + parserState = StringParserState.Escape; + } else { + res.Append(c); + } + } else if (parserState == StringParserState.Escape) { + char m; + switch (c) { + case '<': m = '<'; break; + case '>': m = '>'; break; + case '\\': m = '\\'; break; + default: + throw new Exception($"invalid identifier escape code: \\{c}"); + } + + parserState = StringParserState.Normal; + res.Append(m); + } + } + } + + state.Stream.WhitespaceMode = prevMode; + return null; + } + } +} diff --git a/hasmer/libhasmer/Assembler/Parser/IHasmTokenParser.cs b/hasmer/libhasmer/Assembler/Parser/IHasmTokenParser.cs index 9e1ac06..9fac281 100644 --- a/hasmer/libhasmer/Assembler/Parser/IHasmTokenParser.cs +++ b/hasmer/libhasmer/Assembler/Parser/IHasmTokenParser.cs @@ -9,14 +9,6 @@ namespace Hasmer.Assembler.Parser { /// Represents a class which can parse Hasm tokens from a Hasm file. /// public interface IHasmTokenParser { - public static readonly IHasmTokenParser CommentParser = new HasmCommentParser(); - public static readonly IHasmTokenParser DeclarationParser = new HasmDeclarationParser(); - public static readonly IHasmTokenParser IntegerParser = new HasmIntegerParser(); - public static readonly IHasmTokenParser NumberParser = new HasmNumberParser(); - public static readonly IHasmTokenParser StringParser = new HasmStringParser(); - public static readonly IHasmTokenParser LabelParser = new HasmLabelParser(); - public static readonly IHasmTokenParser InstructionParser = new HasmInstructionParser(); - /// /// Returns true if a valid token can be parsed immediately, or false if one cannot. /// diff --git a/hasmer/libhasmer/Assembler/Visitor/DataAssembler.cs b/hasmer/libhasmer/Assembler/Visitor/DataAssembler.cs index 8c71bac..8eb7c3d 100644 --- a/hasmer/libhasmer/Assembler/Visitor/DataAssembler.cs +++ b/hasmer/libhasmer/Assembler/Visitor/DataAssembler.cs @@ -14,16 +14,22 @@ public class HasmAssemblerDataBuffer { /// /// The raw bytes of the buffer. /// - public List RawBuffer { get; set; } + public MemoryStream RawBuffer { get; set; } + + /// + /// A writer for . + /// + public BinaryWriter BufferWriter { get; set; } /// /// Represents key-value between the label in the buffer (i.e. A5, key = 5) and the offset of that label in the . /// - public Dictionary HasmBuffer { get; set; } + public Dictionary HasmBuffer { get; set; } public HasmAssemblerDataBuffer() { - RawBuffer = new List(); - HasmBuffer = new Dictionary(); + RawBuffer = new MemoryStream(); + BufferWriter = new BinaryWriter(RawBuffer); + HasmBuffer = new Dictionary(); } } @@ -32,9 +38,9 @@ public HasmAssemblerDataBuffer() { /// public class DataAssembler { /// - /// The token stream of the Hasm file. + /// The tokens of the Hasm program. /// - private HasmTokenStream Stream; + private HasmProgram Program; /// /// The array buffer. @@ -52,18 +58,24 @@ public class DataAssembler { public HasmAssemblerDataBuffer ObjectValueBuffer { get; set; } /// - /// Represents the string table. + /// The string table, where each index is the entry's ID. + /// + public List StringTable { get; set; } + + /// + /// Fast lookup into the string table by the string's value. /// The key is the string and the value is the ID of the string. - /// The ID is a sequential value, incremented for each new string. + /// That is, the index into . /// - public Dictionary StringTable { get; set; } + private Dictionary StringTableLookup { get; set; } /// /// Creates a new data assembler. /// - public DataAssembler(HasmTokenStream stream) { - Stream = stream; - StringTable = new Dictionary(); + public DataAssembler(HasmProgram program) { + Program = program; + StringTable = new List(); + StringTableLookup = new Dictionary(); ArrayBuffer = new HasmAssemblerDataBuffer(); ObjectKeyBuffer = new HasmAssemblerDataBuffer(); ObjectValueBuffer = new HasmAssemblerDataBuffer(); @@ -72,12 +84,12 @@ public DataAssembler(HasmTokenStream stream) { /// /// Gets a by its label (i.e. "A", "K", or "V"). /// - private HasmAssemblerDataBuffer GetBufferByName(LabelType type) { - return type switch { - LabelType.ArrayBuffer => ArrayBuffer, - LabelType.ObjectKeyBuffer => ObjectKeyBuffer, - LabelType.ObjectValueBuffer => ObjectValueBuffer, - _ => throw new Exception("invalid buffer label: " + type) + private HasmAssemblerDataBuffer GetBufferByName(HasmLabelKind kind) { + return kind switch { + HasmLabelKind.ArrayBuffer => ArrayBuffer, + HasmLabelKind.ObjectKeyBuffer => ObjectKeyBuffer, + HasmLabelKind.ObjectValueBuffer => ObjectValueBuffer, + _ => throw new Exception($"invalid buffer label '{kind}'") }; } @@ -86,76 +98,85 @@ private HasmAssemblerDataBuffer GetBufferByName(LabelType type) { /// If the string is not already present in the string table, /// it is added and the ID of the newly added string is returned. /// - public uint GetStringId(string str) { - if (StringTable.ContainsKey(str)) { - return StringTable[str]; + public uint GetStringId(string s, StringKind kind) { + uint id; + if (StringTableLookup.TryGetValue(s, out id)) { + return id; } - uint newId = (uint)StringTable.Count; - StringTable[str] = newId; - return newId; + id = (uint)StringTable.Count; + bool isUTF16 = !s.All(char.IsAscii); + StringTable.Add(new StringTableEntry(kind, s, isUTF16)); + StringTableLookup[s] = id; + + return id; } /// /// Parses all the data tokens and assembles them into data. /// public void Assemble() { - foreach (HasmToken token in Stream.ReadTokens()) { - if (token is HasmDataDeclarationToken data) { - HasmDataDeclarationType type = data.DataType; - uint labelIndex = data.Label.LabelIndex.GetValueAsUInt32(); - - HasmAssemblerDataBuffer buffer = GetBufferByName(data.Label.LabelType); - buffer.HasmBuffer[labelIndex] = buffer.RawBuffer.Count; - - HbcDataBufferTagType tagType = type switch { - HasmDataDeclarationType.Null => HbcDataBufferTagType.Null, - HasmDataDeclarationType.True => HbcDataBufferTagType.True, - HasmDataDeclarationType.False => HbcDataBufferTagType.False, - HasmDataDeclarationType.String => HbcDataBufferTagType.ByteString, // this gets overwritten depending on the string offsets - HasmDataDeclarationType.Number => HbcDataBufferTagType.Number, - HasmDataDeclarationType.Integer => HbcDataBufferTagType.Integer, - _ => throw new Exception("invalid declaration type") - }; - - if (type == HasmDataDeclarationType.String) { - List ids = data.Data.Cast().Select(str => GetStringId(str.Value)).ToList(); - foreach (uint id in ids) { - if (id > ushort.MaxValue) { - tagType = HbcDataBufferTagType.LongString; - break; - } else if (id > byte.MaxValue) { - tagType = HbcDataBufferTagType.ShortString; - } + foreach (HasmDataDeclaration data in Program.Data) { + HasmDataDeclarationKind kind = data.Kind; + uint labelIndex = data.Label.Index.GetValueAsUInt32(); + + HasmAssemblerDataBuffer buffer = GetBufferByName(data.Label.Kind); + buffer.HasmBuffer[labelIndex] = buffer.RawBuffer.Position; + + HbcDataBufferTagType tagType = kind switch { + HasmDataDeclarationKind.Null => HbcDataBufferTagType.Null, + HasmDataDeclarationKind.True => HbcDataBufferTagType.True, + HasmDataDeclarationKind.False => HbcDataBufferTagType.False, + HasmDataDeclarationKind.String => HbcDataBufferTagType.ByteString, // this gets overwritten depending on the string offsets + HasmDataDeclarationKind.Number => HbcDataBufferTagType.Number, + HasmDataDeclarationKind.Integer => HbcDataBufferTagType.Integer, + _ => throw new Exception("invalid declaration type") + }; + + if (kind == HasmDataDeclarationKind.String) { + IEnumerable ids = data.Elements.Cast().Select(str => GetStringId(str.Value, StringKind.Literal)); + foreach (uint id in ids) { + if (id > ushort.MaxValue) { + tagType = HbcDataBufferTagType.LongString; + break; + } else if (id > byte.MaxValue) { + tagType = HbcDataBufferTagType.ShortString; } } + } - using MemoryStream ms = new MemoryStream(); - using BinaryWriter bw = new BinaryWriter(ms); - - const byte TAG_MASK = 0x70; - if (data.Data.Count > 0x0F) { - byte keyTag = (byte)(((byte)tagType | (byte)(data.Data.Count >> 8) | 0x80) & TAG_MASK); - bw.Write(keyTag); - bw.Write((byte) (data.Data.Count & 0xFF)); - } else { - byte keyTag = (byte)(((byte)tagType | (byte)data.Data.Count) & TAG_MASK); - bw.Write(keyTag); - } + const byte TAG_MASK = 0x70; + if (data.Count > 0x0F) { + byte keyTag = (byte)(((byte)tagType | (byte)(data.Count >> 8) | 0x80) & TAG_MASK); + buffer.BufferWriter.Write(keyTag); + buffer.BufferWriter.Write((byte)(data.Count & 0xFF)); + } else { + byte keyTag = (byte)(((byte)tagType | (byte)data.Count) & TAG_MASK); + buffer.BufferWriter.Write(keyTag); + } - foreach (HasmLiteralToken literal in data.Data) { + if (data.Elements != null) { + foreach (HasmLiteralToken literal in data.Elements) { + uint id = uint.MaxValue; if (literal is HasmIntegerToken integer) { - bw.Write(integer.GetValueAsInt32()); + buffer.BufferWriter.Write(integer.GetValueAsInt32()); + continue; } else if (literal is HasmNumberToken number) { - bw.Write(number.Value); + buffer.BufferWriter.Write(number.Value); + continue; } else if (literal is HasmStringToken str) { - uint id = GetStringId(str.Value); + id = GetStringId(str.Value, StringKind.Literal); + } else if (literal is HasmIdentifierToken ident) { + id = GetStringId(ident.Value, StringKind.Identifier); + } + + if (id != uint.MaxValue) { if (tagType == HbcDataBufferTagType.ByteString) { - bw.Write((byte)id); + buffer.BufferWriter.Write((byte)id); } else if (tagType == HbcDataBufferTagType.ShortString) { - bw.Write((ushort)id); + buffer.BufferWriter.Write((ushort)id); } else if (tagType == HbcDataBufferTagType.LongString) { - bw.Write(id); + buffer.BufferWriter.Write(id); } else { throw new Exception("invalid tag type"); } @@ -165,9 +186,6 @@ public void Assemble() { // the length of the data represents the amount of constant values in the buffer // and since those values are constant they don't need to be written } - - byte[] dataArray = ms.ToArray(); - buffer.RawBuffer.AddRange(dataArray); } } } diff --git a/hasmer/libhasmer/Assembler/Visitor/FunctionAssembler.cs b/hasmer/libhasmer/Assembler/Visitor/FunctionAssembler.cs index 524dc2f..23370bd 100644 --- a/hasmer/libhasmer/Assembler/Visitor/FunctionAssembler.cs +++ b/hasmer/libhasmer/Assembler/Visitor/FunctionAssembler.cs @@ -19,7 +19,7 @@ public class FunctionAssembler { /// /// The token stream that reads Hasm tokens from the source code. /// - private HasmTokenStream Stream; + private IEnumerable Stream; /// /// The functions that are declared in the file. @@ -29,33 +29,93 @@ public class FunctionAssembler { /// /// Creates a new function assembler instance. /// - public FunctionAssembler(HbcAssembler hbcAssembler, HasmTokenStream stream) { + public FunctionAssembler(HbcAssembler hbcAssembler, IEnumerable stream) { Functions = new List(); HbcAssembler = hbcAssembler; Stream = stream; } - private void OptimizeInstruction(ref HbcInstructionDefinition def, HasmInstructionToken token) { + private bool DoesVariantFit(HbcInstructionDefinition concreteVariant, HasmInstructionToken insn) { + // Console.WriteLine($" DoesVariantFit(concreteVariant = {concreteVariant.Name}, insn = {insn.Instruction})"); + + for (int i = 0; i < concreteVariant.OperandTypes.Count; i++) { + HasmOperandToken operand = insn.Operands[i]; + HbcInstructionOperandType type = concreteVariant.OperandTypes[i]; + + // Console.WriteLine($" {i}: OperandType = {operand.OperandType}, type = {type}"); + + switch (operand.OperandType) { + case HasmOperandTokenType.String: + case HasmOperandTokenType.Identifier: + uint stringId = HbcAssembler.DataAssembler.GetStringId(operand.Value.GetValue(), operand.OperandStringKind); + // Console.WriteLine($" {i}: stringId = {stringId}, type = {type}"); + if (!type.CanStoreInteger(stringId)) { + // Console.WriteLine($" {i}: CanStoreInteger FAILED"); + return false; + } + break; + case HasmOperandTokenType.Register: + case HasmOperandTokenType.Label: + case HasmOperandTokenType.UInt: + ulong value = operand.Value.GetIntegerValue(); + if (!type.CanStoreInteger(value)) { + return false; + } + break; + default: + break; + } + } + + return true; + } + + private HbcInstructionDefinition OptimizeInstruction(HbcInstructionDefinition def, HasmInstructionToken insn) { if (def.AbstractDefinition == null) { - return; + return def; } - HbcAbstractInstructionDefinition abstractDef = HbcAssembler.Header.Format.AbstractDefinitions[def.AbstractDefinition.Value]; - List concreteVariants = abstractDef.Variants.Select(variantId => HbcAssembler.Header.Format.Definitions[(int)variantId]).ToList(); + HbcAbstractInstructionDefinition abstractDef = HbcAssembler.File.BytecodeFormat.AbstractDefinitions[def.AbstractDefinition.Value]; + List concreteVariants = abstractDef.VariantOpcodes.Select(variantId => HbcAssembler.File.BytecodeFormat.Definitions[(int)variantId]).ToList(); + List validVariants = new List(concreteVariants.Count); + foreach (HbcInstructionDefinition concreteVariant in concreteVariants) { - throw new Exception("TODO: OptimizeInstruction"); + if (DoesVariantFit(concreteVariant, insn)) { + validVariants.Add(concreteVariant); + } + } + + if (validVariants.Count == 0) { + throw new HasmParserException(insn, "no concrete defintions for variant exist for provided arguments"); } + + validVariants.Sort((a, b) => a.TotalSize - b.TotalSize); + + return validVariants[0]; } private void WriteInstruction(BinaryWriter writer, HasmInstructionToken insn) { string insnName = insn.Instruction; - HbcInstructionDefinition def = HbcAssembler.Header.Format.Definitions.Find(def => def.Name == insnName); + HbcInstructionDefinition def = HbcAssembler.File.BytecodeFormat.Definitions.Find(def => def.Name == insnName); if (def == null) { - throw new HasmParserException(insn.Line, insn.Column, $"unknown instruction: {insnName}"); + throw new HasmParserException(insn, $"unknown instruction: {insnName}"); + } + + if (!HbcAssembler.IsExact) { + // add indentifier cache operands if not in exact mode + if (insnName == "TryGetById" || insnName == "GetById" || insnName == "TryPutById" || insnName == "PutById") { + // insert a cache index of 0 as the third operand + insn.Operands.Insert(2, new HasmOperandToken(null) { + OperandType = HasmOperandTokenType.UInt, + Value = new PrimitiveValue((byte)0), + }); + } + + def = OptimizeInstruction(def, insn); } - if (!HbcAssembler.Header.IsExact) { - OptimizeInstruction(ref def, insn); + if (def.OperandTypes.Count != insn.Operands.Count) { + throw new HasmParserException(insn, $"expecting {def.OperandTypes.Count} operands but got {insn.Operands.Count}"); } writer.Write((byte)def.Opcode); @@ -65,7 +125,7 @@ private void WriteInstruction(BinaryWriter writer, HasmInstructionToken insn) { HbcInstructionOperandType type = def.OperandTypes[i]; if (operand.Value.TypeCode == TypeCode.String) { - uint stringId = HbcAssembler.DataAssembler.GetStringId(operand.Value.GetValue()); + uint stringId = HbcAssembler.DataAssembler.GetStringId(operand.Value.GetValue(), operand.OperandStringKind); if (type == HbcInstructionOperandType.UInt8S) { if (stringId > byte.MaxValue) { throw new Exception("string ID cannot fit into UInt8"); @@ -82,9 +142,13 @@ private void WriteInstruction(BinaryWriter writer, HasmInstructionToken insn) { } operand.Value = new PrimitiveValue(stringId); // convert string to ID } - } else if (type == HbcInstructionOperandType.Addr8 || type == HbcInstructionOperandType.Reg8 || type == HbcInstructionOperandType.UInt8) { + } else if (type == HbcInstructionOperandType.Addr8) { + writer.Write(operand.Value.GetValue()); + } else if (type == HbcInstructionOperandType.Reg8 || type == HbcInstructionOperandType.UInt8) { writer.Write(operand.Value.GetValue()); - } else if (type == HbcInstructionOperandType.Addr32 || type == HbcInstructionOperandType.Reg32 || type == HbcInstructionOperandType.UInt32 || type == HbcInstructionOperandType.Imm32) { + } else if (type == HbcInstructionOperandType.Addr32) { + writer.Write(operand.Value.GetValue()); + } else if (type == HbcInstructionOperandType.Reg32 || type == HbcInstructionOperandType.UInt32 || type == HbcInstructionOperandType.Imm32) { writer.Write(operand.Value.GetValue()); } else if (type == HbcInstructionOperandType.UInt16) { writer.Write(operand.Value.GetValue()); @@ -103,7 +167,7 @@ private byte[] BuildBytecode() { using MemoryStream ms = new MemoryStream(); using BinaryWriter writer = new BinaryWriter(ms); - HbcFile file = HbcAssembler.FileBuilder.File; + HbcFile file = HbcAssembler.File; foreach (HbcFunctionBuilder builder in Functions) { file.SmallFuncHeaders[builder.FunctionId].Offset = (uint)ms.Position; foreach (HasmInstructionToken insn in builder.Instructions) { @@ -144,36 +208,54 @@ private void AssembleFunction(HasmFunctionToken func, HbcFunctionBuilder builder } public void Assemble() { - HbcFile file = HbcAssembler.FileBuilder.File; + HbcFile file = HbcAssembler.File; - foreach (HasmToken token in Stream.ReadTokens()) { + Console.WriteLine("Parsing functions..."); + foreach (HasmToken token in Stream) { if (token is HasmFunctionToken func) { HbcFunctionBuilder builder = new HbcFunctionBuilder { - FunctionName = func.FunctionName, + FunctionName = func.Name.Value, FunctionId = uint.MaxValue, EnvironmentSize = uint.MaxValue, - FrameSize = uint.MaxValue, ParamCount = uint.MaxValue, + FrameSize = uint.MaxValue, Flags = HbcFuncHeaderFlags.ProhibitNone, Instructions = new List() }; AssembleFunction(func, builder); - file.SmallFuncHeaders[builder.FunctionId] = new HbcSmallFuncHeader { - DeclarationFile = file, - FunctionName = HbcAssembler.DataAssembler.GetStringId(builder.FunctionName), - FunctionId = builder.FunctionId, - EnvironmentSize = builder.EnvironmentSize, - FrameSize = builder.FrameSize, - ParamCount = builder.ParamCount, - Flags = builder.Flags, - }; + if (builder.FunctionId == uint.MaxValue) { + throw new Exception($"function <{builder.FunctionName}> is missing a '.id' declaration"); + } + if (builder.ParamCount == uint.MaxValue) { + throw new Exception($"function <{builder.FunctionName}> is missing a '.params' declaration"); + } + if (builder.FrameSize == uint.MaxValue) { + throw new Exception($"function <{builder.FunctionName}> is missing a '.registers' declaration"); + } + if (builder.EnvironmentSize == uint.MaxValue) { + throw new Exception($"function <{builder.FunctionName}> is missing a '.symbols' declaration"); + } Functions.Add(builder); } } + file.SmallFuncHeaders = new HbcSmallFuncHeader[Functions.Count]; + foreach (HbcFunctionBuilder builder in Functions) { + file.SmallFuncHeaders[builder.FunctionId] = new HbcSmallFuncHeader { + DeclarationFile = file, + FunctionName = HbcAssembler.DataAssembler.GetStringId(builder.FunctionName, StringKind.Identifier), + FunctionId = builder.FunctionId, + EnvironmentSize = builder.EnvironmentSize, + FrameSize = builder.FrameSize, + ParamCount = builder.ParamCount, + Flags = builder.Flags, + }; + } + + Console.WriteLine("Building bytecode..."); file.Instructions = BuildBytecode(); } } diff --git a/hasmer/libhasmer/Common/ConsoleProgressBar.cs b/hasmer/libhasmer/Common/ConsoleProgressBar.cs new file mode 100644 index 0000000..e770d93 --- /dev/null +++ b/hasmer/libhasmer/Common/ConsoleProgressBar.cs @@ -0,0 +1,91 @@ +using System; +using System.Text; +using System.Threading; + +namespace Hasmer { + /// + /// Taken from https://gist.github.com/DanielSWolf/0ab6a96899cc5377bf54 + /// + public class ConsoleProgressBar : IDisposable, IProgress { + private const int blockCount = 40; + private readonly TimeSpan animationInterval = TimeSpan.FromSeconds(1.0 / 10); + private const string animation = @"|/-\"; + + private readonly Timer timer; + + private double currentProgress = 0; + private string currentText = string.Empty; + private bool disposed = false; + private int animationIndex = 0; + + public ConsoleProgressBar() { + timer = new Timer(TimerHandler); + + // A progress bar is only for temporary display in a console window. + // If the console output is redirected to a file, draw nothing. + // Otherwise, we'll end up with a lot of garbage in the target file. + if (!Console.IsOutputRedirected) { + ResetTimer(); + } + } + + public void Report(double value) { + // Make sure value is in [0..1] range + value = Math.Max(0, Math.Min(1, value)); + Interlocked.Exchange(ref currentProgress, value); + } + + private void TimerHandler(object state) { + lock (timer) { + if (disposed) return; + + int progressBlockCount = (int)(currentProgress * blockCount); + int percent = (int)(currentProgress * 100); + string text = string.Format("[{0}{1}] {2,3}% {3}", + new string('#', progressBlockCount), new string('-', blockCount - progressBlockCount), + percent, + animation[animationIndex++ % animation.Length]); + UpdateText(text); + + ResetTimer(); + } + } + + private void UpdateText(string text) { + // Get length of common portion + int commonPrefixLength = 0; + int commonLength = Math.Min(currentText.Length, text.Length); + while (commonPrefixLength < commonLength && text[commonPrefixLength] == currentText[commonPrefixLength]) { + commonPrefixLength++; + } + + // Backtrack to the first differing character + StringBuilder outputBuilder = new StringBuilder(); + outputBuilder.Append('\b', currentText.Length - commonPrefixLength); + + // Output new suffix + outputBuilder.Append(text.Substring(commonPrefixLength)); + + // If the new text is shorter than the old one: delete overlapping characters + int overlapCount = currentText.Length - text.Length; + if (overlapCount > 0) { + outputBuilder.Append(' ', overlapCount); + outputBuilder.Append('\b', overlapCount); + } + + Console.Write(outputBuilder); + currentText = text; + } + + private void ResetTimer() { + timer.Change(animationInterval, TimeSpan.FromMilliseconds(-1)); + } + + public void Dispose() { + lock (timer) { + disposed = true; + UpdateText(string.Empty); + } + } + } +} diff --git a/hasmer/libhasmer/Common/HbcAbstractInstructionDefinition.cs b/hasmer/libhasmer/Common/HbcAbstractInstructionDefinition.cs new file mode 100644 index 0000000..44dbb22 --- /dev/null +++ b/hasmer/libhasmer/Common/HbcAbstractInstructionDefinition.cs @@ -0,0 +1,32 @@ +using System.Collections.Generic; +using Newtonsoft.Json; + +namespace Hasmer { + /// + /// Represents the abstract form of variant instructions. + /// Variant instructions are instructions which perform the same action, but can have differently sized operands. + /// By abstracting these instructions to all have one name, the assembler can optimize the size of the operands. + /// Thus, programmers do not have to figure out the proper sizes when they write Hasm code. + ///

+ /// Passing the "--exact" flag to the hasmer disassmbler will ignore abstract definitions, + /// and instead emit the exact instruction. + ///
+ public class HbcAbstractInstructionDefinition { + /// + /// The abstract name that can be used to represent any of the . + ///
+ /// For example, the instructions "JStrictNotEqual" and "JStrictNotEqualLong" + /// will have an abstract name of simply "JStrictNotEqual". + ///
+ /// The assembler will decide which to use based on the operands at assemble time. + ///
+ [JsonProperty] + public string Name { get; set; } + + /// + /// The opcodes of each variant that can be defined by this abstract definition. + /// + [JsonProperty] + public List VariantOpcodes { get; set; } + } +} diff --git a/hasmer/libhasmer/Common/HbcBytecodeFormat.cs b/hasmer/libhasmer/Common/HbcBytecodeFormat.cs index e45fd2d..ec6c982 100644 --- a/hasmer/libhasmer/Common/HbcBytecodeFormat.cs +++ b/hasmer/libhasmer/Common/HbcBytecodeFormat.cs @@ -3,126 +3,12 @@ using System.Linq; using System.Text; using System.Threading.Tasks; +using System.Runtime.Serialization; using Newtonsoft.Json; using Newtonsoft.Json.Linq; -using System.Runtime.Serialization; using Newtonsoft.Json.Converters; namespace Hasmer { - /// - /// Represents the type of an operand. - /// - [JsonConverter(typeof(StringEnumConverter))] - public enum HbcInstructionOperandType { - /// - /// The operand is a one-byte register reference. - /// - Reg8, - /// - /// The operand is a four-byte register reference. - /// - Reg32, - /// - /// The operand is an unsigned byte. - /// - UInt8, - /// - /// The operand is an unsigned two-byte integer. - /// - UInt16, - /// - /// The operand is an unsigned four-byte integer. - /// - UInt32, - /// - /// The operand is a one-byte code address reference. - /// - Addr8, - /// - /// The operand is a four-byte code address reference. - /// - Addr32, - /// - /// The operand is a four-byte unsigned integer. - /// - Imm32, - /// - /// The operand is an eight-byte IEEE754 floating-point value. - /// - Double, - /// - /// The operand is a one-byte reference to the string table. - /// - UInt8S, - /// - /// The operand is a two-byte reference to the string table. - /// - UInt16S, - /// - /// The operand is a four-byte reference to the string table. - /// - UInt32S - } - - /// - /// Represents the definition of an instruction in a JSON bytecode definitions file. - /// - public class HbcInstructionDefinition { - /// - /// The opcode of the instruction in the binary. - /// - [JsonProperty] - public int Opcode { get; set; } - /// - /// The human-readable name of the instruction. - /// - [JsonProperty] - public string Name { get; set; } - /// - /// The types of all the operands the operand handles. - /// - [JsonProperty] - public List OperandTypes { get; set; } - /// - /// true if the operation is a jumping instruction (i.e. changes the current instruction being executed), or otherwise false. - /// - [JsonProperty] - public bool IsJump { get; set; } - /// - /// The index in the abstract definition table of the abstract form of the instruction, or null if the instruction does not have an abstract form. - /// - [JsonProperty] - public int? AbstractDefinition { get; set; } - } - - /// - /// Represents the abstract form of variant instructions. - /// Variant instructions are instructions which perform the same action, but can have differently sized operands. - /// By abstracting these instructions to all have one name, the assembler can optimize the size of the operands. - /// Thus, programmers do not have to figure out the proper sizes when they write Hasm code. - ///

- /// Passing the "--exact" flag to the hasmer disassmbler will ignore abstract definitions, - /// and instead emit the exact instruction. - ///
- public class HbcAbstractInstructionDefinition { - /// - /// The abstract name that can be used to represent any of the . - ///
- /// For example, the instructions "JStrictNotEqual" and "JStrictNotEqualLong" - /// will have an abstract name of simply "JStrictNotEqual". - ///
- /// The assembler will decide which to use based on the operands at assemble time. - ///
- [JsonProperty] - public string Name { get; set; } - - /// - /// The opcodes of each variant that can be defined by this abstract definition. - /// - [JsonProperty] - public List Variants { get; set; } - } - /// /// Represents a definition of the bytecode operations for a given Hermes version. ///
diff --git a/hasmer/libhasmer/Common/HbcDataBuffer.cs b/hasmer/libhasmer/Common/HbcDataBuffer.cs index 40aaecd..60cad8a 100644 --- a/hasmer/libhasmer/Common/HbcDataBuffer.cs +++ b/hasmer/libhasmer/Common/HbcDataBuffer.cs @@ -32,6 +32,10 @@ public class HbcDataBufferPrefix { /// The type of the data in the data buffer. ///
public HbcDataBufferTagType TagType { get; set; } + + public override string ToString() { + return $"{TagType.ToString()} x {Length}"; + } } /// @@ -80,8 +84,10 @@ public List ReadAll(HbcFile source) { uint offset = (uint)ms.Position; HbcDataBufferPrefix prefix = ReadTagType(reader); PrimitiveValue[] values = new PrimitiveValue[prefix.Length]; + // Console.WriteLine(" prefix: " + prefix.ToString()); for (int i = 0; i < values.Length; i++) { values[i] = ReadValue(source, prefix.TagType, reader); + // Console.WriteLine(" Read value: " + values[i].ToString()); } itemsList.Add(new HbcDataBufferItems { Prefix = prefix, @@ -101,7 +107,7 @@ public void WriteAll(BinaryWriter writer) { } /// - /// Disassembles a single HbcDataBufferItems from an offset in the data buffer (i.e. from an instruction operand). + /// Disassembles a single HbcDataBufferItems from an offset in the data buffer (e.g. from an instruction operand). /// public HbcDataBufferItems Read(HbcFile source, uint offset) { using MemoryStream ms = new MemoryStream(Buffer); @@ -126,9 +132,9 @@ public HbcDataBufferItems Read(HbcFile source, uint offset) { private PrimitiveValue ReadValue(HbcFile source, HbcDataBufferTagType tagType, BinaryReader reader) { // new PrimitiveValue made for each switch to preserve the PrimitiveValue type tagging mechanism for numbers return tagType switch { - HbcDataBufferTagType.ByteString => new PrimitiveValue(source.StringTable[reader.ReadByte()]), - HbcDataBufferTagType.ShortString => new PrimitiveValue(source.StringTable[reader.ReadUInt16()]), - HbcDataBufferTagType.LongString => new PrimitiveValue(source.StringTable[reader.ReadUInt32()]), + HbcDataBufferTagType.ByteString => new PrimitiveValue(source.GetStringTableEntry((int)reader.ReadByte()).Value), + HbcDataBufferTagType.ShortString => new PrimitiveValue(source.GetStringTableEntry((int)reader.ReadUInt16()).Value), + HbcDataBufferTagType.LongString => new PrimitiveValue(source.GetStringTableEntry((int)reader.ReadUInt32()).Value), HbcDataBufferTagType.Number => new PrimitiveValue(reader.ReadDouble()), HbcDataBufferTagType.Integer => new PrimitiveValue(reader.ReadInt32()), HbcDataBufferTagType.Null => new PrimitiveValue(null), diff --git a/hasmer/libhasmer/Common/HbcEncodedItem.cs b/hasmer/libhasmer/Common/HbcEncodedItem.cs index 7732cc5..85f577b 100644 --- a/hasmer/libhasmer/Common/HbcEncodedItem.cs +++ b/hasmer/libhasmer/Common/HbcEncodedItem.cs @@ -15,52 +15,45 @@ public abstract class HbcEncodedItem { /// /// Converts the name of a type in JSON to the .NET type. /// - private static Type GetTypeFromName(string name) { - switch (name) { - case "UInt8": - return typeof(byte); - case "UInt16": - return typeof(ushort); - case "UInt32": - return typeof(uint); - case "UInt64": - return typeof(ulong); - default: - throw new InvalidDataException("bad type: " + name); - } - } + private static Type GetTypeFromName(string name) => name switch { + "UInt8" => typeof(byte), + "UInt16" => typeof(ushort), + "UInt32" => typeof(uint), + "UInt64" => typeof(ulong), + _ => throw new InvalidDataException("bad type: " + name), + }; /// /// Reads a value from the buffer given the type of the value. /// - private static object ReadType(HbcReader reader, string type) { - if (type == "UInt8") { - return reader.ReadByte(); - } else if (type == "UInt16") { - return reader.ReadUInt16(); - } else if (type == "UInt32") { - return reader.ReadUInt32(); - } else if (type == "UInt64") { - return reader.ReadUInt64(); - } else { - throw new InvalidDataException("bad type: " + type); - } - } + private static object ReadType(HbcReader reader, string type) => type switch { + // the explicit cast to object is necessary, the C# compiler casts all the values to UInt64 before casting to object + "UInt8" => (object)reader.ReadByte(), + "UInt16" => (object)reader.ReadUInt16(), + "UInt32" => (object)reader.ReadUInt32(), + "UInt64" => (object)reader.ReadUInt64(), + _ => throw new InvalidDataException("bad type: " + type), + }; /// /// Writes a value to the buffer given the type. /// private static void WriteType(HbcWriter writer, string type, object value) { - if (type == "UInt8") { - writer.Write((byte)value); - } else if (type == "UInt16") { - writer.Write((ushort)value); - } else if (type == "UInt32") { - writer.Write((uint)value); - } else if (type == "UInt64") { - writer.Write((ulong)value); - } else { - throw new InvalidDataException("bad type: " + type); + switch (type) { + case "UInt8": + writer.Write((byte)value); + break; + case "UInt16": + writer.Write((ushort)value); + break; + case "UInt32": + writer.Write((uint)value); + break; + case "UInt64": + writer.Write((ulong)value); + break; + default: + throw new InvalidDataException("bad type: " + type); } } @@ -139,7 +132,12 @@ public static object ReadFromDefinition(HbcReader reader, JToken def) { foreach (JProperty property in obj.Properties()) { PropertyInfo info = typeof(T).GetProperty(property.Name, BindingFlags.Public | BindingFlags.Instance); object value = ReadFromDefinition(reader, property.Value); - info.SetValue(decoded, value); + try { + info.SetValue(decoded, value); + } catch (Exception e) { + Console.WriteLine($"Failed to set {info.PropertyType.FullName} property '{typeof(T).FullName}.{property.Name}' (expecting {property.Value}, read {value.GetType().FullName} {value}): {e}"); + Environment.Exit(1); + } } return decoded; diff --git a/hasmer/libhasmer/Common/HbcFile.cs b/hasmer/libhasmer/Common/HbcFile.cs index 62fad5b..f7daaf5 100644 --- a/hasmer/libhasmer/Common/HbcFile.cs +++ b/hasmer/libhasmer/Common/HbcFile.cs @@ -10,6 +10,8 @@ namespace Hasmer { /// Represents a parsed Hermes bytecode file. /// public class HbcFile { + const uint MAX_STRING_LENGTH = 0xFF; + /// /// The header of the file. /// @@ -56,15 +58,10 @@ public class HbcFile { ///
public uint InstructionOffset { get; set; } - /// - /// The types of the strings in the string table. - /// - public StringKind[] StringKinds { get; set; } - /// /// The parsed string table. Index = string index (i.e. from an operand, etc.), Value = string at that index. /// - public string[] StringTable { get; private set; } + public StringTableEntry[] StringTable { get; set; } /// /// Creates a new bytecode file (probably to be writen out). Does not parse anything. @@ -101,43 +98,43 @@ public HbcFile(HbcReader reader) { } SmallFuncHeaders[i] = header; } - reader.Align(); - Console.WriteLine(Header.StringCount); - Console.WriteLine(Header.StringKindCount); - Console.WriteLine(Header.IdentifierCount); - + StringKindEntry[] stringKinds = new StringKindEntry[Header.StringKindCount]; for (uint i = 0; i < Header.StringKindCount; i++) { - uint stringKind = reader.ReadUInt32(); - Console.WriteLine(Convert.ToString(stringKind, 2)); + stringKinds[i] = new StringKindEntry(reader.ReadUInt32()); } - reader.Align(); + uint[] identifierHashes = new uint[Header.IdentifierCount]; for (uint i = 0; i < Header.IdentifierCount; i++) { - uint identifier = reader.ReadUInt32(); - Console.WriteLine(Convert.ToString(identifier, 2)); + identifierHashes[i] = reader.ReadUInt32(); } reader.Align(); + Console.WriteLine($" rSmallStrings @ {reader.BaseStream.Position}"); + HbcSmallStringTableEntry[] smallStringTable = new HbcSmallStringTableEntry[Header.StringCount]; for (int i = 0; i < Header.StringCount; i++) { smallStringTable[i] = HbcEncodedItem.Decode(reader, (JObject)def["SmallStringTableEntry"]); } - reader.Align(); HbcOverflowStringTableEntry[] overflowStringTable = new HbcOverflowStringTableEntry[Header.OverflowStringCount]; for (int i = 0; i < Header.OverflowStringCount; i++) { overflowStringTable[i] = HbcEncodedItem.Decode(reader, (JObject)def["OverflowStringTableEntry"]); } - reader.Align(); byte[] stringStorage = reader.ReadBytes((int)Header.StringStorageSize); reader.Align(); + // TODO: find the actual bytecode version that BigIntTable was added + if (Header.Version >= 100) { + // TODO: parse the BigIntTable + throw new Exception("BigIntTable not yet implemented"); + } + ArrayBuffer = new HbcDataBuffer(reader.ReadBytes((int)Header.ArrayBufferSize)); reader.Align(); @@ -163,14 +160,13 @@ public HbcFile(HbcReader reader) { HbcCjsModuleTableEntry entry = HbcEncodedItem.Decode(reader, (JObject)def["CjsModuleTableEntry"]); CjsModuleTable[i] = entry; } - reader.Align(); InstructionOffset = (uint)reader.BaseStream.Position; Instructions = new byte[reader.BaseStream.Length - reader.BaseStream.Position]; reader.BaseStream.Read(Instructions, 0, Instructions.Length); - CreateStringTable(stringStorage, smallStringTable, overflowStringTable); + CreateStringTable(stringStorage, smallStringTable, overflowStringTable, stringKinds, identifierHashes); BytecodeFormat = ResourceManager.ReadEmbeddedResource($"Bytecode{Header.Version}"); } @@ -179,32 +175,134 @@ public HbcFile(HbcReader reader) { /// Writes the Hermes bytecode file and serializes it to a byte array. /// public byte[] Write() { + Header.StringCount = (uint)StringTable.Length; + Header.StringKindCount = 0; + Header.IdentifierCount = 0; + Header.OverflowStringCount = 0; + Header.StringStorageSize = 0; + Header.ArrayBufferSize = (uint)ArrayBuffer.Buffer.Length; + Header.ObjKeyBufferSize = (uint)ObjectKeyBuffer.Buffer.Length; + Header.ObjValueBufferSize = (uint)ObjectValueBuffer.Buffer.Length; + Header.FunctionCount = (uint)SmallFuncHeaders.Length; + JObject def = ResourceManager.LoadJsonObject("BytecodeFileFormat"); using MemoryStream ms = new MemoryStream(); using HbcWriter writer = new HbcWriter(ms); - // write the initial header -- some of these values get overwritten when we rewrite the header as the last step + // write the initial header -- these values get overwritten when we rewrite the header as the last step HbcEncodedItem.Encode(writer, (JObject)def["Header"], Header); writer.Align(); - for (uint i = 0; i < Header.FunctionCount; i++) { - HbcEncodedItem.Encode(writer, (JObject)def["SmallFuncHeader"], SmallFuncHeaders[i]); + + foreach (HbcSmallFuncHeader header in SmallFuncHeaders) { + HbcEncodedItem.Encode(writer, (JObject)def["SmallFuncHeader"], header); // TODO: large functions } writer.Align(); - // write string kind count - foreach (StringKind kind in StringKinds) { + // write string kinds + if (StringTable.Length > 0) { + StringKind currentKind = StringTable[0].Kind; + uint currentCount = 1; + for (uint i = 1; i < StringTable.Length; i++) { + StringTableEntry entry = StringTable[i]; + if (entry.Kind == currentKind) { + currentCount++; + } else { + writer.Write(new StringKindEntry(currentKind, currentCount).Entry); + + Header.StringKindCount++; + currentKind = entry.Kind; + currentCount = 1; + } + } + // make sure to write the last run of string kinds + writer.Write(new StringKindEntry(currentKind, currentCount).Entry); } - // write identifier count + // write identifier hashes + for (uint i = 0; i < StringTable.Length; i++) { + StringTableEntry entry = StringTable[i]; + if (entry.IsIdentifier) { + writer.Write(entry.Hash); + Header.IdentifierCount++; + } + } + writer.Align(); + + // encode all strings, indexable by their ID + byte[][] encodedStrings = new byte[StringTable.Length][]; + uint[] encodedStringsAreUTF16 = new uint[StringTable.Length]; + for (uint i = 0; i < StringTable.Length; i++) { + StringTableEntry ste = StringTable[i]; + byte[] encoded = ste.Encoded; + encodedStrings[i] = encoded; + encodedStringsAreUTF16[i] = ste.IsUTF16 ? 1u : 0u; + + if (encoded.Length >= MAX_STRING_LENGTH) { + Header.OverflowStringCount++; + } + Header.StringStorageSize += (uint)encoded.Length; + } + + // construct the contiguous string storage, small string table, and large + byte[] stringStorage = new byte[Header.StringStorageSize]; + HbcSmallStringTableEntry[] smallStrings = new HbcSmallStringTableEntry[StringTable.Length]; + HbcOverflowStringTableEntry[] overflowStrings = new HbcOverflowStringTableEntry[Header.OverflowStringCount]; + uint stringStorageOffset = 0; + uint overflowOffset = 0; + for (uint i = 0; i < StringTable.Length; i++) { + byte[] encoded = encodedStrings[i]; + uint isUTF16 = encodedStringsAreUTF16[i]; + uint encodingDivisor = isUTF16 == 0u ? 1u : 2u; + + HbcSmallStringTableEntry sste; + if (encoded.Length >= MAX_STRING_LENGTH) { + sste = new HbcSmallStringTableEntry { + IsUTF16 = isUTF16, + Offset = overflowOffset, + Length = MAX_STRING_LENGTH, + }; + + overflowStrings[overflowOffset] = new HbcOverflowStringTableEntry { + Offset = stringStorageOffset, + Length = (uint)encoded.Length / encodingDivisor, + }; + + overflowOffset++; + } else { + sste = new HbcSmallStringTableEntry { + IsUTF16 = isUTF16, + Offset = stringStorageOffset, + Length = (uint)encoded.Length / encodingDivisor, + }; + } + smallStrings[i] = sste; + + Array.Copy(encoded, 0, stringStorage, stringStorageOffset, encoded.Length); + stringStorageOffset += (uint)encoded.Length / encodingDivisor; + } + + Console.WriteLine($" wSmallStrings @ {ms.Position}"); // write small string table + foreach (HbcSmallStringTableEntry entry in smallStrings) { + HbcEncodedItem.Encode(writer, (JObject)def["SmallStringTableEntry"], entry); + } + writer.Align(); // write overflow string table + foreach (HbcOverflowStringTableEntry entry in overflowStrings) { + HbcEncodedItem.Encode(writer, (JObject)def["OverflowStringTableEntry"], entry); + } + writer.Align(); // write string storage + writer.Write(stringStorage); + writer.Align(); + + // TODO: read BigIntTable // write array buffer ArrayBuffer.WriteAll(writer); @@ -223,7 +321,7 @@ public byte[] Write() { // write cjs modules // write instructions - InstructionOffset = (uint) ms.Position; + InstructionOffset = (uint)ms.Position; writer.Write(Instructions); // re-write the header with the final values after writing the rest of the stream @@ -231,42 +329,71 @@ public byte[] Write() { ms.Position = 0; HbcEncodedItem.Encode(writer, (JObject)def["Header"], Header); + Console.WriteLine($"Wrote HBC!\n IdentifierCount = {Header.IdentifierCount}\n StringCount = {Header.StringCount}"); + ms.Position = Header.FileLength; return ms.ToArray(); } + public StringTableEntry GetStringTableEntry(int index) { + if (index < 0 || index >= StringTable.Length) { + throw new Exception("out of bounds string index: " + index); + } + return StringTable[index]; + } + /// /// Creates a parsed string table from the raw string storage data. /// - private void CreateStringTable(byte[] stringStorage, HbcSmallStringTableEntry[] smallStringTable, HbcOverflowStringTableEntry[] overflowStringTable) { - const uint MAX_STRING_LENGTH = 0xFF; + private void CreateStringTable(byte[] stringStorage, HbcSmallStringTableEntry[] smallStringTable, HbcOverflowStringTableEntry[] overflowStringTable, StringKindEntry[] stringKinds, uint[] identifierHashes) { + Console.WriteLine($"stringStorage.Length = {stringStorage.Length}"); + + StringKind[] kindLookup = new StringKind[smallStringTable.Length]; + int k = 0; + foreach (StringKindEntry entry in stringKinds) { + for (int i = 0; i < entry.Count; i++, k++) { + kindLookup[k] = entry.Kind; + } + } - StringTable = new string[smallStringTable.Length]; + StringTable = new StringTableEntry[smallStringTable.Length]; + int identIdx = 0; for (uint i = 0; i < smallStringTable.Length; i++) { HbcSmallStringTableEntry entry = smallStringTable[(int)i]; uint offset = entry.Offset; uint length = entry.Length; - uint isUTF16 = entry.IsUTF16; + bool isUTF16 = entry.IsUTF16 != 0; + + Console.WriteLine($" offset = {offset}, length = {length}, isUTF16 = {isUTF16}"); if (length >= MAX_STRING_LENGTH) { HbcOverflowStringTableEntry overflow = overflowStringTable[offset]; offset = overflow.Offset; length = overflow.Length; + Console.WriteLine($" overflow; offset = {offset}, length = {length}"); } - if (isUTF16 == 1) { + if (isUTF16) { length *= 2; + Console.WriteLine($" isUTF16; length = {length}"); } byte[] stringBytes = new byte[length]; Array.Copy(stringStorage, offset, stringBytes, 0, length); - string str = isUTF16 switch { - 1 => string.Concat(stringBytes.Select(b => b.ToString("X2"))), - _ => Encoding.UTF8.GetString(stringBytes) - }; - StringTable[i] = str; + StringKind kind = kindLookup[i]; + Encoding enc = isUTF16 ? Encoding.Unicode : Encoding.ASCII; + string str = enc.GetString(stringBytes); + + StringTableEntry stEntry = new StringTableEntry(kind, str, isUTF16); + if (stEntry.IsIdentifier) { + uint hash = identifierHashes[identIdx++]; + if (stEntry.Hash != hash) { + Console.WriteLine($"Warning: identifier '{stEntry.Value}' has invalid hash; expecting {hash} but calculated {stEntry.Hash}"); + } + } + StringTable[i] = stEntry; } } } diff --git a/hasmer/libhasmer/Common/HbcFuncHeader.cs b/hasmer/libhasmer/Common/HbcFuncHeader.cs index 2f036f8..36e37c4 100644 --- a/hasmer/libhasmer/Common/HbcFuncHeader.cs +++ b/hasmer/libhasmer/Common/HbcFuncHeader.cs @@ -46,7 +46,7 @@ public class HbcFuncHeader : HbcEncodedItem { public uint BytecodeSizeInBytes { get; set; } /// - /// The index in the string table of the function's name (i.e. HbcFile.StringTable[FunctionName]). + /// The index in the string table of the function's name (i.e. HbcFile.GetStringTableEntry(FunctionName)). /// public uint FunctionName { get; set; } @@ -95,7 +95,7 @@ public virtual HbcFuncHeader GetAssemblerHeader() { /// public string GetFunctionName(HbcFile source) { HbcSmallFuncHeader func = source.SmallFuncHeaders[FunctionId]; - string functionName = source.StringTable[func.FunctionName]; + string functionName = source.GetStringTableEntry((int)func.FunctionName).Value; if (functionName == "") { return $"$closure${FunctionId}"; } diff --git a/hasmer/libhasmer/Common/HbcInstruction.cs b/hasmer/libhasmer/Common/HbcInstruction.cs index 775c1b4..07d0a8d 100644 --- a/hasmer/libhasmer/Common/HbcInstruction.cs +++ b/hasmer/libhasmer/Common/HbcInstruction.cs @@ -6,127 +6,6 @@ using System.IO; namespace Hasmer { - /// - /// Represents an operand of Hermes bytecode instruction. - /// - public class HbcInstructionOperand { - /// - /// The type of operand that is represented by the object. - /// - public HbcInstructionOperandType Type { get; set; } - - /// - /// The raw value of the object, represented as a PrimitiveValue to preserve type information. - ///
- /// Is is highly recommended to use and - /// instead of accessing this property directly. - /// Use with caution. - ///
- public PrimitiveValue Value { get; set; } - - /// - /// Writes the operand to a stream of binary data. - /// - public void ToWriter(BinaryWriter writer) { - switch (Type) { - case HbcInstructionOperandType.Reg8: writer.Write(GetValue()); break; - case HbcInstructionOperandType.Reg32: writer.Write(GetValue()); break; - case HbcInstructionOperandType.UInt8: writer.Write(GetValue()); break; - case HbcInstructionOperandType.UInt16: writer.Write(GetValue()); break; - case HbcInstructionOperandType.UInt32: writer.Write(GetValue()); break; - case HbcInstructionOperandType.Addr8: writer.Write(GetValue()); break; - case HbcInstructionOperandType.Addr32: writer.Write(GetValue()); break; - case HbcInstructionOperandType.Imm32: writer.Write(GetValue()); break; - case HbcInstructionOperandType.Double: writer.Write(GetValue()); break; - case HbcInstructionOperandType.UInt8S: writer.Write(GetValue()); break; - case HbcInstructionOperandType.UInt16S: writer.Write(GetValue()); break; - case HbcInstructionOperandType.UInt32S: writer.Write(GetValue()); break; - default: throw new InvalidOperationException("invalid operand type"); - } - } - - /// - /// Reads the operand from a stream of binary data. - /// - public static HbcInstructionOperand FromReader(BinaryReader reader, HbcInstructionOperandType type) { - object rawValue = type switch { - HbcInstructionOperandType.Reg8 => reader.ReadByte(), - HbcInstructionOperandType.Reg32 => reader.ReadUInt32(), - HbcInstructionOperandType.UInt8 => reader.ReadByte(), - HbcInstructionOperandType.UInt16 => reader.ReadUInt16(), - HbcInstructionOperandType.UInt32 => reader.ReadUInt32(), - HbcInstructionOperandType.Addr8 => reader.ReadSByte(), - HbcInstructionOperandType.Addr32 => reader.ReadInt32(), - HbcInstructionOperandType.Imm32 => reader.ReadUInt32(), - HbcInstructionOperandType.Double => reader.ReadDouble(), - HbcInstructionOperandType.UInt8S => reader.ReadByte(), - HbcInstructionOperandType.UInt16S => reader.ReadUInt16(), - HbcInstructionOperandType.UInt32S => reader.ReadUInt32(), - _ => throw new InvalidOperationException("invalid operand type"), - }; - return new HbcInstructionOperand { - Type = type, - Value = new PrimitiveValue(rawValue) - }; - } - - /// - /// Returns the value as the given type. - /// - public T GetValue() { - return Value.GetValue(); - } - - /// - /// Returns the value, or is the value is a string, the string the value points to. - /// - public T GetResolvedValue(HbcFile file) { - return Type switch { - HbcInstructionOperandType.UInt8S => (T)(object)file.StringTable[GetValue()], - HbcInstructionOperandType.UInt16S => (T)(object)file.StringTable[GetValue()], - HbcInstructionOperandType.UInt32S => (T)(object)file.StringTable[GetValue()], - _ => GetValue() - }; - } - - /// - /// Converts a double to a string, catching edge cases. - /// - private string ToDoubleString(double d) { - if (double.IsNegativeInfinity(d)) { - return "-Infinity"; - } else if (double.IsPositiveInfinity(d)) { - return "Infinity"; - } else if (double.IsNaN(d)) { - return "NaN"; - } - - string format = new string('#', 324); // https://stackoverflow.com/a/14964797 - return d.ToString("0." + format); - } - - /// - /// Converts the operand to a human-readable format used for disassembly. - /// - public string ToDisassembly(HbcFile file) { - return Type switch { - HbcInstructionOperandType.Reg8 => $"r{GetValue()}", - HbcInstructionOperandType.Reg32 => $"r{GetValue()}", - HbcInstructionOperandType.UInt8 => GetValue().ToString(), - HbcInstructionOperandType.UInt16 => GetValue().ToString(), - HbcInstructionOperandType.UInt32 => GetValue().ToString(), - HbcInstructionOperandType.Addr8 => $"Addr8({GetValue()})", - HbcInstructionOperandType.Addr32 => $"Addr32({GetValue()})", - HbcInstructionOperandType.Imm32 => GetValue().ToString(), - HbcInstructionOperandType.Double => ToDoubleString(GetValue()), - HbcInstructionOperandType.UInt8S => $"\"{StringEscape.Escape(file.StringTable[GetValue()])}\"", - HbcInstructionOperandType.UInt16S => $"\"{StringEscape.Escape(file.StringTable[GetValue()])}\"", - HbcInstructionOperandType.UInt32S => $"\"{StringEscape.Escape(file.StringTable[GetValue()])}\"", - _ => throw new InvalidOperationException("invalid operand type"), - }; - } - } - /// /// Represents an instruction in Hermes bytecode. /// diff --git a/hasmer/libhasmer/Common/HbcInstructionDefinition.cs b/hasmer/libhasmer/Common/HbcInstructionDefinition.cs new file mode 100644 index 0000000..6a8855f --- /dev/null +++ b/hasmer/libhasmer/Common/HbcInstructionDefinition.cs @@ -0,0 +1,38 @@ +using System.Collections.Generic; +using System.Linq; +using Newtonsoft.Json; + +namespace Hasmer { + /// + /// Represents the definition of an instruction in a JSON bytecode definitions file. + /// + public class HbcInstructionDefinition { + /// + /// The opcode of the instruction in the binary. + /// + [JsonProperty] + public int Opcode { get; set; } + /// + /// The human-readable name of the instruction. + /// + [JsonProperty] + public string Name { get; set; } + /// + /// The types of all the operands the operand handles. + /// + [JsonProperty] + public List OperandTypes { get; set; } + /// + /// true if the operation is a jumping instruction (i.e. changes the current instruction being executed), or otherwise false. + /// + [JsonProperty] + public bool IsJump { get; set; } + /// + /// The index in the abstract definition table of the abstract form of the instruction, or null if the instruction does not have an abstract form. + /// + [JsonProperty] + public int? AbstractDefinition { get; set; } + + public int TotalSize => 1 + OperandTypes.Select(opType => opType.GetSizeof()).Sum(); + } +} diff --git a/hasmer/libhasmer/Common/HbcInstructionOperand.cs b/hasmer/libhasmer/Common/HbcInstructionOperand.cs new file mode 100644 index 0000000..4262dc5 --- /dev/null +++ b/hasmer/libhasmer/Common/HbcInstructionOperand.cs @@ -0,0 +1,109 @@ +using System; +using System.IO; + +namespace Hasmer { + /// + /// Represents an operand of Hermes bytecode instruction. + /// + public class HbcInstructionOperand { + /// + /// The type of operand that is represented by the object. + /// + public HbcInstructionOperandType Type { get; set; } + + /// + /// The raw value of the object, represented as a PrimitiveValue to preserve type information. + ///
+ /// Is is highly recommended to use and + /// instead of accessing this property directly. + /// Use with caution. + ///
+ public PrimitiveValue Value { get; set; } + + /// + /// Writes the operand to a stream of binary data. + /// + public void ToWriter(BinaryWriter writer) { + switch (Type) { + case HbcInstructionOperandType.Reg8: writer.Write(GetValue()); break; + case HbcInstructionOperandType.Reg32: writer.Write(GetValue()); break; + case HbcInstructionOperandType.UInt8: writer.Write(GetValue()); break; + case HbcInstructionOperandType.UInt16: writer.Write(GetValue()); break; + case HbcInstructionOperandType.UInt32: writer.Write(GetValue()); break; + case HbcInstructionOperandType.Addr8: writer.Write(GetValue()); break; + case HbcInstructionOperandType.Addr32: writer.Write(GetValue()); break; + case HbcInstructionOperandType.Imm32: writer.Write(GetValue()); break; + case HbcInstructionOperandType.Double: writer.Write(GetValue()); break; + case HbcInstructionOperandType.UInt8S: writer.Write(GetValue()); break; + case HbcInstructionOperandType.UInt16S: writer.Write(GetValue()); break; + case HbcInstructionOperandType.UInt32S: writer.Write(GetValue()); break; + default: throw new InvalidOperationException("invalid operand type"); + } + } + + /// + /// Reads the operand from a stream of binary data. + /// + public static HbcInstructionOperand FromReader(BinaryReader reader, HbcInstructionOperandType type) { + object rawValue = type switch { + HbcInstructionOperandType.Reg8 => reader.ReadByte(), + HbcInstructionOperandType.Reg32 => reader.ReadUInt32(), + HbcInstructionOperandType.UInt8 => reader.ReadByte(), + HbcInstructionOperandType.UInt16 => reader.ReadUInt16(), + HbcInstructionOperandType.UInt32 => reader.ReadUInt32(), + HbcInstructionOperandType.Addr8 => reader.ReadSByte(), + HbcInstructionOperandType.Addr32 => reader.ReadInt32(), + HbcInstructionOperandType.Imm32 => reader.ReadUInt32(), + HbcInstructionOperandType.Double => reader.ReadDouble(), + HbcInstructionOperandType.UInt8S => reader.ReadByte(), + HbcInstructionOperandType.UInt16S => reader.ReadUInt16(), + HbcInstructionOperandType.UInt32S => reader.ReadUInt32(), + _ => throw new InvalidOperationException("invalid operand type"), + }; + return new HbcInstructionOperand { + Type = type, + Value = new PrimitiveValue(rawValue) + }; + } + + /// + /// Returns the value as the given type. + /// + public T GetValue() { + return Value.GetValue(); + } + + /// + /// Returns the value, or is the value is a string, the string the value points to. + /// + public T GetResolvedValue(HbcFile file) { + return Type switch { + HbcInstructionOperandType.UInt8S => (T)(object)file.GetStringTableEntry((int)GetValue()), + HbcInstructionOperandType.UInt16S => (T)(object)file.GetStringTableEntry((int)GetValue()), + HbcInstructionOperandType.UInt32S => (T)(object)file.GetStringTableEntry((int)GetValue()), + _ => GetValue() + }; + } + + /// + /// Converts the operand to a human-readable format used for disassembly. + /// + public string ToDisassembly(HbcFile file) { + return Type switch { + HbcInstructionOperandType.Reg8 => $"r{GetValue()}", + HbcInstructionOperandType.Reg32 => $"r{GetValue()}", + HbcInstructionOperandType.UInt8 => GetValue().ToString(), + HbcInstructionOperandType.UInt16 => GetValue().ToString(), + HbcInstructionOperandType.UInt32 => GetValue().ToString(), + HbcInstructionOperandType.Addr8 => $"Addr8({GetValue()})", + HbcInstructionOperandType.Addr32 => $"Addr32({GetValue()})", + HbcInstructionOperandType.Imm32 => GetValue().ToString(), + HbcInstructionOperandType.Double => StringEscape.DoubleToString(GetValue()), + HbcInstructionOperandType.UInt8S => file.GetStringTableEntry((int)GetValue()).Printable, + HbcInstructionOperandType.UInt16S => file.GetStringTableEntry((int)GetValue()).Printable, + HbcInstructionOperandType.UInt32S => file.GetStringTableEntry((int)GetValue()).Printable, + _ => throw new InvalidOperationException("invalid operand type"), + }; + } + } +} diff --git a/hasmer/libhasmer/Common/HbcInstructionOperandType.cs b/hasmer/libhasmer/Common/HbcInstructionOperandType.cs new file mode 100644 index 0000000..9606eda --- /dev/null +++ b/hasmer/libhasmer/Common/HbcInstructionOperandType.cs @@ -0,0 +1,97 @@ +using System; +using System.Runtime.Serialization; +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using Newtonsoft.Json.Converters; + +namespace Hasmer { + /// + /// Represents the type of an operand. + /// + [JsonConverter(typeof(StringEnumConverter))] + public enum HbcInstructionOperandType { + /// + /// The operand is a one-byte register reference. + /// + Reg8, + /// + /// The operand is a four-byte register reference. + /// + Reg32, + /// + /// The operand is an unsigned byte. + /// + UInt8, + /// + /// The operand is an unsigned two-byte integer. + /// + UInt16, + /// + /// The operand is an unsigned four-byte integer. + /// + UInt32, + /// + /// The operand is a one-byte code address reference. + /// + Addr8, + /// + /// The operand is a four-byte code address reference. + /// + Addr32, + /// + /// The operand is a four-byte unsigned integer. + /// + Imm32, + /// + /// The operand is an eight-byte IEEE754 floating-point value. + /// + Double, + /// + /// The operand is a one-byte reference to the string table. + /// + UInt8S, + /// + /// The operand is a two-byte reference to the string table. + /// + UInt16S, + /// + /// The operand is a four-byte reference to the string table. + /// + UInt32S + } + + public static class HbcInstructionOperandTypeImpl { + public static int GetSizeof(this HbcInstructionOperandType opType) { + return opType switch { + HbcInstructionOperandType.Reg8 or HbcInstructionOperandType.UInt8 or HbcInstructionOperandType.Addr8 or HbcInstructionOperandType.UInt8S => 1, + HbcInstructionOperandType.UInt16 or HbcInstructionOperandType.UInt16S => 2, + HbcInstructionOperandType.Reg32 or HbcInstructionOperandType.UInt32 or HbcInstructionOperandType.Addr32 or HbcInstructionOperandType.Imm32 or HbcInstructionOperandType.UInt32S => 4, + HbcInstructionOperandType.Double => 8, + _ => throw new Exception("unreachable"), + }; + } + + public static bool CanStoreInteger(this HbcInstructionOperandType opType, ulong integer) { + switch (opType) { + case HbcInstructionOperandType.Reg8: + case HbcInstructionOperandType.UInt8: + case HbcInstructionOperandType.UInt8S: + return integer <= byte.MaxValue; + case HbcInstructionOperandType.UInt16: + case HbcInstructionOperandType.UInt16S: + return integer <= ushort.MaxValue; + case HbcInstructionOperandType.Addr8: + return (long)integer >= sbyte.MinValue && (long)integer <= sbyte.MaxValue; + case HbcInstructionOperandType.Addr32: + return (long)integer >= int.MinValue && (long)integer <= int.MaxValue; + case HbcInstructionOperandType.Imm32: + case HbcInstructionOperandType.Reg32: + case HbcInstructionOperandType.UInt32: + case HbcInstructionOperandType.UInt32S: + return integer <= uint.MaxValue; + default: + throw new Exception($"invalid operand type to store integer: {opType}"); + } + } + } +} diff --git a/hasmer/libhasmer/Common/HbcReader.cs b/hasmer/libhasmer/Common/HbcReader.cs index b3b37d5..a0daa22 100644 --- a/hasmer/libhasmer/Common/HbcReader.cs +++ b/hasmer/libhasmer/Common/HbcReader.cs @@ -44,6 +44,9 @@ public uint ReadBits(int amount) { if (amount > 32) { throw new IndexOutOfRangeException("cannot read more than 32 bits at once"); } + if (amount < 1) { + throw new IndexOutOfRangeException("bits must be >= 1"); + } uint val = 0; for (int i = 0; i < amount; i++) { diff --git a/hasmer/libhasmer/Common/HbcWriter.cs b/hasmer/libhasmer/Common/HbcWriter.cs index 684484c..c5b192f 100644 --- a/hasmer/libhasmer/Common/HbcWriter.cs +++ b/hasmer/libhasmer/Common/HbcWriter.cs @@ -9,8 +9,8 @@ namespace Hasmer { /// Represents a BinaryWriter which can write individual bits. /// public class HbcWriter : BinaryWriter { - // private byte? CurrentByte; - // private int Index; + private byte CurrentByte; + private byte Index; public HbcWriter(Stream stream) : base(stream) { } @@ -22,11 +22,30 @@ public void Align() { } public void WriteBit(byte bit) { - throw new NotImplementedException(); + if (bit == 0) { + CurrentByte &= (byte)~(1 << Index++); + } else { + CurrentByte |= (byte)(1 << Index++); + } + if (Index == 8) { + Write(CurrentByte); + + CurrentByte = 0; + Index = 0; + } } public void WriteBits(uint value, int bitsToWrite) { - throw new NotImplementedException(); + if (bitsToWrite > 32) { + throw new IndexOutOfRangeException("cannot write more than 32 bits at once"); + } + if (bitsToWrite < 1) { + throw new IndexOutOfRangeException("bits must be >= 1"); + } + for (int i = bitsToWrite - 1; i >= 0; i--) { + byte currentBit = (byte)((value >> i) & 1); + WriteBit(currentBit); + } } } } diff --git a/hasmer/libhasmer/Common/JenkinsHash.cs b/hasmer/libhasmer/Common/JenkinsHash.cs new file mode 100644 index 0000000..b9130af --- /dev/null +++ b/hasmer/libhasmer/Common/JenkinsHash.cs @@ -0,0 +1,44 @@ +using System; + +namespace Hasmer { + public class JenkinsHash { + private uint State; + + public void Update(uint x) { + this.State = Mix2(Mix1(this.State + x)); + } + + public uint Finalize() { + uint s = this.State; + this.State = 0; + return s; + } + + private static uint Mix1(uint h) { + return h + (h << 10); + } + + private static uint Mix2(uint h) { + return h ^ (h >> 6); + } + + public static uint Hash(ReadOnlySpan data, bool isUTF16) { + JenkinsHash h = new JenkinsHash(); + if (isUTF16) { + if (data.Length % 2 != 0) { + throw new Exception("UTF-16 data length should be a multiple of 2"); + } + + for (int i = 0; i < data.Length - 1; i += 2) { + uint x = BitConverter.ToUInt16(data.Slice(start: i, length: 2)); + h.Update(x); + } + } else { + foreach (byte x in data) { + h.Update(x); + } + } + return h.Finalize(); + } + } +} diff --git a/hasmer/libhasmer/Common/ObjectDumper.cs b/hasmer/libhasmer/Common/ObjectDumper.cs index 718b02f..368b102 100644 --- a/hasmer/libhasmer/Common/ObjectDumper.cs +++ b/hasmer/libhasmer/Common/ObjectDumper.cs @@ -5,16 +5,16 @@ using System.Text; namespace Hasmer { - internal class ObjectDumper { - private int _level; - private readonly int _indentSize; - private readonly StringBuilder _stringBuilder; - private readonly List _hashListOfFoundElements; + public class ObjectDumper { + private int Level; + private readonly int IndentSize; + private readonly StringBuilder Builder; + private readonly List FoundElements; private ObjectDumper(int indentSize) { - _indentSize = indentSize; - _stringBuilder = new StringBuilder(); - _hashListOfFoundElements = new List(); + IndentSize = indentSize; + Builder = new StringBuilder(); + FoundElements = new List(); } public static string Dump(object element) { @@ -22,7 +22,7 @@ public static string Dump(object element) { } public static string Dump(object element, int indentSize) { - var instance = new ObjectDumper(indentSize); + ObjectDumper instance = new ObjectDumper(indentSize); return instance.DumpElement(element); } @@ -30,107 +30,116 @@ private string DumpElement(object element) { if (element == null || element is ValueType || element is string) { Write(FormatValue(element)); } else { - var objectType = element.GetType(); - if (!typeof(IEnumerable).IsAssignableFrom(objectType)) { + Type objectType = element.GetType(); + IEnumerable enumerableElement = element as IEnumerable; + + if (enumerableElement == null) { Write("{{{0}}}", objectType.FullName); - _hashListOfFoundElements.Add(element.GetHashCode()); - _level++; - } + FoundElements.Add(element.GetHashCode()); + Level++; - var enumerableElement = element as IEnumerable; - if (enumerableElement != null) { - foreach (object item in enumerableElement) { - if (item is IEnumerable && !(item is string)) { - _level++; - DumpElement(item); - _level--; - } else { - if (!AlreadyTouched(item)) - DumpElement(item); - else - Write("{{{0}}} <-- bidirectional reference found", item.GetType().FullName); - } - } - } else { - MemberInfo[] members = element.GetType().GetMembers(BindingFlags.Public | BindingFlags.Instance); - foreach (var memberInfo in members) { - var fieldInfo = memberInfo as FieldInfo; - var propertyInfo = memberInfo as PropertyInfo; + MemberInfo[] members = element.GetType().GetMembers(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance); + foreach (MemberInfo memberInfo in members) { + FieldInfo fieldInfo = memberInfo as FieldInfo; + PropertyInfo propertyInfo = memberInfo as PropertyInfo; - if (fieldInfo == null && propertyInfo == null) + if (fieldInfo == null && propertyInfo == null) { continue; + } - var type = fieldInfo != null ? fieldInfo.FieldType : propertyInfo.PropertyType; + Type type = fieldInfo != null ? fieldInfo.FieldType : propertyInfo.PropertyType; object value = fieldInfo != null - ? fieldInfo.GetValue(element) - : propertyInfo.GetValue(element, null); + ? fieldInfo.GetValue(element) + : propertyInfo.GetValue(element, null); if (type.IsValueType || type == typeof(string)) { Write("{0}: {1}", memberInfo.Name, FormatValue(value)); } else { - var isEnumerable = typeof(IEnumerable).IsAssignableFrom(type); + bool isEnumerable = typeof(IEnumerable).IsAssignableFrom(type); Write("{0}: {1}", memberInfo.Name, isEnumerable ? "..." : "{ }"); - var alreadyTouched = !isEnumerable && AlreadyTouched(value); - _level++; - if (!alreadyTouched) + bool alreadyTouched = !isEnumerable && AlreadyTouched(value); + Level++; + if (!alreadyTouched) { DumpElement(value); - else + } else { Write("{{{0}}} <-- bidirectional reference found", value.GetType().FullName); - _level--; + } + Level--; + } + } + } else { + foreach (object item in enumerableElement) { + if (item is IEnumerable && !(item is string)) { + Level++; + DumpElement(item); + Level--; + } else { + if (!AlreadyTouched(item)) { + DumpElement(item); + } else { + Write("{{{0}}} <-- bidirectional reference found", item.GetType().FullName); + } } } } - if (!typeof(IEnumerable).IsAssignableFrom(objectType)) { - _level--; - } + Level--; } - return _stringBuilder.ToString(); + return Builder.ToString(); } private bool AlreadyTouched(object value) { if (value == null) return false; - var hash = value.GetHashCode(); - for (var i = 0; i < _hashListOfFoundElements.Count; i++) { - if (_hashListOfFoundElements[i] == hash) + int hash = value.GetHashCode(); + for (int i = 0; i < FoundElements.Count; i++) { + if (FoundElements[i] == hash) { return true; + } } return false; } private void Write(string value, params object[] args) { - var space = new string(' ', _level * _indentSize); + string space = new string(' ', Level * IndentSize); - if (args != null) + if (args != null) { value = string.Format(value, args); + } - _stringBuilder.AppendLine(space + value); + Builder.Append(space); + Builder.AppendLine(value); } private string FormatValue(object o) { - if (o == null) - return ("null"); + if (o == null) { + return "null"; + } - if (o is DateTime) - return (((DateTime)o).ToShortDateString()); + if (o is DateTime dt) { + return dt.ToShortDateString(); + } - if (o is string) - return string.Format("\"{0}\"", o); + if (o is string) { + return string.Format($"\"{o}\""); + } - if (o is char && (char)o == '\0') + if (o is char c && c == '\0') { return string.Empty; + } - if (o is ValueType) - return (o.ToString()); + if (o is ValueType) { + return o.ToString(); + } - if (o is IEnumerable) - return ("..."); + if (o is IEnumerable) { + return "..."; + } - return ("{ }"); + return "{ }"; } } } diff --git a/hasmer/libhasmer/Common/PrimitiveValue.cs b/hasmer/libhasmer/Common/PrimitiveValue.cs index 52471e1..41056cd 100644 --- a/hasmer/libhasmer/Common/PrimitiveValue.cs +++ b/hasmer/libhasmer/Common/PrimitiveValue.cs @@ -49,23 +49,36 @@ public void SetValue(object rawValue) { } /// - /// Returns the raw value coerced to type T. It is the duty of the caller to ensure that the type actually is of type T before calling. + /// Returns the raw value coerced to a ulong. + /// The the raw value is not an integer type, an exception is thrown. /// - public T GetValue() { - return Type.GetTypeCode(typeof(T)) switch { - TypeCode.Byte => (T)Convert.ChangeType(Convert.ToByte(RawValue), typeof(T)), - TypeCode.SByte => (T)Convert.ChangeType(Convert.ToSByte(RawValue), typeof(T)), - TypeCode.Int16 => (T)Convert.ChangeType(Convert.ToInt16(RawValue), typeof(T)), - TypeCode.UInt16 => (T)Convert.ChangeType(Convert.ToUInt16(RawValue), typeof(T)), - TypeCode.Int32 => (T)Convert.ChangeType(Convert.ToInt32(RawValue), typeof(T)), - TypeCode.UInt32 => (T)Convert.ChangeType(Convert.ToUInt32(RawValue), typeof(T)), - TypeCode.Double => (T)Convert.ChangeType(Convert.ToDouble(RawValue), typeof(T)), - TypeCode.Boolean => (T)Convert.ChangeType(Convert.ToBoolean(RawValue), typeof(T)), - TypeCode.String => (T)RawValue, - TypeCode.Empty => default(T), - _ => throw new NotImplementedException() - }; - } + public ulong GetIntegerValue() => TypeCode switch { + TypeCode.Byte => (ulong)Convert.ToByte(RawValue), + TypeCode.SByte => (ulong)Convert.ToSByte(RawValue), + TypeCode.Int16 => (ulong)Convert.ToInt16(RawValue), + TypeCode.UInt16 => (ulong)Convert.ToUInt16(RawValue), + TypeCode.Int32 => (ulong)Convert.ToInt32(RawValue), + TypeCode.UInt32 => (ulong)Convert.ToUInt32(RawValue), + _ => throw new Exception("cannot get integer value of non-integer PrimitiveValue"), + }; + + /// + /// Returns the raw value coerced to type T. + /// It is the duty of the caller to ensure that the type actually is of type T before calling. + /// + public T GetValue() => TypeCode switch { + TypeCode.Byte => (T)Convert.ChangeType(Convert.ToByte(RawValue), typeof(T)), + TypeCode.SByte => (T)Convert.ChangeType(Convert.ToSByte(RawValue), typeof(T)), + TypeCode.Int16 => (T)Convert.ChangeType(Convert.ToInt16(RawValue), typeof(T)), + TypeCode.UInt16 => (T)Convert.ChangeType(Convert.ToUInt16(RawValue), typeof(T)), + TypeCode.Int32 => (T)Convert.ChangeType(Convert.ToInt32(RawValue), typeof(T)), + TypeCode.UInt32 => (T)Convert.ChangeType(Convert.ToUInt32(RawValue), typeof(T)), + TypeCode.Double => (T)Convert.ChangeType(Convert.ToDouble(RawValue), typeof(T)), + TypeCode.Boolean => (T)Convert.ChangeType(Convert.ToBoolean(RawValue), typeof(T)), + TypeCode.String => (T)RawValue, + TypeCode.Empty => default(T), + _ => throw new NotImplementedException() + }; public override int GetHashCode() { if (RawValue == null) { @@ -95,7 +108,7 @@ public override string ToString() { TypeCode.UInt16 => Convert.ToUInt16(RawValue).ToString(), TypeCode.Int32 => Convert.ToInt32(RawValue).ToString(), TypeCode.UInt32 => Convert.ToUInt32(RawValue).ToString(), - TypeCode.Double => Convert.ToDouble(RawValue).ToString(), + TypeCode.Double => StringEscape.DoubleToString(Convert.ToDouble(RawValue)), TypeCode.Boolean => Convert.ToBoolean(RawValue) ? "true" : "false", TypeCode.String => (string)RawValue, TypeCode.Empty => "null", diff --git a/hasmer/libhasmer/Common/ResourceManager.cs b/hasmer/libhasmer/Common/ResourceManager.cs index 7b062a4..43a7cef 100644 --- a/hasmer/libhasmer/Common/ResourceManager.cs +++ b/hasmer/libhasmer/Common/ResourceManager.cs @@ -21,6 +21,9 @@ public static string ReadEmbeddedResource(string name) { Assembly assembly = Assembly.GetExecutingAssembly(); using Stream stream = assembly.GetManifestResourceStream("Hasmer.Resources." + name + ".json"); + if (stream == null) { + throw new Exception("embedded resource does not exist: " + name); + } using StreamReader reader = new StreamReader(stream); return reader.ReadToEnd(); } diff --git a/hasmer/libhasmer/Common/StringEscape.cs b/hasmer/libhasmer/Common/StringEscape.cs index abc707f..54ca499 100644 --- a/hasmer/libhasmer/Common/StringEscape.cs +++ b/hasmer/libhasmer/Common/StringEscape.cs @@ -9,24 +9,54 @@ namespace Hasmer { /// Utility for working with string escape codes. /// public class StringEscape { + // Taken from https://stackoverflow.com/a/33697376. + private const string DoubleFixedPoint = "0.###################################################################################################################################################################################################################################################################################################################################################"; + /// - /// Escapes a string, replacing untypable characters and keyword operators with escaped versions. + /// Escapes a string so that it can be used as string literal in Hasm source code. + /// Shamelessly taken from https://stackoverflow.com/a/14087738. /// - public static string Escape(string str) { - return str - .Replace("\n", @"\n") - .Replace("\r", @"\r") - .Replace("\"", "\\\""); + public static string Escape(string s) { + StringBuilder literal = new StringBuilder(s.Length + 2); + literal.Append("\""); + foreach (char c in s) { + switch (c) { + case '\"': literal.Append("\\\""); break; + case '\\': literal.Append(@"\\"); break; + case '\0': literal.Append(@"\0"); break; + case '\a': literal.Append(@"\a"); break; + case '\b': literal.Append(@"\b"); break; + case '\f': literal.Append(@"\f"); break; + case '\n': literal.Append(@"\n"); break; + case '\r': literal.Append(@"\r"); break; + case '\t': literal.Append(@"\t"); break; + case '\v': literal.Append(@"\v"); break; + default: + if (c >= 0x20 && c <= 0x7e) { + // ASCII printable character + literal.Append(c); + } else { + // UTF16 escaped character + literal.Append(@"\u"); + literal.Append(((int)c).ToString("x4")); + } + break; + } + } + literal.Append("\""); + return literal.ToString(); } - /// - /// Unescapes a string, replacing escape codes with their corresponding untypable characters or keyword operators. - /// - public static string Unescape(string str) { - return str - .Replace(@"\n", "\n") - .Replace(@"\r", "\r") - .Replace("\\\"", "\""); + public static string DoubleToString(double d) { + if (double.IsInfinity(d)) { + return "Infinity"; + } else if (double.IsNegativeInfinity(d)) { + return "-Infinity"; + } else if (double.IsNaN(d)) { + return "NaN"; + } else { + return d.ToString(DoubleFixedPoint); + } } } } diff --git a/hasmer/libhasmer/Common/StringKindEntry.cs b/hasmer/libhasmer/Common/StringKindEntry.cs new file mode 100644 index 0000000..bbd0d70 --- /dev/null +++ b/hasmer/libhasmer/Common/StringKindEntry.cs @@ -0,0 +1,42 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Hasmer { + /// + /// Used for determining whether a string is an identifier or a string literal. + /// + [Flags] + public enum StringKind { + /// + /// The string is a string literal, e.g. a string in quotes: `var s = "Hello, World!"`. + /// "Hello, World!" would be encoded as a string literal, i.e. this flag. + /// + Literal = 0 << StringKindEntry.CountBits, + /// + /// The string is an identifier, e.g. the name of a function. + /// + Identifier = 1 << StringKindEntry.CountBits + } + + public struct StringKindEntry { + public const int CountBits = 31; + const uint MaxCount = (1u << CountBits) - 1; + + public uint Entry { get; set; } + + public StringKindEntry(uint entry) { + Entry = entry; + } + + public StringKindEntry(StringKind kind, uint count) { + Entry = (uint)kind | (count & MaxCount); + } + + public StringKind Kind => (StringKind)(Entry & ~MaxCount); + + public int Count => (int)(Entry & MaxCount); + } +} diff --git a/hasmer/libhasmer/Common/StringTableEntry.cs b/hasmer/libhasmer/Common/StringTableEntry.cs new file mode 100644 index 0000000..9d8ef77 --- /dev/null +++ b/hasmer/libhasmer/Common/StringTableEntry.cs @@ -0,0 +1,39 @@ +using System; +using System.Text; +using Hasmer.Decompiler.AST; + +namespace Hasmer { + public class StringTableEntry { + public StringKind Kind { get; private set; } + public string Value { get; private set; } + public bool IsUTF16 { get; private set; } + + public StringTableEntry(StringKind kind, string value, bool isUTF16) { + Kind = kind; + Value = value; + IsUTF16 = isUTF16; + } + + public bool IsIdentifier => Kind == StringKind.Identifier; + public bool IsLiteral => Kind == StringKind.Literal; + public uint Hash => JenkinsHash.Hash(Encoded, IsUTF16); + public byte[] Encoded { + get { + if (IsUTF16) { + return Encoding.Unicode.GetBytes(Value); + } else { + return Encoding.ASCII.GetBytes(Value); + } + } + } + public string Printable { + get { + if (IsIdentifier) { + return new Identifier(Value).ToString(); + } else { + return StringEscape.Escape(Value); + } + } + } + } +} diff --git a/hasmer/libhasmer/Decompiler/AST/Identifier.cs b/hasmer/libhasmer/Decompiler/AST/Identifier.cs index c65adb3..7805f5f 100644 --- a/hasmer/libhasmer/Decompiler/AST/Identifier.cs +++ b/hasmer/libhasmer/Decompiler/AST/Identifier.cs @@ -13,7 +13,7 @@ public class Identifier : SyntaxNode { /// /// A regular expression which represents a valid JavaScript identifier. /// - public static readonly Regex NamePattern = new Regex(@"^([A-Za-z]|_|\$)([A-Za-z]|_|\$|[0-9])+$", RegexOptions.Compiled); + public static readonly Regex NamePattern = new Regex(@"^([A-Za-z]|_|\$)([A-Za-z]|_|\$|[0-9])*$", RegexOptions.Compiled); /// /// The name of the identifier. @@ -40,8 +40,20 @@ public override void WriteDirect(SourceCodeBuilder builder) { builder.Write(Name); } + private static string EscapeIdentifier(string ident) { + return ident.Replace(@"\", @"\\").Replace("<", @"\<").Replace(">", @"\>"); + } + public override string ToString() { - return Name; + if (Name.Length == 0) { + return "<>"; + } else { + if (Identifier.NamePattern.IsMatch(Name)) { + return $"<{Name}>"; + } else { + return $"<{EscapeIdentifier(Name)}>"; + } + } } } } diff --git a/hasmer/libhasmer/Decompiler/Analysis/StaticAnalyzer.cs b/hasmer/libhasmer/Decompiler/Analysis/StaticAnalyzer.cs index f73225f..8814719 100644 --- a/hasmer/libhasmer/Decompiler/Analysis/StaticAnalyzer.cs +++ b/hasmer/libhasmer/Decompiler/Analysis/StaticAnalyzer.cs @@ -33,10 +33,10 @@ private static void OptimizeObjectDeclarations(BlockStatement block) { currentObject = expr; currentObjectName = objName; } else if (currentObject != null && - assn.Left is MemberExpression memberExpr && - memberExpr.Object is Identifier objIndent && - !objIndent.IsRedundant && - objIndent.Name == currentObjectName.Name) { + assn.Left is MemberExpression memberExpr && + memberExpr.Object is Identifier objIndent && + !objIndent.IsRedundant && + objIndent.Name == currentObjectName.Name) { currentObject.Properties.Add(new ObjectExpressionProperty { Key = memberExpr.Property, Value = assn.Right diff --git a/hasmer/libhasmer/Decompiler/Analysis/StaticAnalyzerState.cs b/hasmer/libhasmer/Decompiler/Analysis/StaticAnalyzerState.cs index c722599..5c87439 100644 --- a/hasmer/libhasmer/Decompiler/Analysis/StaticAnalyzerState.cs +++ b/hasmer/libhasmer/Decompiler/Analysis/StaticAnalyzerState.cs @@ -8,7 +8,7 @@ namespace Hasmer.Decompiler.Analysis { public class StaticAnalyzerState { public Dictionary Registers { get; set; } - public List Variables { get; set; } + public List Variables { get; set; } public StaticAnalyzerState() { Registers = new Dictionary(); diff --git a/hasmer/libhasmer/Decompiler/Visitor/EnvironmentOperations.cs b/hasmer/libhasmer/Decompiler/Visitor/EnvironmentOperations.cs index dfb6a45..dbca486 100644 --- a/hasmer/libhasmer/Decompiler/Visitor/EnvironmentOperations.cs +++ b/hasmer/libhasmer/Decompiler/Visitor/EnvironmentOperations.cs @@ -18,7 +18,7 @@ public class EnvironmentIdentifier : SyntaxNode { /// /// The name of the function which defined the environment. /// - public string EnvironmentName => EnvironmentContext.Source.StringTable[EnvironmentContext.Function.FunctionName]; + public string EnvironmentName => EnvironmentContext.Source.GetStringTableEntry((int)EnvironmentContext.Function.FunctionName).Value; public override void WriteDirect(SourceCodeBuilder builder) { throw new Exception(); @@ -100,7 +100,7 @@ public static void StoreToEnvironment(DecompilerContext context) { /// [Visitor] public static void GetNewTarget(DecompilerContext context) { - byte register = context.Instruction.Operands[0].GetValue< byte>(); + byte register = context.Instruction.Operands[0].GetValue(); context.State.Registers[register] = new Identifier("NewTarget"); } diff --git a/hasmer/libhasmer/Decompiler/Visitor/FieldOperations.cs b/hasmer/libhasmer/Decompiler/Visitor/FieldOperations.cs index 88d1900..9574369 100644 --- a/hasmer/libhasmer/Decompiler/Visitor/FieldOperations.cs +++ b/hasmer/libhasmer/Decompiler/Visitor/FieldOperations.cs @@ -155,11 +155,11 @@ public static void PutByVal(DecompilerContext context) { [Visitor] public static void PutById(DecompilerContext context) => - CommonPutById(context, new Identifier(context.Source.StringTable[context.Instruction.Operands[3].GetValue()])); + CommonPutById(context, new Identifier(context.Source.GetStringTableEntry((int)context.Instruction.Operands[3].GetValue()).Value)); [Visitor] public static void PutNewOwnById(DecompilerContext context) => - CommonPutById(context, new Identifier(context.Source.StringTable[context.Instruction.Operands[2].GetValue()])); + CommonPutById(context, new Identifier(context.Source.GetStringTableEntry((int)context.Instruction.Operands[2].GetValue()).Value)); [Visitor] public static void PutOwnByIndex(DecompilerContext context) => diff --git a/hasmer/libhasmer/Decompiler/Visitor/InvokeOperations.cs b/hasmer/libhasmer/Decompiler/Visitor/InvokeOperations.cs index e44cd04..31f1d97 100644 --- a/hasmer/libhasmer/Decompiler/Visitor/InvokeOperations.cs +++ b/hasmer/libhasmer/Decompiler/Visitor/InvokeOperations.cs @@ -40,7 +40,7 @@ private static void AnalyzeCallUsage(DecompilerContext context, byte resultRegis break; } } else if (hasBeenReferenced) { // if there was a reference made, but it was cleared with a different value, stop - break; + break; } } diff --git a/hasmer/libhasmer/Resources/Bytecode40.json b/hasmer/libhasmer/Resources/Bytecode40.json index 4b3ddbd..f4208db 100644 --- a/hasmer/libhasmer/Resources/Bytecode40.json +++ b/hasmer/libhasmer/Resources/Bytecode40.json @@ -1924,6 +1924,5 @@ ] } ], - "GitTag": "v0.0.3", "GitCommitHash": "01deee71329aebaa6bddb291d6695709b90b3c97" } \ No newline at end of file diff --git a/hasmer/libhasmer/Resources/Bytecode41.json b/hasmer/libhasmer/Resources/Bytecode41.json index 6baa32a..4f91751 100644 --- a/hasmer/libhasmer/Resources/Bytecode41.json +++ b/hasmer/libhasmer/Resources/Bytecode41.json @@ -1970,6 +1970,5 @@ ] } ], - "GitTag": "v0.0.3", "GitCommitHash": "cbb5ee0c0f6c180cc45e912d6f396c342e4c717c" } \ No newline at end of file diff --git a/hasmer/libhasmer/Resources/Bytecode42.json b/hasmer/libhasmer/Resources/Bytecode42.json index 5858301..4a62fba 100644 --- a/hasmer/libhasmer/Resources/Bytecode42.json +++ b/hasmer/libhasmer/Resources/Bytecode42.json @@ -1970,6 +1970,5 @@ ] } ], - "GitTag": "v0.0.3", "GitCommitHash": "5397600dd52f1853d3136a404ac3163c0a3e9af0" } \ No newline at end of file diff --git a/hasmer/libhasmer/Resources/Bytecode43.json b/hasmer/libhasmer/Resources/Bytecode43.json index 3f4eee6..59b8a1c 100644 --- a/hasmer/libhasmer/Resources/Bytecode43.json +++ b/hasmer/libhasmer/Resources/Bytecode43.json @@ -1970,6 +1970,5 @@ ] } ], - "GitTag": "v0.0.3", "GitCommitHash": "4ee8ccf03e6385a4921e077b0e9a1a655ce322f8" } \ No newline at end of file diff --git a/hasmer/libhasmer/Resources/Bytecode44.json b/hasmer/libhasmer/Resources/Bytecode44.json index bbcb4fb..457b885 100644 --- a/hasmer/libhasmer/Resources/Bytecode44.json +++ b/hasmer/libhasmer/Resources/Bytecode44.json @@ -1978,6 +1978,5 @@ ] } ], - "GitTag": "v0.0.3", "GitCommitHash": "ea9d1bba9fd20638c8dcc27137fea470e442268c" } \ No newline at end of file diff --git a/hasmer/libhasmer/Resources/Bytecode45.json b/hasmer/libhasmer/Resources/Bytecode45.json index 7376894..33dfa19 100644 --- a/hasmer/libhasmer/Resources/Bytecode45.json +++ b/hasmer/libhasmer/Resources/Bytecode45.json @@ -2019,6 +2019,5 @@ ] } ], - "GitTag": "v0.0.3", "GitCommitHash": "c334f746798c0caa48e339e011dd67b9058503b4" } \ No newline at end of file diff --git a/hasmer/libhasmer/Resources/Bytecode46.json b/hasmer/libhasmer/Resources/Bytecode46.json index 1e2b3ec..1fca0c7 100644 --- a/hasmer/libhasmer/Resources/Bytecode46.json +++ b/hasmer/libhasmer/Resources/Bytecode46.json @@ -2028,6 +2028,5 @@ ] } ], - "GitTag": "v0.0.3", "GitCommitHash": "640e37f3d5b6af5b88c6e568156e58367e9a7a85" } \ No newline at end of file diff --git a/hasmer/libhasmer/Resources/Bytecode47.json b/hasmer/libhasmer/Resources/Bytecode47.json index 3abf111..65dab47 100644 --- a/hasmer/libhasmer/Resources/Bytecode47.json +++ b/hasmer/libhasmer/Resources/Bytecode47.json @@ -2028,6 +2028,5 @@ ] } ], - "GitTag": "v0.0.3", "GitCommitHash": "85f0531ae10ed1513bd8c93c1f33c954356ab2b1" } \ No newline at end of file diff --git a/hasmer/libhasmer/Resources/Bytecode48.json b/hasmer/libhasmer/Resources/Bytecode48.json index 90794cc..b46f79a 100644 --- a/hasmer/libhasmer/Resources/Bytecode48.json +++ b/hasmer/libhasmer/Resources/Bytecode48.json @@ -2028,6 +2028,5 @@ ] } ], - "GitTag": "v0.0.3", "GitCommitHash": "0d8e0c1ac4fb7c24272fe4fcfa959bc549b4d0f7" } \ No newline at end of file diff --git a/hasmer/libhasmer/Resources/Bytecode49.json b/hasmer/libhasmer/Resources/Bytecode49.json index a2a2353..7f7fdd8 100644 --- a/hasmer/libhasmer/Resources/Bytecode49.json +++ b/hasmer/libhasmer/Resources/Bytecode49.json @@ -2028,6 +2028,5 @@ ] } ], - "GitTag": "v0.0.3", "GitCommitHash": "4bef968dafb7bc9b3012910900dcacba9f026c01" } \ No newline at end of file diff --git a/hasmer/libhasmer/Resources/Bytecode50.json b/hasmer/libhasmer/Resources/Bytecode50.json index 607b8de..fcee827 100644 --- a/hasmer/libhasmer/Resources/Bytecode50.json +++ b/hasmer/libhasmer/Resources/Bytecode50.json @@ -2028,6 +2028,5 @@ ] } ], - "GitTag": "v0.0.3", "GitCommitHash": "c2a0873f00486c593eb84c6fac394f6a6175dd3f" } \ No newline at end of file diff --git a/hasmer/libhasmer/Resources/Bytecode51.json b/hasmer/libhasmer/Resources/Bytecode51.json index d4a8b51..12fb290 100644 --- a/hasmer/libhasmer/Resources/Bytecode51.json +++ b/hasmer/libhasmer/Resources/Bytecode51.json @@ -2028,6 +2028,5 @@ ] } ], - "GitTag": "v0.0.3", "GitCommitHash": "445041f8913b28327dc3a90a2819de5e2d7c3e6f" } \ No newline at end of file diff --git a/hasmer/libhasmer/Resources/Bytecode52.json b/hasmer/libhasmer/Resources/Bytecode52.json index f0367f1..5a3b05a 100644 --- a/hasmer/libhasmer/Resources/Bytecode52.json +++ b/hasmer/libhasmer/Resources/Bytecode52.json @@ -2132,6 +2132,5 @@ ] } ], - "GitTag": "v0.0.3", "GitCommitHash": "fcf1a6b28f95ce832a357f77a7564a82153f1f0d" } \ No newline at end of file diff --git a/hasmer/libhasmer/Resources/Bytecode53.json b/hasmer/libhasmer/Resources/Bytecode53.json index 439f9d1..51c17c1 100644 --- a/hasmer/libhasmer/Resources/Bytecode53.json +++ b/hasmer/libhasmer/Resources/Bytecode53.json @@ -2132,6 +2132,5 @@ ] } ], - "GitTag": "v0.0.3", "GitCommitHash": "5d69c95a820ed743f26765cd7233fb314b1958bd" } \ No newline at end of file diff --git a/hasmer/libhasmer/Resources/Bytecode54.json b/hasmer/libhasmer/Resources/Bytecode54.json index ce83c5e..cba01e1 100644 --- a/hasmer/libhasmer/Resources/Bytecode54.json +++ b/hasmer/libhasmer/Resources/Bytecode54.json @@ -2132,6 +2132,5 @@ ] } ], - "GitTag": "v0.0.3", "GitCommitHash": "05910f79afb60bd8e085808f7c5bf681adba7b72" } \ No newline at end of file diff --git a/hasmer/libhasmer/Resources/Bytecode55.json b/hasmer/libhasmer/Resources/Bytecode55.json index 4f3a657..3b0dbfb 100644 --- a/hasmer/libhasmer/Resources/Bytecode55.json +++ b/hasmer/libhasmer/Resources/Bytecode55.json @@ -2132,6 +2132,5 @@ ] } ], - "GitTag": "v0.0.3", "GitCommitHash": "0d2d83d89bead6e3d036c22be6462376e3f928c0" } \ No newline at end of file diff --git a/hasmer/libhasmer/Resources/Bytecode56.json b/hasmer/libhasmer/Resources/Bytecode56.json index 221c344..2a27979 100644 --- a/hasmer/libhasmer/Resources/Bytecode56.json +++ b/hasmer/libhasmer/Resources/Bytecode56.json @@ -2132,6 +2132,5 @@ ] } ], - "GitTag": "v0.0.3", "GitCommitHash": "17816a14bad62dbccb2de75f62eb999b5973ad8b" } \ No newline at end of file diff --git a/hasmer/libhasmer/Resources/Bytecode57.json b/hasmer/libhasmer/Resources/Bytecode57.json index cb147e6..3cddf09 100644 --- a/hasmer/libhasmer/Resources/Bytecode57.json +++ b/hasmer/libhasmer/Resources/Bytecode57.json @@ -2132,6 +2132,5 @@ ] } ], - "GitTag": "v0.0.3", "GitCommitHash": "2b791aab3a569106fcb769c4a9c3c85092eeb5a8" } \ No newline at end of file diff --git a/hasmer/libhasmer/Resources/Bytecode58.json b/hasmer/libhasmer/Resources/Bytecode58.json index 9bffdfe..c61f9d7 100644 --- a/hasmer/libhasmer/Resources/Bytecode58.json +++ b/hasmer/libhasmer/Resources/Bytecode58.json @@ -2132,6 +2132,5 @@ ] } ], - "GitTag": "v0.0.3", "GitCommitHash": "ce9242a487f3ffbde30370cb5b7e936e33ea6b81" } \ No newline at end of file diff --git a/hasmer/libhasmer/Resources/Bytecode59.json b/hasmer/libhasmer/Resources/Bytecode59.json index 5d03371..dbc802f 100644 --- a/hasmer/libhasmer/Resources/Bytecode59.json +++ b/hasmer/libhasmer/Resources/Bytecode59.json @@ -2140,6 +2140,5 @@ ] } ], - "GitTag": "v0.11.0", "GitCommitHash": "f22a18f67da3f03db59c1ec715d6ec3776b03fbf" } \ No newline at end of file diff --git a/hasmer/libhasmer/Resources/Bytecode60.json b/hasmer/libhasmer/Resources/Bytecode60.json index 8148a73..a2e77a8 100644 --- a/hasmer/libhasmer/Resources/Bytecode60.json +++ b/hasmer/libhasmer/Resources/Bytecode60.json @@ -2140,6 +2140,5 @@ ] } ], - "GitTag": "v0.11.0", "GitCommitHash": "d088f6f5fdfd56e0dd946dc53533462fd3505102" } \ No newline at end of file diff --git a/hasmer/libhasmer/Resources/Bytecode61.json b/hasmer/libhasmer/Resources/Bytecode61.json index 4888686..bfee17f 100644 --- a/hasmer/libhasmer/Resources/Bytecode61.json +++ b/hasmer/libhasmer/Resources/Bytecode61.json @@ -2140,6 +2140,5 @@ ] } ], - "GitTag": "v0.11.0", "GitCommitHash": "2ea89f022c502b2bb57d71be910c02623f0df576" } \ No newline at end of file diff --git a/hasmer/libhasmer/Resources/Bytecode62.json b/hasmer/libhasmer/Resources/Bytecode62.json index 0fa3c33..8739b9b 100644 --- a/hasmer/libhasmer/Resources/Bytecode62.json +++ b/hasmer/libhasmer/Resources/Bytecode62.json @@ -2140,6 +2140,5 @@ ] } ], - "GitTag": "v0.11.0", "GitCommitHash": "ae0bc93f49de682c80bcd3c37b6b227dcdf262e8" } \ No newline at end of file diff --git a/hasmer/libhasmer/Resources/Bytecode63.json b/hasmer/libhasmer/Resources/Bytecode63.json index b0f1ac3..177cd69 100644 --- a/hasmer/libhasmer/Resources/Bytecode63.json +++ b/hasmer/libhasmer/Resources/Bytecode63.json @@ -2140,6 +2140,5 @@ ] } ], - "GitTag": "v0.11.0", "GitCommitHash": "8eb59230c5decb290e06bc73f0c9cca426f2f208" } \ No newline at end of file diff --git a/hasmer/libhasmer/Resources/Bytecode64.json b/hasmer/libhasmer/Resources/Bytecode64.json index 06d09b4..37a29c1 100644 --- a/hasmer/libhasmer/Resources/Bytecode64.json +++ b/hasmer/libhasmer/Resources/Bytecode64.json @@ -2140,6 +2140,5 @@ ] } ], - "GitTag": "v0.11.0", "GitCommitHash": "2d326de0c123d230d3e1446e3aec7f43dd4d62b3" } \ No newline at end of file diff --git a/hasmer/libhasmer/Resources/Bytecode65.json b/hasmer/libhasmer/Resources/Bytecode65.json index bf4e092..4251ee4 100644 --- a/hasmer/libhasmer/Resources/Bytecode65.json +++ b/hasmer/libhasmer/Resources/Bytecode65.json @@ -2140,6 +2140,5 @@ ] } ], - "GitTag": "v0.11.0", "GitCommitHash": "28436fbfe9f4ac6a064dd22bd46122117d1080b7" } \ No newline at end of file diff --git a/hasmer/libhasmer/Resources/Bytecode66.json b/hasmer/libhasmer/Resources/Bytecode66.json index 193f983..a47a9b0 100644 --- a/hasmer/libhasmer/Resources/Bytecode66.json +++ b/hasmer/libhasmer/Resources/Bytecode66.json @@ -2140,6 +2140,5 @@ ] } ], - "GitTag": "v0.11.0", "GitCommitHash": "892bf2cf461bfcaea117826ef06a965b1f67e658" } \ No newline at end of file diff --git a/hasmer/libhasmer/Resources/Bytecode67.json b/hasmer/libhasmer/Resources/Bytecode67.json index f7d5307..62ccd45 100644 --- a/hasmer/libhasmer/Resources/Bytecode67.json +++ b/hasmer/libhasmer/Resources/Bytecode67.json @@ -2140,6 +2140,5 @@ ] } ], - "GitTag": "v0.11.0", "GitCommitHash": "f9e263df6ee38acf3aaf8030dc731add113c2155" } \ No newline at end of file diff --git a/hasmer/libhasmer/Resources/Bytecode68.json b/hasmer/libhasmer/Resources/Bytecode68.json index 374d1c3..217a56a 100644 --- a/hasmer/libhasmer/Resources/Bytecode68.json +++ b/hasmer/libhasmer/Resources/Bytecode68.json @@ -2140,6 +2140,5 @@ ] } ], - "GitTag": "v0.11.0", "GitCommitHash": "883eb4df0c2e79220e196bfc93e8b8ff9baa44d6" } \ No newline at end of file diff --git a/hasmer/libhasmer/Resources/Bytecode69.json b/hasmer/libhasmer/Resources/Bytecode69.json index 201c0b4..153a339 100644 --- a/hasmer/libhasmer/Resources/Bytecode69.json +++ b/hasmer/libhasmer/Resources/Bytecode69.json @@ -2140,6 +2140,5 @@ ] } ], - "GitTag": "v0.11.0", "GitCommitHash": "5a402ac42d81470804ac28189cf74433657e0228" } \ No newline at end of file diff --git a/hasmer/libhasmer/Resources/Bytecode70.json b/hasmer/libhasmer/Resources/Bytecode70.json index 52462e4..1b4232b 100644 --- a/hasmer/libhasmer/Resources/Bytecode70.json +++ b/hasmer/libhasmer/Resources/Bytecode70.json @@ -2140,6 +2140,5 @@ ] } ], - "GitTag": "v0.11.0", "GitCommitHash": "fdd3817f87acb715f00a36edf0ea9e1f18f60133" } \ No newline at end of file diff --git a/hasmer/libhasmer/Resources/Bytecode71.json b/hasmer/libhasmer/Resources/Bytecode71.json index bdd340a..33eb8d5 100644 --- a/hasmer/libhasmer/Resources/Bytecode71.json +++ b/hasmer/libhasmer/Resources/Bytecode71.json @@ -2140,6 +2140,5 @@ ] } ], - "GitTag": "v0.11.0", "GitCommitHash": "e5f89a5092db91e582036b691cec1017f6dcdfe7" } \ No newline at end of file diff --git a/hasmer/libhasmer/Resources/Bytecode72.json b/hasmer/libhasmer/Resources/Bytecode72.json index 91985e6..424243c 100644 --- a/hasmer/libhasmer/Resources/Bytecode72.json +++ b/hasmer/libhasmer/Resources/Bytecode72.json @@ -2140,6 +2140,5 @@ ] } ], - "GitTag": "v0.11.0", "GitCommitHash": "d1637f28eb0b3a6055d16e8e4fcb43d2942e35c8" } \ No newline at end of file diff --git a/hasmer/libhasmer/Resources/Bytecode73.json b/hasmer/libhasmer/Resources/Bytecode73.json index fc2b884..a4753a7 100644 --- a/hasmer/libhasmer/Resources/Bytecode73.json +++ b/hasmer/libhasmer/Resources/Bytecode73.json @@ -2168,6 +2168,5 @@ ] } ], - "GitTag": "v0.11.0", "GitCommitHash": "ecded4d4a4aca33c7654b85b8ce3c0b1903bd8fa" } \ No newline at end of file diff --git a/hasmer/libhasmer/Resources/Bytecode74.json b/hasmer/libhasmer/Resources/Bytecode74.json index 318f2e4..1fbc1db 100644 --- a/hasmer/libhasmer/Resources/Bytecode74.json +++ b/hasmer/libhasmer/Resources/Bytecode74.json @@ -2168,6 +2168,5 @@ ] } ], - "GitTag": "v0.11.0", "GitCommitHash": "4f15a2e8af7ff204d99aebd4d31ebcf86e9d7144" } \ No newline at end of file diff --git a/hasmer/libhasmer/Resources/Bytecode75.json b/hasmer/libhasmer/Resources/Bytecode75.json index bf7780b..97fb3f7 100644 --- a/hasmer/libhasmer/Resources/Bytecode75.json +++ b/hasmer/libhasmer/Resources/Bytecode75.json @@ -2168,6 +2168,5 @@ ] } ], - "GitTag": "v0.11.0", "GitCommitHash": "6871396f352ec7eedacf1795d10d28175cffb5ef" } \ No newline at end of file diff --git a/hasmer/libhasmer/Resources/Bytecode76.json b/hasmer/libhasmer/Resources/Bytecode76.json index ba68f06..d6fffe8 100644 --- a/hasmer/libhasmer/Resources/Bytecode76.json +++ b/hasmer/libhasmer/Resources/Bytecode76.json @@ -2168,6 +2168,5 @@ ] } ], - "GitTag": "v0.11.0", "GitCommitHash": "df60b4768ac071dd6ccc6dd08717ece1949c156f" } \ No newline at end of file diff --git a/hasmer/libhasmer/Resources/Bytecode77.json b/hasmer/libhasmer/Resources/Bytecode77.json index 4b38206..acc6d4f 100644 --- a/hasmer/libhasmer/Resources/Bytecode77.json +++ b/hasmer/libhasmer/Resources/Bytecode77.json @@ -2168,6 +2168,5 @@ ] } ], - "GitTag": "v0.11.0", "GitCommitHash": "701b9dd6a70afecaeaf7e4d9bb5b6e843f705294" } \ No newline at end of file diff --git a/hasmer/libhasmer/Resources/Bytecode78.json b/hasmer/libhasmer/Resources/Bytecode78.json index 266158a..1c5ebc1 100644 --- a/hasmer/libhasmer/Resources/Bytecode78.json +++ b/hasmer/libhasmer/Resources/Bytecode78.json @@ -2168,6 +2168,5 @@ ] } ], - "GitTag": "v0.11.0", "GitCommitHash": "c57fde25efaef83cec7e80b27e064d31d7bb166e" } \ No newline at end of file diff --git a/hasmer/libhasmer/Resources/Bytecode79.json b/hasmer/libhasmer/Resources/Bytecode79.json index 4139f48..ee7b492 100644 --- a/hasmer/libhasmer/Resources/Bytecode79.json +++ b/hasmer/libhasmer/Resources/Bytecode79.json @@ -2168,6 +2168,5 @@ ] } ], - "GitTag": "v0.11.0", "GitCommitHash": "05b29726e766594ae0a9be7947dd1378303d9a42" } \ No newline at end of file diff --git a/hasmer/libhasmer/Resources/Bytecode80.json b/hasmer/libhasmer/Resources/Bytecode80.json index 7607f03..316b6aa 100644 --- a/hasmer/libhasmer/Resources/Bytecode80.json +++ b/hasmer/libhasmer/Resources/Bytecode80.json @@ -2187,6 +2187,5 @@ ] } ], - "GitTag": "v0.11.0", "GitCommitHash": "e70045d8430e7913e2f74695402d9fb12214e4f4" } \ No newline at end of file diff --git a/hasmer/libhasmer/Resources/Bytecode81.json b/hasmer/libhasmer/Resources/Bytecode81.json index 11c15a9..5f8403e 100644 --- a/hasmer/libhasmer/Resources/Bytecode81.json +++ b/hasmer/libhasmer/Resources/Bytecode81.json @@ -2234,6 +2234,5 @@ ] } ], - "GitTag": "v0.11.0", "GitCommitHash": "7828e35c26023e9b6554d1dfab704e1007369f0d" } \ No newline at end of file diff --git a/hasmer/libhasmer/Resources/Bytecode82.json b/hasmer/libhasmer/Resources/Bytecode82.json index 61b5e65..90f8f06 100644 --- a/hasmer/libhasmer/Resources/Bytecode82.json +++ b/hasmer/libhasmer/Resources/Bytecode82.json @@ -2234,6 +2234,5 @@ ] } ], - "GitTag": "v0.11.0", "GitCommitHash": "65de349ab1bde8062b54346c2d861cbde71d5841" } \ No newline at end of file diff --git a/hasmer/libhasmer/Resources/Bytecode83.json b/hasmer/libhasmer/Resources/Bytecode83.json index e942e71..7cbe6d5 100644 --- a/hasmer/libhasmer/Resources/Bytecode83.json +++ b/hasmer/libhasmer/Resources/Bytecode83.json @@ -2234,6 +2234,5 @@ ] } ], - "GitTag": "v0.11.0", "GitCommitHash": "7324df965f5ff91b179e3b8a85c243776577cc18" } \ No newline at end of file diff --git a/hasmer/libhasmer/Resources/Bytecode84.json b/hasmer/libhasmer/Resources/Bytecode84.json index 0b58c03..48dcb3a 100644 --- a/hasmer/libhasmer/Resources/Bytecode84.json +++ b/hasmer/libhasmer/Resources/Bytecode84.json @@ -2374,6 +2374,5 @@ ] } ], - "GitTag": "v0.11.0", "GitCommitHash": "c2cd9e385a922f486a55e6bd70db2032f78379ed" } \ No newline at end of file diff --git a/hasmer/libhasmer/Resources/Bytecode85.json b/hasmer/libhasmer/Resources/Bytecode85.json index 14cc633..9c0b997 100644 --- a/hasmer/libhasmer/Resources/Bytecode85.json +++ b/hasmer/libhasmer/Resources/Bytecode85.json @@ -371,6 +371,24 @@ }, { "Opcode": 37, + "Name": "Inc", + "OperandTypes": [ + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 38, + "Name": "Dec", + "OperandTypes": [ + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 39, "Name": "InstanceOf", "OperandTypes": [ "Reg8", @@ -380,7 +398,7 @@ "IsJump": false }, { - "Opcode": 38, + "Opcode": 40, "Name": "IsIn", "OperandTypes": [ "Reg8", @@ -390,7 +408,7 @@ "IsJump": false }, { - "Opcode": 39, + "Opcode": 41, "Name": "GetEnvironment", "OperandTypes": [ "Reg8", @@ -399,7 +417,7 @@ "IsJump": false }, { - "Opcode": 40, + "Opcode": 42, "Name": "StoreToEnvironment", "OperandTypes": [ "Reg8", @@ -410,7 +428,7 @@ "AbstractDefinition": 3 }, { - "Opcode": 41, + "Opcode": 43, "Name": "StoreToEnvironmentL", "OperandTypes": [ "Reg8", @@ -421,7 +439,7 @@ "AbstractDefinition": 3 }, { - "Opcode": 42, + "Opcode": 44, "Name": "StoreNPToEnvironment", "OperandTypes": [ "Reg8", @@ -432,7 +450,7 @@ "AbstractDefinition": 4 }, { - "Opcode": 43, + "Opcode": 45, "Name": "StoreNPToEnvironmentL", "OperandTypes": [ "Reg8", @@ -443,7 +461,7 @@ "AbstractDefinition": 4 }, { - "Opcode": 44, + "Opcode": 46, "Name": "LoadFromEnvironment", "OperandTypes": [ "Reg8", @@ -454,7 +472,7 @@ "AbstractDefinition": 5 }, { - "Opcode": 45, + "Opcode": 47, "Name": "LoadFromEnvironmentL", "OperandTypes": [ "Reg8", @@ -465,7 +483,7 @@ "AbstractDefinition": 5 }, { - "Opcode": 46, + "Opcode": 48, "Name": "GetGlobalObject", "OperandTypes": [ "Reg8" @@ -473,7 +491,7 @@ "IsJump": false }, { - "Opcode": 47, + "Opcode": 49, "Name": "GetNewTarget", "OperandTypes": [ "Reg8" @@ -481,7 +499,7 @@ "IsJump": false }, { - "Opcode": 48, + "Opcode": 50, "Name": "CreateEnvironment", "OperandTypes": [ "Reg8" @@ -489,7 +507,7 @@ "IsJump": false }, { - "Opcode": 49, + "Opcode": 51, "Name": "DeclareGlobalVar", "OperandTypes": [ "UInt32S" @@ -497,7 +515,7 @@ "IsJump": false }, { - "Opcode": 50, + "Opcode": 52, "Name": "GetByIdShort", "OperandTypes": [ "Reg8", @@ -509,7 +527,7 @@ "AbstractDefinition": 6 }, { - "Opcode": 51, + "Opcode": 53, "Name": "GetById", "OperandTypes": [ "Reg8", @@ -521,7 +539,7 @@ "AbstractDefinition": 6 }, { - "Opcode": 52, + "Opcode": 54, "Name": "GetByIdLong", "OperandTypes": [ "Reg8", @@ -533,7 +551,7 @@ "AbstractDefinition": 6 }, { - "Opcode": 53, + "Opcode": 55, "Name": "TryGetById", "OperandTypes": [ "Reg8", @@ -545,7 +563,7 @@ "AbstractDefinition": 7 }, { - "Opcode": 54, + "Opcode": 56, "Name": "TryGetByIdLong", "OperandTypes": [ "Reg8", @@ -557,7 +575,7 @@ "AbstractDefinition": 7 }, { - "Opcode": 55, + "Opcode": 57, "Name": "PutById", "OperandTypes": [ "Reg8", @@ -569,7 +587,7 @@ "AbstractDefinition": 8 }, { - "Opcode": 56, + "Opcode": 58, "Name": "PutByIdLong", "OperandTypes": [ "Reg8", @@ -581,7 +599,7 @@ "AbstractDefinition": 8 }, { - "Opcode": 57, + "Opcode": 59, "Name": "TryPutById", "OperandTypes": [ "Reg8", @@ -593,7 +611,7 @@ "AbstractDefinition": 9 }, { - "Opcode": 58, + "Opcode": 60, "Name": "TryPutByIdLong", "OperandTypes": [ "Reg8", @@ -605,7 +623,7 @@ "AbstractDefinition": 9 }, { - "Opcode": 59, + "Opcode": 61, "Name": "PutNewOwnByIdShort", "OperandTypes": [ "Reg8", @@ -616,7 +634,7 @@ "AbstractDefinition": 10 }, { - "Opcode": 60, + "Opcode": 62, "Name": "PutNewOwnById", "OperandTypes": [ "Reg8", @@ -627,7 +645,7 @@ "AbstractDefinition": 10 }, { - "Opcode": 61, + "Opcode": 63, "Name": "PutNewOwnByIdLong", "OperandTypes": [ "Reg8", @@ -638,7 +656,7 @@ "AbstractDefinition": 10 }, { - "Opcode": 62, + "Opcode": 64, "Name": "PutNewOwnNEById", "OperandTypes": [ "Reg8", @@ -649,7 +667,7 @@ "AbstractDefinition": 11 }, { - "Opcode": 63, + "Opcode": 65, "Name": "PutNewOwnNEByIdLong", "OperandTypes": [ "Reg8", @@ -660,7 +678,7 @@ "AbstractDefinition": 11 }, { - "Opcode": 64, + "Opcode": 66, "Name": "PutOwnByIndex", "OperandTypes": [ "Reg8", @@ -671,7 +689,7 @@ "AbstractDefinition": 12 }, { - "Opcode": 65, + "Opcode": 67, "Name": "PutOwnByIndexL", "OperandTypes": [ "Reg8", @@ -682,7 +700,7 @@ "AbstractDefinition": 12 }, { - "Opcode": 66, + "Opcode": 68, "Name": "PutOwnByVal", "OperandTypes": [ "Reg8", @@ -693,7 +711,7 @@ "IsJump": false }, { - "Opcode": 67, + "Opcode": 69, "Name": "DelById", "OperandTypes": [ "Reg8", @@ -704,7 +722,7 @@ "AbstractDefinition": 13 }, { - "Opcode": 68, + "Opcode": 70, "Name": "DelByIdLong", "OperandTypes": [ "Reg8", @@ -715,7 +733,7 @@ "AbstractDefinition": 13 }, { - "Opcode": 69, + "Opcode": 71, "Name": "GetByVal", "OperandTypes": [ "Reg8", @@ -725,7 +743,7 @@ "IsJump": false }, { - "Opcode": 70, + "Opcode": 72, "Name": "PutByVal", "OperandTypes": [ "Reg8", @@ -735,7 +753,7 @@ "IsJump": false }, { - "Opcode": 71, + "Opcode": 73, "Name": "DelByVal", "OperandTypes": [ "Reg8", @@ -745,7 +763,7 @@ "IsJump": false }, { - "Opcode": 72, + "Opcode": 74, "Name": "PutOwnGetterSetterByVal", "OperandTypes": [ "Reg8", @@ -757,7 +775,7 @@ "IsJump": false }, { - "Opcode": 73, + "Opcode": 75, "Name": "GetPNameList", "OperandTypes": [ "Reg8", @@ -768,7 +786,7 @@ "IsJump": false }, { - "Opcode": 74, + "Opcode": 76, "Name": "GetNextPName", "OperandTypes": [ "Reg8", @@ -780,7 +798,7 @@ "IsJump": false }, { - "Opcode": 75, + "Opcode": 77, "Name": "Call", "OperandTypes": [ "Reg8", @@ -791,7 +809,7 @@ "AbstractDefinition": 14 }, { - "Opcode": 76, + "Opcode": 78, "Name": "Construct", "OperandTypes": [ "Reg8", @@ -802,7 +820,7 @@ "AbstractDefinition": 15 }, { - "Opcode": 77, + "Opcode": 79, "Name": "Call1", "OperandTypes": [ "Reg8", @@ -812,7 +830,7 @@ "IsJump": false }, { - "Opcode": 78, + "Opcode": 80, "Name": "CallDirect", "OperandTypes": [ "Reg8", @@ -823,7 +841,7 @@ "AbstractDefinition": 16 }, { - "Opcode": 79, + "Opcode": 81, "Name": "Call2", "OperandTypes": [ "Reg8", @@ -834,7 +852,7 @@ "IsJump": false }, { - "Opcode": 80, + "Opcode": 82, "Name": "Call3", "OperandTypes": [ "Reg8", @@ -846,7 +864,7 @@ "IsJump": false }, { - "Opcode": 81, + "Opcode": 83, "Name": "Call4", "OperandTypes": [ "Reg8", @@ -859,7 +877,7 @@ "IsJump": false }, { - "Opcode": 82, + "Opcode": 84, "Name": "CallLong", "OperandTypes": [ "Reg8", @@ -870,7 +888,7 @@ "AbstractDefinition": 14 }, { - "Opcode": 83, + "Opcode": 85, "Name": "ConstructLong", "OperandTypes": [ "Reg8", @@ -881,7 +899,7 @@ "AbstractDefinition": 15 }, { - "Opcode": 84, + "Opcode": 86, "Name": "CallDirectLongIndex", "OperandTypes": [ "Reg8", @@ -892,7 +910,7 @@ "AbstractDefinition": 16 }, { - "Opcode": 85, + "Opcode": 87, "Name": "CallBuiltin", "OperandTypes": [ "Reg8", @@ -903,7 +921,7 @@ "AbstractDefinition": 17 }, { - "Opcode": 86, + "Opcode": 88, "Name": "CallBuiltinLong", "OperandTypes": [ "Reg8", @@ -914,7 +932,7 @@ "AbstractDefinition": 17 }, { - "Opcode": 87, + "Opcode": 89, "Name": "GetBuiltinClosure", "OperandTypes": [ "Reg8", @@ -923,7 +941,7 @@ "IsJump": false }, { - "Opcode": 88, + "Opcode": 90, "Name": "Ret", "OperandTypes": [ "Reg8" @@ -931,7 +949,7 @@ "IsJump": false }, { - "Opcode": 89, + "Opcode": 91, "Name": "Catch", "OperandTypes": [ "Reg8" @@ -939,7 +957,7 @@ "IsJump": false }, { - "Opcode": 90, + "Opcode": 92, "Name": "DirectEval", "OperandTypes": [ "Reg8", @@ -948,7 +966,7 @@ "IsJump": false }, { - "Opcode": 91, + "Opcode": 93, "Name": "Throw", "OperandTypes": [ "Reg8" @@ -956,7 +974,7 @@ "IsJump": false }, { - "Opcode": 92, + "Opcode": 94, "Name": "ThrowIfEmpty", "OperandTypes": [ "Reg8", @@ -965,19 +983,19 @@ "IsJump": false }, { - "Opcode": 93, + "Opcode": 95, "Name": "Debugger", "OperandTypes": [], "IsJump": false }, { - "Opcode": 94, + "Opcode": 96, "Name": "AsyncBreakCheck", "OperandTypes": [], "IsJump": false }, { - "Opcode": 95, + "Opcode": 97, "Name": "ProfilePoint", "OperandTypes": [ "UInt16" @@ -985,7 +1003,7 @@ "IsJump": false }, { - "Opcode": 96, + "Opcode": 98, "Name": "CreateClosure", "OperandTypes": [ "Reg8", @@ -996,7 +1014,7 @@ "AbstractDefinition": 18 }, { - "Opcode": 97, + "Opcode": 99, "Name": "CreateClosureLongIndex", "OperandTypes": [ "Reg8", @@ -1007,7 +1025,7 @@ "AbstractDefinition": 18 }, { - "Opcode": 98, + "Opcode": 100, "Name": "CreateGeneratorClosure", "OperandTypes": [ "Reg8", @@ -1018,7 +1036,7 @@ "AbstractDefinition": 19 }, { - "Opcode": 99, + "Opcode": 101, "Name": "CreateGeneratorClosureLongIndex", "OperandTypes": [ "Reg8", @@ -1029,7 +1047,7 @@ "AbstractDefinition": 19 }, { - "Opcode": 100, + "Opcode": 102, "Name": "CreateAsyncClosure", "OperandTypes": [ "Reg8", @@ -1040,7 +1058,7 @@ "AbstractDefinition": 20 }, { - "Opcode": 101, + "Opcode": 103, "Name": "CreateAsyncClosureLongIndex", "OperandTypes": [ "Reg8", @@ -1051,7 +1069,7 @@ "AbstractDefinition": 20 }, { - "Opcode": 102, + "Opcode": 104, "Name": "CreateThis", "OperandTypes": [ "Reg8", @@ -1061,7 +1079,7 @@ "IsJump": false }, { - "Opcode": 103, + "Opcode": 105, "Name": "SelectObject", "OperandTypes": [ "Reg8", @@ -1071,7 +1089,7 @@ "IsJump": false }, { - "Opcode": 104, + "Opcode": 106, "Name": "LoadParam", "OperandTypes": [ "Reg8", @@ -1081,7 +1099,7 @@ "AbstractDefinition": 21 }, { - "Opcode": 105, + "Opcode": 107, "Name": "LoadParamLong", "OperandTypes": [ "Reg8", @@ -1091,7 +1109,7 @@ "AbstractDefinition": 21 }, { - "Opcode": 106, + "Opcode": 108, "Name": "LoadConstUInt8", "OperandTypes": [ "Reg8", @@ -1100,7 +1118,7 @@ "IsJump": false }, { - "Opcode": 107, + "Opcode": 109, "Name": "LoadConstInt", "OperandTypes": [ "Reg8", @@ -1109,7 +1127,7 @@ "IsJump": false }, { - "Opcode": 108, + "Opcode": 110, "Name": "LoadConstDouble", "OperandTypes": [ "Reg8", @@ -1118,7 +1136,7 @@ "IsJump": false }, { - "Opcode": 109, + "Opcode": 111, "Name": "LoadConstString", "OperandTypes": [ "Reg8", @@ -1128,7 +1146,7 @@ "AbstractDefinition": 22 }, { - "Opcode": 110, + "Opcode": 112, "Name": "LoadConstStringLongIndex", "OperandTypes": [ "Reg8", @@ -1138,7 +1156,7 @@ "AbstractDefinition": 22 }, { - "Opcode": 111, + "Opcode": 113, "Name": "LoadConstEmpty", "OperandTypes": [ "Reg8" @@ -1146,7 +1164,7 @@ "IsJump": false }, { - "Opcode": 112, + "Opcode": 114, "Name": "LoadConstUndefined", "OperandTypes": [ "Reg8" @@ -1154,7 +1172,7 @@ "IsJump": false }, { - "Opcode": 113, + "Opcode": 115, "Name": "LoadConstNull", "OperandTypes": [ "Reg8" @@ -1162,7 +1180,7 @@ "IsJump": false }, { - "Opcode": 114, + "Opcode": 116, "Name": "LoadConstTrue", "OperandTypes": [ "Reg8" @@ -1170,7 +1188,7 @@ "IsJump": false }, { - "Opcode": 115, + "Opcode": 117, "Name": "LoadConstFalse", "OperandTypes": [ "Reg8" @@ -1178,7 +1196,7 @@ "IsJump": false }, { - "Opcode": 116, + "Opcode": 118, "Name": "LoadConstZero", "OperandTypes": [ "Reg8" @@ -1186,7 +1204,7 @@ "IsJump": false }, { - "Opcode": 117, + "Opcode": 119, "Name": "CoerceThisNS", "OperandTypes": [ "Reg8", @@ -1195,7 +1213,7 @@ "IsJump": false }, { - "Opcode": 118, + "Opcode": 120, "Name": "LoadThisNS", "OperandTypes": [ "Reg8" @@ -1203,7 +1221,7 @@ "IsJump": false }, { - "Opcode": 119, + "Opcode": 121, "Name": "ToNumber", "OperandTypes": [ "Reg8", @@ -1212,7 +1230,7 @@ "IsJump": false }, { - "Opcode": 120, + "Opcode": 122, "Name": "ToInt32", "OperandTypes": [ "Reg8", @@ -1221,7 +1239,7 @@ "IsJump": false }, { - "Opcode": 121, + "Opcode": 123, "Name": "AddEmptyString", "OperandTypes": [ "Reg8", @@ -1230,7 +1248,7 @@ "IsJump": false }, { - "Opcode": 122, + "Opcode": 124, "Name": "GetArgumentsPropByVal", "OperandTypes": [ "Reg8", @@ -1240,7 +1258,7 @@ "IsJump": false }, { - "Opcode": 123, + "Opcode": 125, "Name": "GetArgumentsLength", "OperandTypes": [ "Reg8", @@ -1249,7 +1267,7 @@ "IsJump": false }, { - "Opcode": 124, + "Opcode": 126, "Name": "ReifyArguments", "OperandTypes": [ "Reg8" @@ -1257,7 +1275,7 @@ "IsJump": false }, { - "Opcode": 125, + "Opcode": 127, "Name": "CreateRegExp", "OperandTypes": [ "Reg8", @@ -1268,7 +1286,7 @@ "IsJump": false }, { - "Opcode": 126, + "Opcode": 128, "Name": "SwitchImm", "OperandTypes": [ "Reg8", @@ -1280,13 +1298,13 @@ "IsJump": false }, { - "Opcode": 127, + "Opcode": 129, "Name": "StartGenerator", "OperandTypes": [], "IsJump": false }, { - "Opcode": 128, + "Opcode": 130, "Name": "ResumeGenerator", "OperandTypes": [ "Reg8", @@ -1295,13 +1313,13 @@ "IsJump": false }, { - "Opcode": 129, + "Opcode": 131, "Name": "CompleteGenerator", "OperandTypes": [], "IsJump": false }, { - "Opcode": 130, + "Opcode": 132, "Name": "CreateGenerator", "OperandTypes": [ "Reg8", @@ -1312,7 +1330,7 @@ "AbstractDefinition": 23 }, { - "Opcode": 131, + "Opcode": 133, "Name": "CreateGeneratorLongIndex", "OperandTypes": [ "Reg8", @@ -1323,7 +1341,7 @@ "AbstractDefinition": 23 }, { - "Opcode": 132, + "Opcode": 134, "Name": "IteratorBegin", "OperandTypes": [ "Reg8", @@ -1332,7 +1350,7 @@ "IsJump": false }, { - "Opcode": 133, + "Opcode": 135, "Name": "IteratorNext", "OperandTypes": [ "Reg8", @@ -1342,7 +1360,7 @@ "IsJump": false }, { - "Opcode": 134, + "Opcode": 136, "Name": "IteratorClose", "OperandTypes": [ "Reg8", @@ -1351,7 +1369,7 @@ "IsJump": false }, { - "Opcode": 135, + "Opcode": 137, "Name": "Jmp", "OperandTypes": [ "Addr8" @@ -1360,7 +1378,7 @@ "AbstractDefinition": 24 }, { - "Opcode": 136, + "Opcode": 138, "Name": "JmpLong", "OperandTypes": [ "Addr32" @@ -1369,7 +1387,7 @@ "AbstractDefinition": 24 }, { - "Opcode": 137, + "Opcode": 139, "Name": "JmpTrue", "OperandTypes": [ "Addr8", @@ -1379,7 +1397,7 @@ "AbstractDefinition": 25 }, { - "Opcode": 138, + "Opcode": 140, "Name": "JmpTrueLong", "OperandTypes": [ "Addr32", @@ -1389,7 +1407,7 @@ "AbstractDefinition": 25 }, { - "Opcode": 139, + "Opcode": 141, "Name": "JmpFalse", "OperandTypes": [ "Addr8", @@ -1399,7 +1417,7 @@ "AbstractDefinition": 26 }, { - "Opcode": 140, + "Opcode": 142, "Name": "JmpFalseLong", "OperandTypes": [ "Addr32", @@ -1409,7 +1427,7 @@ "AbstractDefinition": 26 }, { - "Opcode": 141, + "Opcode": 143, "Name": "JmpUndefined", "OperandTypes": [ "Addr8", @@ -1419,7 +1437,7 @@ "AbstractDefinition": 27 }, { - "Opcode": 142, + "Opcode": 144, "Name": "JmpUndefinedLong", "OperandTypes": [ "Addr32", @@ -1429,7 +1447,7 @@ "AbstractDefinition": 27 }, { - "Opcode": 143, + "Opcode": 145, "Name": "SaveGenerator", "OperandTypes": [ "Addr8" @@ -1438,7 +1456,7 @@ "AbstractDefinition": 28 }, { - "Opcode": 144, + "Opcode": 146, "Name": "SaveGeneratorLong", "OperandTypes": [ "Addr32" @@ -1447,7 +1465,7 @@ "AbstractDefinition": 28 }, { - "Opcode": 145, + "Opcode": 147, "Name": "JLess", "OperandTypes": [ "Addr8", @@ -1458,7 +1476,7 @@ "AbstractDefinition": 29 }, { - "Opcode": 146, + "Opcode": 148, "Name": "JLessLong", "OperandTypes": [ "Addr32", @@ -1469,7 +1487,7 @@ "AbstractDefinition": 29 }, { - "Opcode": 147, + "Opcode": 149, "Name": "JNotLess", "OperandTypes": [ "Addr8", @@ -1480,7 +1498,7 @@ "AbstractDefinition": 30 }, { - "Opcode": 148, + "Opcode": 150, "Name": "JNotLessLong", "OperandTypes": [ "Addr32", @@ -1491,7 +1509,7 @@ "AbstractDefinition": 30 }, { - "Opcode": 149, + "Opcode": 151, "Name": "JLessN", "OperandTypes": [ "Addr8", @@ -1502,7 +1520,7 @@ "AbstractDefinition": 31 }, { - "Opcode": 150, + "Opcode": 152, "Name": "JLessNLong", "OperandTypes": [ "Addr32", @@ -1513,7 +1531,7 @@ "AbstractDefinition": 31 }, { - "Opcode": 151, + "Opcode": 153, "Name": "JNotLessN", "OperandTypes": [ "Addr8", @@ -1524,7 +1542,7 @@ "AbstractDefinition": 32 }, { - "Opcode": 152, + "Opcode": 154, "Name": "JNotLessNLong", "OperandTypes": [ "Addr32", @@ -1535,7 +1553,7 @@ "AbstractDefinition": 32 }, { - "Opcode": 153, + "Opcode": 155, "Name": "JLessEqual", "OperandTypes": [ "Addr8", @@ -1546,7 +1564,7 @@ "AbstractDefinition": 33 }, { - "Opcode": 154, + "Opcode": 156, "Name": "JLessEqualLong", "OperandTypes": [ "Addr32", @@ -1557,7 +1575,7 @@ "AbstractDefinition": 33 }, { - "Opcode": 155, + "Opcode": 157, "Name": "JNotLessEqual", "OperandTypes": [ "Addr8", @@ -1568,7 +1586,7 @@ "AbstractDefinition": 34 }, { - "Opcode": 156, + "Opcode": 158, "Name": "JNotLessEqualLong", "OperandTypes": [ "Addr32", @@ -1579,7 +1597,7 @@ "AbstractDefinition": 34 }, { - "Opcode": 157, + "Opcode": 159, "Name": "JLessEqualN", "OperandTypes": [ "Addr8", @@ -1590,7 +1608,7 @@ "AbstractDefinition": 35 }, { - "Opcode": 158, + "Opcode": 160, "Name": "JLessEqualNLong", "OperandTypes": [ "Addr32", @@ -1601,7 +1619,7 @@ "AbstractDefinition": 35 }, { - "Opcode": 159, + "Opcode": 161, "Name": "JNotLessEqualN", "OperandTypes": [ "Addr8", @@ -1612,7 +1630,7 @@ "AbstractDefinition": 36 }, { - "Opcode": 160, + "Opcode": 162, "Name": "JNotLessEqualNLong", "OperandTypes": [ "Addr32", @@ -1623,7 +1641,7 @@ "AbstractDefinition": 36 }, { - "Opcode": 161, + "Opcode": 163, "Name": "JGreater", "OperandTypes": [ "Addr8", @@ -1634,7 +1652,7 @@ "AbstractDefinition": 37 }, { - "Opcode": 162, + "Opcode": 164, "Name": "JGreaterLong", "OperandTypes": [ "Addr32", @@ -1645,7 +1663,7 @@ "AbstractDefinition": 37 }, { - "Opcode": 163, + "Opcode": 165, "Name": "JNotGreater", "OperandTypes": [ "Addr8", @@ -1656,7 +1674,7 @@ "AbstractDefinition": 38 }, { - "Opcode": 164, + "Opcode": 166, "Name": "JNotGreaterLong", "OperandTypes": [ "Addr32", @@ -1667,7 +1685,7 @@ "AbstractDefinition": 38 }, { - "Opcode": 165, + "Opcode": 167, "Name": "JGreaterN", "OperandTypes": [ "Addr8", @@ -1678,7 +1696,7 @@ "AbstractDefinition": 39 }, { - "Opcode": 166, + "Opcode": 168, "Name": "JGreaterNLong", "OperandTypes": [ "Addr32", @@ -1689,7 +1707,7 @@ "AbstractDefinition": 39 }, { - "Opcode": 167, + "Opcode": 169, "Name": "JNotGreaterN", "OperandTypes": [ "Addr8", @@ -1700,7 +1718,7 @@ "AbstractDefinition": 40 }, { - "Opcode": 168, + "Opcode": 170, "Name": "JNotGreaterNLong", "OperandTypes": [ "Addr32", @@ -1711,7 +1729,7 @@ "AbstractDefinition": 40 }, { - "Opcode": 169, + "Opcode": 171, "Name": "JGreaterEqual", "OperandTypes": [ "Addr8", @@ -1722,7 +1740,7 @@ "AbstractDefinition": 41 }, { - "Opcode": 170, + "Opcode": 172, "Name": "JGreaterEqualLong", "OperandTypes": [ "Addr32", @@ -1733,7 +1751,7 @@ "AbstractDefinition": 41 }, { - "Opcode": 171, + "Opcode": 173, "Name": "JNotGreaterEqual", "OperandTypes": [ "Addr8", @@ -1744,7 +1762,7 @@ "AbstractDefinition": 42 }, { - "Opcode": 172, + "Opcode": 174, "Name": "JNotGreaterEqualLong", "OperandTypes": [ "Addr32", @@ -1755,7 +1773,7 @@ "AbstractDefinition": 42 }, { - "Opcode": 173, + "Opcode": 175, "Name": "JGreaterEqualN", "OperandTypes": [ "Addr8", @@ -1766,7 +1784,7 @@ "AbstractDefinition": 43 }, { - "Opcode": 174, + "Opcode": 176, "Name": "JGreaterEqualNLong", "OperandTypes": [ "Addr32", @@ -1777,7 +1795,7 @@ "AbstractDefinition": 43 }, { - "Opcode": 175, + "Opcode": 177, "Name": "JNotGreaterEqualN", "OperandTypes": [ "Addr8", @@ -1788,7 +1806,7 @@ "AbstractDefinition": 44 }, { - "Opcode": 176, + "Opcode": 178, "Name": "JNotGreaterEqualNLong", "OperandTypes": [ "Addr32", @@ -1799,7 +1817,7 @@ "AbstractDefinition": 44 }, { - "Opcode": 177, + "Opcode": 179, "Name": "JEqual", "OperandTypes": [ "Addr8", @@ -1810,7 +1828,7 @@ "AbstractDefinition": 45 }, { - "Opcode": 178, + "Opcode": 180, "Name": "JEqualLong", "OperandTypes": [ "Addr32", @@ -1821,7 +1839,7 @@ "AbstractDefinition": 45 }, { - "Opcode": 179, + "Opcode": 181, "Name": "JNotEqual", "OperandTypes": [ "Addr8", @@ -1832,7 +1850,7 @@ "AbstractDefinition": 46 }, { - "Opcode": 180, + "Opcode": 182, "Name": "JNotEqualLong", "OperandTypes": [ "Addr32", @@ -1843,7 +1861,7 @@ "AbstractDefinition": 46 }, { - "Opcode": 181, + "Opcode": 183, "Name": "JStrictEqual", "OperandTypes": [ "Addr8", @@ -1854,7 +1872,7 @@ "AbstractDefinition": 47 }, { - "Opcode": 182, + "Opcode": 184, "Name": "JStrictEqualLong", "OperandTypes": [ "Addr32", @@ -1865,7 +1883,7 @@ "AbstractDefinition": 47 }, { - "Opcode": 183, + "Opcode": 185, "Name": "JStrictNotEqual", "OperandTypes": [ "Addr8", @@ -1876,7 +1894,7 @@ "AbstractDefinition": 48 }, { - "Opcode": 184, + "Opcode": 186, "Name": "JStrictNotEqualLong", "OperandTypes": [ "Addr32", @@ -1887,7 +1905,7 @@ "AbstractDefinition": 48 }, { - "Opcode": 185, + "Opcode": 187, "Name": "Add32", "OperandTypes": [ "Reg8", @@ -1897,7 +1915,7 @@ "IsJump": false }, { - "Opcode": 186, + "Opcode": 188, "Name": "Sub32", "OperandTypes": [ "Reg8", @@ -1907,7 +1925,7 @@ "IsJump": false }, { - "Opcode": 187, + "Opcode": 189, "Name": "Mul32", "OperandTypes": [ "Reg8", @@ -1917,7 +1935,7 @@ "IsJump": false }, { - "Opcode": 188, + "Opcode": 190, "Name": "Divi32", "OperandTypes": [ "Reg8", @@ -1927,7 +1945,7 @@ "IsJump": false }, { - "Opcode": 189, + "Opcode": 191, "Name": "Divu32", "OperandTypes": [ "Reg8", @@ -1937,7 +1955,7 @@ "IsJump": false }, { - "Opcode": 190, + "Opcode": 192, "Name": "Loadi8", "OperandTypes": [ "Reg8", @@ -1947,7 +1965,7 @@ "IsJump": false }, { - "Opcode": 191, + "Opcode": 193, "Name": "Loadu8", "OperandTypes": [ "Reg8", @@ -1957,7 +1975,7 @@ "IsJump": false }, { - "Opcode": 192, + "Opcode": 194, "Name": "Loadi16", "OperandTypes": [ "Reg8", @@ -1967,7 +1985,7 @@ "IsJump": false }, { - "Opcode": 193, + "Opcode": 195, "Name": "Loadu16", "OperandTypes": [ "Reg8", @@ -1977,7 +1995,7 @@ "IsJump": false }, { - "Opcode": 194, + "Opcode": 196, "Name": "Loadi32", "OperandTypes": [ "Reg8", @@ -1987,7 +2005,7 @@ "IsJump": false }, { - "Opcode": 195, + "Opcode": 197, "Name": "Loadu32", "OperandTypes": [ "Reg8", @@ -1997,7 +2015,7 @@ "IsJump": false }, { - "Opcode": 196, + "Opcode": 198, "Name": "Store8", "OperandTypes": [ "Reg8", @@ -2007,7 +2025,7 @@ "IsJump": false }, { - "Opcode": 197, + "Opcode": 199, "Name": "Store16", "OperandTypes": [ "Reg8", @@ -2017,7 +2035,7 @@ "IsJump": false }, { - "Opcode": 198, + "Opcode": 200, "Name": "Store32", "OperandTypes": [ "Reg8", @@ -2051,329 +2069,328 @@ }, { "Name": "StoreToEnvironment", - "VariantOpcodes": [ - 40, - 41 - ] - }, - { - "Name": "StoreNPToEnvironment", "VariantOpcodes": [ 42, 43 ] }, { - "Name": "LoadFromEnvironment", + "Name": "StoreNPToEnvironment", "VariantOpcodes": [ 44, 45 ] }, { - "Name": "GetById", + "Name": "LoadFromEnvironment", "VariantOpcodes": [ - 51, - 50, - 52 + 46, + 47 ] }, { - "Name": "TryGetById", + "Name": "GetById", "VariantOpcodes": [ 53, + 52, 54 ] }, { - "Name": "PutById", + "Name": "TryGetById", "VariantOpcodes": [ 55, 56 ] }, { - "Name": "TryPutById", + "Name": "PutById", "VariantOpcodes": [ 57, 58 ] }, { - "Name": "PutNewOwnById", + "Name": "TryPutById", "VariantOpcodes": [ - 60, 59, - 61 + 60 ] }, { - "Name": "PutNewOwnNEById", + "Name": "PutNewOwnById", "VariantOpcodes": [ 62, + 61, 63 ] }, { - "Name": "PutOwnByIndex", + "Name": "PutNewOwnNEById", "VariantOpcodes": [ 64, 65 ] }, + { + "Name": "PutOwnByIndex", + "VariantOpcodes": [ + 66, + 67 + ] + }, { "Name": "DelById", "VariantOpcodes": [ - 67, - 68 + 69, + 70 ] }, { "Name": "Call", "VariantOpcodes": [ - 75, - 82 + 77, + 84 ] }, { "Name": "Construct", "VariantOpcodes": [ - 76, - 83 + 78, + 85 ] }, { "Name": "CallDirect", "VariantOpcodes": [ - 78, - 84 + 80, + 86 ] }, { "Name": "CallBuiltin", "VariantOpcodes": [ - 85, - 86 + 87, + 88 ] }, { "Name": "CreateClosure", "VariantOpcodes": [ - 96, - 97 + 98, + 99 ] }, { "Name": "CreateGeneratorClosure", "VariantOpcodes": [ - 98, - 99 + 100, + 101 ] }, { "Name": "CreateAsyncClosure", "VariantOpcodes": [ - 100, - 101 + 102, + 103 ] }, { "Name": "LoadParam", "VariantOpcodes": [ - 104, - 105 + 106, + 107 ] }, { "Name": "LoadConstString", "VariantOpcodes": [ - 109, - 110 + 111, + 112 ] }, { "Name": "CreateGenerator", "VariantOpcodes": [ - 130, - 131 + 132, + 133 ] }, { "Name": "Jmp", - "VariantOpcodes": [ - 135, - 136 - ] - }, - { - "Name": "JmpTrue", "VariantOpcodes": [ 137, 138 ] }, { - "Name": "JmpFalse", + "Name": "JmpTrue", "VariantOpcodes": [ 139, 140 ] }, { - "Name": "JmpUndefined", + "Name": "JmpFalse", "VariantOpcodes": [ 141, 142 ] }, { - "Name": "SaveGenerator", + "Name": "JmpUndefined", "VariantOpcodes": [ 143, 144 ] }, { - "Name": "JLess", + "Name": "SaveGenerator", "VariantOpcodes": [ 145, 146 ] }, { - "Name": "JNotLess", + "Name": "JLess", "VariantOpcodes": [ 147, 148 ] }, { - "Name": "JLessN", + "Name": "JNotLess", "VariantOpcodes": [ 149, 150 ] }, { - "Name": "JNotLessN", + "Name": "JLessN", "VariantOpcodes": [ 151, 152 ] }, { - "Name": "JLessEqual", + "Name": "JNotLessN", "VariantOpcodes": [ 153, 154 ] }, { - "Name": "JNotLessEqual", + "Name": "JLessEqual", "VariantOpcodes": [ 155, 156 ] }, { - "Name": "JLessEqualN", + "Name": "JNotLessEqual", "VariantOpcodes": [ 157, 158 ] }, { - "Name": "JNotLessEqualN", + "Name": "JLessEqualN", "VariantOpcodes": [ 159, 160 ] }, { - "Name": "JGreater", + "Name": "JNotLessEqualN", "VariantOpcodes": [ 161, 162 ] }, { - "Name": "JNotGreater", + "Name": "JGreater", "VariantOpcodes": [ 163, 164 ] }, { - "Name": "JGreaterN", + "Name": "JNotGreater", "VariantOpcodes": [ 165, 166 ] }, { - "Name": "JNotGreaterN", + "Name": "JGreaterN", "VariantOpcodes": [ 167, 168 ] }, { - "Name": "JGreaterEqual", + "Name": "JNotGreaterN", "VariantOpcodes": [ 169, 170 ] }, { - "Name": "JNotGreaterEqual", + "Name": "JGreaterEqual", "VariantOpcodes": [ 171, 172 ] }, { - "Name": "JGreaterEqualN", + "Name": "JNotGreaterEqual", "VariantOpcodes": [ 173, 174 ] }, { - "Name": "JNotGreaterEqualN", + "Name": "JGreaterEqualN", "VariantOpcodes": [ 175, 176 ] }, { - "Name": "JEqual", + "Name": "JNotGreaterEqualN", "VariantOpcodes": [ 177, 178 ] }, { - "Name": "JNotEqual", + "Name": "JEqual", "VariantOpcodes": [ 179, 180 ] }, { - "Name": "JStrictEqual", + "Name": "JNotEqual", "VariantOpcodes": [ 181, 182 ] }, { - "Name": "JStrictNotEqual", + "Name": "JStrictEqual", "VariantOpcodes": [ 183, 184 ] + }, + { + "Name": "JStrictNotEqual", + "VariantOpcodes": [ + 185, + 186 + ] } ], - "GitTag": "v0.11.0", - "GitCommitHash": "1cc6e722ea9dd9f53def90bb88fbefeca99739b9" + "GitCommitHash": "b74eb2d5bff8ffbfa6914746261c4efd2c4223c5" } \ No newline at end of file diff --git a/hasmer/libhasmer/Resources/Bytecode86.json b/hasmer/libhasmer/Resources/Bytecode86.json index ccc6831..85f522f 100644 --- a/hasmer/libhasmer/Resources/Bytecode86.json +++ b/hasmer/libhasmer/Resources/Bytecode86.json @@ -371,6 +371,24 @@ }, { "Opcode": 37, + "Name": "Inc", + "OperandTypes": [ + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 38, + "Name": "Dec", + "OperandTypes": [ + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 39, "Name": "InstanceOf", "OperandTypes": [ "Reg8", @@ -380,7 +398,7 @@ "IsJump": false }, { - "Opcode": 38, + "Opcode": 40, "Name": "IsIn", "OperandTypes": [ "Reg8", @@ -390,7 +408,7 @@ "IsJump": false }, { - "Opcode": 39, + "Opcode": 41, "Name": "GetEnvironment", "OperandTypes": [ "Reg8", @@ -399,7 +417,7 @@ "IsJump": false }, { - "Opcode": 40, + "Opcode": 42, "Name": "StoreToEnvironment", "OperandTypes": [ "Reg8", @@ -410,7 +428,7 @@ "AbstractDefinition": 3 }, { - "Opcode": 41, + "Opcode": 43, "Name": "StoreToEnvironmentL", "OperandTypes": [ "Reg8", @@ -421,7 +439,7 @@ "AbstractDefinition": 3 }, { - "Opcode": 42, + "Opcode": 44, "Name": "StoreNPToEnvironment", "OperandTypes": [ "Reg8", @@ -432,7 +450,7 @@ "AbstractDefinition": 4 }, { - "Opcode": 43, + "Opcode": 45, "Name": "StoreNPToEnvironmentL", "OperandTypes": [ "Reg8", @@ -443,7 +461,7 @@ "AbstractDefinition": 4 }, { - "Opcode": 44, + "Opcode": 46, "Name": "LoadFromEnvironment", "OperandTypes": [ "Reg8", @@ -454,7 +472,7 @@ "AbstractDefinition": 5 }, { - "Opcode": 45, + "Opcode": 47, "Name": "LoadFromEnvironmentL", "OperandTypes": [ "Reg8", @@ -465,7 +483,7 @@ "AbstractDefinition": 5 }, { - "Opcode": 46, + "Opcode": 48, "Name": "GetGlobalObject", "OperandTypes": [ "Reg8" @@ -473,7 +491,7 @@ "IsJump": false }, { - "Opcode": 47, + "Opcode": 49, "Name": "GetNewTarget", "OperandTypes": [ "Reg8" @@ -481,7 +499,7 @@ "IsJump": false }, { - "Opcode": 48, + "Opcode": 50, "Name": "CreateEnvironment", "OperandTypes": [ "Reg8" @@ -489,7 +507,7 @@ "IsJump": false }, { - "Opcode": 49, + "Opcode": 51, "Name": "DeclareGlobalVar", "OperandTypes": [ "UInt32S" @@ -497,7 +515,7 @@ "IsJump": false }, { - "Opcode": 50, + "Opcode": 52, "Name": "GetByIdShort", "OperandTypes": [ "Reg8", @@ -509,7 +527,7 @@ "AbstractDefinition": 6 }, { - "Opcode": 51, + "Opcode": 53, "Name": "GetById", "OperandTypes": [ "Reg8", @@ -521,7 +539,7 @@ "AbstractDefinition": 6 }, { - "Opcode": 52, + "Opcode": 54, "Name": "GetByIdLong", "OperandTypes": [ "Reg8", @@ -533,7 +551,7 @@ "AbstractDefinition": 6 }, { - "Opcode": 53, + "Opcode": 55, "Name": "TryGetById", "OperandTypes": [ "Reg8", @@ -545,7 +563,7 @@ "AbstractDefinition": 7 }, { - "Opcode": 54, + "Opcode": 56, "Name": "TryGetByIdLong", "OperandTypes": [ "Reg8", @@ -557,7 +575,7 @@ "AbstractDefinition": 7 }, { - "Opcode": 55, + "Opcode": 57, "Name": "PutById", "OperandTypes": [ "Reg8", @@ -569,7 +587,7 @@ "AbstractDefinition": 8 }, { - "Opcode": 56, + "Opcode": 58, "Name": "PutByIdLong", "OperandTypes": [ "Reg8", @@ -581,7 +599,7 @@ "AbstractDefinition": 8 }, { - "Opcode": 57, + "Opcode": 59, "Name": "TryPutById", "OperandTypes": [ "Reg8", @@ -593,7 +611,7 @@ "AbstractDefinition": 9 }, { - "Opcode": 58, + "Opcode": 60, "Name": "TryPutByIdLong", "OperandTypes": [ "Reg8", @@ -605,7 +623,7 @@ "AbstractDefinition": 9 }, { - "Opcode": 59, + "Opcode": 61, "Name": "PutNewOwnByIdShort", "OperandTypes": [ "Reg8", @@ -616,7 +634,7 @@ "AbstractDefinition": 10 }, { - "Opcode": 60, + "Opcode": 62, "Name": "PutNewOwnById", "OperandTypes": [ "Reg8", @@ -627,7 +645,7 @@ "AbstractDefinition": 10 }, { - "Opcode": 61, + "Opcode": 63, "Name": "PutNewOwnByIdLong", "OperandTypes": [ "Reg8", @@ -638,7 +656,7 @@ "AbstractDefinition": 10 }, { - "Opcode": 62, + "Opcode": 64, "Name": "PutNewOwnNEById", "OperandTypes": [ "Reg8", @@ -649,7 +667,7 @@ "AbstractDefinition": 11 }, { - "Opcode": 63, + "Opcode": 65, "Name": "PutNewOwnNEByIdLong", "OperandTypes": [ "Reg8", @@ -660,7 +678,7 @@ "AbstractDefinition": 11 }, { - "Opcode": 64, + "Opcode": 66, "Name": "PutOwnByIndex", "OperandTypes": [ "Reg8", @@ -671,7 +689,7 @@ "AbstractDefinition": 12 }, { - "Opcode": 65, + "Opcode": 67, "Name": "PutOwnByIndexL", "OperandTypes": [ "Reg8", @@ -682,7 +700,7 @@ "AbstractDefinition": 12 }, { - "Opcode": 66, + "Opcode": 68, "Name": "PutOwnByVal", "OperandTypes": [ "Reg8", @@ -693,7 +711,7 @@ "IsJump": false }, { - "Opcode": 67, + "Opcode": 69, "Name": "DelById", "OperandTypes": [ "Reg8", @@ -704,7 +722,7 @@ "AbstractDefinition": 13 }, { - "Opcode": 68, + "Opcode": 70, "Name": "DelByIdLong", "OperandTypes": [ "Reg8", @@ -715,7 +733,7 @@ "AbstractDefinition": 13 }, { - "Opcode": 69, + "Opcode": 71, "Name": "GetByVal", "OperandTypes": [ "Reg8", @@ -725,7 +743,7 @@ "IsJump": false }, { - "Opcode": 70, + "Opcode": 72, "Name": "PutByVal", "OperandTypes": [ "Reg8", @@ -735,7 +753,7 @@ "IsJump": false }, { - "Opcode": 71, + "Opcode": 73, "Name": "DelByVal", "OperandTypes": [ "Reg8", @@ -745,7 +763,7 @@ "IsJump": false }, { - "Opcode": 72, + "Opcode": 74, "Name": "PutOwnGetterSetterByVal", "OperandTypes": [ "Reg8", @@ -757,7 +775,7 @@ "IsJump": false }, { - "Opcode": 73, + "Opcode": 75, "Name": "GetPNameList", "OperandTypes": [ "Reg8", @@ -768,7 +786,7 @@ "IsJump": false }, { - "Opcode": 74, + "Opcode": 76, "Name": "GetNextPName", "OperandTypes": [ "Reg8", @@ -780,7 +798,7 @@ "IsJump": false }, { - "Opcode": 75, + "Opcode": 77, "Name": "Call", "OperandTypes": [ "Reg8", @@ -791,7 +809,7 @@ "AbstractDefinition": 14 }, { - "Opcode": 76, + "Opcode": 78, "Name": "Construct", "OperandTypes": [ "Reg8", @@ -802,7 +820,7 @@ "AbstractDefinition": 15 }, { - "Opcode": 77, + "Opcode": 79, "Name": "Call1", "OperandTypes": [ "Reg8", @@ -812,7 +830,7 @@ "IsJump": false }, { - "Opcode": 78, + "Opcode": 80, "Name": "CallDirect", "OperandTypes": [ "Reg8", @@ -823,7 +841,7 @@ "AbstractDefinition": 16 }, { - "Opcode": 79, + "Opcode": 81, "Name": "Call2", "OperandTypes": [ "Reg8", @@ -834,7 +852,7 @@ "IsJump": false }, { - "Opcode": 80, + "Opcode": 82, "Name": "Call3", "OperandTypes": [ "Reg8", @@ -846,7 +864,7 @@ "IsJump": false }, { - "Opcode": 81, + "Opcode": 83, "Name": "Call4", "OperandTypes": [ "Reg8", @@ -859,7 +877,7 @@ "IsJump": false }, { - "Opcode": 82, + "Opcode": 84, "Name": "CallLong", "OperandTypes": [ "Reg8", @@ -870,7 +888,7 @@ "AbstractDefinition": 14 }, { - "Opcode": 83, + "Opcode": 85, "Name": "ConstructLong", "OperandTypes": [ "Reg8", @@ -881,7 +899,7 @@ "AbstractDefinition": 15 }, { - "Opcode": 84, + "Opcode": 86, "Name": "CallDirectLongIndex", "OperandTypes": [ "Reg8", @@ -892,7 +910,7 @@ "AbstractDefinition": 16 }, { - "Opcode": 85, + "Opcode": 87, "Name": "CallBuiltin", "OperandTypes": [ "Reg8", @@ -903,7 +921,7 @@ "AbstractDefinition": 17 }, { - "Opcode": 86, + "Opcode": 88, "Name": "CallBuiltinLong", "OperandTypes": [ "Reg8", @@ -914,7 +932,7 @@ "AbstractDefinition": 17 }, { - "Opcode": 87, + "Opcode": 89, "Name": "GetBuiltinClosure", "OperandTypes": [ "Reg8", @@ -923,7 +941,7 @@ "IsJump": false }, { - "Opcode": 88, + "Opcode": 90, "Name": "Ret", "OperandTypes": [ "Reg8" @@ -931,7 +949,7 @@ "IsJump": false }, { - "Opcode": 89, + "Opcode": 91, "Name": "Catch", "OperandTypes": [ "Reg8" @@ -939,7 +957,7 @@ "IsJump": false }, { - "Opcode": 90, + "Opcode": 92, "Name": "DirectEval", "OperandTypes": [ "Reg8", @@ -948,7 +966,7 @@ "IsJump": false }, { - "Opcode": 91, + "Opcode": 93, "Name": "Throw", "OperandTypes": [ "Reg8" @@ -956,7 +974,7 @@ "IsJump": false }, { - "Opcode": 92, + "Opcode": 94, "Name": "ThrowIfEmpty", "OperandTypes": [ "Reg8", @@ -965,19 +983,19 @@ "IsJump": false }, { - "Opcode": 93, + "Opcode": 95, "Name": "Debugger", "OperandTypes": [], "IsJump": false }, { - "Opcode": 94, + "Opcode": 96, "Name": "AsyncBreakCheck", "OperandTypes": [], "IsJump": false }, { - "Opcode": 95, + "Opcode": 97, "Name": "ProfilePoint", "OperandTypes": [ "UInt16" @@ -985,7 +1003,7 @@ "IsJump": false }, { - "Opcode": 96, + "Opcode": 98, "Name": "CreateClosure", "OperandTypes": [ "Reg8", @@ -996,7 +1014,7 @@ "AbstractDefinition": 18 }, { - "Opcode": 97, + "Opcode": 99, "Name": "CreateClosureLongIndex", "OperandTypes": [ "Reg8", @@ -1007,7 +1025,7 @@ "AbstractDefinition": 18 }, { - "Opcode": 98, + "Opcode": 100, "Name": "CreateGeneratorClosure", "OperandTypes": [ "Reg8", @@ -1018,7 +1036,7 @@ "AbstractDefinition": 19 }, { - "Opcode": 99, + "Opcode": 101, "Name": "CreateGeneratorClosureLongIndex", "OperandTypes": [ "Reg8", @@ -1029,7 +1047,7 @@ "AbstractDefinition": 19 }, { - "Opcode": 100, + "Opcode": 102, "Name": "CreateAsyncClosure", "OperandTypes": [ "Reg8", @@ -1040,7 +1058,7 @@ "AbstractDefinition": 20 }, { - "Opcode": 101, + "Opcode": 103, "Name": "CreateAsyncClosureLongIndex", "OperandTypes": [ "Reg8", @@ -1051,7 +1069,7 @@ "AbstractDefinition": 20 }, { - "Opcode": 102, + "Opcode": 104, "Name": "CreateThis", "OperandTypes": [ "Reg8", @@ -1061,7 +1079,7 @@ "IsJump": false }, { - "Opcode": 103, + "Opcode": 105, "Name": "SelectObject", "OperandTypes": [ "Reg8", @@ -1071,7 +1089,7 @@ "IsJump": false }, { - "Opcode": 104, + "Opcode": 106, "Name": "LoadParam", "OperandTypes": [ "Reg8", @@ -1081,7 +1099,7 @@ "AbstractDefinition": 21 }, { - "Opcode": 105, + "Opcode": 107, "Name": "LoadParamLong", "OperandTypes": [ "Reg8", @@ -1091,7 +1109,7 @@ "AbstractDefinition": 21 }, { - "Opcode": 106, + "Opcode": 108, "Name": "LoadConstUInt8", "OperandTypes": [ "Reg8", @@ -1100,7 +1118,7 @@ "IsJump": false }, { - "Opcode": 107, + "Opcode": 109, "Name": "LoadConstInt", "OperandTypes": [ "Reg8", @@ -1109,7 +1127,7 @@ "IsJump": false }, { - "Opcode": 108, + "Opcode": 110, "Name": "LoadConstDouble", "OperandTypes": [ "Reg8", @@ -1118,7 +1136,7 @@ "IsJump": false }, { - "Opcode": 109, + "Opcode": 111, "Name": "LoadConstString", "OperandTypes": [ "Reg8", @@ -1128,7 +1146,7 @@ "AbstractDefinition": 22 }, { - "Opcode": 110, + "Opcode": 112, "Name": "LoadConstStringLongIndex", "OperandTypes": [ "Reg8", @@ -1138,7 +1156,7 @@ "AbstractDefinition": 22 }, { - "Opcode": 111, + "Opcode": 113, "Name": "LoadConstEmpty", "OperandTypes": [ "Reg8" @@ -1146,7 +1164,7 @@ "IsJump": false }, { - "Opcode": 112, + "Opcode": 114, "Name": "LoadConstUndefined", "OperandTypes": [ "Reg8" @@ -1154,7 +1172,7 @@ "IsJump": false }, { - "Opcode": 113, + "Opcode": 115, "Name": "LoadConstNull", "OperandTypes": [ "Reg8" @@ -1162,7 +1180,7 @@ "IsJump": false }, { - "Opcode": 114, + "Opcode": 116, "Name": "LoadConstTrue", "OperandTypes": [ "Reg8" @@ -1170,7 +1188,7 @@ "IsJump": false }, { - "Opcode": 115, + "Opcode": 117, "Name": "LoadConstFalse", "OperandTypes": [ "Reg8" @@ -1178,7 +1196,7 @@ "IsJump": false }, { - "Opcode": 116, + "Opcode": 118, "Name": "LoadConstZero", "OperandTypes": [ "Reg8" @@ -1186,7 +1204,7 @@ "IsJump": false }, { - "Opcode": 117, + "Opcode": 119, "Name": "CoerceThisNS", "OperandTypes": [ "Reg8", @@ -1195,7 +1213,7 @@ "IsJump": false }, { - "Opcode": 118, + "Opcode": 120, "Name": "LoadThisNS", "OperandTypes": [ "Reg8" @@ -1203,7 +1221,7 @@ "IsJump": false }, { - "Opcode": 119, + "Opcode": 121, "Name": "ToNumber", "OperandTypes": [ "Reg8", @@ -1212,7 +1230,7 @@ "IsJump": false }, { - "Opcode": 120, + "Opcode": 122, "Name": "ToInt32", "OperandTypes": [ "Reg8", @@ -1221,7 +1239,7 @@ "IsJump": false }, { - "Opcode": 121, + "Opcode": 123, "Name": "AddEmptyString", "OperandTypes": [ "Reg8", @@ -1230,7 +1248,7 @@ "IsJump": false }, { - "Opcode": 122, + "Opcode": 124, "Name": "GetArgumentsPropByVal", "OperandTypes": [ "Reg8", @@ -1240,7 +1258,7 @@ "IsJump": false }, { - "Opcode": 123, + "Opcode": 125, "Name": "GetArgumentsLength", "OperandTypes": [ "Reg8", @@ -1249,7 +1267,7 @@ "IsJump": false }, { - "Opcode": 124, + "Opcode": 126, "Name": "ReifyArguments", "OperandTypes": [ "Reg8" @@ -1257,7 +1275,7 @@ "IsJump": false }, { - "Opcode": 125, + "Opcode": 127, "Name": "CreateRegExp", "OperandTypes": [ "Reg8", @@ -1268,7 +1286,7 @@ "IsJump": false }, { - "Opcode": 126, + "Opcode": 128, "Name": "SwitchImm", "OperandTypes": [ "Reg8", @@ -1280,13 +1298,13 @@ "IsJump": false }, { - "Opcode": 127, + "Opcode": 129, "Name": "StartGenerator", "OperandTypes": [], "IsJump": false }, { - "Opcode": 128, + "Opcode": 130, "Name": "ResumeGenerator", "OperandTypes": [ "Reg8", @@ -1295,13 +1313,13 @@ "IsJump": false }, { - "Opcode": 129, + "Opcode": 131, "Name": "CompleteGenerator", "OperandTypes": [], "IsJump": false }, { - "Opcode": 130, + "Opcode": 132, "Name": "CreateGenerator", "OperandTypes": [ "Reg8", @@ -1312,7 +1330,7 @@ "AbstractDefinition": 23 }, { - "Opcode": 131, + "Opcode": 133, "Name": "CreateGeneratorLongIndex", "OperandTypes": [ "Reg8", @@ -1323,7 +1341,7 @@ "AbstractDefinition": 23 }, { - "Opcode": 132, + "Opcode": 134, "Name": "IteratorBegin", "OperandTypes": [ "Reg8", @@ -1332,7 +1350,7 @@ "IsJump": false }, { - "Opcode": 133, + "Opcode": 135, "Name": "IteratorNext", "OperandTypes": [ "Reg8", @@ -1342,7 +1360,7 @@ "IsJump": false }, { - "Opcode": 134, + "Opcode": 136, "Name": "IteratorClose", "OperandTypes": [ "Reg8", @@ -1351,7 +1369,7 @@ "IsJump": false }, { - "Opcode": 135, + "Opcode": 137, "Name": "Jmp", "OperandTypes": [ "Addr8" @@ -1360,7 +1378,7 @@ "AbstractDefinition": 24 }, { - "Opcode": 136, + "Opcode": 138, "Name": "JmpLong", "OperandTypes": [ "Addr32" @@ -1369,7 +1387,7 @@ "AbstractDefinition": 24 }, { - "Opcode": 137, + "Opcode": 139, "Name": "JmpTrue", "OperandTypes": [ "Addr8", @@ -1379,7 +1397,7 @@ "AbstractDefinition": 25 }, { - "Opcode": 138, + "Opcode": 140, "Name": "JmpTrueLong", "OperandTypes": [ "Addr32", @@ -1389,7 +1407,7 @@ "AbstractDefinition": 25 }, { - "Opcode": 139, + "Opcode": 141, "Name": "JmpFalse", "OperandTypes": [ "Addr8", @@ -1399,7 +1417,7 @@ "AbstractDefinition": 26 }, { - "Opcode": 140, + "Opcode": 142, "Name": "JmpFalseLong", "OperandTypes": [ "Addr32", @@ -1409,7 +1427,7 @@ "AbstractDefinition": 26 }, { - "Opcode": 141, + "Opcode": 143, "Name": "JmpUndefined", "OperandTypes": [ "Addr8", @@ -1419,7 +1437,7 @@ "AbstractDefinition": 27 }, { - "Opcode": 142, + "Opcode": 144, "Name": "JmpUndefinedLong", "OperandTypes": [ "Addr32", @@ -1429,7 +1447,7 @@ "AbstractDefinition": 27 }, { - "Opcode": 143, + "Opcode": 145, "Name": "SaveGenerator", "OperandTypes": [ "Addr8" @@ -1438,7 +1456,7 @@ "AbstractDefinition": 28 }, { - "Opcode": 144, + "Opcode": 146, "Name": "SaveGeneratorLong", "OperandTypes": [ "Addr32" @@ -1447,7 +1465,7 @@ "AbstractDefinition": 28 }, { - "Opcode": 145, + "Opcode": 147, "Name": "JLess", "OperandTypes": [ "Addr8", @@ -1458,7 +1476,7 @@ "AbstractDefinition": 29 }, { - "Opcode": 146, + "Opcode": 148, "Name": "JLessLong", "OperandTypes": [ "Addr32", @@ -1469,7 +1487,7 @@ "AbstractDefinition": 29 }, { - "Opcode": 147, + "Opcode": 149, "Name": "JNotLess", "OperandTypes": [ "Addr8", @@ -1480,7 +1498,7 @@ "AbstractDefinition": 30 }, { - "Opcode": 148, + "Opcode": 150, "Name": "JNotLessLong", "OperandTypes": [ "Addr32", @@ -1491,7 +1509,7 @@ "AbstractDefinition": 30 }, { - "Opcode": 149, + "Opcode": 151, "Name": "JLessN", "OperandTypes": [ "Addr8", @@ -1502,7 +1520,7 @@ "AbstractDefinition": 31 }, { - "Opcode": 150, + "Opcode": 152, "Name": "JLessNLong", "OperandTypes": [ "Addr32", @@ -1513,7 +1531,7 @@ "AbstractDefinition": 31 }, { - "Opcode": 151, + "Opcode": 153, "Name": "JNotLessN", "OperandTypes": [ "Addr8", @@ -1524,7 +1542,7 @@ "AbstractDefinition": 32 }, { - "Opcode": 152, + "Opcode": 154, "Name": "JNotLessNLong", "OperandTypes": [ "Addr32", @@ -1535,7 +1553,7 @@ "AbstractDefinition": 32 }, { - "Opcode": 153, + "Opcode": 155, "Name": "JLessEqual", "OperandTypes": [ "Addr8", @@ -1546,7 +1564,7 @@ "AbstractDefinition": 33 }, { - "Opcode": 154, + "Opcode": 156, "Name": "JLessEqualLong", "OperandTypes": [ "Addr32", @@ -1557,7 +1575,7 @@ "AbstractDefinition": 33 }, { - "Opcode": 155, + "Opcode": 157, "Name": "JNotLessEqual", "OperandTypes": [ "Addr8", @@ -1568,7 +1586,7 @@ "AbstractDefinition": 34 }, { - "Opcode": 156, + "Opcode": 158, "Name": "JNotLessEqualLong", "OperandTypes": [ "Addr32", @@ -1579,7 +1597,7 @@ "AbstractDefinition": 34 }, { - "Opcode": 157, + "Opcode": 159, "Name": "JLessEqualN", "OperandTypes": [ "Addr8", @@ -1590,7 +1608,7 @@ "AbstractDefinition": 35 }, { - "Opcode": 158, + "Opcode": 160, "Name": "JLessEqualNLong", "OperandTypes": [ "Addr32", @@ -1601,7 +1619,7 @@ "AbstractDefinition": 35 }, { - "Opcode": 159, + "Opcode": 161, "Name": "JNotLessEqualN", "OperandTypes": [ "Addr8", @@ -1612,7 +1630,7 @@ "AbstractDefinition": 36 }, { - "Opcode": 160, + "Opcode": 162, "Name": "JNotLessEqualNLong", "OperandTypes": [ "Addr32", @@ -1623,7 +1641,7 @@ "AbstractDefinition": 36 }, { - "Opcode": 161, + "Opcode": 163, "Name": "JGreater", "OperandTypes": [ "Addr8", @@ -1634,7 +1652,7 @@ "AbstractDefinition": 37 }, { - "Opcode": 162, + "Opcode": 164, "Name": "JGreaterLong", "OperandTypes": [ "Addr32", @@ -1645,7 +1663,7 @@ "AbstractDefinition": 37 }, { - "Opcode": 163, + "Opcode": 165, "Name": "JNotGreater", "OperandTypes": [ "Addr8", @@ -1656,7 +1674,7 @@ "AbstractDefinition": 38 }, { - "Opcode": 164, + "Opcode": 166, "Name": "JNotGreaterLong", "OperandTypes": [ "Addr32", @@ -1667,7 +1685,7 @@ "AbstractDefinition": 38 }, { - "Opcode": 165, + "Opcode": 167, "Name": "JGreaterN", "OperandTypes": [ "Addr8", @@ -1678,7 +1696,7 @@ "AbstractDefinition": 39 }, { - "Opcode": 166, + "Opcode": 168, "Name": "JGreaterNLong", "OperandTypes": [ "Addr32", @@ -1689,7 +1707,7 @@ "AbstractDefinition": 39 }, { - "Opcode": 167, + "Opcode": 169, "Name": "JNotGreaterN", "OperandTypes": [ "Addr8", @@ -1700,7 +1718,7 @@ "AbstractDefinition": 40 }, { - "Opcode": 168, + "Opcode": 170, "Name": "JNotGreaterNLong", "OperandTypes": [ "Addr32", @@ -1711,7 +1729,7 @@ "AbstractDefinition": 40 }, { - "Opcode": 169, + "Opcode": 171, "Name": "JGreaterEqual", "OperandTypes": [ "Addr8", @@ -1722,7 +1740,7 @@ "AbstractDefinition": 41 }, { - "Opcode": 170, + "Opcode": 172, "Name": "JGreaterEqualLong", "OperandTypes": [ "Addr32", @@ -1733,7 +1751,7 @@ "AbstractDefinition": 41 }, { - "Opcode": 171, + "Opcode": 173, "Name": "JNotGreaterEqual", "OperandTypes": [ "Addr8", @@ -1744,7 +1762,7 @@ "AbstractDefinition": 42 }, { - "Opcode": 172, + "Opcode": 174, "Name": "JNotGreaterEqualLong", "OperandTypes": [ "Addr32", @@ -1755,7 +1773,7 @@ "AbstractDefinition": 42 }, { - "Opcode": 173, + "Opcode": 175, "Name": "JGreaterEqualN", "OperandTypes": [ "Addr8", @@ -1766,7 +1784,7 @@ "AbstractDefinition": 43 }, { - "Opcode": 174, + "Opcode": 176, "Name": "JGreaterEqualNLong", "OperandTypes": [ "Addr32", @@ -1777,7 +1795,7 @@ "AbstractDefinition": 43 }, { - "Opcode": 175, + "Opcode": 177, "Name": "JNotGreaterEqualN", "OperandTypes": [ "Addr8", @@ -1788,7 +1806,7 @@ "AbstractDefinition": 44 }, { - "Opcode": 176, + "Opcode": 178, "Name": "JNotGreaterEqualNLong", "OperandTypes": [ "Addr32", @@ -1799,7 +1817,7 @@ "AbstractDefinition": 44 }, { - "Opcode": 177, + "Opcode": 179, "Name": "JEqual", "OperandTypes": [ "Addr8", @@ -1810,7 +1828,7 @@ "AbstractDefinition": 45 }, { - "Opcode": 178, + "Opcode": 180, "Name": "JEqualLong", "OperandTypes": [ "Addr32", @@ -1821,7 +1839,7 @@ "AbstractDefinition": 45 }, { - "Opcode": 179, + "Opcode": 181, "Name": "JNotEqual", "OperandTypes": [ "Addr8", @@ -1832,7 +1850,7 @@ "AbstractDefinition": 46 }, { - "Opcode": 180, + "Opcode": 182, "Name": "JNotEqualLong", "OperandTypes": [ "Addr32", @@ -1843,7 +1861,7 @@ "AbstractDefinition": 46 }, { - "Opcode": 181, + "Opcode": 183, "Name": "JStrictEqual", "OperandTypes": [ "Addr8", @@ -1854,7 +1872,7 @@ "AbstractDefinition": 47 }, { - "Opcode": 182, + "Opcode": 184, "Name": "JStrictEqualLong", "OperandTypes": [ "Addr32", @@ -1865,7 +1883,7 @@ "AbstractDefinition": 47 }, { - "Opcode": 183, + "Opcode": 185, "Name": "JStrictNotEqual", "OperandTypes": [ "Addr8", @@ -1876,7 +1894,7 @@ "AbstractDefinition": 48 }, { - "Opcode": 184, + "Opcode": 186, "Name": "JStrictNotEqualLong", "OperandTypes": [ "Addr32", @@ -1887,7 +1905,7 @@ "AbstractDefinition": 48 }, { - "Opcode": 185, + "Opcode": 187, "Name": "Add32", "OperandTypes": [ "Reg8", @@ -1897,7 +1915,7 @@ "IsJump": false }, { - "Opcode": 186, + "Opcode": 188, "Name": "Sub32", "OperandTypes": [ "Reg8", @@ -1907,7 +1925,7 @@ "IsJump": false }, { - "Opcode": 187, + "Opcode": 189, "Name": "Mul32", "OperandTypes": [ "Reg8", @@ -1917,7 +1935,7 @@ "IsJump": false }, { - "Opcode": 188, + "Opcode": 190, "Name": "Divi32", "OperandTypes": [ "Reg8", @@ -1927,7 +1945,7 @@ "IsJump": false }, { - "Opcode": 189, + "Opcode": 191, "Name": "Divu32", "OperandTypes": [ "Reg8", @@ -1937,7 +1955,7 @@ "IsJump": false }, { - "Opcode": 190, + "Opcode": 192, "Name": "Loadi8", "OperandTypes": [ "Reg8", @@ -1947,7 +1965,7 @@ "IsJump": false }, { - "Opcode": 191, + "Opcode": 193, "Name": "Loadu8", "OperandTypes": [ "Reg8", @@ -1957,7 +1975,7 @@ "IsJump": false }, { - "Opcode": 192, + "Opcode": 194, "Name": "Loadi16", "OperandTypes": [ "Reg8", @@ -1967,7 +1985,7 @@ "IsJump": false }, { - "Opcode": 193, + "Opcode": 195, "Name": "Loadu16", "OperandTypes": [ "Reg8", @@ -1977,7 +1995,7 @@ "IsJump": false }, { - "Opcode": 194, + "Opcode": 196, "Name": "Loadi32", "OperandTypes": [ "Reg8", @@ -1987,7 +2005,7 @@ "IsJump": false }, { - "Opcode": 195, + "Opcode": 197, "Name": "Loadu32", "OperandTypes": [ "Reg8", @@ -1997,7 +2015,7 @@ "IsJump": false }, { - "Opcode": 196, + "Opcode": 198, "Name": "Store8", "OperandTypes": [ "Reg8", @@ -2007,7 +2025,7 @@ "IsJump": false }, { - "Opcode": 197, + "Opcode": 199, "Name": "Store16", "OperandTypes": [ "Reg8", @@ -2017,7 +2035,7 @@ "IsJump": false }, { - "Opcode": 198, + "Opcode": 200, "Name": "Store32", "OperandTypes": [ "Reg8", @@ -2051,329 +2069,328 @@ }, { "Name": "StoreToEnvironment", - "VariantOpcodes": [ - 40, - 41 - ] - }, - { - "Name": "StoreNPToEnvironment", "VariantOpcodes": [ 42, 43 ] }, { - "Name": "LoadFromEnvironment", + "Name": "StoreNPToEnvironment", "VariantOpcodes": [ 44, 45 ] }, { - "Name": "GetById", + "Name": "LoadFromEnvironment", "VariantOpcodes": [ - 51, - 50, - 52 + 46, + 47 ] }, { - "Name": "TryGetById", + "Name": "GetById", "VariantOpcodes": [ 53, + 52, 54 ] }, { - "Name": "PutById", + "Name": "TryGetById", "VariantOpcodes": [ 55, 56 ] }, { - "Name": "TryPutById", + "Name": "PutById", "VariantOpcodes": [ 57, 58 ] }, { - "Name": "PutNewOwnById", + "Name": "TryPutById", "VariantOpcodes": [ - 60, 59, - 61 + 60 ] }, { - "Name": "PutNewOwnNEById", + "Name": "PutNewOwnById", "VariantOpcodes": [ 62, + 61, 63 ] }, { - "Name": "PutOwnByIndex", + "Name": "PutNewOwnNEById", "VariantOpcodes": [ 64, 65 ] }, + { + "Name": "PutOwnByIndex", + "VariantOpcodes": [ + 66, + 67 + ] + }, { "Name": "DelById", "VariantOpcodes": [ - 67, - 68 + 69, + 70 ] }, { "Name": "Call", "VariantOpcodes": [ - 75, - 82 + 77, + 84 ] }, { "Name": "Construct", "VariantOpcodes": [ - 76, - 83 + 78, + 85 ] }, { "Name": "CallDirect", "VariantOpcodes": [ - 78, - 84 + 80, + 86 ] }, { "Name": "CallBuiltin", "VariantOpcodes": [ - 85, - 86 + 87, + 88 ] }, { "Name": "CreateClosure", "VariantOpcodes": [ - 96, - 97 + 98, + 99 ] }, { "Name": "CreateGeneratorClosure", "VariantOpcodes": [ - 98, - 99 + 100, + 101 ] }, { "Name": "CreateAsyncClosure", "VariantOpcodes": [ - 100, - 101 + 102, + 103 ] }, { "Name": "LoadParam", "VariantOpcodes": [ - 104, - 105 + 106, + 107 ] }, { "Name": "LoadConstString", "VariantOpcodes": [ - 109, - 110 + 111, + 112 ] }, { "Name": "CreateGenerator", "VariantOpcodes": [ - 130, - 131 + 132, + 133 ] }, { "Name": "Jmp", - "VariantOpcodes": [ - 135, - 136 - ] - }, - { - "Name": "JmpTrue", "VariantOpcodes": [ 137, 138 ] }, { - "Name": "JmpFalse", + "Name": "JmpTrue", "VariantOpcodes": [ 139, 140 ] }, { - "Name": "JmpUndefined", + "Name": "JmpFalse", "VariantOpcodes": [ 141, 142 ] }, { - "Name": "SaveGenerator", + "Name": "JmpUndefined", "VariantOpcodes": [ 143, 144 ] }, { - "Name": "JLess", + "Name": "SaveGenerator", "VariantOpcodes": [ 145, 146 ] }, { - "Name": "JNotLess", + "Name": "JLess", "VariantOpcodes": [ 147, 148 ] }, { - "Name": "JLessN", + "Name": "JNotLess", "VariantOpcodes": [ 149, 150 ] }, { - "Name": "JNotLessN", + "Name": "JLessN", "VariantOpcodes": [ 151, 152 ] }, { - "Name": "JLessEqual", + "Name": "JNotLessN", "VariantOpcodes": [ 153, 154 ] }, { - "Name": "JNotLessEqual", + "Name": "JLessEqual", "VariantOpcodes": [ 155, 156 ] }, { - "Name": "JLessEqualN", + "Name": "JNotLessEqual", "VariantOpcodes": [ 157, 158 ] }, { - "Name": "JNotLessEqualN", + "Name": "JLessEqualN", "VariantOpcodes": [ 159, 160 ] }, { - "Name": "JGreater", + "Name": "JNotLessEqualN", "VariantOpcodes": [ 161, 162 ] }, { - "Name": "JNotGreater", + "Name": "JGreater", "VariantOpcodes": [ 163, 164 ] }, { - "Name": "JGreaterN", + "Name": "JNotGreater", "VariantOpcodes": [ 165, 166 ] }, { - "Name": "JNotGreaterN", + "Name": "JGreaterN", "VariantOpcodes": [ 167, 168 ] }, { - "Name": "JGreaterEqual", + "Name": "JNotGreaterN", "VariantOpcodes": [ 169, 170 ] }, { - "Name": "JNotGreaterEqual", + "Name": "JGreaterEqual", "VariantOpcodes": [ 171, 172 ] }, { - "Name": "JGreaterEqualN", + "Name": "JNotGreaterEqual", "VariantOpcodes": [ 173, 174 ] }, { - "Name": "JNotGreaterEqualN", + "Name": "JGreaterEqualN", "VariantOpcodes": [ 175, 176 ] }, { - "Name": "JEqual", + "Name": "JNotGreaterEqualN", "VariantOpcodes": [ 177, 178 ] }, { - "Name": "JNotEqual", + "Name": "JEqual", "VariantOpcodes": [ 179, 180 ] }, { - "Name": "JStrictEqual", + "Name": "JNotEqual", "VariantOpcodes": [ 181, 182 ] }, { - "Name": "JStrictNotEqual", + "Name": "JStrictEqual", "VariantOpcodes": [ 183, 184 ] + }, + { + "Name": "JStrictNotEqual", + "VariantOpcodes": [ + 185, + 186 + ] } ], - "GitTag": "v0.11.0", - "GitCommitHash": "c4f2fc3f499f7891958b9e6d7ab39fcb6ead93c8" + "GitCommitHash": "b8235156c0bfb0eea550243e67c5018661ff3185" } \ No newline at end of file diff --git a/hasmer/libhasmer/Resources/Bytecode87.json b/hasmer/libhasmer/Resources/Bytecode87.json new file mode 100644 index 0000000..a0d177c --- /dev/null +++ b/hasmer/libhasmer/Resources/Bytecode87.json @@ -0,0 +1,2432 @@ +{ + "Version": 87, + "Definitions": [ + { + "Opcode": 0, + "Name": "Unreachable", + "OperandTypes": [], + "IsJump": false + }, + { + "Opcode": 1, + "Name": "NewObjectWithBuffer", + "OperandTypes": [ + "Reg8", + "UInt16", + "UInt16", + "UInt16", + "UInt16" + ], + "IsJump": false, + "AbstractDefinition": 0 + }, + { + "Opcode": 2, + "Name": "NewObjectWithBufferLong", + "OperandTypes": [ + "Reg8", + "UInt16", + "UInt16", + "UInt32", + "UInt32" + ], + "IsJump": false, + "AbstractDefinition": 0 + }, + { + "Opcode": 3, + "Name": "NewObject", + "OperandTypes": [ + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 4, + "Name": "NewObjectWithParent", + "OperandTypes": [ + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 5, + "Name": "NewArrayWithBuffer", + "OperandTypes": [ + "Reg8", + "UInt16", + "UInt16", + "UInt16" + ], + "IsJump": false, + "AbstractDefinition": 1 + }, + { + "Opcode": 6, + "Name": "NewArrayWithBufferLong", + "OperandTypes": [ + "Reg8", + "UInt16", + "UInt16", + "UInt32" + ], + "IsJump": false, + "AbstractDefinition": 1 + }, + { + "Opcode": 7, + "Name": "NewArray", + "OperandTypes": [ + "Reg8", + "UInt16" + ], + "IsJump": false + }, + { + "Opcode": 8, + "Name": "Mov", + "OperandTypes": [ + "Reg8", + "Reg8" + ], + "IsJump": false, + "AbstractDefinition": 2 + }, + { + "Opcode": 9, + "Name": "MovLong", + "OperandTypes": [ + "Reg32", + "Reg32" + ], + "IsJump": false, + "AbstractDefinition": 2 + }, + { + "Opcode": 10, + "Name": "Negate", + "OperandTypes": [ + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 11, + "Name": "Not", + "OperandTypes": [ + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 12, + "Name": "BitNot", + "OperandTypes": [ + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 13, + "Name": "TypeOf", + "OperandTypes": [ + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 14, + "Name": "Eq", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 15, + "Name": "StrictEq", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 16, + "Name": "Neq", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 17, + "Name": "StrictNeq", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 18, + "Name": "Less", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 19, + "Name": "LessEq", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 20, + "Name": "Greater", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 21, + "Name": "GreaterEq", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 22, + "Name": "Add", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 23, + "Name": "AddN", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 24, + "Name": "Mul", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 25, + "Name": "MulN", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 26, + "Name": "Div", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 27, + "Name": "DivN", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 28, + "Name": "Mod", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 29, + "Name": "Sub", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 30, + "Name": "SubN", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 31, + "Name": "LShift", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 32, + "Name": "RShift", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 33, + "Name": "URshift", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 34, + "Name": "BitAnd", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 35, + "Name": "BitXor", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 36, + "Name": "BitOr", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 37, + "Name": "Inc", + "OperandTypes": [ + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 38, + "Name": "Dec", + "OperandTypes": [ + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 39, + "Name": "InstanceOf", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 40, + "Name": "IsIn", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 41, + "Name": "GetEnvironment", + "OperandTypes": [ + "Reg8", + "UInt8" + ], + "IsJump": false + }, + { + "Opcode": 42, + "Name": "StoreToEnvironment", + "OperandTypes": [ + "Reg8", + "UInt8", + "Reg8" + ], + "IsJump": false, + "AbstractDefinition": 3 + }, + { + "Opcode": 43, + "Name": "StoreToEnvironmentL", + "OperandTypes": [ + "Reg8", + "UInt16", + "Reg8" + ], + "IsJump": false, + "AbstractDefinition": 3 + }, + { + "Opcode": 44, + "Name": "StoreNPToEnvironment", + "OperandTypes": [ + "Reg8", + "UInt8", + "Reg8" + ], + "IsJump": false, + "AbstractDefinition": 4 + }, + { + "Opcode": 45, + "Name": "StoreNPToEnvironmentL", + "OperandTypes": [ + "Reg8", + "UInt16", + "Reg8" + ], + "IsJump": false, + "AbstractDefinition": 4 + }, + { + "Opcode": 46, + "Name": "LoadFromEnvironment", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt8" + ], + "IsJump": false, + "AbstractDefinition": 5 + }, + { + "Opcode": 47, + "Name": "LoadFromEnvironmentL", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt16" + ], + "IsJump": false, + "AbstractDefinition": 5 + }, + { + "Opcode": 48, + "Name": "GetGlobalObject", + "OperandTypes": [ + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 49, + "Name": "GetNewTarget", + "OperandTypes": [ + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 50, + "Name": "CreateEnvironment", + "OperandTypes": [ + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 51, + "Name": "DeclareGlobalVar", + "OperandTypes": [ + "UInt32S" + ], + "IsJump": false + }, + { + "Opcode": 52, + "Name": "GetByIdShort", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt8", + "UInt8S" + ], + "IsJump": false, + "AbstractDefinition": 6 + }, + { + "Opcode": 53, + "Name": "GetById", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt8", + "UInt16S" + ], + "IsJump": false, + "AbstractDefinition": 6 + }, + { + "Opcode": 54, + "Name": "GetByIdLong", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt8", + "UInt32S" + ], + "IsJump": false, + "AbstractDefinition": 6 + }, + { + "Opcode": 55, + "Name": "TryGetById", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt8", + "UInt16S" + ], + "IsJump": false, + "AbstractDefinition": 7 + }, + { + "Opcode": 56, + "Name": "TryGetByIdLong", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt8", + "UInt32S" + ], + "IsJump": false, + "AbstractDefinition": 7 + }, + { + "Opcode": 57, + "Name": "PutById", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt8", + "UInt16S" + ], + "IsJump": false, + "AbstractDefinition": 8 + }, + { + "Opcode": 58, + "Name": "PutByIdLong", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt8", + "UInt32S" + ], + "IsJump": false, + "AbstractDefinition": 8 + }, + { + "Opcode": 59, + "Name": "TryPutById", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt8", + "UInt16S" + ], + "IsJump": false, + "AbstractDefinition": 9 + }, + { + "Opcode": 60, + "Name": "TryPutByIdLong", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt8", + "UInt32S" + ], + "IsJump": false, + "AbstractDefinition": 9 + }, + { + "Opcode": 61, + "Name": "PutNewOwnByIdShort", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt8S" + ], + "IsJump": false, + "AbstractDefinition": 10 + }, + { + "Opcode": 62, + "Name": "PutNewOwnById", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt16S" + ], + "IsJump": false, + "AbstractDefinition": 10 + }, + { + "Opcode": 63, + "Name": "PutNewOwnByIdLong", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt32S" + ], + "IsJump": false, + "AbstractDefinition": 10 + }, + { + "Opcode": 64, + "Name": "PutNewOwnNEById", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt16S" + ], + "IsJump": false, + "AbstractDefinition": 11 + }, + { + "Opcode": 65, + "Name": "PutNewOwnNEByIdLong", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt32S" + ], + "IsJump": false, + "AbstractDefinition": 11 + }, + { + "Opcode": 66, + "Name": "PutOwnByIndex", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt8" + ], + "IsJump": false, + "AbstractDefinition": 12 + }, + { + "Opcode": 67, + "Name": "PutOwnByIndexL", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt32" + ], + "IsJump": false, + "AbstractDefinition": 12 + }, + { + "Opcode": 68, + "Name": "PutOwnByVal", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8", + "UInt8" + ], + "IsJump": false + }, + { + "Opcode": 69, + "Name": "DelById", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt16S" + ], + "IsJump": false, + "AbstractDefinition": 13 + }, + { + "Opcode": 70, + "Name": "DelByIdLong", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt32S" + ], + "IsJump": false, + "AbstractDefinition": 13 + }, + { + "Opcode": 71, + "Name": "GetByVal", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 72, + "Name": "PutByVal", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 73, + "Name": "DelByVal", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 74, + "Name": "PutOwnGetterSetterByVal", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8", + "Reg8", + "UInt8" + ], + "IsJump": false + }, + { + "Opcode": 75, + "Name": "GetPNameList", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 76, + "Name": "GetNextPName", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 77, + "Name": "Call", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt8" + ], + "IsJump": false, + "AbstractDefinition": 14 + }, + { + "Opcode": 78, + "Name": "Construct", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt8" + ], + "IsJump": false, + "AbstractDefinition": 15 + }, + { + "Opcode": 79, + "Name": "Call1", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 80, + "Name": "CallDirect", + "OperandTypes": [ + "Reg8", + "UInt8", + "UInt16" + ], + "IsJump": false, + "AbstractDefinition": 16 + }, + { + "Opcode": 81, + "Name": "Call2", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 82, + "Name": "Call3", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 83, + "Name": "Call4", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8", + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 84, + "Name": "CallLong", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt32" + ], + "IsJump": false, + "AbstractDefinition": 14 + }, + { + "Opcode": 85, + "Name": "ConstructLong", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt32" + ], + "IsJump": false, + "AbstractDefinition": 15 + }, + { + "Opcode": 86, + "Name": "CallDirectLongIndex", + "OperandTypes": [ + "Reg8", + "UInt8", + "UInt32" + ], + "IsJump": false, + "AbstractDefinition": 16 + }, + { + "Opcode": 87, + "Name": "CallBuiltin", + "OperandTypes": [ + "Reg8", + "UInt8", + "UInt8" + ], + "IsJump": false, + "AbstractDefinition": 17 + }, + { + "Opcode": 88, + "Name": "CallBuiltinLong", + "OperandTypes": [ + "Reg8", + "UInt8", + "UInt32" + ], + "IsJump": false, + "AbstractDefinition": 17 + }, + { + "Opcode": 89, + "Name": "GetBuiltinClosure", + "OperandTypes": [ + "Reg8", + "UInt8" + ], + "IsJump": false + }, + { + "Opcode": 90, + "Name": "Ret", + "OperandTypes": [ + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 91, + "Name": "Catch", + "OperandTypes": [ + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 92, + "Name": "DirectEval", + "OperandTypes": [ + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 93, + "Name": "Throw", + "OperandTypes": [ + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 94, + "Name": "ThrowIfEmpty", + "OperandTypes": [ + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 95, + "Name": "Debugger", + "OperandTypes": [], + "IsJump": false + }, + { + "Opcode": 96, + "Name": "AsyncBreakCheck", + "OperandTypes": [], + "IsJump": false + }, + { + "Opcode": 97, + "Name": "ProfilePoint", + "OperandTypes": [ + "UInt16" + ], + "IsJump": false + }, + { + "Opcode": 98, + "Name": "CreateClosure", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt16" + ], + "IsJump": false, + "AbstractDefinition": 18 + }, + { + "Opcode": 99, + "Name": "CreateClosureLongIndex", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt32" + ], + "IsJump": false, + "AbstractDefinition": 18 + }, + { + "Opcode": 100, + "Name": "CreateGeneratorClosure", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt16" + ], + "IsJump": false, + "AbstractDefinition": 19 + }, + { + "Opcode": 101, + "Name": "CreateGeneratorClosureLongIndex", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt32" + ], + "IsJump": false, + "AbstractDefinition": 19 + }, + { + "Opcode": 102, + "Name": "CreateAsyncClosure", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt16" + ], + "IsJump": false, + "AbstractDefinition": 20 + }, + { + "Opcode": 103, + "Name": "CreateAsyncClosureLongIndex", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt32" + ], + "IsJump": false, + "AbstractDefinition": 20 + }, + { + "Opcode": 104, + "Name": "CreateThis", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 105, + "Name": "SelectObject", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 106, + "Name": "LoadParam", + "OperandTypes": [ + "Reg8", + "UInt8" + ], + "IsJump": false, + "AbstractDefinition": 21 + }, + { + "Opcode": 107, + "Name": "LoadParamLong", + "OperandTypes": [ + "Reg8", + "UInt32" + ], + "IsJump": false, + "AbstractDefinition": 21 + }, + { + "Opcode": 108, + "Name": "LoadConstUInt8", + "OperandTypes": [ + "Reg8", + "UInt8" + ], + "IsJump": false + }, + { + "Opcode": 109, + "Name": "LoadConstInt", + "OperandTypes": [ + "Reg8", + "Imm32" + ], + "IsJump": false + }, + { + "Opcode": 110, + "Name": "LoadConstDouble", + "OperandTypes": [ + "Reg8", + "Double" + ], + "IsJump": false + }, + { + "Opcode": 111, + "Name": "LoadConstBigInt", + "OperandTypes": [ + "Reg8", + "UInt16" + ], + "IsJump": false, + "AbstractDefinition": 22 + }, + { + "Opcode": 112, + "Name": "LoadConstBigIntLongIndex", + "OperandTypes": [ + "Reg8", + "UInt32" + ], + "IsJump": false, + "AbstractDefinition": 22 + }, + { + "Opcode": 113, + "Name": "LoadConstString", + "OperandTypes": [ + "Reg8", + "UInt16S" + ], + "IsJump": false, + "AbstractDefinition": 23 + }, + { + "Opcode": 114, + "Name": "LoadConstStringLongIndex", + "OperandTypes": [ + "Reg8", + "UInt32S" + ], + "IsJump": false, + "AbstractDefinition": 23 + }, + { + "Opcode": 115, + "Name": "LoadConstEmpty", + "OperandTypes": [ + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 116, + "Name": "LoadConstUndefined", + "OperandTypes": [ + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 117, + "Name": "LoadConstNull", + "OperandTypes": [ + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 118, + "Name": "LoadConstTrue", + "OperandTypes": [ + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 119, + "Name": "LoadConstFalse", + "OperandTypes": [ + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 120, + "Name": "LoadConstZero", + "OperandTypes": [ + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 121, + "Name": "CoerceThisNS", + "OperandTypes": [ + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 122, + "Name": "LoadThisNS", + "OperandTypes": [ + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 123, + "Name": "ToNumber", + "OperandTypes": [ + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 124, + "Name": "ToNumeric", + "OperandTypes": [ + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 125, + "Name": "ToInt32", + "OperandTypes": [ + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 126, + "Name": "AddEmptyString", + "OperandTypes": [ + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 127, + "Name": "GetArgumentsPropByVal", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 128, + "Name": "GetArgumentsLength", + "OperandTypes": [ + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 129, + "Name": "ReifyArguments", + "OperandTypes": [ + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 130, + "Name": "CreateRegExp", + "OperandTypes": [ + "Reg8", + "UInt32S", + "UInt32S", + "UInt32" + ], + "IsJump": false + }, + { + "Opcode": 131, + "Name": "SwitchImm", + "OperandTypes": [ + "Reg8", + "UInt32", + "Addr32", + "UInt32", + "UInt32" + ], + "IsJump": false + }, + { + "Opcode": 132, + "Name": "StartGenerator", + "OperandTypes": [], + "IsJump": false + }, + { + "Opcode": 133, + "Name": "ResumeGenerator", + "OperandTypes": [ + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 134, + "Name": "CompleteGenerator", + "OperandTypes": [], + "IsJump": false + }, + { + "Opcode": 135, + "Name": "CreateGenerator", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt16" + ], + "IsJump": false, + "AbstractDefinition": 24 + }, + { + "Opcode": 136, + "Name": "CreateGeneratorLongIndex", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt32" + ], + "IsJump": false, + "AbstractDefinition": 24 + }, + { + "Opcode": 137, + "Name": "IteratorBegin", + "OperandTypes": [ + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 138, + "Name": "IteratorNext", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 139, + "Name": "IteratorClose", + "OperandTypes": [ + "Reg8", + "UInt8" + ], + "IsJump": false + }, + { + "Opcode": 140, + "Name": "Jmp", + "OperandTypes": [ + "Addr8" + ], + "IsJump": true, + "AbstractDefinition": 25 + }, + { + "Opcode": 141, + "Name": "JmpLong", + "OperandTypes": [ + "Addr32" + ], + "IsJump": true, + "AbstractDefinition": 25 + }, + { + "Opcode": 142, + "Name": "JmpTrue", + "OperandTypes": [ + "Addr8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 26 + }, + { + "Opcode": 143, + "Name": "JmpTrueLong", + "OperandTypes": [ + "Addr32", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 26 + }, + { + "Opcode": 144, + "Name": "JmpFalse", + "OperandTypes": [ + "Addr8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 27 + }, + { + "Opcode": 145, + "Name": "JmpFalseLong", + "OperandTypes": [ + "Addr32", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 27 + }, + { + "Opcode": 146, + "Name": "JmpUndefined", + "OperandTypes": [ + "Addr8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 28 + }, + { + "Opcode": 147, + "Name": "JmpUndefinedLong", + "OperandTypes": [ + "Addr32", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 28 + }, + { + "Opcode": 148, + "Name": "SaveGenerator", + "OperandTypes": [ + "Addr8" + ], + "IsJump": true, + "AbstractDefinition": 29 + }, + { + "Opcode": 149, + "Name": "SaveGeneratorLong", + "OperandTypes": [ + "Addr32" + ], + "IsJump": true, + "AbstractDefinition": 29 + }, + { + "Opcode": 150, + "Name": "JLess", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 30 + }, + { + "Opcode": 151, + "Name": "JLessLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 30 + }, + { + "Opcode": 152, + "Name": "JNotLess", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 31 + }, + { + "Opcode": 153, + "Name": "JNotLessLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 31 + }, + { + "Opcode": 154, + "Name": "JLessN", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 32 + }, + { + "Opcode": 155, + "Name": "JLessNLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 32 + }, + { + "Opcode": 156, + "Name": "JNotLessN", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 33 + }, + { + "Opcode": 157, + "Name": "JNotLessNLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 33 + }, + { + "Opcode": 158, + "Name": "JLessEqual", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 34 + }, + { + "Opcode": 159, + "Name": "JLessEqualLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 34 + }, + { + "Opcode": 160, + "Name": "JNotLessEqual", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 35 + }, + { + "Opcode": 161, + "Name": "JNotLessEqualLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 35 + }, + { + "Opcode": 162, + "Name": "JLessEqualN", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 36 + }, + { + "Opcode": 163, + "Name": "JLessEqualNLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 36 + }, + { + "Opcode": 164, + "Name": "JNotLessEqualN", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 37 + }, + { + "Opcode": 165, + "Name": "JNotLessEqualNLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 37 + }, + { + "Opcode": 166, + "Name": "JGreater", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 38 + }, + { + "Opcode": 167, + "Name": "JGreaterLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 38 + }, + { + "Opcode": 168, + "Name": "JNotGreater", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 39 + }, + { + "Opcode": 169, + "Name": "JNotGreaterLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 39 + }, + { + "Opcode": 170, + "Name": "JGreaterN", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 40 + }, + { + "Opcode": 171, + "Name": "JGreaterNLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 40 + }, + { + "Opcode": 172, + "Name": "JNotGreaterN", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 41 + }, + { + "Opcode": 173, + "Name": "JNotGreaterNLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 41 + }, + { + "Opcode": 174, + "Name": "JGreaterEqual", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 42 + }, + { + "Opcode": 175, + "Name": "JGreaterEqualLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 42 + }, + { + "Opcode": 176, + "Name": "JNotGreaterEqual", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 43 + }, + { + "Opcode": 177, + "Name": "JNotGreaterEqualLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 43 + }, + { + "Opcode": 178, + "Name": "JGreaterEqualN", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 44 + }, + { + "Opcode": 179, + "Name": "JGreaterEqualNLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 44 + }, + { + "Opcode": 180, + "Name": "JNotGreaterEqualN", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 45 + }, + { + "Opcode": 181, + "Name": "JNotGreaterEqualNLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 45 + }, + { + "Opcode": 182, + "Name": "JEqual", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 46 + }, + { + "Opcode": 183, + "Name": "JEqualLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 46 + }, + { + "Opcode": 184, + "Name": "JNotEqual", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 47 + }, + { + "Opcode": 185, + "Name": "JNotEqualLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 47 + }, + { + "Opcode": 186, + "Name": "JStrictEqual", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 48 + }, + { + "Opcode": 187, + "Name": "JStrictEqualLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 48 + }, + { + "Opcode": 188, + "Name": "JStrictNotEqual", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 49 + }, + { + "Opcode": 189, + "Name": "JStrictNotEqualLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 49 + }, + { + "Opcode": 190, + "Name": "Add32", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 191, + "Name": "Sub32", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 192, + "Name": "Mul32", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 193, + "Name": "Divi32", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 194, + "Name": "Divu32", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 195, + "Name": "Loadi8", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 196, + "Name": "Loadu8", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 197, + "Name": "Loadi16", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 198, + "Name": "Loadu16", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 199, + "Name": "Loadi32", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 200, + "Name": "Loadu32", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 201, + "Name": "Store8", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 202, + "Name": "Store16", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 203, + "Name": "Store32", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + } + ], + "AbstractDefinitions": [ + { + "Name": "NewObjectWithBuffer", + "VariantOpcodes": [ + 1, + 2 + ] + }, + { + "Name": "NewArrayWithBuffer", + "VariantOpcodes": [ + 5, + 6 + ] + }, + { + "Name": "Mov", + "VariantOpcodes": [ + 8, + 9 + ] + }, + { + "Name": "StoreToEnvironment", + "VariantOpcodes": [ + 42, + 43 + ] + }, + { + "Name": "StoreNPToEnvironment", + "VariantOpcodes": [ + 44, + 45 + ] + }, + { + "Name": "LoadFromEnvironment", + "VariantOpcodes": [ + 46, + 47 + ] + }, + { + "Name": "GetById", + "VariantOpcodes": [ + 53, + 52, + 54 + ] + }, + { + "Name": "TryGetById", + "VariantOpcodes": [ + 55, + 56 + ] + }, + { + "Name": "PutById", + "VariantOpcodes": [ + 57, + 58 + ] + }, + { + "Name": "TryPutById", + "VariantOpcodes": [ + 59, + 60 + ] + }, + { + "Name": "PutNewOwnById", + "VariantOpcodes": [ + 62, + 61, + 63 + ] + }, + { + "Name": "PutNewOwnNEById", + "VariantOpcodes": [ + 64, + 65 + ] + }, + { + "Name": "PutOwnByIndex", + "VariantOpcodes": [ + 66, + 67 + ] + }, + { + "Name": "DelById", + "VariantOpcodes": [ + 69, + 70 + ] + }, + { + "Name": "Call", + "VariantOpcodes": [ + 77, + 84 + ] + }, + { + "Name": "Construct", + "VariantOpcodes": [ + 78, + 85 + ] + }, + { + "Name": "CallDirect", + "VariantOpcodes": [ + 80, + 86 + ] + }, + { + "Name": "CallBuiltin", + "VariantOpcodes": [ + 87, + 88 + ] + }, + { + "Name": "CreateClosure", + "VariantOpcodes": [ + 98, + 99 + ] + }, + { + "Name": "CreateGeneratorClosure", + "VariantOpcodes": [ + 100, + 101 + ] + }, + { + "Name": "CreateAsyncClosure", + "VariantOpcodes": [ + 102, + 103 + ] + }, + { + "Name": "LoadParam", + "VariantOpcodes": [ + 106, + 107 + ] + }, + { + "Name": "LoadConstBigInt", + "VariantOpcodes": [ + 111, + 112 + ] + }, + { + "Name": "LoadConstString", + "VariantOpcodes": [ + 113, + 114 + ] + }, + { + "Name": "CreateGenerator", + "VariantOpcodes": [ + 135, + 136 + ] + }, + { + "Name": "Jmp", + "VariantOpcodes": [ + 140, + 141 + ] + }, + { + "Name": "JmpTrue", + "VariantOpcodes": [ + 142, + 143 + ] + }, + { + "Name": "JmpFalse", + "VariantOpcodes": [ + 144, + 145 + ] + }, + { + "Name": "JmpUndefined", + "VariantOpcodes": [ + 146, + 147 + ] + }, + { + "Name": "SaveGenerator", + "VariantOpcodes": [ + 148, + 149 + ] + }, + { + "Name": "JLess", + "VariantOpcodes": [ + 150, + 151 + ] + }, + { + "Name": "JNotLess", + "VariantOpcodes": [ + 152, + 153 + ] + }, + { + "Name": "JLessN", + "VariantOpcodes": [ + 154, + 155 + ] + }, + { + "Name": "JNotLessN", + "VariantOpcodes": [ + 156, + 157 + ] + }, + { + "Name": "JLessEqual", + "VariantOpcodes": [ + 158, + 159 + ] + }, + { + "Name": "JNotLessEqual", + "VariantOpcodes": [ + 160, + 161 + ] + }, + { + "Name": "JLessEqualN", + "VariantOpcodes": [ + 162, + 163 + ] + }, + { + "Name": "JNotLessEqualN", + "VariantOpcodes": [ + 164, + 165 + ] + }, + { + "Name": "JGreater", + "VariantOpcodes": [ + 166, + 167 + ] + }, + { + "Name": "JNotGreater", + "VariantOpcodes": [ + 168, + 169 + ] + }, + { + "Name": "JGreaterN", + "VariantOpcodes": [ + 170, + 171 + ] + }, + { + "Name": "JNotGreaterN", + "VariantOpcodes": [ + 172, + 173 + ] + }, + { + "Name": "JGreaterEqual", + "VariantOpcodes": [ + 174, + 175 + ] + }, + { + "Name": "JNotGreaterEqual", + "VariantOpcodes": [ + 176, + 177 + ] + }, + { + "Name": "JGreaterEqualN", + "VariantOpcodes": [ + 178, + 179 + ] + }, + { + "Name": "JNotGreaterEqualN", + "VariantOpcodes": [ + 180, + 181 + ] + }, + { + "Name": "JEqual", + "VariantOpcodes": [ + 182, + 183 + ] + }, + { + "Name": "JNotEqual", + "VariantOpcodes": [ + 184, + 185 + ] + }, + { + "Name": "JStrictEqual", + "VariantOpcodes": [ + 186, + 187 + ] + }, + { + "Name": "JStrictNotEqual", + "VariantOpcodes": [ + 188, + 189 + ] + } + ], + "GitCommitHash": "41752c6589227694ae3a96a34e932c74c9ce3699" +} \ No newline at end of file diff --git a/hasmer/libhasmer/Resources/Bytecode88.json b/hasmer/libhasmer/Resources/Bytecode88.json new file mode 100644 index 0000000..beb5020 --- /dev/null +++ b/hasmer/libhasmer/Resources/Bytecode88.json @@ -0,0 +1,2432 @@ +{ + "Version": 88, + "Definitions": [ + { + "Opcode": 0, + "Name": "Unreachable", + "OperandTypes": [], + "IsJump": false + }, + { + "Opcode": 1, + "Name": "NewObjectWithBuffer", + "OperandTypes": [ + "Reg8", + "UInt16", + "UInt16", + "UInt16", + "UInt16" + ], + "IsJump": false, + "AbstractDefinition": 0 + }, + { + "Opcode": 2, + "Name": "NewObjectWithBufferLong", + "OperandTypes": [ + "Reg8", + "UInt16", + "UInt16", + "UInt32", + "UInt32" + ], + "IsJump": false, + "AbstractDefinition": 0 + }, + { + "Opcode": 3, + "Name": "NewObject", + "OperandTypes": [ + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 4, + "Name": "NewObjectWithParent", + "OperandTypes": [ + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 5, + "Name": "NewArrayWithBuffer", + "OperandTypes": [ + "Reg8", + "UInt16", + "UInt16", + "UInt16" + ], + "IsJump": false, + "AbstractDefinition": 1 + }, + { + "Opcode": 6, + "Name": "NewArrayWithBufferLong", + "OperandTypes": [ + "Reg8", + "UInt16", + "UInt16", + "UInt32" + ], + "IsJump": false, + "AbstractDefinition": 1 + }, + { + "Opcode": 7, + "Name": "NewArray", + "OperandTypes": [ + "Reg8", + "UInt16" + ], + "IsJump": false + }, + { + "Opcode": 8, + "Name": "Mov", + "OperandTypes": [ + "Reg8", + "Reg8" + ], + "IsJump": false, + "AbstractDefinition": 2 + }, + { + "Opcode": 9, + "Name": "MovLong", + "OperandTypes": [ + "Reg32", + "Reg32" + ], + "IsJump": false, + "AbstractDefinition": 2 + }, + { + "Opcode": 10, + "Name": "Negate", + "OperandTypes": [ + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 11, + "Name": "Not", + "OperandTypes": [ + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 12, + "Name": "BitNot", + "OperandTypes": [ + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 13, + "Name": "TypeOf", + "OperandTypes": [ + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 14, + "Name": "Eq", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 15, + "Name": "StrictEq", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 16, + "Name": "Neq", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 17, + "Name": "StrictNeq", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 18, + "Name": "Less", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 19, + "Name": "LessEq", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 20, + "Name": "Greater", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 21, + "Name": "GreaterEq", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 22, + "Name": "Add", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 23, + "Name": "AddN", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 24, + "Name": "Mul", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 25, + "Name": "MulN", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 26, + "Name": "Div", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 27, + "Name": "DivN", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 28, + "Name": "Mod", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 29, + "Name": "Sub", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 30, + "Name": "SubN", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 31, + "Name": "LShift", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 32, + "Name": "RShift", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 33, + "Name": "URshift", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 34, + "Name": "BitAnd", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 35, + "Name": "BitXor", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 36, + "Name": "BitOr", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 37, + "Name": "Inc", + "OperandTypes": [ + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 38, + "Name": "Dec", + "OperandTypes": [ + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 39, + "Name": "InstanceOf", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 40, + "Name": "IsIn", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 41, + "Name": "GetEnvironment", + "OperandTypes": [ + "Reg8", + "UInt8" + ], + "IsJump": false + }, + { + "Opcode": 42, + "Name": "StoreToEnvironment", + "OperandTypes": [ + "Reg8", + "UInt8", + "Reg8" + ], + "IsJump": false, + "AbstractDefinition": 3 + }, + { + "Opcode": 43, + "Name": "StoreToEnvironmentL", + "OperandTypes": [ + "Reg8", + "UInt16", + "Reg8" + ], + "IsJump": false, + "AbstractDefinition": 3 + }, + { + "Opcode": 44, + "Name": "StoreNPToEnvironment", + "OperandTypes": [ + "Reg8", + "UInt8", + "Reg8" + ], + "IsJump": false, + "AbstractDefinition": 4 + }, + { + "Opcode": 45, + "Name": "StoreNPToEnvironmentL", + "OperandTypes": [ + "Reg8", + "UInt16", + "Reg8" + ], + "IsJump": false, + "AbstractDefinition": 4 + }, + { + "Opcode": 46, + "Name": "LoadFromEnvironment", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt8" + ], + "IsJump": false, + "AbstractDefinition": 5 + }, + { + "Opcode": 47, + "Name": "LoadFromEnvironmentL", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt16" + ], + "IsJump": false, + "AbstractDefinition": 5 + }, + { + "Opcode": 48, + "Name": "GetGlobalObject", + "OperandTypes": [ + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 49, + "Name": "GetNewTarget", + "OperandTypes": [ + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 50, + "Name": "CreateEnvironment", + "OperandTypes": [ + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 51, + "Name": "DeclareGlobalVar", + "OperandTypes": [ + "UInt32S" + ], + "IsJump": false + }, + { + "Opcode": 52, + "Name": "GetByIdShort", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt8", + "UInt8S" + ], + "IsJump": false, + "AbstractDefinition": 6 + }, + { + "Opcode": 53, + "Name": "GetById", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt8", + "UInt16S" + ], + "IsJump": false, + "AbstractDefinition": 6 + }, + { + "Opcode": 54, + "Name": "GetByIdLong", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt8", + "UInt32S" + ], + "IsJump": false, + "AbstractDefinition": 6 + }, + { + "Opcode": 55, + "Name": "TryGetById", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt8", + "UInt16S" + ], + "IsJump": false, + "AbstractDefinition": 7 + }, + { + "Opcode": 56, + "Name": "TryGetByIdLong", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt8", + "UInt32S" + ], + "IsJump": false, + "AbstractDefinition": 7 + }, + { + "Opcode": 57, + "Name": "PutById", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt8", + "UInt16S" + ], + "IsJump": false, + "AbstractDefinition": 8 + }, + { + "Opcode": 58, + "Name": "PutByIdLong", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt8", + "UInt32S" + ], + "IsJump": false, + "AbstractDefinition": 8 + }, + { + "Opcode": 59, + "Name": "TryPutById", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt8", + "UInt16S" + ], + "IsJump": false, + "AbstractDefinition": 9 + }, + { + "Opcode": 60, + "Name": "TryPutByIdLong", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt8", + "UInt32S" + ], + "IsJump": false, + "AbstractDefinition": 9 + }, + { + "Opcode": 61, + "Name": "PutNewOwnByIdShort", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt8S" + ], + "IsJump": false, + "AbstractDefinition": 10 + }, + { + "Opcode": 62, + "Name": "PutNewOwnById", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt16S" + ], + "IsJump": false, + "AbstractDefinition": 10 + }, + { + "Opcode": 63, + "Name": "PutNewOwnByIdLong", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt32S" + ], + "IsJump": false, + "AbstractDefinition": 10 + }, + { + "Opcode": 64, + "Name": "PutNewOwnNEById", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt16S" + ], + "IsJump": false, + "AbstractDefinition": 11 + }, + { + "Opcode": 65, + "Name": "PutNewOwnNEByIdLong", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt32S" + ], + "IsJump": false, + "AbstractDefinition": 11 + }, + { + "Opcode": 66, + "Name": "PutOwnByIndex", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt8" + ], + "IsJump": false, + "AbstractDefinition": 12 + }, + { + "Opcode": 67, + "Name": "PutOwnByIndexL", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt32" + ], + "IsJump": false, + "AbstractDefinition": 12 + }, + { + "Opcode": 68, + "Name": "PutOwnByVal", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8", + "UInt8" + ], + "IsJump": false + }, + { + "Opcode": 69, + "Name": "DelById", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt16S" + ], + "IsJump": false, + "AbstractDefinition": 13 + }, + { + "Opcode": 70, + "Name": "DelByIdLong", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt32S" + ], + "IsJump": false, + "AbstractDefinition": 13 + }, + { + "Opcode": 71, + "Name": "GetByVal", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 72, + "Name": "PutByVal", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 73, + "Name": "DelByVal", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 74, + "Name": "PutOwnGetterSetterByVal", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8", + "Reg8", + "UInt8" + ], + "IsJump": false + }, + { + "Opcode": 75, + "Name": "GetPNameList", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 76, + "Name": "GetNextPName", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 77, + "Name": "Call", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt8" + ], + "IsJump": false, + "AbstractDefinition": 14 + }, + { + "Opcode": 78, + "Name": "Construct", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt8" + ], + "IsJump": false, + "AbstractDefinition": 15 + }, + { + "Opcode": 79, + "Name": "Call1", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 80, + "Name": "CallDirect", + "OperandTypes": [ + "Reg8", + "UInt8", + "UInt16" + ], + "IsJump": false, + "AbstractDefinition": 16 + }, + { + "Opcode": 81, + "Name": "Call2", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 82, + "Name": "Call3", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 83, + "Name": "Call4", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8", + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 84, + "Name": "CallLong", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt32" + ], + "IsJump": false, + "AbstractDefinition": 14 + }, + { + "Opcode": 85, + "Name": "ConstructLong", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt32" + ], + "IsJump": false, + "AbstractDefinition": 15 + }, + { + "Opcode": 86, + "Name": "CallDirectLongIndex", + "OperandTypes": [ + "Reg8", + "UInt8", + "UInt32" + ], + "IsJump": false, + "AbstractDefinition": 16 + }, + { + "Opcode": 87, + "Name": "CallBuiltin", + "OperandTypes": [ + "Reg8", + "UInt8", + "UInt8" + ], + "IsJump": false, + "AbstractDefinition": 17 + }, + { + "Opcode": 88, + "Name": "CallBuiltinLong", + "OperandTypes": [ + "Reg8", + "UInt8", + "UInt32" + ], + "IsJump": false, + "AbstractDefinition": 17 + }, + { + "Opcode": 89, + "Name": "GetBuiltinClosure", + "OperandTypes": [ + "Reg8", + "UInt8" + ], + "IsJump": false + }, + { + "Opcode": 90, + "Name": "Ret", + "OperandTypes": [ + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 91, + "Name": "Catch", + "OperandTypes": [ + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 92, + "Name": "DirectEval", + "OperandTypes": [ + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 93, + "Name": "Throw", + "OperandTypes": [ + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 94, + "Name": "ThrowIfEmpty", + "OperandTypes": [ + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 95, + "Name": "Debugger", + "OperandTypes": [], + "IsJump": false + }, + { + "Opcode": 96, + "Name": "AsyncBreakCheck", + "OperandTypes": [], + "IsJump": false + }, + { + "Opcode": 97, + "Name": "ProfilePoint", + "OperandTypes": [ + "UInt16" + ], + "IsJump": false + }, + { + "Opcode": 98, + "Name": "CreateClosure", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt16" + ], + "IsJump": false, + "AbstractDefinition": 18 + }, + { + "Opcode": 99, + "Name": "CreateClosureLongIndex", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt32" + ], + "IsJump": false, + "AbstractDefinition": 18 + }, + { + "Opcode": 100, + "Name": "CreateGeneratorClosure", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt16" + ], + "IsJump": false, + "AbstractDefinition": 19 + }, + { + "Opcode": 101, + "Name": "CreateGeneratorClosureLongIndex", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt32" + ], + "IsJump": false, + "AbstractDefinition": 19 + }, + { + "Opcode": 102, + "Name": "CreateAsyncClosure", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt16" + ], + "IsJump": false, + "AbstractDefinition": 20 + }, + { + "Opcode": 103, + "Name": "CreateAsyncClosureLongIndex", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt32" + ], + "IsJump": false, + "AbstractDefinition": 20 + }, + { + "Opcode": 104, + "Name": "CreateThis", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 105, + "Name": "SelectObject", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 106, + "Name": "LoadParam", + "OperandTypes": [ + "Reg8", + "UInt8" + ], + "IsJump": false, + "AbstractDefinition": 21 + }, + { + "Opcode": 107, + "Name": "LoadParamLong", + "OperandTypes": [ + "Reg8", + "UInt32" + ], + "IsJump": false, + "AbstractDefinition": 21 + }, + { + "Opcode": 108, + "Name": "LoadConstUInt8", + "OperandTypes": [ + "Reg8", + "UInt8" + ], + "IsJump": false + }, + { + "Opcode": 109, + "Name": "LoadConstInt", + "OperandTypes": [ + "Reg8", + "Imm32" + ], + "IsJump": false + }, + { + "Opcode": 110, + "Name": "LoadConstDouble", + "OperandTypes": [ + "Reg8", + "Double" + ], + "IsJump": false + }, + { + "Opcode": 111, + "Name": "LoadConstBigInt", + "OperandTypes": [ + "Reg8", + "UInt16" + ], + "IsJump": false, + "AbstractDefinition": 22 + }, + { + "Opcode": 112, + "Name": "LoadConstBigIntLongIndex", + "OperandTypes": [ + "Reg8", + "UInt32" + ], + "IsJump": false, + "AbstractDefinition": 22 + }, + { + "Opcode": 113, + "Name": "LoadConstString", + "OperandTypes": [ + "Reg8", + "UInt16S" + ], + "IsJump": false, + "AbstractDefinition": 23 + }, + { + "Opcode": 114, + "Name": "LoadConstStringLongIndex", + "OperandTypes": [ + "Reg8", + "UInt32S" + ], + "IsJump": false, + "AbstractDefinition": 23 + }, + { + "Opcode": 115, + "Name": "LoadConstEmpty", + "OperandTypes": [ + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 116, + "Name": "LoadConstUndefined", + "OperandTypes": [ + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 117, + "Name": "LoadConstNull", + "OperandTypes": [ + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 118, + "Name": "LoadConstTrue", + "OperandTypes": [ + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 119, + "Name": "LoadConstFalse", + "OperandTypes": [ + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 120, + "Name": "LoadConstZero", + "OperandTypes": [ + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 121, + "Name": "CoerceThisNS", + "OperandTypes": [ + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 122, + "Name": "LoadThisNS", + "OperandTypes": [ + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 123, + "Name": "ToNumber", + "OperandTypes": [ + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 124, + "Name": "ToNumeric", + "OperandTypes": [ + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 125, + "Name": "ToInt32", + "OperandTypes": [ + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 126, + "Name": "AddEmptyString", + "OperandTypes": [ + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 127, + "Name": "GetArgumentsPropByVal", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 128, + "Name": "GetArgumentsLength", + "OperandTypes": [ + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 129, + "Name": "ReifyArguments", + "OperandTypes": [ + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 130, + "Name": "CreateRegExp", + "OperandTypes": [ + "Reg8", + "UInt32S", + "UInt32S", + "UInt32" + ], + "IsJump": false + }, + { + "Opcode": 131, + "Name": "SwitchImm", + "OperandTypes": [ + "Reg8", + "UInt32", + "Addr32", + "UInt32", + "UInt32" + ], + "IsJump": false + }, + { + "Opcode": 132, + "Name": "StartGenerator", + "OperandTypes": [], + "IsJump": false + }, + { + "Opcode": 133, + "Name": "ResumeGenerator", + "OperandTypes": [ + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 134, + "Name": "CompleteGenerator", + "OperandTypes": [], + "IsJump": false + }, + { + "Opcode": 135, + "Name": "CreateGenerator", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt16" + ], + "IsJump": false, + "AbstractDefinition": 24 + }, + { + "Opcode": 136, + "Name": "CreateGeneratorLongIndex", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt32" + ], + "IsJump": false, + "AbstractDefinition": 24 + }, + { + "Opcode": 137, + "Name": "IteratorBegin", + "OperandTypes": [ + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 138, + "Name": "IteratorNext", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 139, + "Name": "IteratorClose", + "OperandTypes": [ + "Reg8", + "UInt8" + ], + "IsJump": false + }, + { + "Opcode": 140, + "Name": "Jmp", + "OperandTypes": [ + "Addr8" + ], + "IsJump": true, + "AbstractDefinition": 25 + }, + { + "Opcode": 141, + "Name": "JmpLong", + "OperandTypes": [ + "Addr32" + ], + "IsJump": true, + "AbstractDefinition": 25 + }, + { + "Opcode": 142, + "Name": "JmpTrue", + "OperandTypes": [ + "Addr8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 26 + }, + { + "Opcode": 143, + "Name": "JmpTrueLong", + "OperandTypes": [ + "Addr32", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 26 + }, + { + "Opcode": 144, + "Name": "JmpFalse", + "OperandTypes": [ + "Addr8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 27 + }, + { + "Opcode": 145, + "Name": "JmpFalseLong", + "OperandTypes": [ + "Addr32", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 27 + }, + { + "Opcode": 146, + "Name": "JmpUndefined", + "OperandTypes": [ + "Addr8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 28 + }, + { + "Opcode": 147, + "Name": "JmpUndefinedLong", + "OperandTypes": [ + "Addr32", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 28 + }, + { + "Opcode": 148, + "Name": "SaveGenerator", + "OperandTypes": [ + "Addr8" + ], + "IsJump": true, + "AbstractDefinition": 29 + }, + { + "Opcode": 149, + "Name": "SaveGeneratorLong", + "OperandTypes": [ + "Addr32" + ], + "IsJump": true, + "AbstractDefinition": 29 + }, + { + "Opcode": 150, + "Name": "JLess", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 30 + }, + { + "Opcode": 151, + "Name": "JLessLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 30 + }, + { + "Opcode": 152, + "Name": "JNotLess", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 31 + }, + { + "Opcode": 153, + "Name": "JNotLessLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 31 + }, + { + "Opcode": 154, + "Name": "JLessN", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 32 + }, + { + "Opcode": 155, + "Name": "JLessNLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 32 + }, + { + "Opcode": 156, + "Name": "JNotLessN", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 33 + }, + { + "Opcode": 157, + "Name": "JNotLessNLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 33 + }, + { + "Opcode": 158, + "Name": "JLessEqual", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 34 + }, + { + "Opcode": 159, + "Name": "JLessEqualLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 34 + }, + { + "Opcode": 160, + "Name": "JNotLessEqual", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 35 + }, + { + "Opcode": 161, + "Name": "JNotLessEqualLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 35 + }, + { + "Opcode": 162, + "Name": "JLessEqualN", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 36 + }, + { + "Opcode": 163, + "Name": "JLessEqualNLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 36 + }, + { + "Opcode": 164, + "Name": "JNotLessEqualN", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 37 + }, + { + "Opcode": 165, + "Name": "JNotLessEqualNLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 37 + }, + { + "Opcode": 166, + "Name": "JGreater", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 38 + }, + { + "Opcode": 167, + "Name": "JGreaterLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 38 + }, + { + "Opcode": 168, + "Name": "JNotGreater", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 39 + }, + { + "Opcode": 169, + "Name": "JNotGreaterLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 39 + }, + { + "Opcode": 170, + "Name": "JGreaterN", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 40 + }, + { + "Opcode": 171, + "Name": "JGreaterNLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 40 + }, + { + "Opcode": 172, + "Name": "JNotGreaterN", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 41 + }, + { + "Opcode": 173, + "Name": "JNotGreaterNLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 41 + }, + { + "Opcode": 174, + "Name": "JGreaterEqual", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 42 + }, + { + "Opcode": 175, + "Name": "JGreaterEqualLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 42 + }, + { + "Opcode": 176, + "Name": "JNotGreaterEqual", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 43 + }, + { + "Opcode": 177, + "Name": "JNotGreaterEqualLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 43 + }, + { + "Opcode": 178, + "Name": "JGreaterEqualN", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 44 + }, + { + "Opcode": 179, + "Name": "JGreaterEqualNLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 44 + }, + { + "Opcode": 180, + "Name": "JNotGreaterEqualN", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 45 + }, + { + "Opcode": 181, + "Name": "JNotGreaterEqualNLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 45 + }, + { + "Opcode": 182, + "Name": "JEqual", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 46 + }, + { + "Opcode": 183, + "Name": "JEqualLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 46 + }, + { + "Opcode": 184, + "Name": "JNotEqual", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 47 + }, + { + "Opcode": 185, + "Name": "JNotEqualLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 47 + }, + { + "Opcode": 186, + "Name": "JStrictEqual", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 48 + }, + { + "Opcode": 187, + "Name": "JStrictEqualLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 48 + }, + { + "Opcode": 188, + "Name": "JStrictNotEqual", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 49 + }, + { + "Opcode": 189, + "Name": "JStrictNotEqualLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 49 + }, + { + "Opcode": 190, + "Name": "Add32", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 191, + "Name": "Sub32", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 192, + "Name": "Mul32", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 193, + "Name": "Divi32", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 194, + "Name": "Divu32", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 195, + "Name": "Loadi8", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 196, + "Name": "Loadu8", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 197, + "Name": "Loadi16", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 198, + "Name": "Loadu16", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 199, + "Name": "Loadi32", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 200, + "Name": "Loadu32", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 201, + "Name": "Store8", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 202, + "Name": "Store16", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 203, + "Name": "Store32", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + } + ], + "AbstractDefinitions": [ + { + "Name": "NewObjectWithBuffer", + "VariantOpcodes": [ + 1, + 2 + ] + }, + { + "Name": "NewArrayWithBuffer", + "VariantOpcodes": [ + 5, + 6 + ] + }, + { + "Name": "Mov", + "VariantOpcodes": [ + 8, + 9 + ] + }, + { + "Name": "StoreToEnvironment", + "VariantOpcodes": [ + 42, + 43 + ] + }, + { + "Name": "StoreNPToEnvironment", + "VariantOpcodes": [ + 44, + 45 + ] + }, + { + "Name": "LoadFromEnvironment", + "VariantOpcodes": [ + 46, + 47 + ] + }, + { + "Name": "GetById", + "VariantOpcodes": [ + 53, + 52, + 54 + ] + }, + { + "Name": "TryGetById", + "VariantOpcodes": [ + 55, + 56 + ] + }, + { + "Name": "PutById", + "VariantOpcodes": [ + 57, + 58 + ] + }, + { + "Name": "TryPutById", + "VariantOpcodes": [ + 59, + 60 + ] + }, + { + "Name": "PutNewOwnById", + "VariantOpcodes": [ + 62, + 61, + 63 + ] + }, + { + "Name": "PutNewOwnNEById", + "VariantOpcodes": [ + 64, + 65 + ] + }, + { + "Name": "PutOwnByIndex", + "VariantOpcodes": [ + 66, + 67 + ] + }, + { + "Name": "DelById", + "VariantOpcodes": [ + 69, + 70 + ] + }, + { + "Name": "Call", + "VariantOpcodes": [ + 77, + 84 + ] + }, + { + "Name": "Construct", + "VariantOpcodes": [ + 78, + 85 + ] + }, + { + "Name": "CallDirect", + "VariantOpcodes": [ + 80, + 86 + ] + }, + { + "Name": "CallBuiltin", + "VariantOpcodes": [ + 87, + 88 + ] + }, + { + "Name": "CreateClosure", + "VariantOpcodes": [ + 98, + 99 + ] + }, + { + "Name": "CreateGeneratorClosure", + "VariantOpcodes": [ + 100, + 101 + ] + }, + { + "Name": "CreateAsyncClosure", + "VariantOpcodes": [ + 102, + 103 + ] + }, + { + "Name": "LoadParam", + "VariantOpcodes": [ + 106, + 107 + ] + }, + { + "Name": "LoadConstBigInt", + "VariantOpcodes": [ + 111, + 112 + ] + }, + { + "Name": "LoadConstString", + "VariantOpcodes": [ + 113, + 114 + ] + }, + { + "Name": "CreateGenerator", + "VariantOpcodes": [ + 135, + 136 + ] + }, + { + "Name": "Jmp", + "VariantOpcodes": [ + 140, + 141 + ] + }, + { + "Name": "JmpTrue", + "VariantOpcodes": [ + 142, + 143 + ] + }, + { + "Name": "JmpFalse", + "VariantOpcodes": [ + 144, + 145 + ] + }, + { + "Name": "JmpUndefined", + "VariantOpcodes": [ + 146, + 147 + ] + }, + { + "Name": "SaveGenerator", + "VariantOpcodes": [ + 148, + 149 + ] + }, + { + "Name": "JLess", + "VariantOpcodes": [ + 150, + 151 + ] + }, + { + "Name": "JNotLess", + "VariantOpcodes": [ + 152, + 153 + ] + }, + { + "Name": "JLessN", + "VariantOpcodes": [ + 154, + 155 + ] + }, + { + "Name": "JNotLessN", + "VariantOpcodes": [ + 156, + 157 + ] + }, + { + "Name": "JLessEqual", + "VariantOpcodes": [ + 158, + 159 + ] + }, + { + "Name": "JNotLessEqual", + "VariantOpcodes": [ + 160, + 161 + ] + }, + { + "Name": "JLessEqualN", + "VariantOpcodes": [ + 162, + 163 + ] + }, + { + "Name": "JNotLessEqualN", + "VariantOpcodes": [ + 164, + 165 + ] + }, + { + "Name": "JGreater", + "VariantOpcodes": [ + 166, + 167 + ] + }, + { + "Name": "JNotGreater", + "VariantOpcodes": [ + 168, + 169 + ] + }, + { + "Name": "JGreaterN", + "VariantOpcodes": [ + 170, + 171 + ] + }, + { + "Name": "JNotGreaterN", + "VariantOpcodes": [ + 172, + 173 + ] + }, + { + "Name": "JGreaterEqual", + "VariantOpcodes": [ + 174, + 175 + ] + }, + { + "Name": "JNotGreaterEqual", + "VariantOpcodes": [ + 176, + 177 + ] + }, + { + "Name": "JGreaterEqualN", + "VariantOpcodes": [ + 178, + 179 + ] + }, + { + "Name": "JNotGreaterEqualN", + "VariantOpcodes": [ + 180, + 181 + ] + }, + { + "Name": "JEqual", + "VariantOpcodes": [ + 182, + 183 + ] + }, + { + "Name": "JNotEqual", + "VariantOpcodes": [ + 184, + 185 + ] + }, + { + "Name": "JStrictEqual", + "VariantOpcodes": [ + 186, + 187 + ] + }, + { + "Name": "JStrictNotEqual", + "VariantOpcodes": [ + 188, + 189 + ] + } + ], + "GitCommitHash": "2a55135bce3d41778ec3f56d8b43ad3b57b51b19" +} \ No newline at end of file diff --git a/hasmer/libhasmer/Resources/Bytecode89.json b/hasmer/libhasmer/Resources/Bytecode89.json new file mode 100644 index 0000000..5143624 --- /dev/null +++ b/hasmer/libhasmer/Resources/Bytecode89.json @@ -0,0 +1,2432 @@ +{ + "Version": 89, + "Definitions": [ + { + "Opcode": 0, + "Name": "Unreachable", + "OperandTypes": [], + "IsJump": false + }, + { + "Opcode": 1, + "Name": "NewObjectWithBuffer", + "OperandTypes": [ + "Reg8", + "UInt16", + "UInt16", + "UInt16", + "UInt16" + ], + "IsJump": false, + "AbstractDefinition": 0 + }, + { + "Opcode": 2, + "Name": "NewObjectWithBufferLong", + "OperandTypes": [ + "Reg8", + "UInt16", + "UInt16", + "UInt32", + "UInt32" + ], + "IsJump": false, + "AbstractDefinition": 0 + }, + { + "Opcode": 3, + "Name": "NewObject", + "OperandTypes": [ + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 4, + "Name": "NewObjectWithParent", + "OperandTypes": [ + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 5, + "Name": "NewArrayWithBuffer", + "OperandTypes": [ + "Reg8", + "UInt16", + "UInt16", + "UInt16" + ], + "IsJump": false, + "AbstractDefinition": 1 + }, + { + "Opcode": 6, + "Name": "NewArrayWithBufferLong", + "OperandTypes": [ + "Reg8", + "UInt16", + "UInt16", + "UInt32" + ], + "IsJump": false, + "AbstractDefinition": 1 + }, + { + "Opcode": 7, + "Name": "NewArray", + "OperandTypes": [ + "Reg8", + "UInt16" + ], + "IsJump": false + }, + { + "Opcode": 8, + "Name": "Mov", + "OperandTypes": [ + "Reg8", + "Reg8" + ], + "IsJump": false, + "AbstractDefinition": 2 + }, + { + "Opcode": 9, + "Name": "MovLong", + "OperandTypes": [ + "Reg32", + "Reg32" + ], + "IsJump": false, + "AbstractDefinition": 2 + }, + { + "Opcode": 10, + "Name": "Negate", + "OperandTypes": [ + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 11, + "Name": "Not", + "OperandTypes": [ + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 12, + "Name": "BitNot", + "OperandTypes": [ + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 13, + "Name": "TypeOf", + "OperandTypes": [ + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 14, + "Name": "Eq", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 15, + "Name": "StrictEq", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 16, + "Name": "Neq", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 17, + "Name": "StrictNeq", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 18, + "Name": "Less", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 19, + "Name": "LessEq", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 20, + "Name": "Greater", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 21, + "Name": "GreaterEq", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 22, + "Name": "Add", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 23, + "Name": "AddN", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 24, + "Name": "Mul", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 25, + "Name": "MulN", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 26, + "Name": "Div", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 27, + "Name": "DivN", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 28, + "Name": "Mod", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 29, + "Name": "Sub", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 30, + "Name": "SubN", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 31, + "Name": "LShift", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 32, + "Name": "RShift", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 33, + "Name": "URshift", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 34, + "Name": "BitAnd", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 35, + "Name": "BitXor", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 36, + "Name": "BitOr", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 37, + "Name": "Inc", + "OperandTypes": [ + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 38, + "Name": "Dec", + "OperandTypes": [ + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 39, + "Name": "InstanceOf", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 40, + "Name": "IsIn", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 41, + "Name": "GetEnvironment", + "OperandTypes": [ + "Reg8", + "UInt8" + ], + "IsJump": false + }, + { + "Opcode": 42, + "Name": "StoreToEnvironment", + "OperandTypes": [ + "Reg8", + "UInt8", + "Reg8" + ], + "IsJump": false, + "AbstractDefinition": 3 + }, + { + "Opcode": 43, + "Name": "StoreToEnvironmentL", + "OperandTypes": [ + "Reg8", + "UInt16", + "Reg8" + ], + "IsJump": false, + "AbstractDefinition": 3 + }, + { + "Opcode": 44, + "Name": "StoreNPToEnvironment", + "OperandTypes": [ + "Reg8", + "UInt8", + "Reg8" + ], + "IsJump": false, + "AbstractDefinition": 4 + }, + { + "Opcode": 45, + "Name": "StoreNPToEnvironmentL", + "OperandTypes": [ + "Reg8", + "UInt16", + "Reg8" + ], + "IsJump": false, + "AbstractDefinition": 4 + }, + { + "Opcode": 46, + "Name": "LoadFromEnvironment", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt8" + ], + "IsJump": false, + "AbstractDefinition": 5 + }, + { + "Opcode": 47, + "Name": "LoadFromEnvironmentL", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt16" + ], + "IsJump": false, + "AbstractDefinition": 5 + }, + { + "Opcode": 48, + "Name": "GetGlobalObject", + "OperandTypes": [ + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 49, + "Name": "GetNewTarget", + "OperandTypes": [ + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 50, + "Name": "CreateEnvironment", + "OperandTypes": [ + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 51, + "Name": "DeclareGlobalVar", + "OperandTypes": [ + "UInt32S" + ], + "IsJump": false + }, + { + "Opcode": 52, + "Name": "GetByIdShort", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt8", + "UInt8S" + ], + "IsJump": false, + "AbstractDefinition": 6 + }, + { + "Opcode": 53, + "Name": "GetById", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt8", + "UInt16S" + ], + "IsJump": false, + "AbstractDefinition": 6 + }, + { + "Opcode": 54, + "Name": "GetByIdLong", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt8", + "UInt32S" + ], + "IsJump": false, + "AbstractDefinition": 6 + }, + { + "Opcode": 55, + "Name": "TryGetById", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt8", + "UInt16S" + ], + "IsJump": false, + "AbstractDefinition": 7 + }, + { + "Opcode": 56, + "Name": "TryGetByIdLong", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt8", + "UInt32S" + ], + "IsJump": false, + "AbstractDefinition": 7 + }, + { + "Opcode": 57, + "Name": "PutById", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt8", + "UInt16S" + ], + "IsJump": false, + "AbstractDefinition": 8 + }, + { + "Opcode": 58, + "Name": "PutByIdLong", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt8", + "UInt32S" + ], + "IsJump": false, + "AbstractDefinition": 8 + }, + { + "Opcode": 59, + "Name": "TryPutById", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt8", + "UInt16S" + ], + "IsJump": false, + "AbstractDefinition": 9 + }, + { + "Opcode": 60, + "Name": "TryPutByIdLong", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt8", + "UInt32S" + ], + "IsJump": false, + "AbstractDefinition": 9 + }, + { + "Opcode": 61, + "Name": "PutNewOwnByIdShort", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt8S" + ], + "IsJump": false, + "AbstractDefinition": 10 + }, + { + "Opcode": 62, + "Name": "PutNewOwnById", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt16S" + ], + "IsJump": false, + "AbstractDefinition": 10 + }, + { + "Opcode": 63, + "Name": "PutNewOwnByIdLong", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt32S" + ], + "IsJump": false, + "AbstractDefinition": 10 + }, + { + "Opcode": 64, + "Name": "PutNewOwnNEById", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt16S" + ], + "IsJump": false, + "AbstractDefinition": 11 + }, + { + "Opcode": 65, + "Name": "PutNewOwnNEByIdLong", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt32S" + ], + "IsJump": false, + "AbstractDefinition": 11 + }, + { + "Opcode": 66, + "Name": "PutOwnByIndex", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt8" + ], + "IsJump": false, + "AbstractDefinition": 12 + }, + { + "Opcode": 67, + "Name": "PutOwnByIndexL", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt32" + ], + "IsJump": false, + "AbstractDefinition": 12 + }, + { + "Opcode": 68, + "Name": "PutOwnByVal", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8", + "UInt8" + ], + "IsJump": false + }, + { + "Opcode": 69, + "Name": "DelById", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt16S" + ], + "IsJump": false, + "AbstractDefinition": 13 + }, + { + "Opcode": 70, + "Name": "DelByIdLong", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt32S" + ], + "IsJump": false, + "AbstractDefinition": 13 + }, + { + "Opcode": 71, + "Name": "GetByVal", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 72, + "Name": "PutByVal", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 73, + "Name": "DelByVal", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 74, + "Name": "PutOwnGetterSetterByVal", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8", + "Reg8", + "UInt8" + ], + "IsJump": false + }, + { + "Opcode": 75, + "Name": "GetPNameList", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 76, + "Name": "GetNextPName", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 77, + "Name": "Call", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt8" + ], + "IsJump": false, + "AbstractDefinition": 14 + }, + { + "Opcode": 78, + "Name": "Construct", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt8" + ], + "IsJump": false, + "AbstractDefinition": 15 + }, + { + "Opcode": 79, + "Name": "Call1", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 80, + "Name": "CallDirect", + "OperandTypes": [ + "Reg8", + "UInt8", + "UInt16" + ], + "IsJump": false, + "AbstractDefinition": 16 + }, + { + "Opcode": 81, + "Name": "Call2", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 82, + "Name": "Call3", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 83, + "Name": "Call4", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8", + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 84, + "Name": "CallLong", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt32" + ], + "IsJump": false, + "AbstractDefinition": 14 + }, + { + "Opcode": 85, + "Name": "ConstructLong", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt32" + ], + "IsJump": false, + "AbstractDefinition": 15 + }, + { + "Opcode": 86, + "Name": "CallDirectLongIndex", + "OperandTypes": [ + "Reg8", + "UInt8", + "UInt32" + ], + "IsJump": false, + "AbstractDefinition": 16 + }, + { + "Opcode": 87, + "Name": "CallBuiltin", + "OperandTypes": [ + "Reg8", + "UInt8", + "UInt8" + ], + "IsJump": false, + "AbstractDefinition": 17 + }, + { + "Opcode": 88, + "Name": "CallBuiltinLong", + "OperandTypes": [ + "Reg8", + "UInt8", + "UInt32" + ], + "IsJump": false, + "AbstractDefinition": 17 + }, + { + "Opcode": 89, + "Name": "GetBuiltinClosure", + "OperandTypes": [ + "Reg8", + "UInt8" + ], + "IsJump": false + }, + { + "Opcode": 90, + "Name": "Ret", + "OperandTypes": [ + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 91, + "Name": "Catch", + "OperandTypes": [ + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 92, + "Name": "DirectEval", + "OperandTypes": [ + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 93, + "Name": "Throw", + "OperandTypes": [ + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 94, + "Name": "ThrowIfEmpty", + "OperandTypes": [ + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 95, + "Name": "Debugger", + "OperandTypes": [], + "IsJump": false + }, + { + "Opcode": 96, + "Name": "AsyncBreakCheck", + "OperandTypes": [], + "IsJump": false + }, + { + "Opcode": 97, + "Name": "ProfilePoint", + "OperandTypes": [ + "UInt16" + ], + "IsJump": false + }, + { + "Opcode": 98, + "Name": "CreateClosure", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt16" + ], + "IsJump": false, + "AbstractDefinition": 18 + }, + { + "Opcode": 99, + "Name": "CreateClosureLongIndex", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt32" + ], + "IsJump": false, + "AbstractDefinition": 18 + }, + { + "Opcode": 100, + "Name": "CreateGeneratorClosure", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt16" + ], + "IsJump": false, + "AbstractDefinition": 19 + }, + { + "Opcode": 101, + "Name": "CreateGeneratorClosureLongIndex", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt32" + ], + "IsJump": false, + "AbstractDefinition": 19 + }, + { + "Opcode": 102, + "Name": "CreateAsyncClosure", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt16" + ], + "IsJump": false, + "AbstractDefinition": 20 + }, + { + "Opcode": 103, + "Name": "CreateAsyncClosureLongIndex", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt32" + ], + "IsJump": false, + "AbstractDefinition": 20 + }, + { + "Opcode": 104, + "Name": "CreateThis", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 105, + "Name": "SelectObject", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 106, + "Name": "LoadParam", + "OperandTypes": [ + "Reg8", + "UInt8" + ], + "IsJump": false, + "AbstractDefinition": 21 + }, + { + "Opcode": 107, + "Name": "LoadParamLong", + "OperandTypes": [ + "Reg8", + "UInt32" + ], + "IsJump": false, + "AbstractDefinition": 21 + }, + { + "Opcode": 108, + "Name": "LoadConstUInt8", + "OperandTypes": [ + "Reg8", + "UInt8" + ], + "IsJump": false + }, + { + "Opcode": 109, + "Name": "LoadConstInt", + "OperandTypes": [ + "Reg8", + "Imm32" + ], + "IsJump": false + }, + { + "Opcode": 110, + "Name": "LoadConstDouble", + "OperandTypes": [ + "Reg8", + "Double" + ], + "IsJump": false + }, + { + "Opcode": 111, + "Name": "LoadConstBigInt", + "OperandTypes": [ + "Reg8", + "UInt16" + ], + "IsJump": false, + "AbstractDefinition": 22 + }, + { + "Opcode": 112, + "Name": "LoadConstBigIntLongIndex", + "OperandTypes": [ + "Reg8", + "UInt32" + ], + "IsJump": false, + "AbstractDefinition": 22 + }, + { + "Opcode": 113, + "Name": "LoadConstString", + "OperandTypes": [ + "Reg8", + "UInt16S" + ], + "IsJump": false, + "AbstractDefinition": 23 + }, + { + "Opcode": 114, + "Name": "LoadConstStringLongIndex", + "OperandTypes": [ + "Reg8", + "UInt32S" + ], + "IsJump": false, + "AbstractDefinition": 23 + }, + { + "Opcode": 115, + "Name": "LoadConstEmpty", + "OperandTypes": [ + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 116, + "Name": "LoadConstUndefined", + "OperandTypes": [ + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 117, + "Name": "LoadConstNull", + "OperandTypes": [ + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 118, + "Name": "LoadConstTrue", + "OperandTypes": [ + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 119, + "Name": "LoadConstFalse", + "OperandTypes": [ + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 120, + "Name": "LoadConstZero", + "OperandTypes": [ + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 121, + "Name": "CoerceThisNS", + "OperandTypes": [ + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 122, + "Name": "LoadThisNS", + "OperandTypes": [ + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 123, + "Name": "ToNumber", + "OperandTypes": [ + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 124, + "Name": "ToNumeric", + "OperandTypes": [ + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 125, + "Name": "ToInt32", + "OperandTypes": [ + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 126, + "Name": "AddEmptyString", + "OperandTypes": [ + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 127, + "Name": "GetArgumentsPropByVal", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 128, + "Name": "GetArgumentsLength", + "OperandTypes": [ + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 129, + "Name": "ReifyArguments", + "OperandTypes": [ + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 130, + "Name": "CreateRegExp", + "OperandTypes": [ + "Reg8", + "UInt32S", + "UInt32S", + "UInt32" + ], + "IsJump": false + }, + { + "Opcode": 131, + "Name": "SwitchImm", + "OperandTypes": [ + "Reg8", + "UInt32", + "Addr32", + "UInt32", + "UInt32" + ], + "IsJump": false + }, + { + "Opcode": 132, + "Name": "StartGenerator", + "OperandTypes": [], + "IsJump": false + }, + { + "Opcode": 133, + "Name": "ResumeGenerator", + "OperandTypes": [ + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 134, + "Name": "CompleteGenerator", + "OperandTypes": [], + "IsJump": false + }, + { + "Opcode": 135, + "Name": "CreateGenerator", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt16" + ], + "IsJump": false, + "AbstractDefinition": 24 + }, + { + "Opcode": 136, + "Name": "CreateGeneratorLongIndex", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt32" + ], + "IsJump": false, + "AbstractDefinition": 24 + }, + { + "Opcode": 137, + "Name": "IteratorBegin", + "OperandTypes": [ + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 138, + "Name": "IteratorNext", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 139, + "Name": "IteratorClose", + "OperandTypes": [ + "Reg8", + "UInt8" + ], + "IsJump": false + }, + { + "Opcode": 140, + "Name": "Jmp", + "OperandTypes": [ + "Addr8" + ], + "IsJump": true, + "AbstractDefinition": 25 + }, + { + "Opcode": 141, + "Name": "JmpLong", + "OperandTypes": [ + "Addr32" + ], + "IsJump": true, + "AbstractDefinition": 25 + }, + { + "Opcode": 142, + "Name": "JmpTrue", + "OperandTypes": [ + "Addr8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 26 + }, + { + "Opcode": 143, + "Name": "JmpTrueLong", + "OperandTypes": [ + "Addr32", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 26 + }, + { + "Opcode": 144, + "Name": "JmpFalse", + "OperandTypes": [ + "Addr8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 27 + }, + { + "Opcode": 145, + "Name": "JmpFalseLong", + "OperandTypes": [ + "Addr32", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 27 + }, + { + "Opcode": 146, + "Name": "JmpUndefined", + "OperandTypes": [ + "Addr8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 28 + }, + { + "Opcode": 147, + "Name": "JmpUndefinedLong", + "OperandTypes": [ + "Addr32", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 28 + }, + { + "Opcode": 148, + "Name": "SaveGenerator", + "OperandTypes": [ + "Addr8" + ], + "IsJump": true, + "AbstractDefinition": 29 + }, + { + "Opcode": 149, + "Name": "SaveGeneratorLong", + "OperandTypes": [ + "Addr32" + ], + "IsJump": true, + "AbstractDefinition": 29 + }, + { + "Opcode": 150, + "Name": "JLess", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 30 + }, + { + "Opcode": 151, + "Name": "JLessLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 30 + }, + { + "Opcode": 152, + "Name": "JNotLess", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 31 + }, + { + "Opcode": 153, + "Name": "JNotLessLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 31 + }, + { + "Opcode": 154, + "Name": "JLessN", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 32 + }, + { + "Opcode": 155, + "Name": "JLessNLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 32 + }, + { + "Opcode": 156, + "Name": "JNotLessN", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 33 + }, + { + "Opcode": 157, + "Name": "JNotLessNLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 33 + }, + { + "Opcode": 158, + "Name": "JLessEqual", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 34 + }, + { + "Opcode": 159, + "Name": "JLessEqualLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 34 + }, + { + "Opcode": 160, + "Name": "JNotLessEqual", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 35 + }, + { + "Opcode": 161, + "Name": "JNotLessEqualLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 35 + }, + { + "Opcode": 162, + "Name": "JLessEqualN", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 36 + }, + { + "Opcode": 163, + "Name": "JLessEqualNLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 36 + }, + { + "Opcode": 164, + "Name": "JNotLessEqualN", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 37 + }, + { + "Opcode": 165, + "Name": "JNotLessEqualNLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 37 + }, + { + "Opcode": 166, + "Name": "JGreater", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 38 + }, + { + "Opcode": 167, + "Name": "JGreaterLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 38 + }, + { + "Opcode": 168, + "Name": "JNotGreater", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 39 + }, + { + "Opcode": 169, + "Name": "JNotGreaterLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 39 + }, + { + "Opcode": 170, + "Name": "JGreaterN", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 40 + }, + { + "Opcode": 171, + "Name": "JGreaterNLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 40 + }, + { + "Opcode": 172, + "Name": "JNotGreaterN", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 41 + }, + { + "Opcode": 173, + "Name": "JNotGreaterNLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 41 + }, + { + "Opcode": 174, + "Name": "JGreaterEqual", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 42 + }, + { + "Opcode": 175, + "Name": "JGreaterEqualLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 42 + }, + { + "Opcode": 176, + "Name": "JNotGreaterEqual", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 43 + }, + { + "Opcode": 177, + "Name": "JNotGreaterEqualLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 43 + }, + { + "Opcode": 178, + "Name": "JGreaterEqualN", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 44 + }, + { + "Opcode": 179, + "Name": "JGreaterEqualNLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 44 + }, + { + "Opcode": 180, + "Name": "JNotGreaterEqualN", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 45 + }, + { + "Opcode": 181, + "Name": "JNotGreaterEqualNLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 45 + }, + { + "Opcode": 182, + "Name": "JEqual", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 46 + }, + { + "Opcode": 183, + "Name": "JEqualLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 46 + }, + { + "Opcode": 184, + "Name": "JNotEqual", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 47 + }, + { + "Opcode": 185, + "Name": "JNotEqualLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 47 + }, + { + "Opcode": 186, + "Name": "JStrictEqual", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 48 + }, + { + "Opcode": 187, + "Name": "JStrictEqualLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 48 + }, + { + "Opcode": 188, + "Name": "JStrictNotEqual", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 49 + }, + { + "Opcode": 189, + "Name": "JStrictNotEqualLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 49 + }, + { + "Opcode": 190, + "Name": "Add32", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 191, + "Name": "Sub32", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 192, + "Name": "Mul32", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 193, + "Name": "Divi32", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 194, + "Name": "Divu32", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 195, + "Name": "Loadi8", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 196, + "Name": "Loadu8", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 197, + "Name": "Loadi16", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 198, + "Name": "Loadu16", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 199, + "Name": "Loadi32", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 200, + "Name": "Loadu32", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 201, + "Name": "Store8", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 202, + "Name": "Store16", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 203, + "Name": "Store32", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + } + ], + "AbstractDefinitions": [ + { + "Name": "NewObjectWithBuffer", + "VariantOpcodes": [ + 1, + 2 + ] + }, + { + "Name": "NewArrayWithBuffer", + "VariantOpcodes": [ + 5, + 6 + ] + }, + { + "Name": "Mov", + "VariantOpcodes": [ + 8, + 9 + ] + }, + { + "Name": "StoreToEnvironment", + "VariantOpcodes": [ + 42, + 43 + ] + }, + { + "Name": "StoreNPToEnvironment", + "VariantOpcodes": [ + 44, + 45 + ] + }, + { + "Name": "LoadFromEnvironment", + "VariantOpcodes": [ + 46, + 47 + ] + }, + { + "Name": "GetById", + "VariantOpcodes": [ + 53, + 52, + 54 + ] + }, + { + "Name": "TryGetById", + "VariantOpcodes": [ + 55, + 56 + ] + }, + { + "Name": "PutById", + "VariantOpcodes": [ + 57, + 58 + ] + }, + { + "Name": "TryPutById", + "VariantOpcodes": [ + 59, + 60 + ] + }, + { + "Name": "PutNewOwnById", + "VariantOpcodes": [ + 62, + 61, + 63 + ] + }, + { + "Name": "PutNewOwnNEById", + "VariantOpcodes": [ + 64, + 65 + ] + }, + { + "Name": "PutOwnByIndex", + "VariantOpcodes": [ + 66, + 67 + ] + }, + { + "Name": "DelById", + "VariantOpcodes": [ + 69, + 70 + ] + }, + { + "Name": "Call", + "VariantOpcodes": [ + 77, + 84 + ] + }, + { + "Name": "Construct", + "VariantOpcodes": [ + 78, + 85 + ] + }, + { + "Name": "CallDirect", + "VariantOpcodes": [ + 80, + 86 + ] + }, + { + "Name": "CallBuiltin", + "VariantOpcodes": [ + 87, + 88 + ] + }, + { + "Name": "CreateClosure", + "VariantOpcodes": [ + 98, + 99 + ] + }, + { + "Name": "CreateGeneratorClosure", + "VariantOpcodes": [ + 100, + 101 + ] + }, + { + "Name": "CreateAsyncClosure", + "VariantOpcodes": [ + 102, + 103 + ] + }, + { + "Name": "LoadParam", + "VariantOpcodes": [ + 106, + 107 + ] + }, + { + "Name": "LoadConstBigInt", + "VariantOpcodes": [ + 111, + 112 + ] + }, + { + "Name": "LoadConstString", + "VariantOpcodes": [ + 113, + 114 + ] + }, + { + "Name": "CreateGenerator", + "VariantOpcodes": [ + 135, + 136 + ] + }, + { + "Name": "Jmp", + "VariantOpcodes": [ + 140, + 141 + ] + }, + { + "Name": "JmpTrue", + "VariantOpcodes": [ + 142, + 143 + ] + }, + { + "Name": "JmpFalse", + "VariantOpcodes": [ + 144, + 145 + ] + }, + { + "Name": "JmpUndefined", + "VariantOpcodes": [ + 146, + 147 + ] + }, + { + "Name": "SaveGenerator", + "VariantOpcodes": [ + 148, + 149 + ] + }, + { + "Name": "JLess", + "VariantOpcodes": [ + 150, + 151 + ] + }, + { + "Name": "JNotLess", + "VariantOpcodes": [ + 152, + 153 + ] + }, + { + "Name": "JLessN", + "VariantOpcodes": [ + 154, + 155 + ] + }, + { + "Name": "JNotLessN", + "VariantOpcodes": [ + 156, + 157 + ] + }, + { + "Name": "JLessEqual", + "VariantOpcodes": [ + 158, + 159 + ] + }, + { + "Name": "JNotLessEqual", + "VariantOpcodes": [ + 160, + 161 + ] + }, + { + "Name": "JLessEqualN", + "VariantOpcodes": [ + 162, + 163 + ] + }, + { + "Name": "JNotLessEqualN", + "VariantOpcodes": [ + 164, + 165 + ] + }, + { + "Name": "JGreater", + "VariantOpcodes": [ + 166, + 167 + ] + }, + { + "Name": "JNotGreater", + "VariantOpcodes": [ + 168, + 169 + ] + }, + { + "Name": "JGreaterN", + "VariantOpcodes": [ + 170, + 171 + ] + }, + { + "Name": "JNotGreaterN", + "VariantOpcodes": [ + 172, + 173 + ] + }, + { + "Name": "JGreaterEqual", + "VariantOpcodes": [ + 174, + 175 + ] + }, + { + "Name": "JNotGreaterEqual", + "VariantOpcodes": [ + 176, + 177 + ] + }, + { + "Name": "JGreaterEqualN", + "VariantOpcodes": [ + 178, + 179 + ] + }, + { + "Name": "JNotGreaterEqualN", + "VariantOpcodes": [ + 180, + 181 + ] + }, + { + "Name": "JEqual", + "VariantOpcodes": [ + 182, + 183 + ] + }, + { + "Name": "JNotEqual", + "VariantOpcodes": [ + 184, + 185 + ] + }, + { + "Name": "JStrictEqual", + "VariantOpcodes": [ + 186, + 187 + ] + }, + { + "Name": "JStrictNotEqual", + "VariantOpcodes": [ + 188, + 189 + ] + } + ], + "GitCommitHash": "498f7cb64a8c59a3e95f074035ad2d23d1fde5cc" +} \ No newline at end of file diff --git a/hasmer/libhasmer/Resources/Bytecode90.json b/hasmer/libhasmer/Resources/Bytecode90.json new file mode 100644 index 0000000..df06c04 --- /dev/null +++ b/hasmer/libhasmer/Resources/Bytecode90.json @@ -0,0 +1,2432 @@ +{ + "Version": 90, + "Definitions": [ + { + "Opcode": 0, + "Name": "Unreachable", + "OperandTypes": [], + "IsJump": false + }, + { + "Opcode": 1, + "Name": "NewObjectWithBuffer", + "OperandTypes": [ + "Reg8", + "UInt16", + "UInt16", + "UInt16", + "UInt16" + ], + "IsJump": false, + "AbstractDefinition": 0 + }, + { + "Opcode": 2, + "Name": "NewObjectWithBufferLong", + "OperandTypes": [ + "Reg8", + "UInt16", + "UInt16", + "UInt32", + "UInt32" + ], + "IsJump": false, + "AbstractDefinition": 0 + }, + { + "Opcode": 3, + "Name": "NewObject", + "OperandTypes": [ + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 4, + "Name": "NewObjectWithParent", + "OperandTypes": [ + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 5, + "Name": "NewArrayWithBuffer", + "OperandTypes": [ + "Reg8", + "UInt16", + "UInt16", + "UInt16" + ], + "IsJump": false, + "AbstractDefinition": 1 + }, + { + "Opcode": 6, + "Name": "NewArrayWithBufferLong", + "OperandTypes": [ + "Reg8", + "UInt16", + "UInt16", + "UInt32" + ], + "IsJump": false, + "AbstractDefinition": 1 + }, + { + "Opcode": 7, + "Name": "NewArray", + "OperandTypes": [ + "Reg8", + "UInt16" + ], + "IsJump": false + }, + { + "Opcode": 8, + "Name": "Mov", + "OperandTypes": [ + "Reg8", + "Reg8" + ], + "IsJump": false, + "AbstractDefinition": 2 + }, + { + "Opcode": 9, + "Name": "MovLong", + "OperandTypes": [ + "Reg32", + "Reg32" + ], + "IsJump": false, + "AbstractDefinition": 2 + }, + { + "Opcode": 10, + "Name": "Negate", + "OperandTypes": [ + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 11, + "Name": "Not", + "OperandTypes": [ + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 12, + "Name": "BitNot", + "OperandTypes": [ + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 13, + "Name": "TypeOf", + "OperandTypes": [ + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 14, + "Name": "Eq", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 15, + "Name": "StrictEq", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 16, + "Name": "Neq", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 17, + "Name": "StrictNeq", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 18, + "Name": "Less", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 19, + "Name": "LessEq", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 20, + "Name": "Greater", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 21, + "Name": "GreaterEq", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 22, + "Name": "Add", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 23, + "Name": "AddN", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 24, + "Name": "Mul", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 25, + "Name": "MulN", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 26, + "Name": "Div", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 27, + "Name": "DivN", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 28, + "Name": "Mod", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 29, + "Name": "Sub", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 30, + "Name": "SubN", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 31, + "Name": "LShift", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 32, + "Name": "RShift", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 33, + "Name": "URshift", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 34, + "Name": "BitAnd", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 35, + "Name": "BitXor", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 36, + "Name": "BitOr", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 37, + "Name": "Inc", + "OperandTypes": [ + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 38, + "Name": "Dec", + "OperandTypes": [ + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 39, + "Name": "InstanceOf", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 40, + "Name": "IsIn", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 41, + "Name": "GetEnvironment", + "OperandTypes": [ + "Reg8", + "UInt8" + ], + "IsJump": false + }, + { + "Opcode": 42, + "Name": "StoreToEnvironment", + "OperandTypes": [ + "Reg8", + "UInt8", + "Reg8" + ], + "IsJump": false, + "AbstractDefinition": 3 + }, + { + "Opcode": 43, + "Name": "StoreToEnvironmentL", + "OperandTypes": [ + "Reg8", + "UInt16", + "Reg8" + ], + "IsJump": false, + "AbstractDefinition": 3 + }, + { + "Opcode": 44, + "Name": "StoreNPToEnvironment", + "OperandTypes": [ + "Reg8", + "UInt8", + "Reg8" + ], + "IsJump": false, + "AbstractDefinition": 4 + }, + { + "Opcode": 45, + "Name": "StoreNPToEnvironmentL", + "OperandTypes": [ + "Reg8", + "UInt16", + "Reg8" + ], + "IsJump": false, + "AbstractDefinition": 4 + }, + { + "Opcode": 46, + "Name": "LoadFromEnvironment", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt8" + ], + "IsJump": false, + "AbstractDefinition": 5 + }, + { + "Opcode": 47, + "Name": "LoadFromEnvironmentL", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt16" + ], + "IsJump": false, + "AbstractDefinition": 5 + }, + { + "Opcode": 48, + "Name": "GetGlobalObject", + "OperandTypes": [ + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 49, + "Name": "GetNewTarget", + "OperandTypes": [ + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 50, + "Name": "CreateEnvironment", + "OperandTypes": [ + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 51, + "Name": "DeclareGlobalVar", + "OperandTypes": [ + "UInt32S" + ], + "IsJump": false + }, + { + "Opcode": 52, + "Name": "GetByIdShort", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt8", + "UInt8S" + ], + "IsJump": false, + "AbstractDefinition": 6 + }, + { + "Opcode": 53, + "Name": "GetById", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt8", + "UInt16S" + ], + "IsJump": false, + "AbstractDefinition": 6 + }, + { + "Opcode": 54, + "Name": "GetByIdLong", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt8", + "UInt32S" + ], + "IsJump": false, + "AbstractDefinition": 6 + }, + { + "Opcode": 55, + "Name": "TryGetById", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt8", + "UInt16S" + ], + "IsJump": false, + "AbstractDefinition": 7 + }, + { + "Opcode": 56, + "Name": "TryGetByIdLong", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt8", + "UInt32S" + ], + "IsJump": false, + "AbstractDefinition": 7 + }, + { + "Opcode": 57, + "Name": "PutById", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt8", + "UInt16S" + ], + "IsJump": false, + "AbstractDefinition": 8 + }, + { + "Opcode": 58, + "Name": "PutByIdLong", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt8", + "UInt32S" + ], + "IsJump": false, + "AbstractDefinition": 8 + }, + { + "Opcode": 59, + "Name": "TryPutById", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt8", + "UInt16S" + ], + "IsJump": false, + "AbstractDefinition": 9 + }, + { + "Opcode": 60, + "Name": "TryPutByIdLong", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt8", + "UInt32S" + ], + "IsJump": false, + "AbstractDefinition": 9 + }, + { + "Opcode": 61, + "Name": "PutNewOwnByIdShort", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt8S" + ], + "IsJump": false, + "AbstractDefinition": 10 + }, + { + "Opcode": 62, + "Name": "PutNewOwnById", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt16S" + ], + "IsJump": false, + "AbstractDefinition": 10 + }, + { + "Opcode": 63, + "Name": "PutNewOwnByIdLong", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt32S" + ], + "IsJump": false, + "AbstractDefinition": 10 + }, + { + "Opcode": 64, + "Name": "PutNewOwnNEById", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt16S" + ], + "IsJump": false, + "AbstractDefinition": 11 + }, + { + "Opcode": 65, + "Name": "PutNewOwnNEByIdLong", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt32S" + ], + "IsJump": false, + "AbstractDefinition": 11 + }, + { + "Opcode": 66, + "Name": "PutOwnByIndex", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt8" + ], + "IsJump": false, + "AbstractDefinition": 12 + }, + { + "Opcode": 67, + "Name": "PutOwnByIndexL", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt32" + ], + "IsJump": false, + "AbstractDefinition": 12 + }, + { + "Opcode": 68, + "Name": "PutOwnByVal", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8", + "UInt8" + ], + "IsJump": false + }, + { + "Opcode": 69, + "Name": "DelById", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt16S" + ], + "IsJump": false, + "AbstractDefinition": 13 + }, + { + "Opcode": 70, + "Name": "DelByIdLong", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt32S" + ], + "IsJump": false, + "AbstractDefinition": 13 + }, + { + "Opcode": 71, + "Name": "GetByVal", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 72, + "Name": "PutByVal", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 73, + "Name": "DelByVal", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 74, + "Name": "PutOwnGetterSetterByVal", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8", + "Reg8", + "UInt8" + ], + "IsJump": false + }, + { + "Opcode": 75, + "Name": "GetPNameList", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 76, + "Name": "GetNextPName", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 77, + "Name": "Call", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt8" + ], + "IsJump": false, + "AbstractDefinition": 14 + }, + { + "Opcode": 78, + "Name": "Construct", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt8" + ], + "IsJump": false, + "AbstractDefinition": 15 + }, + { + "Opcode": 79, + "Name": "Call1", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 80, + "Name": "CallDirect", + "OperandTypes": [ + "Reg8", + "UInt8", + "UInt16" + ], + "IsJump": false, + "AbstractDefinition": 16 + }, + { + "Opcode": 81, + "Name": "Call2", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 82, + "Name": "Call3", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 83, + "Name": "Call4", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8", + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 84, + "Name": "CallLong", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt32" + ], + "IsJump": false, + "AbstractDefinition": 14 + }, + { + "Opcode": 85, + "Name": "ConstructLong", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt32" + ], + "IsJump": false, + "AbstractDefinition": 15 + }, + { + "Opcode": 86, + "Name": "CallDirectLongIndex", + "OperandTypes": [ + "Reg8", + "UInt8", + "UInt32" + ], + "IsJump": false, + "AbstractDefinition": 16 + }, + { + "Opcode": 87, + "Name": "CallBuiltin", + "OperandTypes": [ + "Reg8", + "UInt8", + "UInt8" + ], + "IsJump": false, + "AbstractDefinition": 17 + }, + { + "Opcode": 88, + "Name": "CallBuiltinLong", + "OperandTypes": [ + "Reg8", + "UInt8", + "UInt32" + ], + "IsJump": false, + "AbstractDefinition": 17 + }, + { + "Opcode": 89, + "Name": "GetBuiltinClosure", + "OperandTypes": [ + "Reg8", + "UInt8" + ], + "IsJump": false + }, + { + "Opcode": 90, + "Name": "Ret", + "OperandTypes": [ + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 91, + "Name": "Catch", + "OperandTypes": [ + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 92, + "Name": "DirectEval", + "OperandTypes": [ + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 93, + "Name": "Throw", + "OperandTypes": [ + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 94, + "Name": "ThrowIfEmpty", + "OperandTypes": [ + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 95, + "Name": "Debugger", + "OperandTypes": [], + "IsJump": false + }, + { + "Opcode": 96, + "Name": "AsyncBreakCheck", + "OperandTypes": [], + "IsJump": false + }, + { + "Opcode": 97, + "Name": "ProfilePoint", + "OperandTypes": [ + "UInt16" + ], + "IsJump": false + }, + { + "Opcode": 98, + "Name": "CreateClosure", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt16" + ], + "IsJump": false, + "AbstractDefinition": 18 + }, + { + "Opcode": 99, + "Name": "CreateClosureLongIndex", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt32" + ], + "IsJump": false, + "AbstractDefinition": 18 + }, + { + "Opcode": 100, + "Name": "CreateGeneratorClosure", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt16" + ], + "IsJump": false, + "AbstractDefinition": 19 + }, + { + "Opcode": 101, + "Name": "CreateGeneratorClosureLongIndex", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt32" + ], + "IsJump": false, + "AbstractDefinition": 19 + }, + { + "Opcode": 102, + "Name": "CreateAsyncClosure", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt16" + ], + "IsJump": false, + "AbstractDefinition": 20 + }, + { + "Opcode": 103, + "Name": "CreateAsyncClosureLongIndex", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt32" + ], + "IsJump": false, + "AbstractDefinition": 20 + }, + { + "Opcode": 104, + "Name": "CreateThis", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 105, + "Name": "SelectObject", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 106, + "Name": "LoadParam", + "OperandTypes": [ + "Reg8", + "UInt8" + ], + "IsJump": false, + "AbstractDefinition": 21 + }, + { + "Opcode": 107, + "Name": "LoadParamLong", + "OperandTypes": [ + "Reg8", + "UInt32" + ], + "IsJump": false, + "AbstractDefinition": 21 + }, + { + "Opcode": 108, + "Name": "LoadConstUInt8", + "OperandTypes": [ + "Reg8", + "UInt8" + ], + "IsJump": false + }, + { + "Opcode": 109, + "Name": "LoadConstInt", + "OperandTypes": [ + "Reg8", + "Imm32" + ], + "IsJump": false + }, + { + "Opcode": 110, + "Name": "LoadConstDouble", + "OperandTypes": [ + "Reg8", + "Double" + ], + "IsJump": false + }, + { + "Opcode": 111, + "Name": "LoadConstBigInt", + "OperandTypes": [ + "Reg8", + "UInt16" + ], + "IsJump": false, + "AbstractDefinition": 22 + }, + { + "Opcode": 112, + "Name": "LoadConstBigIntLongIndex", + "OperandTypes": [ + "Reg8", + "UInt32" + ], + "IsJump": false, + "AbstractDefinition": 22 + }, + { + "Opcode": 113, + "Name": "LoadConstString", + "OperandTypes": [ + "Reg8", + "UInt16S" + ], + "IsJump": false, + "AbstractDefinition": 23 + }, + { + "Opcode": 114, + "Name": "LoadConstStringLongIndex", + "OperandTypes": [ + "Reg8", + "UInt32S" + ], + "IsJump": false, + "AbstractDefinition": 23 + }, + { + "Opcode": 115, + "Name": "LoadConstEmpty", + "OperandTypes": [ + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 116, + "Name": "LoadConstUndefined", + "OperandTypes": [ + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 117, + "Name": "LoadConstNull", + "OperandTypes": [ + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 118, + "Name": "LoadConstTrue", + "OperandTypes": [ + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 119, + "Name": "LoadConstFalse", + "OperandTypes": [ + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 120, + "Name": "LoadConstZero", + "OperandTypes": [ + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 121, + "Name": "CoerceThisNS", + "OperandTypes": [ + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 122, + "Name": "LoadThisNS", + "OperandTypes": [ + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 123, + "Name": "ToNumber", + "OperandTypes": [ + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 124, + "Name": "ToNumeric", + "OperandTypes": [ + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 125, + "Name": "ToInt32", + "OperandTypes": [ + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 126, + "Name": "AddEmptyString", + "OperandTypes": [ + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 127, + "Name": "GetArgumentsPropByVal", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 128, + "Name": "GetArgumentsLength", + "OperandTypes": [ + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 129, + "Name": "ReifyArguments", + "OperandTypes": [ + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 130, + "Name": "CreateRegExp", + "OperandTypes": [ + "Reg8", + "UInt32S", + "UInt32S", + "UInt32" + ], + "IsJump": false + }, + { + "Opcode": 131, + "Name": "SwitchImm", + "OperandTypes": [ + "Reg8", + "UInt32", + "Addr32", + "UInt32", + "UInt32" + ], + "IsJump": false + }, + { + "Opcode": 132, + "Name": "StartGenerator", + "OperandTypes": [], + "IsJump": false + }, + { + "Opcode": 133, + "Name": "ResumeGenerator", + "OperandTypes": [ + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 134, + "Name": "CompleteGenerator", + "OperandTypes": [], + "IsJump": false + }, + { + "Opcode": 135, + "Name": "CreateGenerator", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt16" + ], + "IsJump": false, + "AbstractDefinition": 24 + }, + { + "Opcode": 136, + "Name": "CreateGeneratorLongIndex", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt32" + ], + "IsJump": false, + "AbstractDefinition": 24 + }, + { + "Opcode": 137, + "Name": "IteratorBegin", + "OperandTypes": [ + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 138, + "Name": "IteratorNext", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 139, + "Name": "IteratorClose", + "OperandTypes": [ + "Reg8", + "UInt8" + ], + "IsJump": false + }, + { + "Opcode": 140, + "Name": "Jmp", + "OperandTypes": [ + "Addr8" + ], + "IsJump": true, + "AbstractDefinition": 25 + }, + { + "Opcode": 141, + "Name": "JmpLong", + "OperandTypes": [ + "Addr32" + ], + "IsJump": true, + "AbstractDefinition": 25 + }, + { + "Opcode": 142, + "Name": "JmpTrue", + "OperandTypes": [ + "Addr8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 26 + }, + { + "Opcode": 143, + "Name": "JmpTrueLong", + "OperandTypes": [ + "Addr32", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 26 + }, + { + "Opcode": 144, + "Name": "JmpFalse", + "OperandTypes": [ + "Addr8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 27 + }, + { + "Opcode": 145, + "Name": "JmpFalseLong", + "OperandTypes": [ + "Addr32", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 27 + }, + { + "Opcode": 146, + "Name": "JmpUndefined", + "OperandTypes": [ + "Addr8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 28 + }, + { + "Opcode": 147, + "Name": "JmpUndefinedLong", + "OperandTypes": [ + "Addr32", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 28 + }, + { + "Opcode": 148, + "Name": "SaveGenerator", + "OperandTypes": [ + "Addr8" + ], + "IsJump": true, + "AbstractDefinition": 29 + }, + { + "Opcode": 149, + "Name": "SaveGeneratorLong", + "OperandTypes": [ + "Addr32" + ], + "IsJump": true, + "AbstractDefinition": 29 + }, + { + "Opcode": 150, + "Name": "JLess", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 30 + }, + { + "Opcode": 151, + "Name": "JLessLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 30 + }, + { + "Opcode": 152, + "Name": "JNotLess", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 31 + }, + { + "Opcode": 153, + "Name": "JNotLessLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 31 + }, + { + "Opcode": 154, + "Name": "JLessN", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 32 + }, + { + "Opcode": 155, + "Name": "JLessNLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 32 + }, + { + "Opcode": 156, + "Name": "JNotLessN", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 33 + }, + { + "Opcode": 157, + "Name": "JNotLessNLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 33 + }, + { + "Opcode": 158, + "Name": "JLessEqual", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 34 + }, + { + "Opcode": 159, + "Name": "JLessEqualLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 34 + }, + { + "Opcode": 160, + "Name": "JNotLessEqual", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 35 + }, + { + "Opcode": 161, + "Name": "JNotLessEqualLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 35 + }, + { + "Opcode": 162, + "Name": "JLessEqualN", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 36 + }, + { + "Opcode": 163, + "Name": "JLessEqualNLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 36 + }, + { + "Opcode": 164, + "Name": "JNotLessEqualN", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 37 + }, + { + "Opcode": 165, + "Name": "JNotLessEqualNLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 37 + }, + { + "Opcode": 166, + "Name": "JGreater", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 38 + }, + { + "Opcode": 167, + "Name": "JGreaterLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 38 + }, + { + "Opcode": 168, + "Name": "JNotGreater", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 39 + }, + { + "Opcode": 169, + "Name": "JNotGreaterLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 39 + }, + { + "Opcode": 170, + "Name": "JGreaterN", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 40 + }, + { + "Opcode": 171, + "Name": "JGreaterNLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 40 + }, + { + "Opcode": 172, + "Name": "JNotGreaterN", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 41 + }, + { + "Opcode": 173, + "Name": "JNotGreaterNLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 41 + }, + { + "Opcode": 174, + "Name": "JGreaterEqual", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 42 + }, + { + "Opcode": 175, + "Name": "JGreaterEqualLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 42 + }, + { + "Opcode": 176, + "Name": "JNotGreaterEqual", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 43 + }, + { + "Opcode": 177, + "Name": "JNotGreaterEqualLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 43 + }, + { + "Opcode": 178, + "Name": "JGreaterEqualN", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 44 + }, + { + "Opcode": 179, + "Name": "JGreaterEqualNLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 44 + }, + { + "Opcode": 180, + "Name": "JNotGreaterEqualN", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 45 + }, + { + "Opcode": 181, + "Name": "JNotGreaterEqualNLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 45 + }, + { + "Opcode": 182, + "Name": "JEqual", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 46 + }, + { + "Opcode": 183, + "Name": "JEqualLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 46 + }, + { + "Opcode": 184, + "Name": "JNotEqual", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 47 + }, + { + "Opcode": 185, + "Name": "JNotEqualLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 47 + }, + { + "Opcode": 186, + "Name": "JStrictEqual", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 48 + }, + { + "Opcode": 187, + "Name": "JStrictEqualLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 48 + }, + { + "Opcode": 188, + "Name": "JStrictNotEqual", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 49 + }, + { + "Opcode": 189, + "Name": "JStrictNotEqualLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 49 + }, + { + "Opcode": 190, + "Name": "Add32", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 191, + "Name": "Sub32", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 192, + "Name": "Mul32", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 193, + "Name": "Divi32", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 194, + "Name": "Divu32", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 195, + "Name": "Loadi8", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 196, + "Name": "Loadu8", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 197, + "Name": "Loadi16", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 198, + "Name": "Loadu16", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 199, + "Name": "Loadi32", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 200, + "Name": "Loadu32", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 201, + "Name": "Store8", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 202, + "Name": "Store16", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 203, + "Name": "Store32", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + } + ], + "AbstractDefinitions": [ + { + "Name": "NewObjectWithBuffer", + "VariantOpcodes": [ + 1, + 2 + ] + }, + { + "Name": "NewArrayWithBuffer", + "VariantOpcodes": [ + 5, + 6 + ] + }, + { + "Name": "Mov", + "VariantOpcodes": [ + 8, + 9 + ] + }, + { + "Name": "StoreToEnvironment", + "VariantOpcodes": [ + 42, + 43 + ] + }, + { + "Name": "StoreNPToEnvironment", + "VariantOpcodes": [ + 44, + 45 + ] + }, + { + "Name": "LoadFromEnvironment", + "VariantOpcodes": [ + 46, + 47 + ] + }, + { + "Name": "GetById", + "VariantOpcodes": [ + 53, + 52, + 54 + ] + }, + { + "Name": "TryGetById", + "VariantOpcodes": [ + 55, + 56 + ] + }, + { + "Name": "PutById", + "VariantOpcodes": [ + 57, + 58 + ] + }, + { + "Name": "TryPutById", + "VariantOpcodes": [ + 59, + 60 + ] + }, + { + "Name": "PutNewOwnById", + "VariantOpcodes": [ + 62, + 61, + 63 + ] + }, + { + "Name": "PutNewOwnNEById", + "VariantOpcodes": [ + 64, + 65 + ] + }, + { + "Name": "PutOwnByIndex", + "VariantOpcodes": [ + 66, + 67 + ] + }, + { + "Name": "DelById", + "VariantOpcodes": [ + 69, + 70 + ] + }, + { + "Name": "Call", + "VariantOpcodes": [ + 77, + 84 + ] + }, + { + "Name": "Construct", + "VariantOpcodes": [ + 78, + 85 + ] + }, + { + "Name": "CallDirect", + "VariantOpcodes": [ + 80, + 86 + ] + }, + { + "Name": "CallBuiltin", + "VariantOpcodes": [ + 87, + 88 + ] + }, + { + "Name": "CreateClosure", + "VariantOpcodes": [ + 98, + 99 + ] + }, + { + "Name": "CreateGeneratorClosure", + "VariantOpcodes": [ + 100, + 101 + ] + }, + { + "Name": "CreateAsyncClosure", + "VariantOpcodes": [ + 102, + 103 + ] + }, + { + "Name": "LoadParam", + "VariantOpcodes": [ + 106, + 107 + ] + }, + { + "Name": "LoadConstBigInt", + "VariantOpcodes": [ + 111, + 112 + ] + }, + { + "Name": "LoadConstString", + "VariantOpcodes": [ + 113, + 114 + ] + }, + { + "Name": "CreateGenerator", + "VariantOpcodes": [ + 135, + 136 + ] + }, + { + "Name": "Jmp", + "VariantOpcodes": [ + 140, + 141 + ] + }, + { + "Name": "JmpTrue", + "VariantOpcodes": [ + 142, + 143 + ] + }, + { + "Name": "JmpFalse", + "VariantOpcodes": [ + 144, + 145 + ] + }, + { + "Name": "JmpUndefined", + "VariantOpcodes": [ + 146, + 147 + ] + }, + { + "Name": "SaveGenerator", + "VariantOpcodes": [ + 148, + 149 + ] + }, + { + "Name": "JLess", + "VariantOpcodes": [ + 150, + 151 + ] + }, + { + "Name": "JNotLess", + "VariantOpcodes": [ + 152, + 153 + ] + }, + { + "Name": "JLessN", + "VariantOpcodes": [ + 154, + 155 + ] + }, + { + "Name": "JNotLessN", + "VariantOpcodes": [ + 156, + 157 + ] + }, + { + "Name": "JLessEqual", + "VariantOpcodes": [ + 158, + 159 + ] + }, + { + "Name": "JNotLessEqual", + "VariantOpcodes": [ + 160, + 161 + ] + }, + { + "Name": "JLessEqualN", + "VariantOpcodes": [ + 162, + 163 + ] + }, + { + "Name": "JNotLessEqualN", + "VariantOpcodes": [ + 164, + 165 + ] + }, + { + "Name": "JGreater", + "VariantOpcodes": [ + 166, + 167 + ] + }, + { + "Name": "JNotGreater", + "VariantOpcodes": [ + 168, + 169 + ] + }, + { + "Name": "JGreaterN", + "VariantOpcodes": [ + 170, + 171 + ] + }, + { + "Name": "JNotGreaterN", + "VariantOpcodes": [ + 172, + 173 + ] + }, + { + "Name": "JGreaterEqual", + "VariantOpcodes": [ + 174, + 175 + ] + }, + { + "Name": "JNotGreaterEqual", + "VariantOpcodes": [ + 176, + 177 + ] + }, + { + "Name": "JGreaterEqualN", + "VariantOpcodes": [ + 178, + 179 + ] + }, + { + "Name": "JNotGreaterEqualN", + "VariantOpcodes": [ + 180, + 181 + ] + }, + { + "Name": "JEqual", + "VariantOpcodes": [ + 182, + 183 + ] + }, + { + "Name": "JNotEqual", + "VariantOpcodes": [ + 184, + 185 + ] + }, + { + "Name": "JStrictEqual", + "VariantOpcodes": [ + 186, + 187 + ] + }, + { + "Name": "JStrictNotEqual", + "VariantOpcodes": [ + 188, + 189 + ] + } + ], + "GitCommitHash": "0763eee4bf461df30ffefe0180d09835bb6bb58d" +} \ No newline at end of file diff --git a/hasmer/libhasmer/Resources/Bytecode91.json b/hasmer/libhasmer/Resources/Bytecode91.json new file mode 100644 index 0000000..53369bf --- /dev/null +++ b/hasmer/libhasmer/Resources/Bytecode91.json @@ -0,0 +1,2432 @@ +{ + "Version": 91, + "Definitions": [ + { + "Opcode": 0, + "Name": "Unreachable", + "OperandTypes": [], + "IsJump": false + }, + { + "Opcode": 1, + "Name": "NewObjectWithBuffer", + "OperandTypes": [ + "Reg8", + "UInt16", + "UInt16", + "UInt16", + "UInt16" + ], + "IsJump": false, + "AbstractDefinition": 0 + }, + { + "Opcode": 2, + "Name": "NewObjectWithBufferLong", + "OperandTypes": [ + "Reg8", + "UInt16", + "UInt16", + "UInt32", + "UInt32" + ], + "IsJump": false, + "AbstractDefinition": 0 + }, + { + "Opcode": 3, + "Name": "NewObject", + "OperandTypes": [ + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 4, + "Name": "NewObjectWithParent", + "OperandTypes": [ + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 5, + "Name": "NewArrayWithBuffer", + "OperandTypes": [ + "Reg8", + "UInt16", + "UInt16", + "UInt16" + ], + "IsJump": false, + "AbstractDefinition": 1 + }, + { + "Opcode": 6, + "Name": "NewArrayWithBufferLong", + "OperandTypes": [ + "Reg8", + "UInt16", + "UInt16", + "UInt32" + ], + "IsJump": false, + "AbstractDefinition": 1 + }, + { + "Opcode": 7, + "Name": "NewArray", + "OperandTypes": [ + "Reg8", + "UInt16" + ], + "IsJump": false + }, + { + "Opcode": 8, + "Name": "Mov", + "OperandTypes": [ + "Reg8", + "Reg8" + ], + "IsJump": false, + "AbstractDefinition": 2 + }, + { + "Opcode": 9, + "Name": "MovLong", + "OperandTypes": [ + "Reg32", + "Reg32" + ], + "IsJump": false, + "AbstractDefinition": 2 + }, + { + "Opcode": 10, + "Name": "Negate", + "OperandTypes": [ + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 11, + "Name": "Not", + "OperandTypes": [ + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 12, + "Name": "BitNot", + "OperandTypes": [ + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 13, + "Name": "TypeOf", + "OperandTypes": [ + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 14, + "Name": "Eq", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 15, + "Name": "StrictEq", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 16, + "Name": "Neq", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 17, + "Name": "StrictNeq", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 18, + "Name": "Less", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 19, + "Name": "LessEq", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 20, + "Name": "Greater", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 21, + "Name": "GreaterEq", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 22, + "Name": "Add", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 23, + "Name": "AddN", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 24, + "Name": "Mul", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 25, + "Name": "MulN", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 26, + "Name": "Div", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 27, + "Name": "DivN", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 28, + "Name": "Mod", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 29, + "Name": "Sub", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 30, + "Name": "SubN", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 31, + "Name": "LShift", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 32, + "Name": "RShift", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 33, + "Name": "URshift", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 34, + "Name": "BitAnd", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 35, + "Name": "BitXor", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 36, + "Name": "BitOr", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 37, + "Name": "Inc", + "OperandTypes": [ + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 38, + "Name": "Dec", + "OperandTypes": [ + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 39, + "Name": "InstanceOf", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 40, + "Name": "IsIn", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 41, + "Name": "GetEnvironment", + "OperandTypes": [ + "Reg8", + "UInt8" + ], + "IsJump": false + }, + { + "Opcode": 42, + "Name": "StoreToEnvironment", + "OperandTypes": [ + "Reg8", + "UInt8", + "Reg8" + ], + "IsJump": false, + "AbstractDefinition": 3 + }, + { + "Opcode": 43, + "Name": "StoreToEnvironmentL", + "OperandTypes": [ + "Reg8", + "UInt16", + "Reg8" + ], + "IsJump": false, + "AbstractDefinition": 3 + }, + { + "Opcode": 44, + "Name": "StoreNPToEnvironment", + "OperandTypes": [ + "Reg8", + "UInt8", + "Reg8" + ], + "IsJump": false, + "AbstractDefinition": 4 + }, + { + "Opcode": 45, + "Name": "StoreNPToEnvironmentL", + "OperandTypes": [ + "Reg8", + "UInt16", + "Reg8" + ], + "IsJump": false, + "AbstractDefinition": 4 + }, + { + "Opcode": 46, + "Name": "LoadFromEnvironment", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt8" + ], + "IsJump": false, + "AbstractDefinition": 5 + }, + { + "Opcode": 47, + "Name": "LoadFromEnvironmentL", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt16" + ], + "IsJump": false, + "AbstractDefinition": 5 + }, + { + "Opcode": 48, + "Name": "GetGlobalObject", + "OperandTypes": [ + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 49, + "Name": "GetNewTarget", + "OperandTypes": [ + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 50, + "Name": "CreateEnvironment", + "OperandTypes": [ + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 51, + "Name": "DeclareGlobalVar", + "OperandTypes": [ + "UInt32S" + ], + "IsJump": false + }, + { + "Opcode": 52, + "Name": "GetByIdShort", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt8", + "UInt8S" + ], + "IsJump": false, + "AbstractDefinition": 6 + }, + { + "Opcode": 53, + "Name": "GetById", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt8", + "UInt16S" + ], + "IsJump": false, + "AbstractDefinition": 6 + }, + { + "Opcode": 54, + "Name": "GetByIdLong", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt8", + "UInt32S" + ], + "IsJump": false, + "AbstractDefinition": 6 + }, + { + "Opcode": 55, + "Name": "TryGetById", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt8", + "UInt16S" + ], + "IsJump": false, + "AbstractDefinition": 7 + }, + { + "Opcode": 56, + "Name": "TryGetByIdLong", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt8", + "UInt32S" + ], + "IsJump": false, + "AbstractDefinition": 7 + }, + { + "Opcode": 57, + "Name": "PutById", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt8", + "UInt16S" + ], + "IsJump": false, + "AbstractDefinition": 8 + }, + { + "Opcode": 58, + "Name": "PutByIdLong", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt8", + "UInt32S" + ], + "IsJump": false, + "AbstractDefinition": 8 + }, + { + "Opcode": 59, + "Name": "TryPutById", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt8", + "UInt16S" + ], + "IsJump": false, + "AbstractDefinition": 9 + }, + { + "Opcode": 60, + "Name": "TryPutByIdLong", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt8", + "UInt32S" + ], + "IsJump": false, + "AbstractDefinition": 9 + }, + { + "Opcode": 61, + "Name": "PutNewOwnByIdShort", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt8S" + ], + "IsJump": false, + "AbstractDefinition": 10 + }, + { + "Opcode": 62, + "Name": "PutNewOwnById", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt16S" + ], + "IsJump": false, + "AbstractDefinition": 10 + }, + { + "Opcode": 63, + "Name": "PutNewOwnByIdLong", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt32S" + ], + "IsJump": false, + "AbstractDefinition": 10 + }, + { + "Opcode": 64, + "Name": "PutNewOwnNEById", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt16S" + ], + "IsJump": false, + "AbstractDefinition": 11 + }, + { + "Opcode": 65, + "Name": "PutNewOwnNEByIdLong", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt32S" + ], + "IsJump": false, + "AbstractDefinition": 11 + }, + { + "Opcode": 66, + "Name": "PutOwnByIndex", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt8" + ], + "IsJump": false, + "AbstractDefinition": 12 + }, + { + "Opcode": 67, + "Name": "PutOwnByIndexL", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt32" + ], + "IsJump": false, + "AbstractDefinition": 12 + }, + { + "Opcode": 68, + "Name": "PutOwnByVal", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8", + "UInt8" + ], + "IsJump": false + }, + { + "Opcode": 69, + "Name": "DelById", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt16S" + ], + "IsJump": false, + "AbstractDefinition": 13 + }, + { + "Opcode": 70, + "Name": "DelByIdLong", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt32S" + ], + "IsJump": false, + "AbstractDefinition": 13 + }, + { + "Opcode": 71, + "Name": "GetByVal", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 72, + "Name": "PutByVal", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 73, + "Name": "DelByVal", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 74, + "Name": "PutOwnGetterSetterByVal", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8", + "Reg8", + "UInt8" + ], + "IsJump": false + }, + { + "Opcode": 75, + "Name": "GetPNameList", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 76, + "Name": "GetNextPName", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 77, + "Name": "Call", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt8" + ], + "IsJump": false, + "AbstractDefinition": 14 + }, + { + "Opcode": 78, + "Name": "Construct", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt8" + ], + "IsJump": false, + "AbstractDefinition": 15 + }, + { + "Opcode": 79, + "Name": "Call1", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 80, + "Name": "CallDirect", + "OperandTypes": [ + "Reg8", + "UInt8", + "UInt16" + ], + "IsJump": false, + "AbstractDefinition": 16 + }, + { + "Opcode": 81, + "Name": "Call2", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 82, + "Name": "Call3", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 83, + "Name": "Call4", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8", + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 84, + "Name": "CallLong", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt32" + ], + "IsJump": false, + "AbstractDefinition": 14 + }, + { + "Opcode": 85, + "Name": "ConstructLong", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt32" + ], + "IsJump": false, + "AbstractDefinition": 15 + }, + { + "Opcode": 86, + "Name": "CallDirectLongIndex", + "OperandTypes": [ + "Reg8", + "UInt8", + "UInt32" + ], + "IsJump": false, + "AbstractDefinition": 16 + }, + { + "Opcode": 87, + "Name": "CallBuiltin", + "OperandTypes": [ + "Reg8", + "UInt8", + "UInt8" + ], + "IsJump": false, + "AbstractDefinition": 17 + }, + { + "Opcode": 88, + "Name": "CallBuiltinLong", + "OperandTypes": [ + "Reg8", + "UInt8", + "UInt32" + ], + "IsJump": false, + "AbstractDefinition": 17 + }, + { + "Opcode": 89, + "Name": "GetBuiltinClosure", + "OperandTypes": [ + "Reg8", + "UInt8" + ], + "IsJump": false + }, + { + "Opcode": 90, + "Name": "Ret", + "OperandTypes": [ + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 91, + "Name": "Catch", + "OperandTypes": [ + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 92, + "Name": "DirectEval", + "OperandTypes": [ + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 93, + "Name": "Throw", + "OperandTypes": [ + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 94, + "Name": "ThrowIfEmpty", + "OperandTypes": [ + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 95, + "Name": "Debugger", + "OperandTypes": [], + "IsJump": false + }, + { + "Opcode": 96, + "Name": "AsyncBreakCheck", + "OperandTypes": [], + "IsJump": false + }, + { + "Opcode": 97, + "Name": "ProfilePoint", + "OperandTypes": [ + "UInt16" + ], + "IsJump": false + }, + { + "Opcode": 98, + "Name": "CreateClosure", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt16" + ], + "IsJump": false, + "AbstractDefinition": 18 + }, + { + "Opcode": 99, + "Name": "CreateClosureLongIndex", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt32" + ], + "IsJump": false, + "AbstractDefinition": 18 + }, + { + "Opcode": 100, + "Name": "CreateGeneratorClosure", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt16" + ], + "IsJump": false, + "AbstractDefinition": 19 + }, + { + "Opcode": 101, + "Name": "CreateGeneratorClosureLongIndex", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt32" + ], + "IsJump": false, + "AbstractDefinition": 19 + }, + { + "Opcode": 102, + "Name": "CreateAsyncClosure", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt16" + ], + "IsJump": false, + "AbstractDefinition": 20 + }, + { + "Opcode": 103, + "Name": "CreateAsyncClosureLongIndex", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt32" + ], + "IsJump": false, + "AbstractDefinition": 20 + }, + { + "Opcode": 104, + "Name": "CreateThis", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 105, + "Name": "SelectObject", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 106, + "Name": "LoadParam", + "OperandTypes": [ + "Reg8", + "UInt8" + ], + "IsJump": false, + "AbstractDefinition": 21 + }, + { + "Opcode": 107, + "Name": "LoadParamLong", + "OperandTypes": [ + "Reg8", + "UInt32" + ], + "IsJump": false, + "AbstractDefinition": 21 + }, + { + "Opcode": 108, + "Name": "LoadConstUInt8", + "OperandTypes": [ + "Reg8", + "UInt8" + ], + "IsJump": false + }, + { + "Opcode": 109, + "Name": "LoadConstInt", + "OperandTypes": [ + "Reg8", + "Imm32" + ], + "IsJump": false + }, + { + "Opcode": 110, + "Name": "LoadConstDouble", + "OperandTypes": [ + "Reg8", + "Double" + ], + "IsJump": false + }, + { + "Opcode": 111, + "Name": "LoadConstBigInt", + "OperandTypes": [ + "Reg8", + "UInt16" + ], + "IsJump": false, + "AbstractDefinition": 22 + }, + { + "Opcode": 112, + "Name": "LoadConstBigIntLongIndex", + "OperandTypes": [ + "Reg8", + "UInt32" + ], + "IsJump": false, + "AbstractDefinition": 22 + }, + { + "Opcode": 113, + "Name": "LoadConstString", + "OperandTypes": [ + "Reg8", + "UInt16S" + ], + "IsJump": false, + "AbstractDefinition": 23 + }, + { + "Opcode": 114, + "Name": "LoadConstStringLongIndex", + "OperandTypes": [ + "Reg8", + "UInt32S" + ], + "IsJump": false, + "AbstractDefinition": 23 + }, + { + "Opcode": 115, + "Name": "LoadConstEmpty", + "OperandTypes": [ + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 116, + "Name": "LoadConstUndefined", + "OperandTypes": [ + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 117, + "Name": "LoadConstNull", + "OperandTypes": [ + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 118, + "Name": "LoadConstTrue", + "OperandTypes": [ + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 119, + "Name": "LoadConstFalse", + "OperandTypes": [ + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 120, + "Name": "LoadConstZero", + "OperandTypes": [ + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 121, + "Name": "CoerceThisNS", + "OperandTypes": [ + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 122, + "Name": "LoadThisNS", + "OperandTypes": [ + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 123, + "Name": "ToNumber", + "OperandTypes": [ + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 124, + "Name": "ToNumeric", + "OperandTypes": [ + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 125, + "Name": "ToInt32", + "OperandTypes": [ + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 126, + "Name": "AddEmptyString", + "OperandTypes": [ + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 127, + "Name": "GetArgumentsPropByVal", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 128, + "Name": "GetArgumentsLength", + "OperandTypes": [ + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 129, + "Name": "ReifyArguments", + "OperandTypes": [ + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 130, + "Name": "CreateRegExp", + "OperandTypes": [ + "Reg8", + "UInt32S", + "UInt32S", + "UInt32" + ], + "IsJump": false + }, + { + "Opcode": 131, + "Name": "SwitchImm", + "OperandTypes": [ + "Reg8", + "UInt32", + "Addr32", + "UInt32", + "UInt32" + ], + "IsJump": false + }, + { + "Opcode": 132, + "Name": "StartGenerator", + "OperandTypes": [], + "IsJump": false + }, + { + "Opcode": 133, + "Name": "ResumeGenerator", + "OperandTypes": [ + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 134, + "Name": "CompleteGenerator", + "OperandTypes": [], + "IsJump": false + }, + { + "Opcode": 135, + "Name": "CreateGenerator", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt16" + ], + "IsJump": false, + "AbstractDefinition": 24 + }, + { + "Opcode": 136, + "Name": "CreateGeneratorLongIndex", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt32" + ], + "IsJump": false, + "AbstractDefinition": 24 + }, + { + "Opcode": 137, + "Name": "IteratorBegin", + "OperandTypes": [ + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 138, + "Name": "IteratorNext", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 139, + "Name": "IteratorClose", + "OperandTypes": [ + "Reg8", + "UInt8" + ], + "IsJump": false + }, + { + "Opcode": 140, + "Name": "Jmp", + "OperandTypes": [ + "Addr8" + ], + "IsJump": true, + "AbstractDefinition": 25 + }, + { + "Opcode": 141, + "Name": "JmpLong", + "OperandTypes": [ + "Addr32" + ], + "IsJump": true, + "AbstractDefinition": 25 + }, + { + "Opcode": 142, + "Name": "JmpTrue", + "OperandTypes": [ + "Addr8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 26 + }, + { + "Opcode": 143, + "Name": "JmpTrueLong", + "OperandTypes": [ + "Addr32", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 26 + }, + { + "Opcode": 144, + "Name": "JmpFalse", + "OperandTypes": [ + "Addr8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 27 + }, + { + "Opcode": 145, + "Name": "JmpFalseLong", + "OperandTypes": [ + "Addr32", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 27 + }, + { + "Opcode": 146, + "Name": "JmpUndefined", + "OperandTypes": [ + "Addr8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 28 + }, + { + "Opcode": 147, + "Name": "JmpUndefinedLong", + "OperandTypes": [ + "Addr32", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 28 + }, + { + "Opcode": 148, + "Name": "SaveGenerator", + "OperandTypes": [ + "Addr8" + ], + "IsJump": true, + "AbstractDefinition": 29 + }, + { + "Opcode": 149, + "Name": "SaveGeneratorLong", + "OperandTypes": [ + "Addr32" + ], + "IsJump": true, + "AbstractDefinition": 29 + }, + { + "Opcode": 150, + "Name": "JLess", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 30 + }, + { + "Opcode": 151, + "Name": "JLessLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 30 + }, + { + "Opcode": 152, + "Name": "JNotLess", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 31 + }, + { + "Opcode": 153, + "Name": "JNotLessLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 31 + }, + { + "Opcode": 154, + "Name": "JLessN", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 32 + }, + { + "Opcode": 155, + "Name": "JLessNLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 32 + }, + { + "Opcode": 156, + "Name": "JNotLessN", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 33 + }, + { + "Opcode": 157, + "Name": "JNotLessNLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 33 + }, + { + "Opcode": 158, + "Name": "JLessEqual", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 34 + }, + { + "Opcode": 159, + "Name": "JLessEqualLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 34 + }, + { + "Opcode": 160, + "Name": "JNotLessEqual", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 35 + }, + { + "Opcode": 161, + "Name": "JNotLessEqualLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 35 + }, + { + "Opcode": 162, + "Name": "JLessEqualN", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 36 + }, + { + "Opcode": 163, + "Name": "JLessEqualNLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 36 + }, + { + "Opcode": 164, + "Name": "JNotLessEqualN", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 37 + }, + { + "Opcode": 165, + "Name": "JNotLessEqualNLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 37 + }, + { + "Opcode": 166, + "Name": "JGreater", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 38 + }, + { + "Opcode": 167, + "Name": "JGreaterLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 38 + }, + { + "Opcode": 168, + "Name": "JNotGreater", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 39 + }, + { + "Opcode": 169, + "Name": "JNotGreaterLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 39 + }, + { + "Opcode": 170, + "Name": "JGreaterN", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 40 + }, + { + "Opcode": 171, + "Name": "JGreaterNLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 40 + }, + { + "Opcode": 172, + "Name": "JNotGreaterN", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 41 + }, + { + "Opcode": 173, + "Name": "JNotGreaterNLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 41 + }, + { + "Opcode": 174, + "Name": "JGreaterEqual", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 42 + }, + { + "Opcode": 175, + "Name": "JGreaterEqualLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 42 + }, + { + "Opcode": 176, + "Name": "JNotGreaterEqual", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 43 + }, + { + "Opcode": 177, + "Name": "JNotGreaterEqualLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 43 + }, + { + "Opcode": 178, + "Name": "JGreaterEqualN", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 44 + }, + { + "Opcode": 179, + "Name": "JGreaterEqualNLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 44 + }, + { + "Opcode": 180, + "Name": "JNotGreaterEqualN", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 45 + }, + { + "Opcode": 181, + "Name": "JNotGreaterEqualNLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 45 + }, + { + "Opcode": 182, + "Name": "JEqual", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 46 + }, + { + "Opcode": 183, + "Name": "JEqualLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 46 + }, + { + "Opcode": 184, + "Name": "JNotEqual", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 47 + }, + { + "Opcode": 185, + "Name": "JNotEqualLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 47 + }, + { + "Opcode": 186, + "Name": "JStrictEqual", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 48 + }, + { + "Opcode": 187, + "Name": "JStrictEqualLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 48 + }, + { + "Opcode": 188, + "Name": "JStrictNotEqual", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 49 + }, + { + "Opcode": 189, + "Name": "JStrictNotEqualLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 49 + }, + { + "Opcode": 190, + "Name": "Add32", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 191, + "Name": "Sub32", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 192, + "Name": "Mul32", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 193, + "Name": "Divi32", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 194, + "Name": "Divu32", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 195, + "Name": "Loadi8", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 196, + "Name": "Loadu8", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 197, + "Name": "Loadi16", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 198, + "Name": "Loadu16", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 199, + "Name": "Loadi32", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 200, + "Name": "Loadu32", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 201, + "Name": "Store8", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 202, + "Name": "Store16", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 203, + "Name": "Store32", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + } + ], + "AbstractDefinitions": [ + { + "Name": "NewObjectWithBuffer", + "VariantOpcodes": [ + 1, + 2 + ] + }, + { + "Name": "NewArrayWithBuffer", + "VariantOpcodes": [ + 5, + 6 + ] + }, + { + "Name": "Mov", + "VariantOpcodes": [ + 8, + 9 + ] + }, + { + "Name": "StoreToEnvironment", + "VariantOpcodes": [ + 42, + 43 + ] + }, + { + "Name": "StoreNPToEnvironment", + "VariantOpcodes": [ + 44, + 45 + ] + }, + { + "Name": "LoadFromEnvironment", + "VariantOpcodes": [ + 46, + 47 + ] + }, + { + "Name": "GetById", + "VariantOpcodes": [ + 53, + 52, + 54 + ] + }, + { + "Name": "TryGetById", + "VariantOpcodes": [ + 55, + 56 + ] + }, + { + "Name": "PutById", + "VariantOpcodes": [ + 57, + 58 + ] + }, + { + "Name": "TryPutById", + "VariantOpcodes": [ + 59, + 60 + ] + }, + { + "Name": "PutNewOwnById", + "VariantOpcodes": [ + 62, + 61, + 63 + ] + }, + { + "Name": "PutNewOwnNEById", + "VariantOpcodes": [ + 64, + 65 + ] + }, + { + "Name": "PutOwnByIndex", + "VariantOpcodes": [ + 66, + 67 + ] + }, + { + "Name": "DelById", + "VariantOpcodes": [ + 69, + 70 + ] + }, + { + "Name": "Call", + "VariantOpcodes": [ + 77, + 84 + ] + }, + { + "Name": "Construct", + "VariantOpcodes": [ + 78, + 85 + ] + }, + { + "Name": "CallDirect", + "VariantOpcodes": [ + 80, + 86 + ] + }, + { + "Name": "CallBuiltin", + "VariantOpcodes": [ + 87, + 88 + ] + }, + { + "Name": "CreateClosure", + "VariantOpcodes": [ + 98, + 99 + ] + }, + { + "Name": "CreateGeneratorClosure", + "VariantOpcodes": [ + 100, + 101 + ] + }, + { + "Name": "CreateAsyncClosure", + "VariantOpcodes": [ + 102, + 103 + ] + }, + { + "Name": "LoadParam", + "VariantOpcodes": [ + 106, + 107 + ] + }, + { + "Name": "LoadConstBigInt", + "VariantOpcodes": [ + 111, + 112 + ] + }, + { + "Name": "LoadConstString", + "VariantOpcodes": [ + 113, + 114 + ] + }, + { + "Name": "CreateGenerator", + "VariantOpcodes": [ + 135, + 136 + ] + }, + { + "Name": "Jmp", + "VariantOpcodes": [ + 140, + 141 + ] + }, + { + "Name": "JmpTrue", + "VariantOpcodes": [ + 142, + 143 + ] + }, + { + "Name": "JmpFalse", + "VariantOpcodes": [ + 144, + 145 + ] + }, + { + "Name": "JmpUndefined", + "VariantOpcodes": [ + 146, + 147 + ] + }, + { + "Name": "SaveGenerator", + "VariantOpcodes": [ + 148, + 149 + ] + }, + { + "Name": "JLess", + "VariantOpcodes": [ + 150, + 151 + ] + }, + { + "Name": "JNotLess", + "VariantOpcodes": [ + 152, + 153 + ] + }, + { + "Name": "JLessN", + "VariantOpcodes": [ + 154, + 155 + ] + }, + { + "Name": "JNotLessN", + "VariantOpcodes": [ + 156, + 157 + ] + }, + { + "Name": "JLessEqual", + "VariantOpcodes": [ + 158, + 159 + ] + }, + { + "Name": "JNotLessEqual", + "VariantOpcodes": [ + 160, + 161 + ] + }, + { + "Name": "JLessEqualN", + "VariantOpcodes": [ + 162, + 163 + ] + }, + { + "Name": "JNotLessEqualN", + "VariantOpcodes": [ + 164, + 165 + ] + }, + { + "Name": "JGreater", + "VariantOpcodes": [ + 166, + 167 + ] + }, + { + "Name": "JNotGreater", + "VariantOpcodes": [ + 168, + 169 + ] + }, + { + "Name": "JGreaterN", + "VariantOpcodes": [ + 170, + 171 + ] + }, + { + "Name": "JNotGreaterN", + "VariantOpcodes": [ + 172, + 173 + ] + }, + { + "Name": "JGreaterEqual", + "VariantOpcodes": [ + 174, + 175 + ] + }, + { + "Name": "JNotGreaterEqual", + "VariantOpcodes": [ + 176, + 177 + ] + }, + { + "Name": "JGreaterEqualN", + "VariantOpcodes": [ + 178, + 179 + ] + }, + { + "Name": "JNotGreaterEqualN", + "VariantOpcodes": [ + 180, + 181 + ] + }, + { + "Name": "JEqual", + "VariantOpcodes": [ + 182, + 183 + ] + }, + { + "Name": "JNotEqual", + "VariantOpcodes": [ + 184, + 185 + ] + }, + { + "Name": "JStrictEqual", + "VariantOpcodes": [ + 186, + 187 + ] + }, + { + "Name": "JStrictNotEqual", + "VariantOpcodes": [ + 188, + 189 + ] + } + ], + "GitCommitHash": "6ce4457fefdb50c6ce431b371e514914848fb128" +} \ No newline at end of file diff --git a/hasmer/libhasmer/Resources/Bytecode92.json b/hasmer/libhasmer/Resources/Bytecode92.json new file mode 100644 index 0000000..399d19e --- /dev/null +++ b/hasmer/libhasmer/Resources/Bytecode92.json @@ -0,0 +1,2450 @@ +{ + "Version": 92, + "Definitions": [ + { + "Opcode": 0, + "Name": "Unreachable", + "OperandTypes": [], + "IsJump": false + }, + { + "Opcode": 1, + "Name": "NewObjectWithBuffer", + "OperandTypes": [ + "Reg8", + "UInt16", + "UInt16", + "UInt16", + "UInt16" + ], + "IsJump": false, + "AbstractDefinition": 0 + }, + { + "Opcode": 2, + "Name": "NewObjectWithBufferLong", + "OperandTypes": [ + "Reg8", + "UInt16", + "UInt16", + "UInt32", + "UInt32" + ], + "IsJump": false, + "AbstractDefinition": 0 + }, + { + "Opcode": 3, + "Name": "NewObject", + "OperandTypes": [ + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 4, + "Name": "NewObjectWithParent", + "OperandTypes": [ + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 5, + "Name": "NewArrayWithBuffer", + "OperandTypes": [ + "Reg8", + "UInt16", + "UInt16", + "UInt16" + ], + "IsJump": false, + "AbstractDefinition": 1 + }, + { + "Opcode": 6, + "Name": "NewArrayWithBufferLong", + "OperandTypes": [ + "Reg8", + "UInt16", + "UInt16", + "UInt32" + ], + "IsJump": false, + "AbstractDefinition": 1 + }, + { + "Opcode": 7, + "Name": "NewArray", + "OperandTypes": [ + "Reg8", + "UInt16" + ], + "IsJump": false + }, + { + "Opcode": 8, + "Name": "Mov", + "OperandTypes": [ + "Reg8", + "Reg8" + ], + "IsJump": false, + "AbstractDefinition": 2 + }, + { + "Opcode": 9, + "Name": "MovLong", + "OperandTypes": [ + "Reg32", + "Reg32" + ], + "IsJump": false, + "AbstractDefinition": 2 + }, + { + "Opcode": 10, + "Name": "Negate", + "OperandTypes": [ + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 11, + "Name": "Not", + "OperandTypes": [ + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 12, + "Name": "BitNot", + "OperandTypes": [ + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 13, + "Name": "TypeOf", + "OperandTypes": [ + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 14, + "Name": "Eq", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 15, + "Name": "StrictEq", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 16, + "Name": "Neq", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 17, + "Name": "StrictNeq", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 18, + "Name": "Less", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 19, + "Name": "LessEq", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 20, + "Name": "Greater", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 21, + "Name": "GreaterEq", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 22, + "Name": "Add", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 23, + "Name": "AddN", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 24, + "Name": "Mul", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 25, + "Name": "MulN", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 26, + "Name": "Div", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 27, + "Name": "DivN", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 28, + "Name": "Mod", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 29, + "Name": "Sub", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 30, + "Name": "SubN", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 31, + "Name": "LShift", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 32, + "Name": "RShift", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 33, + "Name": "URshift", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 34, + "Name": "BitAnd", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 35, + "Name": "BitXor", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 36, + "Name": "BitOr", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 37, + "Name": "Inc", + "OperandTypes": [ + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 38, + "Name": "Dec", + "OperandTypes": [ + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 39, + "Name": "InstanceOf", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 40, + "Name": "IsIn", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 41, + "Name": "GetEnvironment", + "OperandTypes": [ + "Reg8", + "UInt8" + ], + "IsJump": false + }, + { + "Opcode": 42, + "Name": "StoreToEnvironment", + "OperandTypes": [ + "Reg8", + "UInt8", + "Reg8" + ], + "IsJump": false, + "AbstractDefinition": 3 + }, + { + "Opcode": 43, + "Name": "StoreToEnvironmentL", + "OperandTypes": [ + "Reg8", + "UInt16", + "Reg8" + ], + "IsJump": false, + "AbstractDefinition": 3 + }, + { + "Opcode": 44, + "Name": "StoreNPToEnvironment", + "OperandTypes": [ + "Reg8", + "UInt8", + "Reg8" + ], + "IsJump": false, + "AbstractDefinition": 4 + }, + { + "Opcode": 45, + "Name": "StoreNPToEnvironmentL", + "OperandTypes": [ + "Reg8", + "UInt16", + "Reg8" + ], + "IsJump": false, + "AbstractDefinition": 4 + }, + { + "Opcode": 46, + "Name": "LoadFromEnvironment", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt8" + ], + "IsJump": false, + "AbstractDefinition": 5 + }, + { + "Opcode": 47, + "Name": "LoadFromEnvironmentL", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt16" + ], + "IsJump": false, + "AbstractDefinition": 5 + }, + { + "Opcode": 48, + "Name": "GetGlobalObject", + "OperandTypes": [ + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 49, + "Name": "GetNewTarget", + "OperandTypes": [ + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 50, + "Name": "CreateEnvironment", + "OperandTypes": [ + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 51, + "Name": "CreateInnerEnvironment", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt32" + ], + "IsJump": false + }, + { + "Opcode": 52, + "Name": "DeclareGlobalVar", + "OperandTypes": [ + "UInt32S" + ], + "IsJump": false + }, + { + "Opcode": 53, + "Name": "ThrowIfHasRestrictedGlobalProperty", + "OperandTypes": [ + "UInt32S" + ], + "IsJump": false + }, + { + "Opcode": 54, + "Name": "GetByIdShort", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt8", + "UInt8S" + ], + "IsJump": false, + "AbstractDefinition": 6 + }, + { + "Opcode": 55, + "Name": "GetById", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt8", + "UInt16S" + ], + "IsJump": false, + "AbstractDefinition": 6 + }, + { + "Opcode": 56, + "Name": "GetByIdLong", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt8", + "UInt32S" + ], + "IsJump": false, + "AbstractDefinition": 6 + }, + { + "Opcode": 57, + "Name": "TryGetById", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt8", + "UInt16S" + ], + "IsJump": false, + "AbstractDefinition": 7 + }, + { + "Opcode": 58, + "Name": "TryGetByIdLong", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt8", + "UInt32S" + ], + "IsJump": false, + "AbstractDefinition": 7 + }, + { + "Opcode": 59, + "Name": "PutById", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt8", + "UInt16S" + ], + "IsJump": false, + "AbstractDefinition": 8 + }, + { + "Opcode": 60, + "Name": "PutByIdLong", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt8", + "UInt32S" + ], + "IsJump": false, + "AbstractDefinition": 8 + }, + { + "Opcode": 61, + "Name": "TryPutById", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt8", + "UInt16S" + ], + "IsJump": false, + "AbstractDefinition": 9 + }, + { + "Opcode": 62, + "Name": "TryPutByIdLong", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt8", + "UInt32S" + ], + "IsJump": false, + "AbstractDefinition": 9 + }, + { + "Opcode": 63, + "Name": "PutNewOwnByIdShort", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt8S" + ], + "IsJump": false, + "AbstractDefinition": 10 + }, + { + "Opcode": 64, + "Name": "PutNewOwnById", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt16S" + ], + "IsJump": false, + "AbstractDefinition": 10 + }, + { + "Opcode": 65, + "Name": "PutNewOwnByIdLong", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt32S" + ], + "IsJump": false, + "AbstractDefinition": 10 + }, + { + "Opcode": 66, + "Name": "PutNewOwnNEById", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt16S" + ], + "IsJump": false, + "AbstractDefinition": 11 + }, + { + "Opcode": 67, + "Name": "PutNewOwnNEByIdLong", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt32S" + ], + "IsJump": false, + "AbstractDefinition": 11 + }, + { + "Opcode": 68, + "Name": "PutOwnByIndex", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt8" + ], + "IsJump": false, + "AbstractDefinition": 12 + }, + { + "Opcode": 69, + "Name": "PutOwnByIndexL", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt32" + ], + "IsJump": false, + "AbstractDefinition": 12 + }, + { + "Opcode": 70, + "Name": "PutOwnByVal", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8", + "UInt8" + ], + "IsJump": false + }, + { + "Opcode": 71, + "Name": "DelById", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt16S" + ], + "IsJump": false, + "AbstractDefinition": 13 + }, + { + "Opcode": 72, + "Name": "DelByIdLong", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt32S" + ], + "IsJump": false, + "AbstractDefinition": 13 + }, + { + "Opcode": 73, + "Name": "GetByVal", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 74, + "Name": "PutByVal", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 75, + "Name": "DelByVal", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 76, + "Name": "PutOwnGetterSetterByVal", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8", + "Reg8", + "UInt8" + ], + "IsJump": false + }, + { + "Opcode": 77, + "Name": "GetPNameList", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 78, + "Name": "GetNextPName", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 79, + "Name": "Call", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt8" + ], + "IsJump": false, + "AbstractDefinition": 14 + }, + { + "Opcode": 80, + "Name": "Construct", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt8" + ], + "IsJump": false, + "AbstractDefinition": 15 + }, + { + "Opcode": 81, + "Name": "Call1", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 82, + "Name": "CallDirect", + "OperandTypes": [ + "Reg8", + "UInt8", + "UInt16" + ], + "IsJump": false, + "AbstractDefinition": 16 + }, + { + "Opcode": 83, + "Name": "Call2", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 84, + "Name": "Call3", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 85, + "Name": "Call4", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8", + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 86, + "Name": "CallLong", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt32" + ], + "IsJump": false, + "AbstractDefinition": 14 + }, + { + "Opcode": 87, + "Name": "ConstructLong", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt32" + ], + "IsJump": false, + "AbstractDefinition": 15 + }, + { + "Opcode": 88, + "Name": "CallDirectLongIndex", + "OperandTypes": [ + "Reg8", + "UInt8", + "UInt32" + ], + "IsJump": false, + "AbstractDefinition": 16 + }, + { + "Opcode": 89, + "Name": "CallBuiltin", + "OperandTypes": [ + "Reg8", + "UInt8", + "UInt8" + ], + "IsJump": false, + "AbstractDefinition": 17 + }, + { + "Opcode": 90, + "Name": "CallBuiltinLong", + "OperandTypes": [ + "Reg8", + "UInt8", + "UInt32" + ], + "IsJump": false, + "AbstractDefinition": 17 + }, + { + "Opcode": 91, + "Name": "GetBuiltinClosure", + "OperandTypes": [ + "Reg8", + "UInt8" + ], + "IsJump": false + }, + { + "Opcode": 92, + "Name": "Ret", + "OperandTypes": [ + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 93, + "Name": "Catch", + "OperandTypes": [ + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 94, + "Name": "DirectEval", + "OperandTypes": [ + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 95, + "Name": "Throw", + "OperandTypes": [ + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 96, + "Name": "ThrowIfEmpty", + "OperandTypes": [ + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 97, + "Name": "Debugger", + "OperandTypes": [], + "IsJump": false + }, + { + "Opcode": 98, + "Name": "AsyncBreakCheck", + "OperandTypes": [], + "IsJump": false + }, + { + "Opcode": 99, + "Name": "ProfilePoint", + "OperandTypes": [ + "UInt16" + ], + "IsJump": false + }, + { + "Opcode": 100, + "Name": "CreateClosure", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt16" + ], + "IsJump": false, + "AbstractDefinition": 18 + }, + { + "Opcode": 101, + "Name": "CreateClosureLongIndex", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt32" + ], + "IsJump": false, + "AbstractDefinition": 18 + }, + { + "Opcode": 102, + "Name": "CreateGeneratorClosure", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt16" + ], + "IsJump": false, + "AbstractDefinition": 19 + }, + { + "Opcode": 103, + "Name": "CreateGeneratorClosureLongIndex", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt32" + ], + "IsJump": false, + "AbstractDefinition": 19 + }, + { + "Opcode": 104, + "Name": "CreateAsyncClosure", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt16" + ], + "IsJump": false, + "AbstractDefinition": 20 + }, + { + "Opcode": 105, + "Name": "CreateAsyncClosureLongIndex", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt32" + ], + "IsJump": false, + "AbstractDefinition": 20 + }, + { + "Opcode": 106, + "Name": "CreateThis", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 107, + "Name": "SelectObject", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 108, + "Name": "LoadParam", + "OperandTypes": [ + "Reg8", + "UInt8" + ], + "IsJump": false, + "AbstractDefinition": 21 + }, + { + "Opcode": 109, + "Name": "LoadParamLong", + "OperandTypes": [ + "Reg8", + "UInt32" + ], + "IsJump": false, + "AbstractDefinition": 21 + }, + { + "Opcode": 110, + "Name": "LoadConstUInt8", + "OperandTypes": [ + "Reg8", + "UInt8" + ], + "IsJump": false + }, + { + "Opcode": 111, + "Name": "LoadConstInt", + "OperandTypes": [ + "Reg8", + "Imm32" + ], + "IsJump": false + }, + { + "Opcode": 112, + "Name": "LoadConstDouble", + "OperandTypes": [ + "Reg8", + "Double" + ], + "IsJump": false + }, + { + "Opcode": 113, + "Name": "LoadConstBigInt", + "OperandTypes": [ + "Reg8", + "UInt16" + ], + "IsJump": false, + "AbstractDefinition": 22 + }, + { + "Opcode": 114, + "Name": "LoadConstBigIntLongIndex", + "OperandTypes": [ + "Reg8", + "UInt32" + ], + "IsJump": false, + "AbstractDefinition": 22 + }, + { + "Opcode": 115, + "Name": "LoadConstString", + "OperandTypes": [ + "Reg8", + "UInt16S" + ], + "IsJump": false, + "AbstractDefinition": 23 + }, + { + "Opcode": 116, + "Name": "LoadConstStringLongIndex", + "OperandTypes": [ + "Reg8", + "UInt32S" + ], + "IsJump": false, + "AbstractDefinition": 23 + }, + { + "Opcode": 117, + "Name": "LoadConstEmpty", + "OperandTypes": [ + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 118, + "Name": "LoadConstUndefined", + "OperandTypes": [ + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 119, + "Name": "LoadConstNull", + "OperandTypes": [ + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 120, + "Name": "LoadConstTrue", + "OperandTypes": [ + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 121, + "Name": "LoadConstFalse", + "OperandTypes": [ + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 122, + "Name": "LoadConstZero", + "OperandTypes": [ + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 123, + "Name": "CoerceThisNS", + "OperandTypes": [ + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 124, + "Name": "LoadThisNS", + "OperandTypes": [ + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 125, + "Name": "ToNumber", + "OperandTypes": [ + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 126, + "Name": "ToNumeric", + "OperandTypes": [ + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 127, + "Name": "ToInt32", + "OperandTypes": [ + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 128, + "Name": "AddEmptyString", + "OperandTypes": [ + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 129, + "Name": "GetArgumentsPropByVal", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 130, + "Name": "GetArgumentsLength", + "OperandTypes": [ + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 131, + "Name": "ReifyArguments", + "OperandTypes": [ + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 132, + "Name": "CreateRegExp", + "OperandTypes": [ + "Reg8", + "UInt32S", + "UInt32S", + "UInt32" + ], + "IsJump": false + }, + { + "Opcode": 133, + "Name": "SwitchImm", + "OperandTypes": [ + "Reg8", + "UInt32", + "Addr32", + "UInt32", + "UInt32" + ], + "IsJump": false + }, + { + "Opcode": 134, + "Name": "StartGenerator", + "OperandTypes": [], + "IsJump": false + }, + { + "Opcode": 135, + "Name": "ResumeGenerator", + "OperandTypes": [ + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 136, + "Name": "CompleteGenerator", + "OperandTypes": [], + "IsJump": false + }, + { + "Opcode": 137, + "Name": "CreateGenerator", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt16" + ], + "IsJump": false, + "AbstractDefinition": 24 + }, + { + "Opcode": 138, + "Name": "CreateGeneratorLongIndex", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt32" + ], + "IsJump": false, + "AbstractDefinition": 24 + }, + { + "Opcode": 139, + "Name": "IteratorBegin", + "OperandTypes": [ + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 140, + "Name": "IteratorNext", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 141, + "Name": "IteratorClose", + "OperandTypes": [ + "Reg8", + "UInt8" + ], + "IsJump": false + }, + { + "Opcode": 142, + "Name": "Jmp", + "OperandTypes": [ + "Addr8" + ], + "IsJump": true, + "AbstractDefinition": 25 + }, + { + "Opcode": 143, + "Name": "JmpLong", + "OperandTypes": [ + "Addr32" + ], + "IsJump": true, + "AbstractDefinition": 25 + }, + { + "Opcode": 144, + "Name": "JmpTrue", + "OperandTypes": [ + "Addr8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 26 + }, + { + "Opcode": 145, + "Name": "JmpTrueLong", + "OperandTypes": [ + "Addr32", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 26 + }, + { + "Opcode": 146, + "Name": "JmpFalse", + "OperandTypes": [ + "Addr8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 27 + }, + { + "Opcode": 147, + "Name": "JmpFalseLong", + "OperandTypes": [ + "Addr32", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 27 + }, + { + "Opcode": 148, + "Name": "JmpUndefined", + "OperandTypes": [ + "Addr8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 28 + }, + { + "Opcode": 149, + "Name": "JmpUndefinedLong", + "OperandTypes": [ + "Addr32", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 28 + }, + { + "Opcode": 150, + "Name": "SaveGenerator", + "OperandTypes": [ + "Addr8" + ], + "IsJump": true, + "AbstractDefinition": 29 + }, + { + "Opcode": 151, + "Name": "SaveGeneratorLong", + "OperandTypes": [ + "Addr32" + ], + "IsJump": true, + "AbstractDefinition": 29 + }, + { + "Opcode": 152, + "Name": "JLess", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 30 + }, + { + "Opcode": 153, + "Name": "JLessLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 30 + }, + { + "Opcode": 154, + "Name": "JNotLess", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 31 + }, + { + "Opcode": 155, + "Name": "JNotLessLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 31 + }, + { + "Opcode": 156, + "Name": "JLessN", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 32 + }, + { + "Opcode": 157, + "Name": "JLessNLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 32 + }, + { + "Opcode": 158, + "Name": "JNotLessN", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 33 + }, + { + "Opcode": 159, + "Name": "JNotLessNLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 33 + }, + { + "Opcode": 160, + "Name": "JLessEqual", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 34 + }, + { + "Opcode": 161, + "Name": "JLessEqualLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 34 + }, + { + "Opcode": 162, + "Name": "JNotLessEqual", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 35 + }, + { + "Opcode": 163, + "Name": "JNotLessEqualLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 35 + }, + { + "Opcode": 164, + "Name": "JLessEqualN", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 36 + }, + { + "Opcode": 165, + "Name": "JLessEqualNLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 36 + }, + { + "Opcode": 166, + "Name": "JNotLessEqualN", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 37 + }, + { + "Opcode": 167, + "Name": "JNotLessEqualNLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 37 + }, + { + "Opcode": 168, + "Name": "JGreater", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 38 + }, + { + "Opcode": 169, + "Name": "JGreaterLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 38 + }, + { + "Opcode": 170, + "Name": "JNotGreater", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 39 + }, + { + "Opcode": 171, + "Name": "JNotGreaterLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 39 + }, + { + "Opcode": 172, + "Name": "JGreaterN", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 40 + }, + { + "Opcode": 173, + "Name": "JGreaterNLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 40 + }, + { + "Opcode": 174, + "Name": "JNotGreaterN", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 41 + }, + { + "Opcode": 175, + "Name": "JNotGreaterNLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 41 + }, + { + "Opcode": 176, + "Name": "JGreaterEqual", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 42 + }, + { + "Opcode": 177, + "Name": "JGreaterEqualLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 42 + }, + { + "Opcode": 178, + "Name": "JNotGreaterEqual", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 43 + }, + { + "Opcode": 179, + "Name": "JNotGreaterEqualLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 43 + }, + { + "Opcode": 180, + "Name": "JGreaterEqualN", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 44 + }, + { + "Opcode": 181, + "Name": "JGreaterEqualNLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 44 + }, + { + "Opcode": 182, + "Name": "JNotGreaterEqualN", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 45 + }, + { + "Opcode": 183, + "Name": "JNotGreaterEqualNLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 45 + }, + { + "Opcode": 184, + "Name": "JEqual", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 46 + }, + { + "Opcode": 185, + "Name": "JEqualLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 46 + }, + { + "Opcode": 186, + "Name": "JNotEqual", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 47 + }, + { + "Opcode": 187, + "Name": "JNotEqualLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 47 + }, + { + "Opcode": 188, + "Name": "JStrictEqual", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 48 + }, + { + "Opcode": 189, + "Name": "JStrictEqualLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 48 + }, + { + "Opcode": 190, + "Name": "JStrictNotEqual", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 49 + }, + { + "Opcode": 191, + "Name": "JStrictNotEqualLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 49 + }, + { + "Opcode": 192, + "Name": "Add32", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 193, + "Name": "Sub32", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 194, + "Name": "Mul32", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 195, + "Name": "Divi32", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 196, + "Name": "Divu32", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 197, + "Name": "Loadi8", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 198, + "Name": "Loadu8", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 199, + "Name": "Loadi16", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 200, + "Name": "Loadu16", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 201, + "Name": "Loadi32", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 202, + "Name": "Loadu32", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 203, + "Name": "Store8", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 204, + "Name": "Store16", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 205, + "Name": "Store32", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + } + ], + "AbstractDefinitions": [ + { + "Name": "NewObjectWithBuffer", + "VariantOpcodes": [ + 1, + 2 + ] + }, + { + "Name": "NewArrayWithBuffer", + "VariantOpcodes": [ + 5, + 6 + ] + }, + { + "Name": "Mov", + "VariantOpcodes": [ + 8, + 9 + ] + }, + { + "Name": "StoreToEnvironment", + "VariantOpcodes": [ + 42, + 43 + ] + }, + { + "Name": "StoreNPToEnvironment", + "VariantOpcodes": [ + 44, + 45 + ] + }, + { + "Name": "LoadFromEnvironment", + "VariantOpcodes": [ + 46, + 47 + ] + }, + { + "Name": "GetById", + "VariantOpcodes": [ + 55, + 54, + 56 + ] + }, + { + "Name": "TryGetById", + "VariantOpcodes": [ + 57, + 58 + ] + }, + { + "Name": "PutById", + "VariantOpcodes": [ + 59, + 60 + ] + }, + { + "Name": "TryPutById", + "VariantOpcodes": [ + 61, + 62 + ] + }, + { + "Name": "PutNewOwnById", + "VariantOpcodes": [ + 64, + 63, + 65 + ] + }, + { + "Name": "PutNewOwnNEById", + "VariantOpcodes": [ + 66, + 67 + ] + }, + { + "Name": "PutOwnByIndex", + "VariantOpcodes": [ + 68, + 69 + ] + }, + { + "Name": "DelById", + "VariantOpcodes": [ + 71, + 72 + ] + }, + { + "Name": "Call", + "VariantOpcodes": [ + 79, + 86 + ] + }, + { + "Name": "Construct", + "VariantOpcodes": [ + 80, + 87 + ] + }, + { + "Name": "CallDirect", + "VariantOpcodes": [ + 82, + 88 + ] + }, + { + "Name": "CallBuiltin", + "VariantOpcodes": [ + 89, + 90 + ] + }, + { + "Name": "CreateClosure", + "VariantOpcodes": [ + 100, + 101 + ] + }, + { + "Name": "CreateGeneratorClosure", + "VariantOpcodes": [ + 102, + 103 + ] + }, + { + "Name": "CreateAsyncClosure", + "VariantOpcodes": [ + 104, + 105 + ] + }, + { + "Name": "LoadParam", + "VariantOpcodes": [ + 108, + 109 + ] + }, + { + "Name": "LoadConstBigInt", + "VariantOpcodes": [ + 113, + 114 + ] + }, + { + "Name": "LoadConstString", + "VariantOpcodes": [ + 115, + 116 + ] + }, + { + "Name": "CreateGenerator", + "VariantOpcodes": [ + 137, + 138 + ] + }, + { + "Name": "Jmp", + "VariantOpcodes": [ + 142, + 143 + ] + }, + { + "Name": "JmpTrue", + "VariantOpcodes": [ + 144, + 145 + ] + }, + { + "Name": "JmpFalse", + "VariantOpcodes": [ + 146, + 147 + ] + }, + { + "Name": "JmpUndefined", + "VariantOpcodes": [ + 148, + 149 + ] + }, + { + "Name": "SaveGenerator", + "VariantOpcodes": [ + 150, + 151 + ] + }, + { + "Name": "JLess", + "VariantOpcodes": [ + 152, + 153 + ] + }, + { + "Name": "JNotLess", + "VariantOpcodes": [ + 154, + 155 + ] + }, + { + "Name": "JLessN", + "VariantOpcodes": [ + 156, + 157 + ] + }, + { + "Name": "JNotLessN", + "VariantOpcodes": [ + 158, + 159 + ] + }, + { + "Name": "JLessEqual", + "VariantOpcodes": [ + 160, + 161 + ] + }, + { + "Name": "JNotLessEqual", + "VariantOpcodes": [ + 162, + 163 + ] + }, + { + "Name": "JLessEqualN", + "VariantOpcodes": [ + 164, + 165 + ] + }, + { + "Name": "JNotLessEqualN", + "VariantOpcodes": [ + 166, + 167 + ] + }, + { + "Name": "JGreater", + "VariantOpcodes": [ + 168, + 169 + ] + }, + { + "Name": "JNotGreater", + "VariantOpcodes": [ + 170, + 171 + ] + }, + { + "Name": "JGreaterN", + "VariantOpcodes": [ + 172, + 173 + ] + }, + { + "Name": "JNotGreaterN", + "VariantOpcodes": [ + 174, + 175 + ] + }, + { + "Name": "JGreaterEqual", + "VariantOpcodes": [ + 176, + 177 + ] + }, + { + "Name": "JNotGreaterEqual", + "VariantOpcodes": [ + 178, + 179 + ] + }, + { + "Name": "JGreaterEqualN", + "VariantOpcodes": [ + 180, + 181 + ] + }, + { + "Name": "JNotGreaterEqualN", + "VariantOpcodes": [ + 182, + 183 + ] + }, + { + "Name": "JEqual", + "VariantOpcodes": [ + 184, + 185 + ] + }, + { + "Name": "JNotEqual", + "VariantOpcodes": [ + 186, + 187 + ] + }, + { + "Name": "JStrictEqual", + "VariantOpcodes": [ + 188, + 189 + ] + }, + { + "Name": "JStrictNotEqual", + "VariantOpcodes": [ + 190, + 191 + ] + } + ], + "GitCommitHash": "b544ff4a587586a296c5e15e3901c22be45c145f" +} \ No newline at end of file diff --git a/hasmer/libhasmer/Resources/Bytecode93.json b/hasmer/libhasmer/Resources/Bytecode93.json new file mode 100644 index 0000000..ec552c5 --- /dev/null +++ b/hasmer/libhasmer/Resources/Bytecode93.json @@ -0,0 +1,2432 @@ +{ + "Version": 93, + "Definitions": [ + { + "Opcode": 0, + "Name": "Unreachable", + "OperandTypes": [], + "IsJump": false + }, + { + "Opcode": 1, + "Name": "NewObjectWithBuffer", + "OperandTypes": [ + "Reg8", + "UInt16", + "UInt16", + "UInt16", + "UInt16" + ], + "IsJump": false, + "AbstractDefinition": 0 + }, + { + "Opcode": 2, + "Name": "NewObjectWithBufferLong", + "OperandTypes": [ + "Reg8", + "UInt16", + "UInt16", + "UInt32", + "UInt32" + ], + "IsJump": false, + "AbstractDefinition": 0 + }, + { + "Opcode": 3, + "Name": "NewObject", + "OperandTypes": [ + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 4, + "Name": "NewObjectWithParent", + "OperandTypes": [ + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 5, + "Name": "NewArrayWithBuffer", + "OperandTypes": [ + "Reg8", + "UInt16", + "UInt16", + "UInt16" + ], + "IsJump": false, + "AbstractDefinition": 1 + }, + { + "Opcode": 6, + "Name": "NewArrayWithBufferLong", + "OperandTypes": [ + "Reg8", + "UInt16", + "UInt16", + "UInt32" + ], + "IsJump": false, + "AbstractDefinition": 1 + }, + { + "Opcode": 7, + "Name": "NewArray", + "OperandTypes": [ + "Reg8", + "UInt16" + ], + "IsJump": false + }, + { + "Opcode": 8, + "Name": "Mov", + "OperandTypes": [ + "Reg8", + "Reg8" + ], + "IsJump": false, + "AbstractDefinition": 2 + }, + { + "Opcode": 9, + "Name": "MovLong", + "OperandTypes": [ + "Reg32", + "Reg32" + ], + "IsJump": false, + "AbstractDefinition": 2 + }, + { + "Opcode": 10, + "Name": "Negate", + "OperandTypes": [ + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 11, + "Name": "Not", + "OperandTypes": [ + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 12, + "Name": "BitNot", + "OperandTypes": [ + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 13, + "Name": "TypeOf", + "OperandTypes": [ + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 14, + "Name": "Eq", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 15, + "Name": "StrictEq", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 16, + "Name": "Neq", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 17, + "Name": "StrictNeq", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 18, + "Name": "Less", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 19, + "Name": "LessEq", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 20, + "Name": "Greater", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 21, + "Name": "GreaterEq", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 22, + "Name": "Add", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 23, + "Name": "AddN", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 24, + "Name": "Mul", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 25, + "Name": "MulN", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 26, + "Name": "Div", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 27, + "Name": "DivN", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 28, + "Name": "Mod", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 29, + "Name": "Sub", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 30, + "Name": "SubN", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 31, + "Name": "LShift", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 32, + "Name": "RShift", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 33, + "Name": "URshift", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 34, + "Name": "BitAnd", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 35, + "Name": "BitXor", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 36, + "Name": "BitOr", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 37, + "Name": "Inc", + "OperandTypes": [ + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 38, + "Name": "Dec", + "OperandTypes": [ + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 39, + "Name": "InstanceOf", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 40, + "Name": "IsIn", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 41, + "Name": "GetEnvironment", + "OperandTypes": [ + "Reg8", + "UInt8" + ], + "IsJump": false + }, + { + "Opcode": 42, + "Name": "StoreToEnvironment", + "OperandTypes": [ + "Reg8", + "UInt8", + "Reg8" + ], + "IsJump": false, + "AbstractDefinition": 3 + }, + { + "Opcode": 43, + "Name": "StoreToEnvironmentL", + "OperandTypes": [ + "Reg8", + "UInt16", + "Reg8" + ], + "IsJump": false, + "AbstractDefinition": 3 + }, + { + "Opcode": 44, + "Name": "StoreNPToEnvironment", + "OperandTypes": [ + "Reg8", + "UInt8", + "Reg8" + ], + "IsJump": false, + "AbstractDefinition": 4 + }, + { + "Opcode": 45, + "Name": "StoreNPToEnvironmentL", + "OperandTypes": [ + "Reg8", + "UInt16", + "Reg8" + ], + "IsJump": false, + "AbstractDefinition": 4 + }, + { + "Opcode": 46, + "Name": "LoadFromEnvironment", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt8" + ], + "IsJump": false, + "AbstractDefinition": 5 + }, + { + "Opcode": 47, + "Name": "LoadFromEnvironmentL", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt16" + ], + "IsJump": false, + "AbstractDefinition": 5 + }, + { + "Opcode": 48, + "Name": "GetGlobalObject", + "OperandTypes": [ + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 49, + "Name": "GetNewTarget", + "OperandTypes": [ + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 50, + "Name": "CreateEnvironment", + "OperandTypes": [ + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 51, + "Name": "DeclareGlobalVar", + "OperandTypes": [ + "UInt32S" + ], + "IsJump": false + }, + { + "Opcode": 52, + "Name": "GetByIdShort", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt8", + "UInt8S" + ], + "IsJump": false, + "AbstractDefinition": 6 + }, + { + "Opcode": 53, + "Name": "GetById", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt8", + "UInt16S" + ], + "IsJump": false, + "AbstractDefinition": 6 + }, + { + "Opcode": 54, + "Name": "GetByIdLong", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt8", + "UInt32S" + ], + "IsJump": false, + "AbstractDefinition": 6 + }, + { + "Opcode": 55, + "Name": "TryGetById", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt8", + "UInt16S" + ], + "IsJump": false, + "AbstractDefinition": 7 + }, + { + "Opcode": 56, + "Name": "TryGetByIdLong", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt8", + "UInt32S" + ], + "IsJump": false, + "AbstractDefinition": 7 + }, + { + "Opcode": 57, + "Name": "PutById", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt8", + "UInt16S" + ], + "IsJump": false, + "AbstractDefinition": 8 + }, + { + "Opcode": 58, + "Name": "PutByIdLong", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt8", + "UInt32S" + ], + "IsJump": false, + "AbstractDefinition": 8 + }, + { + "Opcode": 59, + "Name": "TryPutById", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt8", + "UInt16S" + ], + "IsJump": false, + "AbstractDefinition": 9 + }, + { + "Opcode": 60, + "Name": "TryPutByIdLong", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt8", + "UInt32S" + ], + "IsJump": false, + "AbstractDefinition": 9 + }, + { + "Opcode": 61, + "Name": "PutNewOwnByIdShort", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt8S" + ], + "IsJump": false, + "AbstractDefinition": 10 + }, + { + "Opcode": 62, + "Name": "PutNewOwnById", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt16S" + ], + "IsJump": false, + "AbstractDefinition": 10 + }, + { + "Opcode": 63, + "Name": "PutNewOwnByIdLong", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt32S" + ], + "IsJump": false, + "AbstractDefinition": 10 + }, + { + "Opcode": 64, + "Name": "PutNewOwnNEById", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt16S" + ], + "IsJump": false, + "AbstractDefinition": 11 + }, + { + "Opcode": 65, + "Name": "PutNewOwnNEByIdLong", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt32S" + ], + "IsJump": false, + "AbstractDefinition": 11 + }, + { + "Opcode": 66, + "Name": "PutOwnByIndex", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt8" + ], + "IsJump": false, + "AbstractDefinition": 12 + }, + { + "Opcode": 67, + "Name": "PutOwnByIndexL", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt32" + ], + "IsJump": false, + "AbstractDefinition": 12 + }, + { + "Opcode": 68, + "Name": "PutOwnByVal", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8", + "UInt8" + ], + "IsJump": false + }, + { + "Opcode": 69, + "Name": "DelById", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt16S" + ], + "IsJump": false, + "AbstractDefinition": 13 + }, + { + "Opcode": 70, + "Name": "DelByIdLong", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt32S" + ], + "IsJump": false, + "AbstractDefinition": 13 + }, + { + "Opcode": 71, + "Name": "GetByVal", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 72, + "Name": "PutByVal", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 73, + "Name": "DelByVal", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 74, + "Name": "PutOwnGetterSetterByVal", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8", + "Reg8", + "UInt8" + ], + "IsJump": false + }, + { + "Opcode": 75, + "Name": "GetPNameList", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 76, + "Name": "GetNextPName", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 77, + "Name": "Call", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt8" + ], + "IsJump": false, + "AbstractDefinition": 14 + }, + { + "Opcode": 78, + "Name": "Construct", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt8" + ], + "IsJump": false, + "AbstractDefinition": 15 + }, + { + "Opcode": 79, + "Name": "Call1", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 80, + "Name": "CallDirect", + "OperandTypes": [ + "Reg8", + "UInt8", + "UInt16" + ], + "IsJump": false, + "AbstractDefinition": 16 + }, + { + "Opcode": 81, + "Name": "Call2", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 82, + "Name": "Call3", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 83, + "Name": "Call4", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8", + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 84, + "Name": "CallLong", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt32" + ], + "IsJump": false, + "AbstractDefinition": 14 + }, + { + "Opcode": 85, + "Name": "ConstructLong", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt32" + ], + "IsJump": false, + "AbstractDefinition": 15 + }, + { + "Opcode": 86, + "Name": "CallDirectLongIndex", + "OperandTypes": [ + "Reg8", + "UInt8", + "UInt32" + ], + "IsJump": false, + "AbstractDefinition": 16 + }, + { + "Opcode": 87, + "Name": "CallBuiltin", + "OperandTypes": [ + "Reg8", + "UInt8", + "UInt8" + ], + "IsJump": false, + "AbstractDefinition": 17 + }, + { + "Opcode": 88, + "Name": "CallBuiltinLong", + "OperandTypes": [ + "Reg8", + "UInt8", + "UInt32" + ], + "IsJump": false, + "AbstractDefinition": 17 + }, + { + "Opcode": 89, + "Name": "GetBuiltinClosure", + "OperandTypes": [ + "Reg8", + "UInt8" + ], + "IsJump": false + }, + { + "Opcode": 90, + "Name": "Ret", + "OperandTypes": [ + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 91, + "Name": "Catch", + "OperandTypes": [ + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 92, + "Name": "DirectEval", + "OperandTypes": [ + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 93, + "Name": "Throw", + "OperandTypes": [ + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 94, + "Name": "ThrowIfEmpty", + "OperandTypes": [ + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 95, + "Name": "Debugger", + "OperandTypes": [], + "IsJump": false + }, + { + "Opcode": 96, + "Name": "AsyncBreakCheck", + "OperandTypes": [], + "IsJump": false + }, + { + "Opcode": 97, + "Name": "ProfilePoint", + "OperandTypes": [ + "UInt16" + ], + "IsJump": false + }, + { + "Opcode": 98, + "Name": "CreateClosure", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt16" + ], + "IsJump": false, + "AbstractDefinition": 18 + }, + { + "Opcode": 99, + "Name": "CreateClosureLongIndex", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt32" + ], + "IsJump": false, + "AbstractDefinition": 18 + }, + { + "Opcode": 100, + "Name": "CreateGeneratorClosure", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt16" + ], + "IsJump": false, + "AbstractDefinition": 19 + }, + { + "Opcode": 101, + "Name": "CreateGeneratorClosureLongIndex", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt32" + ], + "IsJump": false, + "AbstractDefinition": 19 + }, + { + "Opcode": 102, + "Name": "CreateAsyncClosure", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt16" + ], + "IsJump": false, + "AbstractDefinition": 20 + }, + { + "Opcode": 103, + "Name": "CreateAsyncClosureLongIndex", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt32" + ], + "IsJump": false, + "AbstractDefinition": 20 + }, + { + "Opcode": 104, + "Name": "CreateThis", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 105, + "Name": "SelectObject", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 106, + "Name": "LoadParam", + "OperandTypes": [ + "Reg8", + "UInt8" + ], + "IsJump": false, + "AbstractDefinition": 21 + }, + { + "Opcode": 107, + "Name": "LoadParamLong", + "OperandTypes": [ + "Reg8", + "UInt32" + ], + "IsJump": false, + "AbstractDefinition": 21 + }, + { + "Opcode": 108, + "Name": "LoadConstUInt8", + "OperandTypes": [ + "Reg8", + "UInt8" + ], + "IsJump": false + }, + { + "Opcode": 109, + "Name": "LoadConstInt", + "OperandTypes": [ + "Reg8", + "Imm32" + ], + "IsJump": false + }, + { + "Opcode": 110, + "Name": "LoadConstDouble", + "OperandTypes": [ + "Reg8", + "Double" + ], + "IsJump": false + }, + { + "Opcode": 111, + "Name": "LoadConstBigInt", + "OperandTypes": [ + "Reg8", + "UInt16" + ], + "IsJump": false, + "AbstractDefinition": 22 + }, + { + "Opcode": 112, + "Name": "LoadConstBigIntLongIndex", + "OperandTypes": [ + "Reg8", + "UInt32" + ], + "IsJump": false, + "AbstractDefinition": 22 + }, + { + "Opcode": 113, + "Name": "LoadConstString", + "OperandTypes": [ + "Reg8", + "UInt16S" + ], + "IsJump": false, + "AbstractDefinition": 23 + }, + { + "Opcode": 114, + "Name": "LoadConstStringLongIndex", + "OperandTypes": [ + "Reg8", + "UInt32S" + ], + "IsJump": false, + "AbstractDefinition": 23 + }, + { + "Opcode": 115, + "Name": "LoadConstEmpty", + "OperandTypes": [ + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 116, + "Name": "LoadConstUndefined", + "OperandTypes": [ + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 117, + "Name": "LoadConstNull", + "OperandTypes": [ + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 118, + "Name": "LoadConstTrue", + "OperandTypes": [ + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 119, + "Name": "LoadConstFalse", + "OperandTypes": [ + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 120, + "Name": "LoadConstZero", + "OperandTypes": [ + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 121, + "Name": "CoerceThisNS", + "OperandTypes": [ + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 122, + "Name": "LoadThisNS", + "OperandTypes": [ + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 123, + "Name": "ToNumber", + "OperandTypes": [ + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 124, + "Name": "ToNumeric", + "OperandTypes": [ + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 125, + "Name": "ToInt32", + "OperandTypes": [ + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 126, + "Name": "AddEmptyString", + "OperandTypes": [ + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 127, + "Name": "GetArgumentsPropByVal", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 128, + "Name": "GetArgumentsLength", + "OperandTypes": [ + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 129, + "Name": "ReifyArguments", + "OperandTypes": [ + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 130, + "Name": "CreateRegExp", + "OperandTypes": [ + "Reg8", + "UInt32S", + "UInt32S", + "UInt32" + ], + "IsJump": false + }, + { + "Opcode": 131, + "Name": "SwitchImm", + "OperandTypes": [ + "Reg8", + "UInt32", + "Addr32", + "UInt32", + "UInt32" + ], + "IsJump": false + }, + { + "Opcode": 132, + "Name": "StartGenerator", + "OperandTypes": [], + "IsJump": false + }, + { + "Opcode": 133, + "Name": "ResumeGenerator", + "OperandTypes": [ + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 134, + "Name": "CompleteGenerator", + "OperandTypes": [], + "IsJump": false + }, + { + "Opcode": 135, + "Name": "CreateGenerator", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt16" + ], + "IsJump": false, + "AbstractDefinition": 24 + }, + { + "Opcode": 136, + "Name": "CreateGeneratorLongIndex", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt32" + ], + "IsJump": false, + "AbstractDefinition": 24 + }, + { + "Opcode": 137, + "Name": "IteratorBegin", + "OperandTypes": [ + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 138, + "Name": "IteratorNext", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 139, + "Name": "IteratorClose", + "OperandTypes": [ + "Reg8", + "UInt8" + ], + "IsJump": false + }, + { + "Opcode": 140, + "Name": "Jmp", + "OperandTypes": [ + "Addr8" + ], + "IsJump": true, + "AbstractDefinition": 25 + }, + { + "Opcode": 141, + "Name": "JmpLong", + "OperandTypes": [ + "Addr32" + ], + "IsJump": true, + "AbstractDefinition": 25 + }, + { + "Opcode": 142, + "Name": "JmpTrue", + "OperandTypes": [ + "Addr8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 26 + }, + { + "Opcode": 143, + "Name": "JmpTrueLong", + "OperandTypes": [ + "Addr32", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 26 + }, + { + "Opcode": 144, + "Name": "JmpFalse", + "OperandTypes": [ + "Addr8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 27 + }, + { + "Opcode": 145, + "Name": "JmpFalseLong", + "OperandTypes": [ + "Addr32", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 27 + }, + { + "Opcode": 146, + "Name": "JmpUndefined", + "OperandTypes": [ + "Addr8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 28 + }, + { + "Opcode": 147, + "Name": "JmpUndefinedLong", + "OperandTypes": [ + "Addr32", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 28 + }, + { + "Opcode": 148, + "Name": "SaveGenerator", + "OperandTypes": [ + "Addr8" + ], + "IsJump": true, + "AbstractDefinition": 29 + }, + { + "Opcode": 149, + "Name": "SaveGeneratorLong", + "OperandTypes": [ + "Addr32" + ], + "IsJump": true, + "AbstractDefinition": 29 + }, + { + "Opcode": 150, + "Name": "JLess", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 30 + }, + { + "Opcode": 151, + "Name": "JLessLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 30 + }, + { + "Opcode": 152, + "Name": "JNotLess", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 31 + }, + { + "Opcode": 153, + "Name": "JNotLessLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 31 + }, + { + "Opcode": 154, + "Name": "JLessN", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 32 + }, + { + "Opcode": 155, + "Name": "JLessNLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 32 + }, + { + "Opcode": 156, + "Name": "JNotLessN", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 33 + }, + { + "Opcode": 157, + "Name": "JNotLessNLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 33 + }, + { + "Opcode": 158, + "Name": "JLessEqual", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 34 + }, + { + "Opcode": 159, + "Name": "JLessEqualLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 34 + }, + { + "Opcode": 160, + "Name": "JNotLessEqual", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 35 + }, + { + "Opcode": 161, + "Name": "JNotLessEqualLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 35 + }, + { + "Opcode": 162, + "Name": "JLessEqualN", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 36 + }, + { + "Opcode": 163, + "Name": "JLessEqualNLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 36 + }, + { + "Opcode": 164, + "Name": "JNotLessEqualN", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 37 + }, + { + "Opcode": 165, + "Name": "JNotLessEqualNLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 37 + }, + { + "Opcode": 166, + "Name": "JGreater", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 38 + }, + { + "Opcode": 167, + "Name": "JGreaterLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 38 + }, + { + "Opcode": 168, + "Name": "JNotGreater", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 39 + }, + { + "Opcode": 169, + "Name": "JNotGreaterLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 39 + }, + { + "Opcode": 170, + "Name": "JGreaterN", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 40 + }, + { + "Opcode": 171, + "Name": "JGreaterNLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 40 + }, + { + "Opcode": 172, + "Name": "JNotGreaterN", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 41 + }, + { + "Opcode": 173, + "Name": "JNotGreaterNLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 41 + }, + { + "Opcode": 174, + "Name": "JGreaterEqual", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 42 + }, + { + "Opcode": 175, + "Name": "JGreaterEqualLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 42 + }, + { + "Opcode": 176, + "Name": "JNotGreaterEqual", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 43 + }, + { + "Opcode": 177, + "Name": "JNotGreaterEqualLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 43 + }, + { + "Opcode": 178, + "Name": "JGreaterEqualN", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 44 + }, + { + "Opcode": 179, + "Name": "JGreaterEqualNLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 44 + }, + { + "Opcode": 180, + "Name": "JNotGreaterEqualN", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 45 + }, + { + "Opcode": 181, + "Name": "JNotGreaterEqualNLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 45 + }, + { + "Opcode": 182, + "Name": "JEqual", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 46 + }, + { + "Opcode": 183, + "Name": "JEqualLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 46 + }, + { + "Opcode": 184, + "Name": "JNotEqual", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 47 + }, + { + "Opcode": 185, + "Name": "JNotEqualLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 47 + }, + { + "Opcode": 186, + "Name": "JStrictEqual", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 48 + }, + { + "Opcode": 187, + "Name": "JStrictEqualLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 48 + }, + { + "Opcode": 188, + "Name": "JStrictNotEqual", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 49 + }, + { + "Opcode": 189, + "Name": "JStrictNotEqualLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 49 + }, + { + "Opcode": 190, + "Name": "Add32", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 191, + "Name": "Sub32", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 192, + "Name": "Mul32", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 193, + "Name": "Divi32", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 194, + "Name": "Divu32", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 195, + "Name": "Loadi8", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 196, + "Name": "Loadu8", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 197, + "Name": "Loadi16", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 198, + "Name": "Loadu16", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 199, + "Name": "Loadi32", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 200, + "Name": "Loadu32", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 201, + "Name": "Store8", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 202, + "Name": "Store16", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 203, + "Name": "Store32", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + } + ], + "AbstractDefinitions": [ + { + "Name": "NewObjectWithBuffer", + "VariantOpcodes": [ + 1, + 2 + ] + }, + { + "Name": "NewArrayWithBuffer", + "VariantOpcodes": [ + 5, + 6 + ] + }, + { + "Name": "Mov", + "VariantOpcodes": [ + 8, + 9 + ] + }, + { + "Name": "StoreToEnvironment", + "VariantOpcodes": [ + 42, + 43 + ] + }, + { + "Name": "StoreNPToEnvironment", + "VariantOpcodes": [ + 44, + 45 + ] + }, + { + "Name": "LoadFromEnvironment", + "VariantOpcodes": [ + 46, + 47 + ] + }, + { + "Name": "GetById", + "VariantOpcodes": [ + 53, + 52, + 54 + ] + }, + { + "Name": "TryGetById", + "VariantOpcodes": [ + 55, + 56 + ] + }, + { + "Name": "PutById", + "VariantOpcodes": [ + 57, + 58 + ] + }, + { + "Name": "TryPutById", + "VariantOpcodes": [ + 59, + 60 + ] + }, + { + "Name": "PutNewOwnById", + "VariantOpcodes": [ + 62, + 61, + 63 + ] + }, + { + "Name": "PutNewOwnNEById", + "VariantOpcodes": [ + 64, + 65 + ] + }, + { + "Name": "PutOwnByIndex", + "VariantOpcodes": [ + 66, + 67 + ] + }, + { + "Name": "DelById", + "VariantOpcodes": [ + 69, + 70 + ] + }, + { + "Name": "Call", + "VariantOpcodes": [ + 77, + 84 + ] + }, + { + "Name": "Construct", + "VariantOpcodes": [ + 78, + 85 + ] + }, + { + "Name": "CallDirect", + "VariantOpcodes": [ + 80, + 86 + ] + }, + { + "Name": "CallBuiltin", + "VariantOpcodes": [ + 87, + 88 + ] + }, + { + "Name": "CreateClosure", + "VariantOpcodes": [ + 98, + 99 + ] + }, + { + "Name": "CreateGeneratorClosure", + "VariantOpcodes": [ + 100, + 101 + ] + }, + { + "Name": "CreateAsyncClosure", + "VariantOpcodes": [ + 102, + 103 + ] + }, + { + "Name": "LoadParam", + "VariantOpcodes": [ + 106, + 107 + ] + }, + { + "Name": "LoadConstBigInt", + "VariantOpcodes": [ + 111, + 112 + ] + }, + { + "Name": "LoadConstString", + "VariantOpcodes": [ + 113, + 114 + ] + }, + { + "Name": "CreateGenerator", + "VariantOpcodes": [ + 135, + 136 + ] + }, + { + "Name": "Jmp", + "VariantOpcodes": [ + 140, + 141 + ] + }, + { + "Name": "JmpTrue", + "VariantOpcodes": [ + 142, + 143 + ] + }, + { + "Name": "JmpFalse", + "VariantOpcodes": [ + 144, + 145 + ] + }, + { + "Name": "JmpUndefined", + "VariantOpcodes": [ + 146, + 147 + ] + }, + { + "Name": "SaveGenerator", + "VariantOpcodes": [ + 148, + 149 + ] + }, + { + "Name": "JLess", + "VariantOpcodes": [ + 150, + 151 + ] + }, + { + "Name": "JNotLess", + "VariantOpcodes": [ + 152, + 153 + ] + }, + { + "Name": "JLessN", + "VariantOpcodes": [ + 154, + 155 + ] + }, + { + "Name": "JNotLessN", + "VariantOpcodes": [ + 156, + 157 + ] + }, + { + "Name": "JLessEqual", + "VariantOpcodes": [ + 158, + 159 + ] + }, + { + "Name": "JNotLessEqual", + "VariantOpcodes": [ + 160, + 161 + ] + }, + { + "Name": "JLessEqualN", + "VariantOpcodes": [ + 162, + 163 + ] + }, + { + "Name": "JNotLessEqualN", + "VariantOpcodes": [ + 164, + 165 + ] + }, + { + "Name": "JGreater", + "VariantOpcodes": [ + 166, + 167 + ] + }, + { + "Name": "JNotGreater", + "VariantOpcodes": [ + 168, + 169 + ] + }, + { + "Name": "JGreaterN", + "VariantOpcodes": [ + 170, + 171 + ] + }, + { + "Name": "JNotGreaterN", + "VariantOpcodes": [ + 172, + 173 + ] + }, + { + "Name": "JGreaterEqual", + "VariantOpcodes": [ + 174, + 175 + ] + }, + { + "Name": "JNotGreaterEqual", + "VariantOpcodes": [ + 176, + 177 + ] + }, + { + "Name": "JGreaterEqualN", + "VariantOpcodes": [ + 178, + 179 + ] + }, + { + "Name": "JNotGreaterEqualN", + "VariantOpcodes": [ + 180, + 181 + ] + }, + { + "Name": "JEqual", + "VariantOpcodes": [ + 182, + 183 + ] + }, + { + "Name": "JNotEqual", + "VariantOpcodes": [ + 184, + 185 + ] + }, + { + "Name": "JStrictEqual", + "VariantOpcodes": [ + 186, + 187 + ] + }, + { + "Name": "JStrictNotEqual", + "VariantOpcodes": [ + 188, + 189 + ] + } + ], + "GitCommitHash": "760d8659d8a8c703831144de4511e0f0ac41e391" +} \ No newline at end of file diff --git a/hasmer/libhasmer/Resources/Bytecode94.json b/hasmer/libhasmer/Resources/Bytecode94.json new file mode 100644 index 0000000..3f8dd7f --- /dev/null +++ b/hasmer/libhasmer/Resources/Bytecode94.json @@ -0,0 +1,2450 @@ +{ + "Version": 94, + "Definitions": [ + { + "Opcode": 0, + "Name": "Unreachable", + "OperandTypes": [], + "IsJump": false + }, + { + "Opcode": 1, + "Name": "NewObjectWithBuffer", + "OperandTypes": [ + "Reg8", + "UInt16", + "UInt16", + "UInt16", + "UInt16" + ], + "IsJump": false, + "AbstractDefinition": 0 + }, + { + "Opcode": 2, + "Name": "NewObjectWithBufferLong", + "OperandTypes": [ + "Reg8", + "UInt16", + "UInt16", + "UInt32", + "UInt32" + ], + "IsJump": false, + "AbstractDefinition": 0 + }, + { + "Opcode": 3, + "Name": "NewObject", + "OperandTypes": [ + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 4, + "Name": "NewObjectWithParent", + "OperandTypes": [ + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 5, + "Name": "NewArrayWithBuffer", + "OperandTypes": [ + "Reg8", + "UInt16", + "UInt16", + "UInt16" + ], + "IsJump": false, + "AbstractDefinition": 1 + }, + { + "Opcode": 6, + "Name": "NewArrayWithBufferLong", + "OperandTypes": [ + "Reg8", + "UInt16", + "UInt16", + "UInt32" + ], + "IsJump": false, + "AbstractDefinition": 1 + }, + { + "Opcode": 7, + "Name": "NewArray", + "OperandTypes": [ + "Reg8", + "UInt16" + ], + "IsJump": false + }, + { + "Opcode": 8, + "Name": "Mov", + "OperandTypes": [ + "Reg8", + "Reg8" + ], + "IsJump": false, + "AbstractDefinition": 2 + }, + { + "Opcode": 9, + "Name": "MovLong", + "OperandTypes": [ + "Reg32", + "Reg32" + ], + "IsJump": false, + "AbstractDefinition": 2 + }, + { + "Opcode": 10, + "Name": "Negate", + "OperandTypes": [ + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 11, + "Name": "Not", + "OperandTypes": [ + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 12, + "Name": "BitNot", + "OperandTypes": [ + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 13, + "Name": "TypeOf", + "OperandTypes": [ + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 14, + "Name": "Eq", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 15, + "Name": "StrictEq", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 16, + "Name": "Neq", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 17, + "Name": "StrictNeq", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 18, + "Name": "Less", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 19, + "Name": "LessEq", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 20, + "Name": "Greater", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 21, + "Name": "GreaterEq", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 22, + "Name": "Add", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 23, + "Name": "AddN", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 24, + "Name": "Mul", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 25, + "Name": "MulN", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 26, + "Name": "Div", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 27, + "Name": "DivN", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 28, + "Name": "Mod", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 29, + "Name": "Sub", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 30, + "Name": "SubN", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 31, + "Name": "LShift", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 32, + "Name": "RShift", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 33, + "Name": "URshift", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 34, + "Name": "BitAnd", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 35, + "Name": "BitXor", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 36, + "Name": "BitOr", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 37, + "Name": "Inc", + "OperandTypes": [ + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 38, + "Name": "Dec", + "OperandTypes": [ + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 39, + "Name": "InstanceOf", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 40, + "Name": "IsIn", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 41, + "Name": "GetEnvironment", + "OperandTypes": [ + "Reg8", + "UInt8" + ], + "IsJump": false + }, + { + "Opcode": 42, + "Name": "StoreToEnvironment", + "OperandTypes": [ + "Reg8", + "UInt8", + "Reg8" + ], + "IsJump": false, + "AbstractDefinition": 3 + }, + { + "Opcode": 43, + "Name": "StoreToEnvironmentL", + "OperandTypes": [ + "Reg8", + "UInt16", + "Reg8" + ], + "IsJump": false, + "AbstractDefinition": 3 + }, + { + "Opcode": 44, + "Name": "StoreNPToEnvironment", + "OperandTypes": [ + "Reg8", + "UInt8", + "Reg8" + ], + "IsJump": false, + "AbstractDefinition": 4 + }, + { + "Opcode": 45, + "Name": "StoreNPToEnvironmentL", + "OperandTypes": [ + "Reg8", + "UInt16", + "Reg8" + ], + "IsJump": false, + "AbstractDefinition": 4 + }, + { + "Opcode": 46, + "Name": "LoadFromEnvironment", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt8" + ], + "IsJump": false, + "AbstractDefinition": 5 + }, + { + "Opcode": 47, + "Name": "LoadFromEnvironmentL", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt16" + ], + "IsJump": false, + "AbstractDefinition": 5 + }, + { + "Opcode": 48, + "Name": "GetGlobalObject", + "OperandTypes": [ + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 49, + "Name": "GetNewTarget", + "OperandTypes": [ + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 50, + "Name": "CreateEnvironment", + "OperandTypes": [ + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 51, + "Name": "CreateInnerEnvironment", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt32" + ], + "IsJump": false + }, + { + "Opcode": 52, + "Name": "DeclareGlobalVar", + "OperandTypes": [ + "UInt32S" + ], + "IsJump": false + }, + { + "Opcode": 53, + "Name": "ThrowIfHasRestrictedGlobalProperty", + "OperandTypes": [ + "UInt32S" + ], + "IsJump": false + }, + { + "Opcode": 54, + "Name": "GetByIdShort", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt8", + "UInt8S" + ], + "IsJump": false, + "AbstractDefinition": 6 + }, + { + "Opcode": 55, + "Name": "GetById", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt8", + "UInt16S" + ], + "IsJump": false, + "AbstractDefinition": 6 + }, + { + "Opcode": 56, + "Name": "GetByIdLong", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt8", + "UInt32S" + ], + "IsJump": false, + "AbstractDefinition": 6 + }, + { + "Opcode": 57, + "Name": "TryGetById", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt8", + "UInt16S" + ], + "IsJump": false, + "AbstractDefinition": 7 + }, + { + "Opcode": 58, + "Name": "TryGetByIdLong", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt8", + "UInt32S" + ], + "IsJump": false, + "AbstractDefinition": 7 + }, + { + "Opcode": 59, + "Name": "PutById", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt8", + "UInt16S" + ], + "IsJump": false, + "AbstractDefinition": 8 + }, + { + "Opcode": 60, + "Name": "PutByIdLong", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt8", + "UInt32S" + ], + "IsJump": false, + "AbstractDefinition": 8 + }, + { + "Opcode": 61, + "Name": "TryPutById", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt8", + "UInt16S" + ], + "IsJump": false, + "AbstractDefinition": 9 + }, + { + "Opcode": 62, + "Name": "TryPutByIdLong", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt8", + "UInt32S" + ], + "IsJump": false, + "AbstractDefinition": 9 + }, + { + "Opcode": 63, + "Name": "PutNewOwnByIdShort", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt8S" + ], + "IsJump": false, + "AbstractDefinition": 10 + }, + { + "Opcode": 64, + "Name": "PutNewOwnById", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt16S" + ], + "IsJump": false, + "AbstractDefinition": 10 + }, + { + "Opcode": 65, + "Name": "PutNewOwnByIdLong", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt32S" + ], + "IsJump": false, + "AbstractDefinition": 10 + }, + { + "Opcode": 66, + "Name": "PutNewOwnNEById", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt16S" + ], + "IsJump": false, + "AbstractDefinition": 11 + }, + { + "Opcode": 67, + "Name": "PutNewOwnNEByIdLong", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt32S" + ], + "IsJump": false, + "AbstractDefinition": 11 + }, + { + "Opcode": 68, + "Name": "PutOwnByIndex", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt8" + ], + "IsJump": false, + "AbstractDefinition": 12 + }, + { + "Opcode": 69, + "Name": "PutOwnByIndexL", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt32" + ], + "IsJump": false, + "AbstractDefinition": 12 + }, + { + "Opcode": 70, + "Name": "PutOwnByVal", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8", + "UInt8" + ], + "IsJump": false + }, + { + "Opcode": 71, + "Name": "DelById", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt16S" + ], + "IsJump": false, + "AbstractDefinition": 13 + }, + { + "Opcode": 72, + "Name": "DelByIdLong", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt32S" + ], + "IsJump": false, + "AbstractDefinition": 13 + }, + { + "Opcode": 73, + "Name": "GetByVal", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 74, + "Name": "PutByVal", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 75, + "Name": "DelByVal", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 76, + "Name": "PutOwnGetterSetterByVal", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8", + "Reg8", + "UInt8" + ], + "IsJump": false + }, + { + "Opcode": 77, + "Name": "GetPNameList", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 78, + "Name": "GetNextPName", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 79, + "Name": "Call", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt8" + ], + "IsJump": false, + "AbstractDefinition": 14 + }, + { + "Opcode": 80, + "Name": "Construct", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt8" + ], + "IsJump": false, + "AbstractDefinition": 15 + }, + { + "Opcode": 81, + "Name": "Call1", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 82, + "Name": "CallDirect", + "OperandTypes": [ + "Reg8", + "UInt8", + "UInt16" + ], + "IsJump": false, + "AbstractDefinition": 16 + }, + { + "Opcode": 83, + "Name": "Call2", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 84, + "Name": "Call3", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 85, + "Name": "Call4", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8", + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 86, + "Name": "CallLong", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt32" + ], + "IsJump": false, + "AbstractDefinition": 14 + }, + { + "Opcode": 87, + "Name": "ConstructLong", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt32" + ], + "IsJump": false, + "AbstractDefinition": 15 + }, + { + "Opcode": 88, + "Name": "CallDirectLongIndex", + "OperandTypes": [ + "Reg8", + "UInt8", + "UInt32" + ], + "IsJump": false, + "AbstractDefinition": 16 + }, + { + "Opcode": 89, + "Name": "CallBuiltin", + "OperandTypes": [ + "Reg8", + "UInt8", + "UInt8" + ], + "IsJump": false, + "AbstractDefinition": 17 + }, + { + "Opcode": 90, + "Name": "CallBuiltinLong", + "OperandTypes": [ + "Reg8", + "UInt8", + "UInt32" + ], + "IsJump": false, + "AbstractDefinition": 17 + }, + { + "Opcode": 91, + "Name": "GetBuiltinClosure", + "OperandTypes": [ + "Reg8", + "UInt8" + ], + "IsJump": false + }, + { + "Opcode": 92, + "Name": "Ret", + "OperandTypes": [ + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 93, + "Name": "Catch", + "OperandTypes": [ + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 94, + "Name": "DirectEval", + "OperandTypes": [ + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 95, + "Name": "Throw", + "OperandTypes": [ + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 96, + "Name": "ThrowIfEmpty", + "OperandTypes": [ + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 97, + "Name": "Debugger", + "OperandTypes": [], + "IsJump": false + }, + { + "Opcode": 98, + "Name": "AsyncBreakCheck", + "OperandTypes": [], + "IsJump": false + }, + { + "Opcode": 99, + "Name": "ProfilePoint", + "OperandTypes": [ + "UInt16" + ], + "IsJump": false + }, + { + "Opcode": 100, + "Name": "CreateClosure", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt16" + ], + "IsJump": false, + "AbstractDefinition": 18 + }, + { + "Opcode": 101, + "Name": "CreateClosureLongIndex", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt32" + ], + "IsJump": false, + "AbstractDefinition": 18 + }, + { + "Opcode": 102, + "Name": "CreateGeneratorClosure", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt16" + ], + "IsJump": false, + "AbstractDefinition": 19 + }, + { + "Opcode": 103, + "Name": "CreateGeneratorClosureLongIndex", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt32" + ], + "IsJump": false, + "AbstractDefinition": 19 + }, + { + "Opcode": 104, + "Name": "CreateAsyncClosure", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt16" + ], + "IsJump": false, + "AbstractDefinition": 20 + }, + { + "Opcode": 105, + "Name": "CreateAsyncClosureLongIndex", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt32" + ], + "IsJump": false, + "AbstractDefinition": 20 + }, + { + "Opcode": 106, + "Name": "CreateThis", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 107, + "Name": "SelectObject", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 108, + "Name": "LoadParam", + "OperandTypes": [ + "Reg8", + "UInt8" + ], + "IsJump": false, + "AbstractDefinition": 21 + }, + { + "Opcode": 109, + "Name": "LoadParamLong", + "OperandTypes": [ + "Reg8", + "UInt32" + ], + "IsJump": false, + "AbstractDefinition": 21 + }, + { + "Opcode": 110, + "Name": "LoadConstUInt8", + "OperandTypes": [ + "Reg8", + "UInt8" + ], + "IsJump": false + }, + { + "Opcode": 111, + "Name": "LoadConstInt", + "OperandTypes": [ + "Reg8", + "Imm32" + ], + "IsJump": false + }, + { + "Opcode": 112, + "Name": "LoadConstDouble", + "OperandTypes": [ + "Reg8", + "Double" + ], + "IsJump": false + }, + { + "Opcode": 113, + "Name": "LoadConstBigInt", + "OperandTypes": [ + "Reg8", + "UInt16" + ], + "IsJump": false, + "AbstractDefinition": 22 + }, + { + "Opcode": 114, + "Name": "LoadConstBigIntLongIndex", + "OperandTypes": [ + "Reg8", + "UInt32" + ], + "IsJump": false, + "AbstractDefinition": 22 + }, + { + "Opcode": 115, + "Name": "LoadConstString", + "OperandTypes": [ + "Reg8", + "UInt16S" + ], + "IsJump": false, + "AbstractDefinition": 23 + }, + { + "Opcode": 116, + "Name": "LoadConstStringLongIndex", + "OperandTypes": [ + "Reg8", + "UInt32S" + ], + "IsJump": false, + "AbstractDefinition": 23 + }, + { + "Opcode": 117, + "Name": "LoadConstEmpty", + "OperandTypes": [ + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 118, + "Name": "LoadConstUndefined", + "OperandTypes": [ + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 119, + "Name": "LoadConstNull", + "OperandTypes": [ + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 120, + "Name": "LoadConstTrue", + "OperandTypes": [ + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 121, + "Name": "LoadConstFalse", + "OperandTypes": [ + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 122, + "Name": "LoadConstZero", + "OperandTypes": [ + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 123, + "Name": "CoerceThisNS", + "OperandTypes": [ + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 124, + "Name": "LoadThisNS", + "OperandTypes": [ + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 125, + "Name": "ToNumber", + "OperandTypes": [ + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 126, + "Name": "ToNumeric", + "OperandTypes": [ + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 127, + "Name": "ToInt32", + "OperandTypes": [ + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 128, + "Name": "AddEmptyString", + "OperandTypes": [ + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 129, + "Name": "GetArgumentsPropByVal", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 130, + "Name": "GetArgumentsLength", + "OperandTypes": [ + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 131, + "Name": "ReifyArguments", + "OperandTypes": [ + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 132, + "Name": "CreateRegExp", + "OperandTypes": [ + "Reg8", + "UInt32S", + "UInt32S", + "UInt32" + ], + "IsJump": false + }, + { + "Opcode": 133, + "Name": "SwitchImm", + "OperandTypes": [ + "Reg8", + "UInt32", + "Addr32", + "UInt32", + "UInt32" + ], + "IsJump": false + }, + { + "Opcode": 134, + "Name": "StartGenerator", + "OperandTypes": [], + "IsJump": false + }, + { + "Opcode": 135, + "Name": "ResumeGenerator", + "OperandTypes": [ + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 136, + "Name": "CompleteGenerator", + "OperandTypes": [], + "IsJump": false + }, + { + "Opcode": 137, + "Name": "CreateGenerator", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt16" + ], + "IsJump": false, + "AbstractDefinition": 24 + }, + { + "Opcode": 138, + "Name": "CreateGeneratorLongIndex", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt32" + ], + "IsJump": false, + "AbstractDefinition": 24 + }, + { + "Opcode": 139, + "Name": "IteratorBegin", + "OperandTypes": [ + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 140, + "Name": "IteratorNext", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 141, + "Name": "IteratorClose", + "OperandTypes": [ + "Reg8", + "UInt8" + ], + "IsJump": false + }, + { + "Opcode": 142, + "Name": "Jmp", + "OperandTypes": [ + "Addr8" + ], + "IsJump": true, + "AbstractDefinition": 25 + }, + { + "Opcode": 143, + "Name": "JmpLong", + "OperandTypes": [ + "Addr32" + ], + "IsJump": true, + "AbstractDefinition": 25 + }, + { + "Opcode": 144, + "Name": "JmpTrue", + "OperandTypes": [ + "Addr8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 26 + }, + { + "Opcode": 145, + "Name": "JmpTrueLong", + "OperandTypes": [ + "Addr32", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 26 + }, + { + "Opcode": 146, + "Name": "JmpFalse", + "OperandTypes": [ + "Addr8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 27 + }, + { + "Opcode": 147, + "Name": "JmpFalseLong", + "OperandTypes": [ + "Addr32", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 27 + }, + { + "Opcode": 148, + "Name": "JmpUndefined", + "OperandTypes": [ + "Addr8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 28 + }, + { + "Opcode": 149, + "Name": "JmpUndefinedLong", + "OperandTypes": [ + "Addr32", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 28 + }, + { + "Opcode": 150, + "Name": "SaveGenerator", + "OperandTypes": [ + "Addr8" + ], + "IsJump": true, + "AbstractDefinition": 29 + }, + { + "Opcode": 151, + "Name": "SaveGeneratorLong", + "OperandTypes": [ + "Addr32" + ], + "IsJump": true, + "AbstractDefinition": 29 + }, + { + "Opcode": 152, + "Name": "JLess", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 30 + }, + { + "Opcode": 153, + "Name": "JLessLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 30 + }, + { + "Opcode": 154, + "Name": "JNotLess", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 31 + }, + { + "Opcode": 155, + "Name": "JNotLessLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 31 + }, + { + "Opcode": 156, + "Name": "JLessN", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 32 + }, + { + "Opcode": 157, + "Name": "JLessNLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 32 + }, + { + "Opcode": 158, + "Name": "JNotLessN", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 33 + }, + { + "Opcode": 159, + "Name": "JNotLessNLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 33 + }, + { + "Opcode": 160, + "Name": "JLessEqual", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 34 + }, + { + "Opcode": 161, + "Name": "JLessEqualLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 34 + }, + { + "Opcode": 162, + "Name": "JNotLessEqual", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 35 + }, + { + "Opcode": 163, + "Name": "JNotLessEqualLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 35 + }, + { + "Opcode": 164, + "Name": "JLessEqualN", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 36 + }, + { + "Opcode": 165, + "Name": "JLessEqualNLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 36 + }, + { + "Opcode": 166, + "Name": "JNotLessEqualN", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 37 + }, + { + "Opcode": 167, + "Name": "JNotLessEqualNLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 37 + }, + { + "Opcode": 168, + "Name": "JGreater", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 38 + }, + { + "Opcode": 169, + "Name": "JGreaterLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 38 + }, + { + "Opcode": 170, + "Name": "JNotGreater", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 39 + }, + { + "Opcode": 171, + "Name": "JNotGreaterLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 39 + }, + { + "Opcode": 172, + "Name": "JGreaterN", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 40 + }, + { + "Opcode": 173, + "Name": "JGreaterNLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 40 + }, + { + "Opcode": 174, + "Name": "JNotGreaterN", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 41 + }, + { + "Opcode": 175, + "Name": "JNotGreaterNLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 41 + }, + { + "Opcode": 176, + "Name": "JGreaterEqual", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 42 + }, + { + "Opcode": 177, + "Name": "JGreaterEqualLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 42 + }, + { + "Opcode": 178, + "Name": "JNotGreaterEqual", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 43 + }, + { + "Opcode": 179, + "Name": "JNotGreaterEqualLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 43 + }, + { + "Opcode": 180, + "Name": "JGreaterEqualN", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 44 + }, + { + "Opcode": 181, + "Name": "JGreaterEqualNLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 44 + }, + { + "Opcode": 182, + "Name": "JNotGreaterEqualN", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 45 + }, + { + "Opcode": 183, + "Name": "JNotGreaterEqualNLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 45 + }, + { + "Opcode": 184, + "Name": "JEqual", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 46 + }, + { + "Opcode": 185, + "Name": "JEqualLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 46 + }, + { + "Opcode": 186, + "Name": "JNotEqual", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 47 + }, + { + "Opcode": 187, + "Name": "JNotEqualLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 47 + }, + { + "Opcode": 188, + "Name": "JStrictEqual", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 48 + }, + { + "Opcode": 189, + "Name": "JStrictEqualLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 48 + }, + { + "Opcode": 190, + "Name": "JStrictNotEqual", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 49 + }, + { + "Opcode": 191, + "Name": "JStrictNotEqualLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 49 + }, + { + "Opcode": 192, + "Name": "Add32", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 193, + "Name": "Sub32", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 194, + "Name": "Mul32", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 195, + "Name": "Divi32", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 196, + "Name": "Divu32", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 197, + "Name": "Loadi8", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 198, + "Name": "Loadu8", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 199, + "Name": "Loadi16", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 200, + "Name": "Loadu16", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 201, + "Name": "Loadi32", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 202, + "Name": "Loadu32", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 203, + "Name": "Store8", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 204, + "Name": "Store16", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 205, + "Name": "Store32", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + } + ], + "AbstractDefinitions": [ + { + "Name": "NewObjectWithBuffer", + "VariantOpcodes": [ + 1, + 2 + ] + }, + { + "Name": "NewArrayWithBuffer", + "VariantOpcodes": [ + 5, + 6 + ] + }, + { + "Name": "Mov", + "VariantOpcodes": [ + 8, + 9 + ] + }, + { + "Name": "StoreToEnvironment", + "VariantOpcodes": [ + 42, + 43 + ] + }, + { + "Name": "StoreNPToEnvironment", + "VariantOpcodes": [ + 44, + 45 + ] + }, + { + "Name": "LoadFromEnvironment", + "VariantOpcodes": [ + 46, + 47 + ] + }, + { + "Name": "GetById", + "VariantOpcodes": [ + 55, + 54, + 56 + ] + }, + { + "Name": "TryGetById", + "VariantOpcodes": [ + 57, + 58 + ] + }, + { + "Name": "PutById", + "VariantOpcodes": [ + 59, + 60 + ] + }, + { + "Name": "TryPutById", + "VariantOpcodes": [ + 61, + 62 + ] + }, + { + "Name": "PutNewOwnById", + "VariantOpcodes": [ + 64, + 63, + 65 + ] + }, + { + "Name": "PutNewOwnNEById", + "VariantOpcodes": [ + 66, + 67 + ] + }, + { + "Name": "PutOwnByIndex", + "VariantOpcodes": [ + 68, + 69 + ] + }, + { + "Name": "DelById", + "VariantOpcodes": [ + 71, + 72 + ] + }, + { + "Name": "Call", + "VariantOpcodes": [ + 79, + 86 + ] + }, + { + "Name": "Construct", + "VariantOpcodes": [ + 80, + 87 + ] + }, + { + "Name": "CallDirect", + "VariantOpcodes": [ + 82, + 88 + ] + }, + { + "Name": "CallBuiltin", + "VariantOpcodes": [ + 89, + 90 + ] + }, + { + "Name": "CreateClosure", + "VariantOpcodes": [ + 100, + 101 + ] + }, + { + "Name": "CreateGeneratorClosure", + "VariantOpcodes": [ + 102, + 103 + ] + }, + { + "Name": "CreateAsyncClosure", + "VariantOpcodes": [ + 104, + 105 + ] + }, + { + "Name": "LoadParam", + "VariantOpcodes": [ + 108, + 109 + ] + }, + { + "Name": "LoadConstBigInt", + "VariantOpcodes": [ + 113, + 114 + ] + }, + { + "Name": "LoadConstString", + "VariantOpcodes": [ + 115, + 116 + ] + }, + { + "Name": "CreateGenerator", + "VariantOpcodes": [ + 137, + 138 + ] + }, + { + "Name": "Jmp", + "VariantOpcodes": [ + 142, + 143 + ] + }, + { + "Name": "JmpTrue", + "VariantOpcodes": [ + 144, + 145 + ] + }, + { + "Name": "JmpFalse", + "VariantOpcodes": [ + 146, + 147 + ] + }, + { + "Name": "JmpUndefined", + "VariantOpcodes": [ + 148, + 149 + ] + }, + { + "Name": "SaveGenerator", + "VariantOpcodes": [ + 150, + 151 + ] + }, + { + "Name": "JLess", + "VariantOpcodes": [ + 152, + 153 + ] + }, + { + "Name": "JNotLess", + "VariantOpcodes": [ + 154, + 155 + ] + }, + { + "Name": "JLessN", + "VariantOpcodes": [ + 156, + 157 + ] + }, + { + "Name": "JNotLessN", + "VariantOpcodes": [ + 158, + 159 + ] + }, + { + "Name": "JLessEqual", + "VariantOpcodes": [ + 160, + 161 + ] + }, + { + "Name": "JNotLessEqual", + "VariantOpcodes": [ + 162, + 163 + ] + }, + { + "Name": "JLessEqualN", + "VariantOpcodes": [ + 164, + 165 + ] + }, + { + "Name": "JNotLessEqualN", + "VariantOpcodes": [ + 166, + 167 + ] + }, + { + "Name": "JGreater", + "VariantOpcodes": [ + 168, + 169 + ] + }, + { + "Name": "JNotGreater", + "VariantOpcodes": [ + 170, + 171 + ] + }, + { + "Name": "JGreaterN", + "VariantOpcodes": [ + 172, + 173 + ] + }, + { + "Name": "JNotGreaterN", + "VariantOpcodes": [ + 174, + 175 + ] + }, + { + "Name": "JGreaterEqual", + "VariantOpcodes": [ + 176, + 177 + ] + }, + { + "Name": "JNotGreaterEqual", + "VariantOpcodes": [ + 178, + 179 + ] + }, + { + "Name": "JGreaterEqualN", + "VariantOpcodes": [ + 180, + 181 + ] + }, + { + "Name": "JNotGreaterEqualN", + "VariantOpcodes": [ + 182, + 183 + ] + }, + { + "Name": "JEqual", + "VariantOpcodes": [ + 184, + 185 + ] + }, + { + "Name": "JNotEqual", + "VariantOpcodes": [ + 186, + 187 + ] + }, + { + "Name": "JStrictEqual", + "VariantOpcodes": [ + 188, + 189 + ] + }, + { + "Name": "JStrictNotEqual", + "VariantOpcodes": [ + 190, + 191 + ] + } + ], + "GitCommitHash": "1c717488d1799f6153cf6d60c3556ab4ddd9dce6" +} \ No newline at end of file diff --git a/hasmer/libhasmer/Resources/Bytecode95.json b/hasmer/libhasmer/Resources/Bytecode95.json new file mode 100644 index 0000000..d55515b --- /dev/null +++ b/hasmer/libhasmer/Resources/Bytecode95.json @@ -0,0 +1,2451 @@ +{ + "Version": 95, + "Definitions": [ + { + "Opcode": 0, + "Name": "Unreachable", + "OperandTypes": [], + "IsJump": false + }, + { + "Opcode": 1, + "Name": "NewObjectWithBuffer", + "OperandTypes": [ + "Reg8", + "UInt16", + "UInt16", + "UInt16", + "UInt16" + ], + "IsJump": false, + "AbstractDefinition": 0 + }, + { + "Opcode": 2, + "Name": "NewObjectWithBufferLong", + "OperandTypes": [ + "Reg8", + "UInt16", + "UInt16", + "UInt32", + "UInt32" + ], + "IsJump": false, + "AbstractDefinition": 0 + }, + { + "Opcode": 3, + "Name": "NewObject", + "OperandTypes": [ + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 4, + "Name": "NewObjectWithParent", + "OperandTypes": [ + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 5, + "Name": "NewArrayWithBuffer", + "OperandTypes": [ + "Reg8", + "UInt16", + "UInt16", + "UInt16" + ], + "IsJump": false, + "AbstractDefinition": 1 + }, + { + "Opcode": 6, + "Name": "NewArrayWithBufferLong", + "OperandTypes": [ + "Reg8", + "UInt16", + "UInt16", + "UInt32" + ], + "IsJump": false, + "AbstractDefinition": 1 + }, + { + "Opcode": 7, + "Name": "NewArray", + "OperandTypes": [ + "Reg8", + "UInt16" + ], + "IsJump": false + }, + { + "Opcode": 8, + "Name": "Mov", + "OperandTypes": [ + "Reg8", + "Reg8" + ], + "IsJump": false, + "AbstractDefinition": 2 + }, + { + "Opcode": 9, + "Name": "MovLong", + "OperandTypes": [ + "Reg32", + "Reg32" + ], + "IsJump": false, + "AbstractDefinition": 2 + }, + { + "Opcode": 10, + "Name": "Negate", + "OperandTypes": [ + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 11, + "Name": "Not", + "OperandTypes": [ + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 12, + "Name": "BitNot", + "OperandTypes": [ + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 13, + "Name": "TypeOf", + "OperandTypes": [ + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 14, + "Name": "Eq", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 15, + "Name": "StrictEq", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 16, + "Name": "Neq", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 17, + "Name": "StrictNeq", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 18, + "Name": "Less", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 19, + "Name": "LessEq", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 20, + "Name": "Greater", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 21, + "Name": "GreaterEq", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 22, + "Name": "Add", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 23, + "Name": "AddN", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 24, + "Name": "Mul", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 25, + "Name": "MulN", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 26, + "Name": "Div", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 27, + "Name": "DivN", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 28, + "Name": "Mod", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 29, + "Name": "Sub", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 30, + "Name": "SubN", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 31, + "Name": "LShift", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 32, + "Name": "RShift", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 33, + "Name": "URshift", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 34, + "Name": "BitAnd", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 35, + "Name": "BitXor", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 36, + "Name": "BitOr", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 37, + "Name": "Inc", + "OperandTypes": [ + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 38, + "Name": "Dec", + "OperandTypes": [ + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 39, + "Name": "InstanceOf", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 40, + "Name": "IsIn", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 41, + "Name": "GetEnvironment", + "OperandTypes": [ + "Reg8", + "UInt8" + ], + "IsJump": false + }, + { + "Opcode": 42, + "Name": "StoreToEnvironment", + "OperandTypes": [ + "Reg8", + "UInt8", + "Reg8" + ], + "IsJump": false, + "AbstractDefinition": 3 + }, + { + "Opcode": 43, + "Name": "StoreToEnvironmentL", + "OperandTypes": [ + "Reg8", + "UInt16", + "Reg8" + ], + "IsJump": false, + "AbstractDefinition": 3 + }, + { + "Opcode": 44, + "Name": "StoreNPToEnvironment", + "OperandTypes": [ + "Reg8", + "UInt8", + "Reg8" + ], + "IsJump": false, + "AbstractDefinition": 4 + }, + { + "Opcode": 45, + "Name": "StoreNPToEnvironmentL", + "OperandTypes": [ + "Reg8", + "UInt16", + "Reg8" + ], + "IsJump": false, + "AbstractDefinition": 4 + }, + { + "Opcode": 46, + "Name": "LoadFromEnvironment", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt8" + ], + "IsJump": false, + "AbstractDefinition": 5 + }, + { + "Opcode": 47, + "Name": "LoadFromEnvironmentL", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt16" + ], + "IsJump": false, + "AbstractDefinition": 5 + }, + { + "Opcode": 48, + "Name": "GetGlobalObject", + "OperandTypes": [ + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 49, + "Name": "GetNewTarget", + "OperandTypes": [ + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 50, + "Name": "CreateEnvironment", + "OperandTypes": [ + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 51, + "Name": "CreateInnerEnvironment", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt32" + ], + "IsJump": false + }, + { + "Opcode": 52, + "Name": "DeclareGlobalVar", + "OperandTypes": [ + "UInt32S" + ], + "IsJump": false + }, + { + "Opcode": 53, + "Name": "ThrowIfHasRestrictedGlobalProperty", + "OperandTypes": [ + "UInt32S" + ], + "IsJump": false + }, + { + "Opcode": 54, + "Name": "GetByIdShort", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt8", + "UInt8S" + ], + "IsJump": false, + "AbstractDefinition": 6 + }, + { + "Opcode": 55, + "Name": "GetById", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt8", + "UInt16S" + ], + "IsJump": false, + "AbstractDefinition": 6 + }, + { + "Opcode": 56, + "Name": "GetByIdLong", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt8", + "UInt32S" + ], + "IsJump": false, + "AbstractDefinition": 6 + }, + { + "Opcode": 57, + "Name": "TryGetById", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt8", + "UInt16S" + ], + "IsJump": false, + "AbstractDefinition": 7 + }, + { + "Opcode": 58, + "Name": "TryGetByIdLong", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt8", + "UInt32S" + ], + "IsJump": false, + "AbstractDefinition": 7 + }, + { + "Opcode": 59, + "Name": "PutById", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt8", + "UInt16S" + ], + "IsJump": false, + "AbstractDefinition": 8 + }, + { + "Opcode": 60, + "Name": "PutByIdLong", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt8", + "UInt32S" + ], + "IsJump": false, + "AbstractDefinition": 8 + }, + { + "Opcode": 61, + "Name": "TryPutById", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt8", + "UInt16S" + ], + "IsJump": false, + "AbstractDefinition": 9 + }, + { + "Opcode": 62, + "Name": "TryPutByIdLong", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt8", + "UInt32S" + ], + "IsJump": false, + "AbstractDefinition": 9 + }, + { + "Opcode": 63, + "Name": "PutNewOwnByIdShort", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt8S" + ], + "IsJump": false, + "AbstractDefinition": 10 + }, + { + "Opcode": 64, + "Name": "PutNewOwnById", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt16S" + ], + "IsJump": false, + "AbstractDefinition": 10 + }, + { + "Opcode": 65, + "Name": "PutNewOwnByIdLong", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt32S" + ], + "IsJump": false, + "AbstractDefinition": 10 + }, + { + "Opcode": 66, + "Name": "PutNewOwnNEById", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt16S" + ], + "IsJump": false, + "AbstractDefinition": 11 + }, + { + "Opcode": 67, + "Name": "PutNewOwnNEByIdLong", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt32S" + ], + "IsJump": false, + "AbstractDefinition": 11 + }, + { + "Opcode": 68, + "Name": "PutOwnByIndex", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt8" + ], + "IsJump": false, + "AbstractDefinition": 12 + }, + { + "Opcode": 69, + "Name": "PutOwnByIndexL", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt32" + ], + "IsJump": false, + "AbstractDefinition": 12 + }, + { + "Opcode": 70, + "Name": "PutOwnByVal", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8", + "UInt8" + ], + "IsJump": false + }, + { + "Opcode": 71, + "Name": "DelById", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt16S" + ], + "IsJump": false, + "AbstractDefinition": 13 + }, + { + "Opcode": 72, + "Name": "DelByIdLong", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt32S" + ], + "IsJump": false, + "AbstractDefinition": 13 + }, + { + "Opcode": 73, + "Name": "GetByVal", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 74, + "Name": "PutByVal", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 75, + "Name": "DelByVal", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 76, + "Name": "PutOwnGetterSetterByVal", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8", + "Reg8", + "UInt8" + ], + "IsJump": false + }, + { + "Opcode": 77, + "Name": "GetPNameList", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 78, + "Name": "GetNextPName", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 79, + "Name": "Call", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt8" + ], + "IsJump": false, + "AbstractDefinition": 14 + }, + { + "Opcode": 80, + "Name": "Construct", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt8" + ], + "IsJump": false, + "AbstractDefinition": 15 + }, + { + "Opcode": 81, + "Name": "Call1", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 82, + "Name": "CallDirect", + "OperandTypes": [ + "Reg8", + "UInt8", + "UInt16" + ], + "IsJump": false, + "AbstractDefinition": 16 + }, + { + "Opcode": 83, + "Name": "Call2", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 84, + "Name": "Call3", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 85, + "Name": "Call4", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8", + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 86, + "Name": "CallLong", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt32" + ], + "IsJump": false, + "AbstractDefinition": 14 + }, + { + "Opcode": 87, + "Name": "ConstructLong", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt32" + ], + "IsJump": false, + "AbstractDefinition": 15 + }, + { + "Opcode": 88, + "Name": "CallDirectLongIndex", + "OperandTypes": [ + "Reg8", + "UInt8", + "UInt32" + ], + "IsJump": false, + "AbstractDefinition": 16 + }, + { + "Opcode": 89, + "Name": "CallBuiltin", + "OperandTypes": [ + "Reg8", + "UInt8", + "UInt8" + ], + "IsJump": false, + "AbstractDefinition": 17 + }, + { + "Opcode": 90, + "Name": "CallBuiltinLong", + "OperandTypes": [ + "Reg8", + "UInt8", + "UInt32" + ], + "IsJump": false, + "AbstractDefinition": 17 + }, + { + "Opcode": 91, + "Name": "GetBuiltinClosure", + "OperandTypes": [ + "Reg8", + "UInt8" + ], + "IsJump": false + }, + { + "Opcode": 92, + "Name": "Ret", + "OperandTypes": [ + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 93, + "Name": "Catch", + "OperandTypes": [ + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 94, + "Name": "DirectEval", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt8" + ], + "IsJump": false + }, + { + "Opcode": 95, + "Name": "Throw", + "OperandTypes": [ + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 96, + "Name": "ThrowIfEmpty", + "OperandTypes": [ + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 97, + "Name": "Debugger", + "OperandTypes": [], + "IsJump": false + }, + { + "Opcode": 98, + "Name": "AsyncBreakCheck", + "OperandTypes": [], + "IsJump": false + }, + { + "Opcode": 99, + "Name": "ProfilePoint", + "OperandTypes": [ + "UInt16" + ], + "IsJump": false + }, + { + "Opcode": 100, + "Name": "CreateClosure", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt16" + ], + "IsJump": false, + "AbstractDefinition": 18 + }, + { + "Opcode": 101, + "Name": "CreateClosureLongIndex", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt32" + ], + "IsJump": false, + "AbstractDefinition": 18 + }, + { + "Opcode": 102, + "Name": "CreateGeneratorClosure", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt16" + ], + "IsJump": false, + "AbstractDefinition": 19 + }, + { + "Opcode": 103, + "Name": "CreateGeneratorClosureLongIndex", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt32" + ], + "IsJump": false, + "AbstractDefinition": 19 + }, + { + "Opcode": 104, + "Name": "CreateAsyncClosure", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt16" + ], + "IsJump": false, + "AbstractDefinition": 20 + }, + { + "Opcode": 105, + "Name": "CreateAsyncClosureLongIndex", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt32" + ], + "IsJump": false, + "AbstractDefinition": 20 + }, + { + "Opcode": 106, + "Name": "CreateThis", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 107, + "Name": "SelectObject", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 108, + "Name": "LoadParam", + "OperandTypes": [ + "Reg8", + "UInt8" + ], + "IsJump": false, + "AbstractDefinition": 21 + }, + { + "Opcode": 109, + "Name": "LoadParamLong", + "OperandTypes": [ + "Reg8", + "UInt32" + ], + "IsJump": false, + "AbstractDefinition": 21 + }, + { + "Opcode": 110, + "Name": "LoadConstUInt8", + "OperandTypes": [ + "Reg8", + "UInt8" + ], + "IsJump": false + }, + { + "Opcode": 111, + "Name": "LoadConstInt", + "OperandTypes": [ + "Reg8", + "Imm32" + ], + "IsJump": false + }, + { + "Opcode": 112, + "Name": "LoadConstDouble", + "OperandTypes": [ + "Reg8", + "Double" + ], + "IsJump": false + }, + { + "Opcode": 113, + "Name": "LoadConstBigInt", + "OperandTypes": [ + "Reg8", + "UInt16" + ], + "IsJump": false, + "AbstractDefinition": 22 + }, + { + "Opcode": 114, + "Name": "LoadConstBigIntLongIndex", + "OperandTypes": [ + "Reg8", + "UInt32" + ], + "IsJump": false, + "AbstractDefinition": 22 + }, + { + "Opcode": 115, + "Name": "LoadConstString", + "OperandTypes": [ + "Reg8", + "UInt16S" + ], + "IsJump": false, + "AbstractDefinition": 23 + }, + { + "Opcode": 116, + "Name": "LoadConstStringLongIndex", + "OperandTypes": [ + "Reg8", + "UInt32S" + ], + "IsJump": false, + "AbstractDefinition": 23 + }, + { + "Opcode": 117, + "Name": "LoadConstEmpty", + "OperandTypes": [ + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 118, + "Name": "LoadConstUndefined", + "OperandTypes": [ + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 119, + "Name": "LoadConstNull", + "OperandTypes": [ + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 120, + "Name": "LoadConstTrue", + "OperandTypes": [ + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 121, + "Name": "LoadConstFalse", + "OperandTypes": [ + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 122, + "Name": "LoadConstZero", + "OperandTypes": [ + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 123, + "Name": "CoerceThisNS", + "OperandTypes": [ + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 124, + "Name": "LoadThisNS", + "OperandTypes": [ + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 125, + "Name": "ToNumber", + "OperandTypes": [ + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 126, + "Name": "ToNumeric", + "OperandTypes": [ + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 127, + "Name": "ToInt32", + "OperandTypes": [ + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 128, + "Name": "AddEmptyString", + "OperandTypes": [ + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 129, + "Name": "GetArgumentsPropByVal", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 130, + "Name": "GetArgumentsLength", + "OperandTypes": [ + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 131, + "Name": "ReifyArguments", + "OperandTypes": [ + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 132, + "Name": "CreateRegExp", + "OperandTypes": [ + "Reg8", + "UInt32S", + "UInt32S", + "UInt32" + ], + "IsJump": false + }, + { + "Opcode": 133, + "Name": "SwitchImm", + "OperandTypes": [ + "Reg8", + "UInt32", + "Addr32", + "UInt32", + "UInt32" + ], + "IsJump": false + }, + { + "Opcode": 134, + "Name": "StartGenerator", + "OperandTypes": [], + "IsJump": false + }, + { + "Opcode": 135, + "Name": "ResumeGenerator", + "OperandTypes": [ + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 136, + "Name": "CompleteGenerator", + "OperandTypes": [], + "IsJump": false + }, + { + "Opcode": 137, + "Name": "CreateGenerator", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt16" + ], + "IsJump": false, + "AbstractDefinition": 24 + }, + { + "Opcode": 138, + "Name": "CreateGeneratorLongIndex", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt32" + ], + "IsJump": false, + "AbstractDefinition": 24 + }, + { + "Opcode": 139, + "Name": "IteratorBegin", + "OperandTypes": [ + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 140, + "Name": "IteratorNext", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 141, + "Name": "IteratorClose", + "OperandTypes": [ + "Reg8", + "UInt8" + ], + "IsJump": false + }, + { + "Opcode": 142, + "Name": "Jmp", + "OperandTypes": [ + "Addr8" + ], + "IsJump": true, + "AbstractDefinition": 25 + }, + { + "Opcode": 143, + "Name": "JmpLong", + "OperandTypes": [ + "Addr32" + ], + "IsJump": true, + "AbstractDefinition": 25 + }, + { + "Opcode": 144, + "Name": "JmpTrue", + "OperandTypes": [ + "Addr8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 26 + }, + { + "Opcode": 145, + "Name": "JmpTrueLong", + "OperandTypes": [ + "Addr32", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 26 + }, + { + "Opcode": 146, + "Name": "JmpFalse", + "OperandTypes": [ + "Addr8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 27 + }, + { + "Opcode": 147, + "Name": "JmpFalseLong", + "OperandTypes": [ + "Addr32", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 27 + }, + { + "Opcode": 148, + "Name": "JmpUndefined", + "OperandTypes": [ + "Addr8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 28 + }, + { + "Opcode": 149, + "Name": "JmpUndefinedLong", + "OperandTypes": [ + "Addr32", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 28 + }, + { + "Opcode": 150, + "Name": "SaveGenerator", + "OperandTypes": [ + "Addr8" + ], + "IsJump": true, + "AbstractDefinition": 29 + }, + { + "Opcode": 151, + "Name": "SaveGeneratorLong", + "OperandTypes": [ + "Addr32" + ], + "IsJump": true, + "AbstractDefinition": 29 + }, + { + "Opcode": 152, + "Name": "JLess", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 30 + }, + { + "Opcode": 153, + "Name": "JLessLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 30 + }, + { + "Opcode": 154, + "Name": "JNotLess", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 31 + }, + { + "Opcode": 155, + "Name": "JNotLessLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 31 + }, + { + "Opcode": 156, + "Name": "JLessN", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 32 + }, + { + "Opcode": 157, + "Name": "JLessNLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 32 + }, + { + "Opcode": 158, + "Name": "JNotLessN", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 33 + }, + { + "Opcode": 159, + "Name": "JNotLessNLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 33 + }, + { + "Opcode": 160, + "Name": "JLessEqual", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 34 + }, + { + "Opcode": 161, + "Name": "JLessEqualLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 34 + }, + { + "Opcode": 162, + "Name": "JNotLessEqual", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 35 + }, + { + "Opcode": 163, + "Name": "JNotLessEqualLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 35 + }, + { + "Opcode": 164, + "Name": "JLessEqualN", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 36 + }, + { + "Opcode": 165, + "Name": "JLessEqualNLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 36 + }, + { + "Opcode": 166, + "Name": "JNotLessEqualN", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 37 + }, + { + "Opcode": 167, + "Name": "JNotLessEqualNLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 37 + }, + { + "Opcode": 168, + "Name": "JGreater", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 38 + }, + { + "Opcode": 169, + "Name": "JGreaterLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 38 + }, + { + "Opcode": 170, + "Name": "JNotGreater", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 39 + }, + { + "Opcode": 171, + "Name": "JNotGreaterLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 39 + }, + { + "Opcode": 172, + "Name": "JGreaterN", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 40 + }, + { + "Opcode": 173, + "Name": "JGreaterNLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 40 + }, + { + "Opcode": 174, + "Name": "JNotGreaterN", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 41 + }, + { + "Opcode": 175, + "Name": "JNotGreaterNLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 41 + }, + { + "Opcode": 176, + "Name": "JGreaterEqual", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 42 + }, + { + "Opcode": 177, + "Name": "JGreaterEqualLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 42 + }, + { + "Opcode": 178, + "Name": "JNotGreaterEqual", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 43 + }, + { + "Opcode": 179, + "Name": "JNotGreaterEqualLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 43 + }, + { + "Opcode": 180, + "Name": "JGreaterEqualN", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 44 + }, + { + "Opcode": 181, + "Name": "JGreaterEqualNLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 44 + }, + { + "Opcode": 182, + "Name": "JNotGreaterEqualN", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 45 + }, + { + "Opcode": 183, + "Name": "JNotGreaterEqualNLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 45 + }, + { + "Opcode": 184, + "Name": "JEqual", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 46 + }, + { + "Opcode": 185, + "Name": "JEqualLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 46 + }, + { + "Opcode": 186, + "Name": "JNotEqual", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 47 + }, + { + "Opcode": 187, + "Name": "JNotEqualLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 47 + }, + { + "Opcode": 188, + "Name": "JStrictEqual", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 48 + }, + { + "Opcode": 189, + "Name": "JStrictEqualLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 48 + }, + { + "Opcode": 190, + "Name": "JStrictNotEqual", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 49 + }, + { + "Opcode": 191, + "Name": "JStrictNotEqualLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 49 + }, + { + "Opcode": 192, + "Name": "Add32", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 193, + "Name": "Sub32", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 194, + "Name": "Mul32", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 195, + "Name": "Divi32", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 196, + "Name": "Divu32", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 197, + "Name": "Loadi8", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 198, + "Name": "Loadu8", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 199, + "Name": "Loadi16", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 200, + "Name": "Loadu16", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 201, + "Name": "Loadi32", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 202, + "Name": "Loadu32", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 203, + "Name": "Store8", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 204, + "Name": "Store16", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 205, + "Name": "Store32", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + } + ], + "AbstractDefinitions": [ + { + "Name": "NewObjectWithBuffer", + "VariantOpcodes": [ + 1, + 2 + ] + }, + { + "Name": "NewArrayWithBuffer", + "VariantOpcodes": [ + 5, + 6 + ] + }, + { + "Name": "Mov", + "VariantOpcodes": [ + 8, + 9 + ] + }, + { + "Name": "StoreToEnvironment", + "VariantOpcodes": [ + 42, + 43 + ] + }, + { + "Name": "StoreNPToEnvironment", + "VariantOpcodes": [ + 44, + 45 + ] + }, + { + "Name": "LoadFromEnvironment", + "VariantOpcodes": [ + 46, + 47 + ] + }, + { + "Name": "GetById", + "VariantOpcodes": [ + 55, + 54, + 56 + ] + }, + { + "Name": "TryGetById", + "VariantOpcodes": [ + 57, + 58 + ] + }, + { + "Name": "PutById", + "VariantOpcodes": [ + 59, + 60 + ] + }, + { + "Name": "TryPutById", + "VariantOpcodes": [ + 61, + 62 + ] + }, + { + "Name": "PutNewOwnById", + "VariantOpcodes": [ + 64, + 63, + 65 + ] + }, + { + "Name": "PutNewOwnNEById", + "VariantOpcodes": [ + 66, + 67 + ] + }, + { + "Name": "PutOwnByIndex", + "VariantOpcodes": [ + 68, + 69 + ] + }, + { + "Name": "DelById", + "VariantOpcodes": [ + 71, + 72 + ] + }, + { + "Name": "Call", + "VariantOpcodes": [ + 79, + 86 + ] + }, + { + "Name": "Construct", + "VariantOpcodes": [ + 80, + 87 + ] + }, + { + "Name": "CallDirect", + "VariantOpcodes": [ + 82, + 88 + ] + }, + { + "Name": "CallBuiltin", + "VariantOpcodes": [ + 89, + 90 + ] + }, + { + "Name": "CreateClosure", + "VariantOpcodes": [ + 100, + 101 + ] + }, + { + "Name": "CreateGeneratorClosure", + "VariantOpcodes": [ + 102, + 103 + ] + }, + { + "Name": "CreateAsyncClosure", + "VariantOpcodes": [ + 104, + 105 + ] + }, + { + "Name": "LoadParam", + "VariantOpcodes": [ + 108, + 109 + ] + }, + { + "Name": "LoadConstBigInt", + "VariantOpcodes": [ + 113, + 114 + ] + }, + { + "Name": "LoadConstString", + "VariantOpcodes": [ + 115, + 116 + ] + }, + { + "Name": "CreateGenerator", + "VariantOpcodes": [ + 137, + 138 + ] + }, + { + "Name": "Jmp", + "VariantOpcodes": [ + 142, + 143 + ] + }, + { + "Name": "JmpTrue", + "VariantOpcodes": [ + 144, + 145 + ] + }, + { + "Name": "JmpFalse", + "VariantOpcodes": [ + 146, + 147 + ] + }, + { + "Name": "JmpUndefined", + "VariantOpcodes": [ + 148, + 149 + ] + }, + { + "Name": "SaveGenerator", + "VariantOpcodes": [ + 150, + 151 + ] + }, + { + "Name": "JLess", + "VariantOpcodes": [ + 152, + 153 + ] + }, + { + "Name": "JNotLess", + "VariantOpcodes": [ + 154, + 155 + ] + }, + { + "Name": "JLessN", + "VariantOpcodes": [ + 156, + 157 + ] + }, + { + "Name": "JNotLessN", + "VariantOpcodes": [ + 158, + 159 + ] + }, + { + "Name": "JLessEqual", + "VariantOpcodes": [ + 160, + 161 + ] + }, + { + "Name": "JNotLessEqual", + "VariantOpcodes": [ + 162, + 163 + ] + }, + { + "Name": "JLessEqualN", + "VariantOpcodes": [ + 164, + 165 + ] + }, + { + "Name": "JNotLessEqualN", + "VariantOpcodes": [ + 166, + 167 + ] + }, + { + "Name": "JGreater", + "VariantOpcodes": [ + 168, + 169 + ] + }, + { + "Name": "JNotGreater", + "VariantOpcodes": [ + 170, + 171 + ] + }, + { + "Name": "JGreaterN", + "VariantOpcodes": [ + 172, + 173 + ] + }, + { + "Name": "JNotGreaterN", + "VariantOpcodes": [ + 174, + 175 + ] + }, + { + "Name": "JGreaterEqual", + "VariantOpcodes": [ + 176, + 177 + ] + }, + { + "Name": "JNotGreaterEqual", + "VariantOpcodes": [ + 178, + 179 + ] + }, + { + "Name": "JGreaterEqualN", + "VariantOpcodes": [ + 180, + 181 + ] + }, + { + "Name": "JNotGreaterEqualN", + "VariantOpcodes": [ + 182, + 183 + ] + }, + { + "Name": "JEqual", + "VariantOpcodes": [ + 184, + 185 + ] + }, + { + "Name": "JNotEqual", + "VariantOpcodes": [ + 186, + 187 + ] + }, + { + "Name": "JStrictEqual", + "VariantOpcodes": [ + 188, + 189 + ] + }, + { + "Name": "JStrictNotEqual", + "VariantOpcodes": [ + 190, + 191 + ] + } + ], + "GitCommitHash": "f6b56d334467555b634f54bd18900d7ef8408eba" +} \ No newline at end of file diff --git a/hasmer/libhasmer/Resources/Bytecode96.json b/hasmer/libhasmer/Resources/Bytecode96.json new file mode 100644 index 0000000..c77de9c --- /dev/null +++ b/hasmer/libhasmer/Resources/Bytecode96.json @@ -0,0 +1,2451 @@ +{ + "Version": 96, + "Definitions": [ + { + "Opcode": 0, + "Name": "Unreachable", + "OperandTypes": [], + "IsJump": false + }, + { + "Opcode": 1, + "Name": "NewObjectWithBuffer", + "OperandTypes": [ + "Reg8", + "UInt16", + "UInt16", + "UInt16", + "UInt16" + ], + "IsJump": false, + "AbstractDefinition": 0 + }, + { + "Opcode": 2, + "Name": "NewObjectWithBufferLong", + "OperandTypes": [ + "Reg8", + "UInt16", + "UInt16", + "UInt32", + "UInt32" + ], + "IsJump": false, + "AbstractDefinition": 0 + }, + { + "Opcode": 3, + "Name": "NewObject", + "OperandTypes": [ + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 4, + "Name": "NewObjectWithParent", + "OperandTypes": [ + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 5, + "Name": "NewArrayWithBuffer", + "OperandTypes": [ + "Reg8", + "UInt16", + "UInt16", + "UInt16" + ], + "IsJump": false, + "AbstractDefinition": 1 + }, + { + "Opcode": 6, + "Name": "NewArrayWithBufferLong", + "OperandTypes": [ + "Reg8", + "UInt16", + "UInt16", + "UInt32" + ], + "IsJump": false, + "AbstractDefinition": 1 + }, + { + "Opcode": 7, + "Name": "NewArray", + "OperandTypes": [ + "Reg8", + "UInt16" + ], + "IsJump": false + }, + { + "Opcode": 8, + "Name": "Mov", + "OperandTypes": [ + "Reg8", + "Reg8" + ], + "IsJump": false, + "AbstractDefinition": 2 + }, + { + "Opcode": 9, + "Name": "MovLong", + "OperandTypes": [ + "Reg32", + "Reg32" + ], + "IsJump": false, + "AbstractDefinition": 2 + }, + { + "Opcode": 10, + "Name": "Negate", + "OperandTypes": [ + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 11, + "Name": "Not", + "OperandTypes": [ + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 12, + "Name": "BitNot", + "OperandTypes": [ + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 13, + "Name": "TypeOf", + "OperandTypes": [ + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 14, + "Name": "Eq", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 15, + "Name": "StrictEq", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 16, + "Name": "Neq", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 17, + "Name": "StrictNeq", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 18, + "Name": "Less", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 19, + "Name": "LessEq", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 20, + "Name": "Greater", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 21, + "Name": "GreaterEq", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 22, + "Name": "Add", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 23, + "Name": "AddN", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 24, + "Name": "Mul", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 25, + "Name": "MulN", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 26, + "Name": "Div", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 27, + "Name": "DivN", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 28, + "Name": "Mod", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 29, + "Name": "Sub", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 30, + "Name": "SubN", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 31, + "Name": "LShift", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 32, + "Name": "RShift", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 33, + "Name": "URshift", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 34, + "Name": "BitAnd", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 35, + "Name": "BitXor", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 36, + "Name": "BitOr", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 37, + "Name": "Inc", + "OperandTypes": [ + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 38, + "Name": "Dec", + "OperandTypes": [ + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 39, + "Name": "InstanceOf", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 40, + "Name": "IsIn", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 41, + "Name": "GetEnvironment", + "OperandTypes": [ + "Reg8", + "UInt8" + ], + "IsJump": false + }, + { + "Opcode": 42, + "Name": "StoreToEnvironment", + "OperandTypes": [ + "Reg8", + "UInt8", + "Reg8" + ], + "IsJump": false, + "AbstractDefinition": 3 + }, + { + "Opcode": 43, + "Name": "StoreToEnvironmentL", + "OperandTypes": [ + "Reg8", + "UInt16", + "Reg8" + ], + "IsJump": false, + "AbstractDefinition": 3 + }, + { + "Opcode": 44, + "Name": "StoreNPToEnvironment", + "OperandTypes": [ + "Reg8", + "UInt8", + "Reg8" + ], + "IsJump": false, + "AbstractDefinition": 4 + }, + { + "Opcode": 45, + "Name": "StoreNPToEnvironmentL", + "OperandTypes": [ + "Reg8", + "UInt16", + "Reg8" + ], + "IsJump": false, + "AbstractDefinition": 4 + }, + { + "Opcode": 46, + "Name": "LoadFromEnvironment", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt8" + ], + "IsJump": false, + "AbstractDefinition": 5 + }, + { + "Opcode": 47, + "Name": "LoadFromEnvironmentL", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt16" + ], + "IsJump": false, + "AbstractDefinition": 5 + }, + { + "Opcode": 48, + "Name": "GetGlobalObject", + "OperandTypes": [ + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 49, + "Name": "GetNewTarget", + "OperandTypes": [ + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 50, + "Name": "CreateEnvironment", + "OperandTypes": [ + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 51, + "Name": "CreateInnerEnvironment", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt32" + ], + "IsJump": false + }, + { + "Opcode": 52, + "Name": "DeclareGlobalVar", + "OperandTypes": [ + "UInt32S" + ], + "IsJump": false + }, + { + "Opcode": 53, + "Name": "ThrowIfHasRestrictedGlobalProperty", + "OperandTypes": [ + "UInt32S" + ], + "IsJump": false + }, + { + "Opcode": 54, + "Name": "GetByIdShort", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt8", + "UInt8S" + ], + "IsJump": false, + "AbstractDefinition": 6 + }, + { + "Opcode": 55, + "Name": "GetById", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt8", + "UInt16S" + ], + "IsJump": false, + "AbstractDefinition": 6 + }, + { + "Opcode": 56, + "Name": "GetByIdLong", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt8", + "UInt32S" + ], + "IsJump": false, + "AbstractDefinition": 6 + }, + { + "Opcode": 57, + "Name": "TryGetById", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt8", + "UInt16S" + ], + "IsJump": false, + "AbstractDefinition": 7 + }, + { + "Opcode": 58, + "Name": "TryGetByIdLong", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt8", + "UInt32S" + ], + "IsJump": false, + "AbstractDefinition": 7 + }, + { + "Opcode": 59, + "Name": "PutById", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt8", + "UInt16S" + ], + "IsJump": false, + "AbstractDefinition": 8 + }, + { + "Opcode": 60, + "Name": "PutByIdLong", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt8", + "UInt32S" + ], + "IsJump": false, + "AbstractDefinition": 8 + }, + { + "Opcode": 61, + "Name": "TryPutById", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt8", + "UInt16S" + ], + "IsJump": false, + "AbstractDefinition": 9 + }, + { + "Opcode": 62, + "Name": "TryPutByIdLong", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt8", + "UInt32S" + ], + "IsJump": false, + "AbstractDefinition": 9 + }, + { + "Opcode": 63, + "Name": "PutNewOwnByIdShort", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt8S" + ], + "IsJump": false, + "AbstractDefinition": 10 + }, + { + "Opcode": 64, + "Name": "PutNewOwnById", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt16S" + ], + "IsJump": false, + "AbstractDefinition": 10 + }, + { + "Opcode": 65, + "Name": "PutNewOwnByIdLong", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt32S" + ], + "IsJump": false, + "AbstractDefinition": 10 + }, + { + "Opcode": 66, + "Name": "PutNewOwnNEById", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt16S" + ], + "IsJump": false, + "AbstractDefinition": 11 + }, + { + "Opcode": 67, + "Name": "PutNewOwnNEByIdLong", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt32S" + ], + "IsJump": false, + "AbstractDefinition": 11 + }, + { + "Opcode": 68, + "Name": "PutOwnByIndex", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt8" + ], + "IsJump": false, + "AbstractDefinition": 12 + }, + { + "Opcode": 69, + "Name": "PutOwnByIndexL", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt32" + ], + "IsJump": false, + "AbstractDefinition": 12 + }, + { + "Opcode": 70, + "Name": "PutOwnByVal", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8", + "UInt8" + ], + "IsJump": false + }, + { + "Opcode": 71, + "Name": "DelById", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt16S" + ], + "IsJump": false, + "AbstractDefinition": 13 + }, + { + "Opcode": 72, + "Name": "DelByIdLong", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt32S" + ], + "IsJump": false, + "AbstractDefinition": 13 + }, + { + "Opcode": 73, + "Name": "GetByVal", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 74, + "Name": "PutByVal", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 75, + "Name": "DelByVal", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 76, + "Name": "PutOwnGetterSetterByVal", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8", + "Reg8", + "UInt8" + ], + "IsJump": false + }, + { + "Opcode": 77, + "Name": "GetPNameList", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 78, + "Name": "GetNextPName", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 79, + "Name": "Call", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt8" + ], + "IsJump": false, + "AbstractDefinition": 14 + }, + { + "Opcode": 80, + "Name": "Construct", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt8" + ], + "IsJump": false, + "AbstractDefinition": 15 + }, + { + "Opcode": 81, + "Name": "Call1", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 82, + "Name": "CallDirect", + "OperandTypes": [ + "Reg8", + "UInt8", + "UInt16" + ], + "IsJump": false, + "AbstractDefinition": 16 + }, + { + "Opcode": 83, + "Name": "Call2", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 84, + "Name": "Call3", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 85, + "Name": "Call4", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8", + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 86, + "Name": "CallLong", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt32" + ], + "IsJump": false, + "AbstractDefinition": 14 + }, + { + "Opcode": 87, + "Name": "ConstructLong", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt32" + ], + "IsJump": false, + "AbstractDefinition": 15 + }, + { + "Opcode": 88, + "Name": "CallDirectLongIndex", + "OperandTypes": [ + "Reg8", + "UInt8", + "UInt32" + ], + "IsJump": false, + "AbstractDefinition": 16 + }, + { + "Opcode": 89, + "Name": "CallBuiltin", + "OperandTypes": [ + "Reg8", + "UInt8", + "UInt8" + ], + "IsJump": false, + "AbstractDefinition": 17 + }, + { + "Opcode": 90, + "Name": "CallBuiltinLong", + "OperandTypes": [ + "Reg8", + "UInt8", + "UInt32" + ], + "IsJump": false, + "AbstractDefinition": 17 + }, + { + "Opcode": 91, + "Name": "GetBuiltinClosure", + "OperandTypes": [ + "Reg8", + "UInt8" + ], + "IsJump": false + }, + { + "Opcode": 92, + "Name": "Ret", + "OperandTypes": [ + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 93, + "Name": "Catch", + "OperandTypes": [ + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 94, + "Name": "DirectEval", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt8" + ], + "IsJump": false + }, + { + "Opcode": 95, + "Name": "Throw", + "OperandTypes": [ + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 96, + "Name": "ThrowIfEmpty", + "OperandTypes": [ + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 97, + "Name": "Debugger", + "OperandTypes": [], + "IsJump": false + }, + { + "Opcode": 98, + "Name": "AsyncBreakCheck", + "OperandTypes": [], + "IsJump": false + }, + { + "Opcode": 99, + "Name": "ProfilePoint", + "OperandTypes": [ + "UInt16" + ], + "IsJump": false + }, + { + "Opcode": 100, + "Name": "CreateClosure", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt16" + ], + "IsJump": false, + "AbstractDefinition": 18 + }, + { + "Opcode": 101, + "Name": "CreateClosureLongIndex", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt32" + ], + "IsJump": false, + "AbstractDefinition": 18 + }, + { + "Opcode": 102, + "Name": "CreateGeneratorClosure", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt16" + ], + "IsJump": false, + "AbstractDefinition": 19 + }, + { + "Opcode": 103, + "Name": "CreateGeneratorClosureLongIndex", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt32" + ], + "IsJump": false, + "AbstractDefinition": 19 + }, + { + "Opcode": 104, + "Name": "CreateAsyncClosure", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt16" + ], + "IsJump": false, + "AbstractDefinition": 20 + }, + { + "Opcode": 105, + "Name": "CreateAsyncClosureLongIndex", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt32" + ], + "IsJump": false, + "AbstractDefinition": 20 + }, + { + "Opcode": 106, + "Name": "CreateThis", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 107, + "Name": "SelectObject", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 108, + "Name": "LoadParam", + "OperandTypes": [ + "Reg8", + "UInt8" + ], + "IsJump": false, + "AbstractDefinition": 21 + }, + { + "Opcode": 109, + "Name": "LoadParamLong", + "OperandTypes": [ + "Reg8", + "UInt32" + ], + "IsJump": false, + "AbstractDefinition": 21 + }, + { + "Opcode": 110, + "Name": "LoadConstUInt8", + "OperandTypes": [ + "Reg8", + "UInt8" + ], + "IsJump": false + }, + { + "Opcode": 111, + "Name": "LoadConstInt", + "OperandTypes": [ + "Reg8", + "Imm32" + ], + "IsJump": false + }, + { + "Opcode": 112, + "Name": "LoadConstDouble", + "OperandTypes": [ + "Reg8", + "Double" + ], + "IsJump": false + }, + { + "Opcode": 113, + "Name": "LoadConstBigInt", + "OperandTypes": [ + "Reg8", + "UInt16" + ], + "IsJump": false, + "AbstractDefinition": 22 + }, + { + "Opcode": 114, + "Name": "LoadConstBigIntLongIndex", + "OperandTypes": [ + "Reg8", + "UInt32" + ], + "IsJump": false, + "AbstractDefinition": 22 + }, + { + "Opcode": 115, + "Name": "LoadConstString", + "OperandTypes": [ + "Reg8", + "UInt16S" + ], + "IsJump": false, + "AbstractDefinition": 23 + }, + { + "Opcode": 116, + "Name": "LoadConstStringLongIndex", + "OperandTypes": [ + "Reg8", + "UInt32S" + ], + "IsJump": false, + "AbstractDefinition": 23 + }, + { + "Opcode": 117, + "Name": "LoadConstEmpty", + "OperandTypes": [ + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 118, + "Name": "LoadConstUndefined", + "OperandTypes": [ + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 119, + "Name": "LoadConstNull", + "OperandTypes": [ + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 120, + "Name": "LoadConstTrue", + "OperandTypes": [ + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 121, + "Name": "LoadConstFalse", + "OperandTypes": [ + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 122, + "Name": "LoadConstZero", + "OperandTypes": [ + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 123, + "Name": "CoerceThisNS", + "OperandTypes": [ + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 124, + "Name": "LoadThisNS", + "OperandTypes": [ + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 125, + "Name": "ToNumber", + "OperandTypes": [ + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 126, + "Name": "ToNumeric", + "OperandTypes": [ + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 127, + "Name": "ToInt32", + "OperandTypes": [ + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 128, + "Name": "AddEmptyString", + "OperandTypes": [ + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 129, + "Name": "GetArgumentsPropByVal", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 130, + "Name": "GetArgumentsLength", + "OperandTypes": [ + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 131, + "Name": "ReifyArguments", + "OperandTypes": [ + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 132, + "Name": "CreateRegExp", + "OperandTypes": [ + "Reg8", + "UInt32S", + "UInt32S", + "UInt32" + ], + "IsJump": false + }, + { + "Opcode": 133, + "Name": "SwitchImm", + "OperandTypes": [ + "Reg8", + "UInt32", + "Addr32", + "UInt32", + "UInt32" + ], + "IsJump": false + }, + { + "Opcode": 134, + "Name": "StartGenerator", + "OperandTypes": [], + "IsJump": false + }, + { + "Opcode": 135, + "Name": "ResumeGenerator", + "OperandTypes": [ + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 136, + "Name": "CompleteGenerator", + "OperandTypes": [], + "IsJump": false + }, + { + "Opcode": 137, + "Name": "CreateGenerator", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt16" + ], + "IsJump": false, + "AbstractDefinition": 24 + }, + { + "Opcode": 138, + "Name": "CreateGeneratorLongIndex", + "OperandTypes": [ + "Reg8", + "Reg8", + "UInt32" + ], + "IsJump": false, + "AbstractDefinition": 24 + }, + { + "Opcode": 139, + "Name": "IteratorBegin", + "OperandTypes": [ + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 140, + "Name": "IteratorNext", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 141, + "Name": "IteratorClose", + "OperandTypes": [ + "Reg8", + "UInt8" + ], + "IsJump": false + }, + { + "Opcode": 142, + "Name": "Jmp", + "OperandTypes": [ + "Addr8" + ], + "IsJump": true, + "AbstractDefinition": 25 + }, + { + "Opcode": 143, + "Name": "JmpLong", + "OperandTypes": [ + "Addr32" + ], + "IsJump": true, + "AbstractDefinition": 25 + }, + { + "Opcode": 144, + "Name": "JmpTrue", + "OperandTypes": [ + "Addr8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 26 + }, + { + "Opcode": 145, + "Name": "JmpTrueLong", + "OperandTypes": [ + "Addr32", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 26 + }, + { + "Opcode": 146, + "Name": "JmpFalse", + "OperandTypes": [ + "Addr8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 27 + }, + { + "Opcode": 147, + "Name": "JmpFalseLong", + "OperandTypes": [ + "Addr32", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 27 + }, + { + "Opcode": 148, + "Name": "JmpUndefined", + "OperandTypes": [ + "Addr8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 28 + }, + { + "Opcode": 149, + "Name": "JmpUndefinedLong", + "OperandTypes": [ + "Addr32", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 28 + }, + { + "Opcode": 150, + "Name": "SaveGenerator", + "OperandTypes": [ + "Addr8" + ], + "IsJump": true, + "AbstractDefinition": 29 + }, + { + "Opcode": 151, + "Name": "SaveGeneratorLong", + "OperandTypes": [ + "Addr32" + ], + "IsJump": true, + "AbstractDefinition": 29 + }, + { + "Opcode": 152, + "Name": "JLess", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 30 + }, + { + "Opcode": 153, + "Name": "JLessLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 30 + }, + { + "Opcode": 154, + "Name": "JNotLess", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 31 + }, + { + "Opcode": 155, + "Name": "JNotLessLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 31 + }, + { + "Opcode": 156, + "Name": "JLessN", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 32 + }, + { + "Opcode": 157, + "Name": "JLessNLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 32 + }, + { + "Opcode": 158, + "Name": "JNotLessN", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 33 + }, + { + "Opcode": 159, + "Name": "JNotLessNLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 33 + }, + { + "Opcode": 160, + "Name": "JLessEqual", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 34 + }, + { + "Opcode": 161, + "Name": "JLessEqualLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 34 + }, + { + "Opcode": 162, + "Name": "JNotLessEqual", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 35 + }, + { + "Opcode": 163, + "Name": "JNotLessEqualLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 35 + }, + { + "Opcode": 164, + "Name": "JLessEqualN", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 36 + }, + { + "Opcode": 165, + "Name": "JLessEqualNLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 36 + }, + { + "Opcode": 166, + "Name": "JNotLessEqualN", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 37 + }, + { + "Opcode": 167, + "Name": "JNotLessEqualNLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 37 + }, + { + "Opcode": 168, + "Name": "JGreater", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 38 + }, + { + "Opcode": 169, + "Name": "JGreaterLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 38 + }, + { + "Opcode": 170, + "Name": "JNotGreater", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 39 + }, + { + "Opcode": 171, + "Name": "JNotGreaterLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 39 + }, + { + "Opcode": 172, + "Name": "JGreaterN", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 40 + }, + { + "Opcode": 173, + "Name": "JGreaterNLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 40 + }, + { + "Opcode": 174, + "Name": "JNotGreaterN", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 41 + }, + { + "Opcode": 175, + "Name": "JNotGreaterNLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 41 + }, + { + "Opcode": 176, + "Name": "JGreaterEqual", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 42 + }, + { + "Opcode": 177, + "Name": "JGreaterEqualLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 42 + }, + { + "Opcode": 178, + "Name": "JNotGreaterEqual", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 43 + }, + { + "Opcode": 179, + "Name": "JNotGreaterEqualLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 43 + }, + { + "Opcode": 180, + "Name": "JGreaterEqualN", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 44 + }, + { + "Opcode": 181, + "Name": "JGreaterEqualNLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 44 + }, + { + "Opcode": 182, + "Name": "JNotGreaterEqualN", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 45 + }, + { + "Opcode": 183, + "Name": "JNotGreaterEqualNLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 45 + }, + { + "Opcode": 184, + "Name": "JEqual", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 46 + }, + { + "Opcode": 185, + "Name": "JEqualLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 46 + }, + { + "Opcode": 186, + "Name": "JNotEqual", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 47 + }, + { + "Opcode": 187, + "Name": "JNotEqualLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 47 + }, + { + "Opcode": 188, + "Name": "JStrictEqual", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 48 + }, + { + "Opcode": 189, + "Name": "JStrictEqualLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 48 + }, + { + "Opcode": 190, + "Name": "JStrictNotEqual", + "OperandTypes": [ + "Addr8", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 49 + }, + { + "Opcode": 191, + "Name": "JStrictNotEqualLong", + "OperandTypes": [ + "Addr32", + "Reg8", + "Reg8" + ], + "IsJump": true, + "AbstractDefinition": 49 + }, + { + "Opcode": 192, + "Name": "Add32", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 193, + "Name": "Sub32", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 194, + "Name": "Mul32", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 195, + "Name": "Divi32", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 196, + "Name": "Divu32", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 197, + "Name": "Loadi8", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 198, + "Name": "Loadu8", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 199, + "Name": "Loadi16", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 200, + "Name": "Loadu16", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 201, + "Name": "Loadi32", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 202, + "Name": "Loadu32", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 203, + "Name": "Store8", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 204, + "Name": "Store16", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + }, + { + "Opcode": 205, + "Name": "Store32", + "OperandTypes": [ + "Reg8", + "Reg8", + "Reg8" + ], + "IsJump": false + } + ], + "AbstractDefinitions": [ + { + "Name": "NewObjectWithBuffer", + "VariantOpcodes": [ + 1, + 2 + ] + }, + { + "Name": "NewArrayWithBuffer", + "VariantOpcodes": [ + 5, + 6 + ] + }, + { + "Name": "Mov", + "VariantOpcodes": [ + 8, + 9 + ] + }, + { + "Name": "StoreToEnvironment", + "VariantOpcodes": [ + 42, + 43 + ] + }, + { + "Name": "StoreNPToEnvironment", + "VariantOpcodes": [ + 44, + 45 + ] + }, + { + "Name": "LoadFromEnvironment", + "VariantOpcodes": [ + 46, + 47 + ] + }, + { + "Name": "GetById", + "VariantOpcodes": [ + 55, + 54, + 56 + ] + }, + { + "Name": "TryGetById", + "VariantOpcodes": [ + 57, + 58 + ] + }, + { + "Name": "PutById", + "VariantOpcodes": [ + 59, + 60 + ] + }, + { + "Name": "TryPutById", + "VariantOpcodes": [ + 61, + 62 + ] + }, + { + "Name": "PutNewOwnById", + "VariantOpcodes": [ + 64, + 63, + 65 + ] + }, + { + "Name": "PutNewOwnNEById", + "VariantOpcodes": [ + 66, + 67 + ] + }, + { + "Name": "PutOwnByIndex", + "VariantOpcodes": [ + 68, + 69 + ] + }, + { + "Name": "DelById", + "VariantOpcodes": [ + 71, + 72 + ] + }, + { + "Name": "Call", + "VariantOpcodes": [ + 79, + 86 + ] + }, + { + "Name": "Construct", + "VariantOpcodes": [ + 80, + 87 + ] + }, + { + "Name": "CallDirect", + "VariantOpcodes": [ + 82, + 88 + ] + }, + { + "Name": "CallBuiltin", + "VariantOpcodes": [ + 89, + 90 + ] + }, + { + "Name": "CreateClosure", + "VariantOpcodes": [ + 100, + 101 + ] + }, + { + "Name": "CreateGeneratorClosure", + "VariantOpcodes": [ + 102, + 103 + ] + }, + { + "Name": "CreateAsyncClosure", + "VariantOpcodes": [ + 104, + 105 + ] + }, + { + "Name": "LoadParam", + "VariantOpcodes": [ + 108, + 109 + ] + }, + { + "Name": "LoadConstBigInt", + "VariantOpcodes": [ + 113, + 114 + ] + }, + { + "Name": "LoadConstString", + "VariantOpcodes": [ + 115, + 116 + ] + }, + { + "Name": "CreateGenerator", + "VariantOpcodes": [ + 137, + 138 + ] + }, + { + "Name": "Jmp", + "VariantOpcodes": [ + 142, + 143 + ] + }, + { + "Name": "JmpTrue", + "VariantOpcodes": [ + 144, + 145 + ] + }, + { + "Name": "JmpFalse", + "VariantOpcodes": [ + 146, + 147 + ] + }, + { + "Name": "JmpUndefined", + "VariantOpcodes": [ + 148, + 149 + ] + }, + { + "Name": "SaveGenerator", + "VariantOpcodes": [ + 150, + 151 + ] + }, + { + "Name": "JLess", + "VariantOpcodes": [ + 152, + 153 + ] + }, + { + "Name": "JNotLess", + "VariantOpcodes": [ + 154, + 155 + ] + }, + { + "Name": "JLessN", + "VariantOpcodes": [ + 156, + 157 + ] + }, + { + "Name": "JNotLessN", + "VariantOpcodes": [ + 158, + 159 + ] + }, + { + "Name": "JLessEqual", + "VariantOpcodes": [ + 160, + 161 + ] + }, + { + "Name": "JNotLessEqual", + "VariantOpcodes": [ + 162, + 163 + ] + }, + { + "Name": "JLessEqualN", + "VariantOpcodes": [ + 164, + 165 + ] + }, + { + "Name": "JNotLessEqualN", + "VariantOpcodes": [ + 166, + 167 + ] + }, + { + "Name": "JGreater", + "VariantOpcodes": [ + 168, + 169 + ] + }, + { + "Name": "JNotGreater", + "VariantOpcodes": [ + 170, + 171 + ] + }, + { + "Name": "JGreaterN", + "VariantOpcodes": [ + 172, + 173 + ] + }, + { + "Name": "JNotGreaterN", + "VariantOpcodes": [ + 174, + 175 + ] + }, + { + "Name": "JGreaterEqual", + "VariantOpcodes": [ + 176, + 177 + ] + }, + { + "Name": "JNotGreaterEqual", + "VariantOpcodes": [ + 178, + 179 + ] + }, + { + "Name": "JGreaterEqualN", + "VariantOpcodes": [ + 180, + 181 + ] + }, + { + "Name": "JNotGreaterEqualN", + "VariantOpcodes": [ + 182, + 183 + ] + }, + { + "Name": "JEqual", + "VariantOpcodes": [ + 184, + 185 + ] + }, + { + "Name": "JNotEqual", + "VariantOpcodes": [ + 186, + 187 + ] + }, + { + "Name": "JStrictEqual", + "VariantOpcodes": [ + 188, + 189 + ] + }, + { + "Name": "JStrictNotEqual", + "VariantOpcodes": [ + 190, + 191 + ] + } + ], + "GitCommitHash": "2afc7b09ffc74201b4dd530d9414b48e61a5196f" +} \ No newline at end of file diff --git a/hasmer/libhasmer/Resources/HasmTokenDefinitions.json b/hasmer/libhasmer/Resources/HasmTokenDefinitions.json new file mode 100644 index 0000000..92287b3 --- /dev/null +++ b/hasmer/libhasmer/Resources/HasmTokenDefinitions.json @@ -0,0 +1,363 @@ +{ + "Header": [ + { + "Kind": "literal", + "Match": ".hasm" + }, + { + "Kind": "integer", + "Var": "version" + }, + { + "Kind": "enum", + "Match": [ + "exact", + "auto" + ], + "Var": "mode" + } + ], + "Register": [ + { + "Modifier": "contiguous" + }, + { + "Kind": "literal", + "Match": "r" + }, + { + "Kind": "integer", + "Var": "reg" + } + ], + "Label": [ + { + "Modifier": "contiguous" + }, + { + "Kind": "enum", + "Match": [ + "A", + "K", + "V", + "L" + ], + "Var": "kind" + }, + { + "Kind": "integer", + "Var": "index" + }, + { + "Optional": true, + "Match": [ + { + "Kind": "integer", + "Var": "value" + } + ], + "Var": "offset" + } + ], + "Literal": [ + { + "Kind": "or", + "Match": [ + { + "Kind": "string" + }, + { + "Kind": "integer" + }, + { + "Kind": "number" + }, + { + "Kind": "enum", + "Match": ["true", "false"] + }, + { + "Kind": "literal", + "Match": "null" + } + ] + } + ], + "Operand": [ + { + "Kind": "or", + "Match": [ + { + "Kind": "string" + }, + { + "Kind": "ident" + }, + { + "Kind": "integer" + }, + { + "Kind": "number" + }, + { + "Kind": "$Register" + }, + { + "Kind": "$Label" + } + ] + } + ], + "DatumElements": [ + { + "Kind": "literal", + "Match": "{" + }, + { + "Modifier": "move" + }, + { + "Repeated": true, + "Optional": true, + "Match": [ + { + "Kind": "$Literal", + "Var": "elements" + }, + { + "Kind": "literal", + "Match": "," + } + ] + }, + { + "Kind": "literal", + "Match": "}" + } + ], + "Datum": [ + { + "Kind": "literal", + "Match": ".data", + "Var": "decl" + }, + { + "Kind": "$Label", + "Var": "label" + }, + { + "Kind": "enum", + "Match": [ + "String", + "Integer", + "Number", + "Null", + "True", + "False" + ], + "Var": "kind" + }, + { + "Kind": "literal", + "Match": "[" + }, + { + "Optional": true, + "Kind": "integer", + "Var": "length" + }, + { + "Kind": "literal", + "Match": "]" + }, + { + "Optional": true, + "Kind": "$DatumElements", + "Var": "elements" + } + + ], + "DirectiveID": [ + { + "Kind": "literal", + "Match": ".id" + }, + { + "Kind": "integer", + "Var": "n" + } + ], + "DirectiveParams": [ + { + "Kind": "literal", + "Match": ".params" + }, + { + "Kind": "integer", + "Var": "n" + } + ], + "DirectiveRegisters": [ + { + "Kind": "literal", + "Match": ".registers" + }, + { + "Kind": "integer", + "Var": "n" + } + ], + "DirectiveSymbols": [ + { + "Kind": "literal", + "Match": ".symbols" + }, + { + "Kind": "integer", + "Var": "n" + } + ], + "DirectiveStrict": [ + { + "Kind": "literal", + "Match": ".strict" + } + ], + "DirectiveLabel": [ + { + "Kind": "literal", + "Match": ".label" + }, + { + "Kind": "$Label", + "Var": "label" + } + ], + "Directive": [ + { + "Kind": "$DirectiveID" + }, + { + "Kind": "$DirectiveParams" + }, + { + "Kind": "$DirectiveRegisters" + }, + { + "Kind": "$DirectiveSymbols" + }, + { + "Kind": "$DirectiveStrict" + }, + { + "Kind": "$DirectiveLabel" + } + ], + "Instruction": [ + { + "Kind": "word", + "Var": "name" + }, + { + "Repeated": true, + "Optional": true, + "Match": [ + { + "Kind": "$Operand", + "Var": "operands" + }, + { + "Kind": "literal", + "Match": "," + } + ] + }, + { + "Optional": true, + "Kind": "$Operand", + "Var": "operands" + } + ], + "Function": [ + { + "Kind": "literal", + "Match": ".start" + }, + { + "Kind": "enum", + "Match": ["Function", "Constructor", "NSFunction"], + "Var": "kind" + }, + { + "Kind": "ident", + "Var": "name" + }, + { + "Kind": "literal", + "Match": "(" + }, + { + "Repeated": true, + "Optional": true, + "Match": [ + { + "Kind": "$Register", + "Var": "params" + }, + { + "Kind": "literal", + "Match": "," + } + ] + }, + { + "Optional": true, + "Kind": "$Register", + "Var": "params" + }, + { + "Kind": "literal", + "Match": ")" + }, + { + "Repeated": true, + "Optional": true, + "Match": [ + { + "Kind": "or", + "Match": [ + { + "Kind": "$Directive" + }, + { + "Kind": "$Instruction" + } + ] + } + ], + "Var": "body" + }, + { + "Kind": "literal", + "Match": ".end" + } + ], + "Program": [ + { + "Kind": "$Header", + "Var": "header" + }, + { + "Optional": true, + "Repeated": true, + "Kind": "$Datum", + "Var": "data" + }, + { + "Optional": true, + "Repeated": true, + "Kind": "$Function", + "Var": "funcs" + } + ] +} \ No newline at end of file diff --git a/hasmer/libhasmer/libhasmer.csproj b/hasmer/libhasmer/libhasmer.csproj index f6539d7..b0cf737 100644 --- a/hasmer/libhasmer/libhasmer.csproj +++ b/hasmer/libhasmer/libhasmer.csproj @@ -2,7 +2,7 @@ Library - net5.0 + net8.0 Hasmer libhasmer @@ -55,7 +55,18 @@ + + + + + + + + + + +
@@ -106,7 +117,18 @@ + + + + + + + + + + +