⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 codegeneration.jrag

📁 JDK1.4编译器后端
💻 JRAG
📖 第 1 页 / 共 4 页
字号:
  // emitInvoke  public void MethodDecl.emitInvokeMethod(CodeGeneration gen, TypeDecl hostType) {    if(hostType.isInterfaceDecl()) {      int size = type().variableSize() - 1;      for(int i = 0; i < getNumParameter(); i++)        size -= getParameter(i).type().variableSize();      String classname = hostType.constantPoolName();      String      desc = descName();      String      name = name();      int index = gen.constantPool().addInterfaceMethodref(classname, name, desc);      int numArg = 1; // instance      for(int i = 0; i < getNumParameter(); i++)        numArg += getParameter(i).type().variableSize();      gen.emit(Bytecode.INVOKEINTERFACE, size).add2(index).add(numArg).add(0);    }    else {      String classname = hostType.constantPoolName();      String      desc = descName();      String      name = name();      int index = gen.constantPool().addMethodref(classname, name, desc);      if(isStatic()) {        int size = type().variableSize();        for(int i = 0; i < getNumParameter(); i++)          size -= getParameter(i).type().variableSize();        gen.emit(Bytecode.INVOKESTATIC, size).add2(index);      }      else {        int size = type().variableSize() - 1;        for(int i = 0; i < getNumParameter(); i++)          size -= getParameter(i).type().variableSize();        gen.emit(Bytecode.INVOKEVIRTUAL, size).add2(index);      }    }  }    public void MethodDecl.emitInvokeSpecialMethod(CodeGeneration gen, TypeDecl hostType) {    String classname = hostType.constantPoolName();    String      desc = descName();    String      name = name();    int index = gen.constantPool().addMethodref(classname, name, desc);    int size = type().variableSize() - 1;    for(int i = 0; i < getNumParameter(); i++)      size -= getParameter(i).type().variableSize();    gen.emit(Bytecode.INVOKESPECIAL, size).add2(index);  }  public void ConstructorDecl.emitInvokeConstructor(CodeGeneration gen) {    int size = -1;    for(int i = 0; i < getNumParameter(); i++)      size -= getParameter(i).type().variableSize();    if(hostType().needsEnclosing())      size--;    if(hostType().needsSuperEnclosing()) {      size--;    }    String classname = hostType().constantPoolName();    String      desc = descName();    String      name = "<init>";    int index = gen.constantPool().addMethodref(classname, name, desc);    gen.emit(Bytecode.INVOKESPECIAL, size).add2(index);  }  // emitNew  public void TypeDecl.emitNew(CodeGeneration gen) {    int index = gen.constantPool().addClass(constantPoolName());    gen.emit(Bytecode.NEW).add2(index);  }}aspect CodeGenerationConversions {  void TypeDecl.emitAssignConvTo(CodeGeneration gen, TypeDecl type) {    if(!type.isIntegralType() || !isIntegralType() || type.isLong())      emitCastTo(gen, type);  }    void TypeDecl.emitCastTo(CodeGeneration gen, TypeDecl type) { throw new Error("CastTo not implemented for " + getClass().getName()); }  void ReferenceType.emitCastTo(CodeGeneration gen, TypeDecl type) { if(!instanceOf(type) && !type.isNull()) gen.emitCheckCast(type); }  void IntType.emitCastTo(CodeGeneration gen, TypeDecl type)      { type.intToThis(gen); }  void FloatType.emitCastTo(CodeGeneration gen, TypeDecl type)    { type.floatToThis(gen); }  void DoubleType.emitCastTo(CodeGeneration gen, TypeDecl type)   { type.doubleToThis(gen); }  void LongType.emitCastTo(CodeGeneration gen, TypeDecl type)     { type.longToThis(gen); }  void ByteType.emitCastTo(CodeGeneration gen, TypeDecl type)     { type.byteToThis(gen); }  void ShortType.emitCastTo(CodeGeneration gen, TypeDecl type)    { type.shortToThis(gen); }  void CharType.emitCastTo(CodeGeneration gen, TypeDecl type)     { type.charToThis(gen); }  void BooleanType.emitCastTo(CodeGeneration gen, TypeDecl type)  { }  void NullType.emitCastTo(CodeGeneration gen, TypeDecl type)     { }  void TypeDecl.intToThis(CodeGeneration gen) { throw new Error("intToThis not implemented for " + getClass().getName()); }  void IntType.intToThis(CodeGeneration gen)    { }  void LongType.intToThis(CodeGeneration gen)   { gen.emit(Bytecode.I2L); }  void FloatType.intToThis(CodeGeneration gen)  { gen.emit(Bytecode.I2F); }  void DoubleType.intToThis(CodeGeneration gen) { gen.emit(Bytecode.I2D); }  void ByteType.intToThis(CodeGeneration gen)   { gen.emit(Bytecode.I2B); }  void CharType.intToThis(CodeGeneration gen)   { gen.emit(Bytecode.I2C); }  void ShortType.intToThis(CodeGeneration gen)  { gen.emit(Bytecode.I2S); }  void TypeDecl.floatToThis(CodeGeneration gen) { throw new Error("floatToThis not implemented for " + getClass().getName()); }  void IntType.floatToThis(CodeGeneration gen)    { gen.emit(Bytecode.F2I); }  void ByteType.floatToThis(CodeGeneration gen)   { gen.emit(Bytecode.F2I).emit(Bytecode.I2B); }  void ShortType.floatToThis(CodeGeneration gen)  { gen.emit(Bytecode.F2I).emit(Bytecode.I2S); }  void CharType.floatToThis(CodeGeneration gen)   { gen.emit(Bytecode.F2I).emit(Bytecode.I2C); }  void FloatType.floatToThis(CodeGeneration gen)  { }  void LongType.floatToThis(CodeGeneration gen)   { gen.emit(Bytecode.F2L); }  void DoubleType.floatToThis(CodeGeneration gen) { gen.emit(Bytecode.F2D); }  void TypeDecl.doubleToThis(CodeGeneration gen) { throw new Error("doubleToThis not implemented for " + getClass().getName()); }  void IntType.doubleToThis(CodeGeneration gen)    { gen.emit(Bytecode.D2I); }  void ByteType.doubleToThis(CodeGeneration gen)   { gen.emit(Bytecode.D2I).emit(Bytecode.I2B); }  void ShortType.doubleToThis(CodeGeneration gen)  { gen.emit(Bytecode.D2I).emit(Bytecode.I2S); }  void CharType.doubleToThis(CodeGeneration gen)   { gen.emit(Bytecode.D2I).emit(Bytecode.I2C); }  void FloatType.doubleToThis(CodeGeneration gen)  { gen.emit(Bytecode.D2F); }  void LongType.doubleToThis(CodeGeneration gen)   { gen.emit(Bytecode.D2L); }  void DoubleType.doubleToThis(CodeGeneration gen) { }  void TypeDecl.longToThis(CodeGeneration gen) { throw new Error("longToThis not implemented for " + getClass().getName()); }  void IntType.longToThis(CodeGeneration gen)    { gen.emit(Bytecode.L2I); }  void ByteType.longToThis(CodeGeneration gen)   { gen.emit(Bytecode.L2I).emit(Bytecode.I2B); }  void ShortType.longToThis(CodeGeneration gen)  { gen.emit(Bytecode.L2I).emit(Bytecode.I2S); }  void CharType.longToThis(CodeGeneration gen)   { gen.emit(Bytecode.L2I).emit(Bytecode.I2C); }  void FloatType.longToThis(CodeGeneration gen)  { gen.emit(Bytecode.L2F); }  void LongType.longToThis(CodeGeneration gen)   { }  void DoubleType.longToThis(CodeGeneration gen) { gen.emit(Bytecode.L2D); }  void TypeDecl.byteToThis(CodeGeneration gen) { throw new Error("byteToThis not implemented for " + getClass().getName()); }  void IntegralType.byteToThis(CodeGeneration gen) { }  void CharType.byteToThis(CodeGeneration gen)     { gen.emit(Bytecode.I2C); }  void FloatType.byteToThis(CodeGeneration gen)    { gen.emit(Bytecode.I2F); }  void LongType.byteToThis(CodeGeneration gen)     { gen.emit(Bytecode.I2L); }  void DoubleType.byteToThis(CodeGeneration gen)   { gen.emit(Bytecode.I2D);}    void TypeDecl.charToThis(CodeGeneration gen) { throw new Error("charToThis not implemented for " + getClass().getName()); }  void IntegralType.charToThis(CodeGeneration gen) { }  void ByteType.charToThis(CodeGeneration gen)     { gen.emit(Bytecode.I2B); }  void ShortType.charToThis(CodeGeneration gen)    { gen.emit(Bytecode.I2S); }  void FloatType.charToThis(CodeGeneration gen)    { gen.emit(Bytecode.I2F); }  void LongType.charToThis(CodeGeneration gen)     { gen.emit(Bytecode.I2L); }  void DoubleType.charToThis(CodeGeneration gen)   { gen.emit(Bytecode.I2D);}    void TypeDecl.shortToThis(CodeGeneration gen) { throw new Error("shortToThis not implemented for " + getClass().getName()); }  void IntegralType.shortToThis(CodeGeneration gen) { }  void ByteType.shortToThis(CodeGeneration gen)     { gen.emit(Bytecode.I2B); }  void CharType.shortToThis(CodeGeneration gen)     { gen.emit(Bytecode.I2C); }  void FloatType.shortToThis(CodeGeneration gen)    { gen.emit(Bytecode.I2F); }  void LongType.shortToThis(CodeGeneration gen)     { gen.emit(Bytecode.I2L); }  void DoubleType.shortToThis(CodeGeneration gen)   { gen.emit(Bytecode.I2D); }}aspect CodeGenerationBinaryOperations {  // emit the desired operation on the operand(s) on the stack  void Expr.emitOperation(CodeGeneration gen) {error();}  // unary  void MinusExpr.emitOperation(CodeGeneration gen)  { type().neg(gen); }  void PlusExpr.emitOperation(CodeGeneration gen)   { }  void BitNotExpr.emitOperation(CodeGeneration gen) { type().bitNot(gen); }  void LogNotExpr.emitOperation(CodeGeneration gen) { type().logNot(gen); }  // binary  void AddExpr.emitOperation(CodeGeneration gen) { type().add(gen); }  void SubExpr.emitOperation(CodeGeneration gen) { type().sub(gen); }  void MulExpr.emitOperation(CodeGeneration gen) { type().mul(gen); }  void DivExpr.emitOperation(CodeGeneration gen) { type().div(gen); }  void ModExpr.emitOperation(CodeGeneration gen) { type().rem(gen); }  void LShiftExpr.emitOperation(CodeGeneration gen)     { type().shl(gen); }  void RShiftExpr.emitOperation(CodeGeneration gen)     { type().shr(gen); }  void URShiftExpr.emitOperation(CodeGeneration gen)    { type().ushr(gen); }  void OrBitwiseExpr.emitOperation(CodeGeneration gen)  { type().bitor(gen); }  void AndBitwiseExpr.emitOperation(CodeGeneration gen) { type().bitand(gen); }  void XorBitwiseExpr.emitOperation(CodeGeneration gen) { type().bitxor(gen); }    void TypeDecl.neg(CodeGeneration gen) { error(); }  void IntegralType.neg(CodeGeneration gen) { gen.emit(Bytecode.INEG); }  void LongType.neg(CodeGeneration gen)     { gen.emit(Bytecode.LNEG); }  void FloatType.neg(CodeGeneration gen)    { gen.emit(Bytecode.FNEG); }  void DoubleType.neg(CodeGeneration gen)   { gen.emit(Bytecode.DNEG); }  void TypeDecl.bitNot(CodeGeneration gen) { error(); }  void IntegralType.bitNot(CodeGeneration gen) { gen.emit(Bytecode.ICONST_M1).emit(Bytecode.IXOR); }  void LongType.bitNot(CodeGeneration gen)     { emitPushConstant(gen, -1); gen.emit(Bytecode.LXOR); }  void TypeDecl.logNot(CodeGeneration gen) { error();}  void BooleanType.logNot(CodeGeneration gen) { gen.emit(Bytecode.ICONST_1).emit(Bytecode.IXOR); }  void TypeDecl.add(CodeGeneration gen) {error();}  void LongType.add(CodeGeneration gen) {gen.emit(Bytecode.LADD);}  void FloatType.add(CodeGeneration gen) {gen.emit(Bytecode.FADD);}  void DoubleType.add(CodeGeneration gen) {gen.emit(Bytecode.DADD);}  void IntegralType.add(CodeGeneration gen) {gen.emit(Bytecode.IADD);}  void TypeDecl.sub(CodeGeneration gen) {error();}  void LongType.sub(CodeGeneration gen) {gen.emit(Bytecode.LSUB);}  void FloatType.sub(CodeGeneration gen) {gen.emit(Bytecode.FSUB);}  void DoubleType.sub(CodeGeneration gen) {gen.emit(Bytecode.DSUB);}  void IntegralType.sub(CodeGeneration gen) {gen.emit(Bytecode.ISUB);}  void TypeDecl.mul(CodeGeneration gen) {error();}  void LongType.mul(CodeGeneration gen) {gen.emit(Bytecode.LMUL);}  void FloatType.mul(CodeGeneration gen) {gen.emit(Bytecode.FMUL);}  void DoubleType.mul(CodeGeneration gen) {gen.emit(Bytecode.DMUL);}  void IntegralType.mul(CodeGeneration gen) {gen.emit(Bytecode.IMUL);}  void TypeDecl.div(CodeGeneration gen) {error();}  void LongType.div(CodeGeneration gen) {gen.emit(Bytecode.LDIV);}  void FloatType.div(CodeGeneration gen) {gen.emit(Bytecode.FDIV);}  void DoubleType.div(CodeGeneration gen) {gen.emit(Bytecode.DDIV);}  void IntegralType.div(CodeGeneration gen) {gen.emit(Bytecode.IDIV);}  void TypeDecl.rem(CodeGeneration gen) {error();}  void LongType.rem(CodeGeneration gen) {gen.emit(Bytecode.LREM);}  void FloatType.rem(CodeGeneration gen) {gen.emit(Bytecode.FREM);}  void DoubleType.rem(CodeGeneration gen) {gen.emit(Bytecode.DREM);}  void IntegralType.rem(CodeGeneration gen) {gen.emit(Bytecode.IREM);}  void TypeDecl.shl(CodeGeneration gen) {error();}  void LongType.shl(CodeGeneration gen) {gen.emit(Bytecode.LSHL);}  void IntegralType.shl(CodeGeneration gen) {gen.emit(Bytecode.ISHL);}  void TypeDecl.shr(CodeGeneration gen) {error();}  void LongType.shr(CodeGeneration gen) {gen.emit(Bytecode.LSHR);}  void IntegralType.shr(CodeGeneration gen) {gen.emit(Bytecode.ISHR);}  void TypeDecl.ushr(CodeGeneration gen) {error();}  void LongType.ushr(CodeGeneration gen) {gen.emit(Bytecode.LUSHR);}  void IntegralType.ushr(CodeGeneration gen) {gen.emit(Bytecode.IUSHR);}  void TypeDecl.bitand(CodeGeneration gen) {error();}  void LongType.bitand(CodeGeneration gen) {gen.emit(Bytecode.LAND);}  void IntegralType.bitand(CodeGeneration gen) {gen.emit(Bytecode.IAND);}  void BooleanType.bitand(CodeGeneration gen) {gen.emit(Bytecode.IAND);}  void TypeDecl.bitor(CodeGeneration gen) {error();}  void LongType.bitor(CodeGeneration gen) {gen.emit(Bytecode.LOR);}  void IntegralType.bitor(CodeGeneration gen) {gen.emit(Bytecode.IOR);}  void BooleanType.bitor(CodeGeneration gen) {gen.emit(Bytecode.IOR);}  void TypeDecl.bitxor(CodeGeneration gen) {error();}  void LongType.bitxor(CodeGeneration gen) {gen.emit(Bytecode.LXOR);}  void IntegralType.bitxor(CodeGeneration gen) {gen.emit(Bytecode.IXOR);}  void BooleanType.bitxor(CodeGeneration gen) {gen.emit(Bytecode.IXOR);}}aspect CodeGenerationBranch {  public void TypeDecl.branchLT(CodeGeneration gen, int label) { throw new Error("branchLT not supported for " + getClass().getName()); }  public void DoubleType.branchLT(CodeGeneration gen, int label)   { gen.emit(Bytecode.DCMPG).emitCompare(Bytecode.IFLT, label); }  public void FloatType.branchLT(CodeGeneration gen, int label)    { gen.emit(Bytecode.FCMPG).emitCompare(Bytecode.IFLT, label); }  public void LongType.branchLT(CodeGeneration gen, int label)     { gen.emit(Bytecode.LCMP).emitCompare(Bytecode.IFLT, label); }  public void IntegralType.branchLT(CodeGeneration gen, int label) { gen.emitCompare(Bytecode.IF_ICMPLT, label); }      public void TypeDecl.branchLE(CodeGeneration gen, int label) { throw new Error("branchLE not supported for " + getClass().getName()); }  public void DoubleType.branchLE(CodeGeneration gen, int label)   { gen.emit(Bytecode.DCMPG).emitCompare(Bytecode.IFLE, label); }  public void FloatType.branchLE(CodeGeneration gen, int label)    { gen.emit(Bytecode.FCMPG).emitCompare(Bytecode.IFLE, label); }  public void LongType.branchLE(CodeGeneration gen, int label)     { gen.emit(Bytecode.LCMP).emitCompare(Bytecode.IFLE, label); }  public void IntegralType.branchLE(CodeGeneration gen, int label) { gen.emitCompare(Bytecode.IF_ICMPLE, label); }    public void TypeDecl.branchGE(CodeGeneration gen, int label) { throw new Error("branchGE not supported for " + getClass().getName()); }  public void DoubleType.branchGE(CodeGeneration gen, int label)   { gen.emit(Bytecode.DCMPL).emitCompare(Bytecode.IFGE, label); }  public void FloatType.branchGE(CodeGeneration gen, int label)    { gen.emit(Bytecode.FCMPL).emitCompare(Bytecode.IFGE, label); }  public void LongType.branchGE(CodeGeneration gen, int label)     { gen.emit(Bytecode.LCMP).emitCompare(Bytecode.IFGE, label); }  public void IntegralType.branchGE(CodeGeneration gen, int label) { gen.emitCompare(Bytecode.IF_ICMPGE, label); }    public void TypeDecl.branchGT(CodeGeneration gen, int label) { throw new Error("branchGT not supported for " + getClass().getName()); }  public void DoubleType.branchGT(CodeGeneration gen, int label)   { gen.emit(Bytecode.DCMPL).emitCompare(Bytecode.IFGT, label); }  public void FloatType.branchGT(CodeGeneration gen, int label)    { gen.emit(Bytecode.FCMPL).emitCompare(Bytecode.IFGT, label); }  public void LongType.branchGT(CodeGeneration gen, int label)     { gen.emit(Bytecode.LCMP).emitCompare(Bytecode.IFGT, label); }  public void IntegralType.branchGT(CodeGeneration gen, int label) { gen.emitCompare(Bytecode.IF_ICMPGT, label); }  public void TypeDecl.branchEQ(CodeGeneration gen, int label) { throw new Error("branchEQ not supported for " + getClass().getName()); }  public void DoubleType.branchEQ(CodeGeneration gen, int label)    { gen.emit(Bytecode.DCMPL).emitCompare(Bytecode.IFEQ, label); }  public void FloatType.branchEQ(CodeGeneration gen, int label)     { gen.emit(Bytecode.FCMPL).emitCompare(Bytecode.IFEQ, label); }  public void LongType.branchEQ(CodeGeneration gen, int label)      { gen.emit(Bytecode.LCMP).emitCompare(Bytecode.IFEQ, label); }  public void IntegralType.branchEQ(CodeGeneration gen, int label)  { gen.emitCompare(Bytecode.IF_ICMPEQ, label); }  public void BooleanType.branchEQ(CodeGeneration gen, int label)   { gen.emitCompare(Bytecode.IF_ICMPEQ, label); }  public void ReferenceType.branchEQ(CodeGeneration gen, int label) { gen.emitCompare(Bytecode.IF_ACMPEQ, label); }  public void NullType.branchEQ(CodeGeneration gen, int label)      { gen.emitCompare(Bytecode.IF_ACMPEQ, label); }    public void TypeDecl.branchNE(CodeGeneration gen, int label) { throw new Error("branchNE not supported for " + getClass().getName()); }  public void DoubleType.branchNE(CodeGeneration gen, int label)    { gen.emit(Bytecode.DCMPL).emitCompare(Bytecode.IFNE, label); }  public void FloatType.branchNE(CodeGeneration gen, int label)     { gen.emit(Bytecode.FCMPL).emitCompare(Bytecode.IFNE, label); }  public void LongType.branchNE(CodeGeneration gen, int label)      { gen.emit(Bytecode.LCMP).emitCompare(Bytecode.IFNE, label); }  public void IntegralType.branchNE(CodeGeneration gen, int label)  { gen.emitCompare(Bytecode.IF_ICMPNE, label); }  public void BooleanType.branchNE(CodeGeneration gen, int label)   { gen.emitCompare(Bytecode.IF_ICMPNE, label); }  public void ReferenceType.branchNE(CodeGeneration gen, int label) { gen.emitCompare(Bytecode.IF_ACMPNE, label); }  public void NullType.branchNE(CodeGeneration gen, int label)      { gen.emitCompare(Bytecode.IF_ACMPNE, label); }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -