| Index: pkg/fletchc/lib/generate_bytecodes.dart
|
| diff --git a/pkg/fletchc/lib/generate_bytecodes.dart b/pkg/fletchc/lib/generate_bytecodes.dart
|
| deleted file mode 100644
|
| index c3423b162ea461df4f378588f3dfe31015ff972b..0000000000000000000000000000000000000000
|
| --- a/pkg/fletchc/lib/generate_bytecodes.dart
|
| +++ /dev/null
|
| @@ -1,247 +0,0 @@
|
| -// Copyright (c) 2015, the Dartino project authors. Please see the AUTHORS file
|
| -// for details. All rights reserved. Use of this source code is governed by a
|
| -// BSD-style license that can be found in the LICENSE.md file.
|
| -
|
| -main() {
|
| - print("""
|
| -// Copyright (c) 2015, the Dartino project authors. Please see the AUTHORS file
|
| -// for details. All rights reserved. Use of this source code is governed by a
|
| -// BSD-style license that can be found in the LICENSE.md file.
|
| -
|
| -// WARNING: Generated file, do not edit!
|
| -
|
| -part of fletch.bytecodes;
|
| -""");
|
| -
|
| - print("enum Opcode {");
|
| - doBytecodes((String name, bool isBranching, String format, int size,
|
| - spDiff, String formatString) {
|
| - print(" $name,");
|
| - });
|
| - print("}");
|
| -
|
| - doBytecodes((String name, bool isBranching, String format, int size,
|
| - spDiff, String formatString) {
|
| - List<String> fields = <String>[];
|
| - List<String> encode = <String>[];
|
| -
|
| - for (int i = 0; i < format.length; i++) {
|
| - String code = format[i];
|
| - switch (code) {
|
| - case "B":
|
| - String field = "uint8Argument$i";
|
| - fields.add(field);
|
| - encode.add(" ..addUint8($field)\n");
|
| - break;
|
| - case "I":
|
| - String field = "uint32Argument$i";
|
| - fields.add(field);
|
| - encode.add(" ..addUint32($field)\n");
|
| - break;
|
| - default:
|
| - throw "Unknown format: $code";
|
| - }
|
| - }
|
| -
|
| - String toStringExpression = formatString;
|
| - if (fields.isNotEmpty) {
|
| - List<String> parts = formatString.split("%d");
|
| - StringBuffer buffer = new StringBuffer();
|
| - Iterator iterator = fields.iterator;
|
| - for (String part in parts) {
|
| - buffer.write(part);
|
| - if (iterator.moveNext()) {
|
| - buffer.write(r'${');
|
| - buffer.write(iterator.current);
|
| - buffer.write('}');
|
| - }
|
| - }
|
| - toStringExpression = '$buffer';
|
| - }
|
| -
|
| - String equals = '';
|
| - if (fields.isNotEmpty) {
|
| - StringBuffer equalsBuffer =
|
| - new StringBuffer('\n\n operator==(Bytecode other) {\n');
|
| - equalsBuffer.writeln(' if (!(super==(other))) return false;');
|
| - equalsBuffer.writeln(' $name rhs = other;');
|
| - for (String field in fields) {
|
| - equalsBuffer.writeln(' if ($field != rhs.$field) return false;');
|
| - }
|
| - equalsBuffer.writeln(' return true;');
|
| - equalsBuffer.write(' }');
|
| - equals = '$equalsBuffer';
|
| - }
|
| -
|
| - String hashCode = '';
|
| - if (fields.isNotEmpty) {
|
| - StringBuffer hashCodeBuffer =
|
| - new StringBuffer('\n\n int get hashCode {\n');
|
| - hashCodeBuffer.writeln(' int value = super.hashCode;');
|
| - for (String field in fields) {
|
| - hashCodeBuffer.writeln(' value += $field;');
|
| - }
|
| - hashCodeBuffer.writeln(' return value;');
|
| - hashCodeBuffer.write(' }');
|
| - hashCode = '$hashCodeBuffer';
|
| - }
|
| -
|
| -print("""
|
| -
|
| -class $name extends Bytecode {
|
| -${
|
| - fields.map((a) => ' final int $a;\n').join('')
|
| -} const $name(${fields.map((a) => 'this.$a').join(', ')})
|
| - : super();
|
| -
|
| - Opcode get opcode => Opcode.$name;
|
| -
|
| - String get name => '$name';
|
| -
|
| - bool get isBranching => $isBranching;
|
| -
|
| - String get format => '$format';
|
| -
|
| - int get size => $size;
|
| -
|
| - int get stackPointerDifference => $spDiff;
|
| -
|
| - String get formatString => '$formatString';
|
| -
|
| - void addTo(Sink<List<int>> sink) {
|
| - new BytecodeBuffer()
|
| - ..addUint8(opcode.index)
|
| -${
|
| - encode.join("")
|
| -} ..sendOn(sink);
|
| - }
|
| -
|
| - String toString() => '$toStringExpression';$equals$hashCode
|
| -}""");
|
| - });
|
| -}
|
| -
|
| -void doBytecodes(V(String name, bool isBranching, String format, int size,
|
| - spDiff, String formatString)) {
|
| - // Code below was copied from src/shared/bytecodes.h.
|
| - var kVarDiff = "VAR_DIFF";
|
| -
|
| - void INVOKE(V, name, diff, desc, suffix, type) {
|
| - V("Invoke${name}${suffix}", true, "I", 5, diff, "invoke ${type}${desc}%d");
|
| - }
|
| -
|
| - void INVOKES_DO(V, suffix, type) {
|
| - INVOKE(V, "Method", kVarDiff, "method ", suffix, type);
|
| - INVOKE(V, "Test", 0, "test ", suffix, type);
|
| -
|
| - INVOKE(V, "Eq", -1, "eq ", suffix, type);
|
| - INVOKE(V, "Lt", -1, "lt ", suffix, type);
|
| - INVOKE(V, "Le", -1, "le ", suffix, type);
|
| - INVOKE(V, "Gt", -1, "gt ", suffix, type);
|
| - INVOKE(V, "Ge", -1, "ge ", suffix, type);
|
| -
|
| - INVOKE(V, "Add", -1, "add ", suffix, type);
|
| - INVOKE(V, "Sub", -1, "sub ", suffix, type);
|
| - INVOKE(V, "Mod", -1, "mod ", suffix, type);
|
| - INVOKE(V, "Mul", -1, "mul ", suffix, type);
|
| - INVOKE(V, "TruncDiv", -1, "trunc div ", suffix, type);
|
| -
|
| - INVOKE(V, "BitNot", 0, "bit not ", suffix, type);
|
| - INVOKE(V, "BitAnd", -1, "bit and ", suffix, type);
|
| - INVOKE(V, "BitOr", -1, "bit or ", suffix, type);
|
| - INVOKE(V, "BitXor", -1, "bit xor ", suffix, type);
|
| - INVOKE(V, "BitShr", -1, "bit shr ", suffix, type);
|
| - INVOKE(V, "BitShl", -1, "bit shl ", suffix, type);
|
| - }
|
| -
|
| - /* Name Branching Format Size SP-diff format-string */
|
| - V("LoadLocal0", false, "", 1, 1, "load local 0");
|
| - V("LoadLocal1", false, "", 1, 1, "load local 1");
|
| - V("LoadLocal2", false, "", 1, 1, "load local 2");
|
| - V("LoadLocal3", false, "", 1, 1, "load local 3");
|
| - V("LoadLocal4", false, "", 1, 1, "load local 4");
|
| - V("LoadLocal5", false, "", 1, 1, "load local 5");
|
| - V("LoadLocal", false, "B", 2, 1, "load local %d");
|
| - V("LoadLocalWide", false, "I", 5, 1, "load local %d");
|
| -
|
| - V("LoadBoxed", false, "B", 2, 1, "load boxed %d");
|
| - V("LoadStatic", false, "I", 5, 1, "load static %d");
|
| - V("LoadStaticInit", false, "I", 5, 1, "load static init %d");
|
| - V("LoadField", false, "B", 2, 0, "load field %d");
|
| - V("LoadFieldWide", false, "I", 5, 0, "load field %d");
|
| -
|
| - V("StoreLocal", false, "B", 2, 0, "store local %d");
|
| - V("StoreBoxed", false, "B", 2, 0, "store boxed %d");
|
| - V("StoreStatic", false, "I", 5, 0, "store static %d");
|
| - V("StoreField", false, "B", 2, -1, "store field %d");
|
| - V("StoreFieldWide", false, "I", 5, -1, "store field %d");
|
| -
|
| - V("LoadLiteralNull", false, "", 1, 1, "load literal null");
|
| - V("LoadLiteralTrue", false, "", 1, 1, "load literal true");
|
| - V("LoadLiteralFalse", false, "", 1, 1, "load literal false");
|
| - V("LoadLiteral0", false, "", 1, 1, "load literal 0");
|
| - V("LoadLiteral1", false, "", 1, 1, "load literal 1");
|
| - V("LoadLiteral", false, "B", 2, 1, "load literal %d");
|
| - // TODO(ahe): The argument to LoadLiteralWide is probably signed.
|
| - V("LoadLiteralWide", false, "I", 5, 1, "load literal %d");
|
| -
|
| - INVOKES_DO(V, "", "");
|
| - INVOKE(V, "Static", kVarDiff, "static ", "", "");
|
| - INVOKE(V, "Factory", kVarDiff, "factory ", "", "");
|
| - V("Allocate", false, "I", 5, kVarDiff, "allocate %d");
|
| - V("AllocateImmutable", false, "I", 5, kVarDiff, "allocateim %d");
|
| -
|
| - V("InvokeNoSuchMethod", true, "I", 5, kVarDiff, "invoke no such method %d");
|
| - V("InvokeTestNoSuchMethod", true, "I", 5, 0, "invoke test no such method %d");
|
| -
|
| - V("InvokeNative", true, "BB", 3, 1, "invoke native %d %d");
|
| - V("InvokeDetachableNative", true, "BB", 3, 1,
|
| - "invoke detachable native %d %d");
|
| - V("InvokeNativeYield", true, "BB", 3, 1, "invoke native yield %d %d");
|
| -
|
| - V("InvokeSelector", true, "I", 5, kVarDiff, "invoke selector");
|
| -
|
| - V("Pop", false, "", 1, -1, "pop");
|
| - V("Drop", false, "B", 2, kVarDiff, "drop %d");
|
| - V("Return", true, "", 1, -1, "return");
|
| - V("ReturnNull", true, "", 1, 0, "return null");
|
| -
|
| - V("BranchWide", true, "I", 5, 0, "branch +%d");
|
| - V("BranchIfTrueWide", true, "I", 5, -1, "branch if true +%d");
|
| - V("BranchIfFalseWide", true, "I", 5, -1, "branch if false +%d");
|
| -
|
| - V("BranchBack", true, "B", 2, 0, "branch -%d");
|
| - V("BranchBackIfTrue", true, "B", 2, -1, "branch if true -%d");
|
| - V("BranchBackIfFalse", true, "B", 2, -1, "branch if false -%d");
|
| -
|
| - V("BranchBackWide", true, "I", 5, 0, "branch -%d");
|
| - V("BranchBackIfTrueWide", true, "I", 5, -1, "branch if true -%d");
|
| - V("BranchBackIfFalseWide", true, "I", 5, -1, "branch if false -%d");
|
| -
|
| - V("PopAndBranchWide", true, "BI", 6, 0, "pop %d and branch +%d");
|
| - V("PopAndBranchBackWide", true, "BI", 6, 0, "pop %d and branch -%d");
|
| -
|
| - V("AllocateBoxed", false, "", 1, 0, "allocate boxed");
|
| -
|
| - V("Negate", false, "", 1, 0, "negate");
|
| -
|
| - V("StackOverflowCheck", true, "I", 5, 0, "stack overflow check %d");
|
| -
|
| - V("Throw", true, "", 1, 0, "throw");
|
| - V("SubroutineCall", true, "II", 9, kVarDiff, "subroutine call +%d -%d");
|
| - V("SubroutineReturn", true, "", 1, -1, "subroutine return");
|
| -
|
| - V("ProcessYield", true, "", 1, 0, "process yield");
|
| - V("CoroutineChange", true, "", 1, -1, "coroutine change");
|
| -
|
| - V("Identical", true, "", 1, -1, "identical");
|
| - V("IdenticalNonNumeric", true, "", 1, -1, "identical non numeric");
|
| -
|
| - V("EnterNoSuchMethod", true, "B", 2, kVarDiff, "enter noSuchMethod +%d");
|
| - V("ExitNoSuchMethod", true, "", 1, -1, "exit noSuchMethod");
|
| -
|
| - INVOKES_DO(V, "Unfold", "unfold ");
|
| - V("LoadConst", false, "I", 5, 1, "load const @%d");
|
| -
|
| - V("MethodEnd", false, "I", 5, 0, "method end %d");
|
| -}
|
|
|