Package objot.bytecode

Examples of objot.bytecode.Procedure


    targetName = Bytecode.utf(target.getName() + ".");
    y = y_;
    cons = y.cons;
    clazzCi = cons.addClass(target);
    ao = ao_;
    wp = new Procedure(cons);
    wo = new Code(cons, ao.bytes, ao.beginBi);
    wp.setCode(wo);
  }
View Full Code Here


    Clazz.class, "encode")));

  private static void makeEncodeRefs(Bytecode y, Property[] es, int classCi, int encsCi,
    int ableCi)
  {
    Procedure p = new Procedure(y.cons);
    p.setModifier(Mod2.PROTECTED | Mod2.FINAL);
    p.setNameCi(p.cons.addUtf(NAME_encodeRefs));
    p.setDescCi(p.cons.addUtf(DESC_encodeRefs));
    Instruction s = new Instruction(p.cons, 250);
    s.ins0(ALOAD2);
    s.insU2(CHECKCAST, classCi);
    s.insU1(ASTORE, 4); // object
    s.ins0(ALOAD0);
    s.insU2(GETFIELD, encsCi); // properties
    int refsCi = p.cons.addProc(Encoder.M_refs);
    Property e;
    for (int i = 0; i < es.length; i++)
      if ( !(e = es[i]).cla.isPrimitive() && !Number.class.isAssignableFrom(e.cla)
        && e.cla != Boolean.class)
      {
        s.ins0(DUP);
        s.insS2(SIPUSH, i);
        s.ins0(AALOAD); // property
        s.ins0(ALOAD2);
        s.ins0(ALOAD3);
        s.insU2(INVOKEVIRTUAL, ableCi);
        int if0 = s.insJump(IFIE0);
        s.ins0(ALOAD1);
        s.insU1(ALOAD, 4); // object
        if (e.field != null)
          s.insU2(GETFIELD, p.cons.addField(e.field));
        else
          s.insU2(INVOKEVIRTUAL, p.cons.addProc(e.method));
        s.insU2(INVOKEVIRTUAL, refsCi);
        s.jumpHere(if0);
      }
    s.ins0(RETURN);
    p.getCode().setIns(s, false);
    p.getCode().setLocalN(5);
    p.getCode().setStackN(4);
    y.getProcs().addProc(p);
  }
View Full Code Here

    "doubleValue");

  private static void makeEncode(Bytecode y, Property[] es, int classCi, int encsCi,
    int ableCi, int nameCi)
  {
    Procedure p = new Procedure(y.cons);
    p.setModifier(Mod2.PROTECTED | Mod2.FINAL);
    p.setNameCi(p.cons.addUtf(NAME_encode));
    p.setDescCi(p.cons.addUtf(DESC_encode));
    Instruction s = new Instruction(y.cons, 250);
    s.ins0(ALOAD2);
    s.insU2(CHECKCAST, classCi);
    s.insU1(ASTORE, 4); // object
    s.ins0(ALOAD0);
    s.insU2(GETFIELD, encsCi); // properties
    int intCi = p.cons.addProc(Encoder.M_valueInt);
    int longCi = p.cons.addProc(Encoder.M_valueLong);
    int boolCi = p.cons.addProc(Encoder.M_valueBool);
    int floatCi = p.cons.addProc(Encoder.M_valueFloat);
    int doubleCi = p.cons.addProc(Encoder.M_valueDouble);
    int objCi = p.cons.addProc(Encoder.M_valueObject);
    int intVCi = p.cons.addProc(M_intValue);
    int byteVCi = p.cons.addProc(M_byteValue);
    int shortVCi = p.cons.addProc(M_shortValue);
    int longVCi = p.cons.addProc(M_longValue);
    int boolVCi = p.cons.addProc(M_boolValue);
    int floatVCi = p.cons.addProc(M_floatValue);
    int doubleVCi = p.cons.addProc(M_doubleValue);
    Property e;
    for (int i = 0; i < es.length; i++)
    {
      s.ins0(DUP);
      s.insS2(SIPUSH, i);
      s.ins0(AALOAD); // property
      s.ins0(DUP); // property
      s.insU1(ASTORE, 5); // property
      s.ins0(ALOAD2);
      s.ins0(ALOAD3);
      s.insU2(INVOKEVIRTUAL, ableCi);
      int if0 = s.insJump(IFIE0);
      s.ins0(ALOAD1);
      s.insU1(ALOAD, 5); // property
      s.insU2(GETFIELD, nameCi);
      s.insU1(ALOAD, 4); // object
      if ((e = es[i]).field != null)
        s.insU2(GETFIELD, p.cons.addField(e.field));
      else
        s.insU2(INVOKEVIRTUAL, p.cons.addProc(e.method));
      if (e.cla == int.class || e.cla == byte.class || e.cla == short.class)
        s.insU2(INVOKEVIRTUAL, intCi);
      else if (e.cla == long.class)
        s.insU2(INVOKEVIRTUAL, longCi);
      else if (e.cla == boolean.class)
        s.insU2(INVOKEVIRTUAL, boolCi);
      else if (e.cla == float.class)
        s.insU2(INVOKEVIRTUAL, floatCi);
      else if (e.cla == double.class)
        s.insU2(INVOKEVIRTUAL, doubleCi);
      else if (e.cla == Integer.class)
      {
        s.insU2(INVOKEVIRTUAL, intVCi);
        s.insU2(INVOKEVIRTUAL, intCi);
      }
      else if (e.cla == Byte.class)
      {
        s.insU2(INVOKEVIRTUAL, byteVCi);
        s.insU2(INVOKEVIRTUAL, intCi);
      }
      else if (e.cla == Short.class)
      {
        s.insU2(INVOKEVIRTUAL, shortVCi);
        s.insU2(INVOKEVIRTUAL, intCi);
      }
      else if (e.cla == Long.class)
      {
        s.insU2(INVOKEVIRTUAL, longVCi);
        s.insU2(INVOKEVIRTUAL, longCi);
      }
      else if (e.cla == Boolean.class)
      {
        s.insU2(INVOKEVIRTUAL, boolVCi);
        s.insU2(INVOKEVIRTUAL, boolCi);
      }
      else if (e.cla == Float.class)
      {
        s.insU2(INVOKEVIRTUAL, floatVCi);
        s.insU2(INVOKEVIRTUAL, floatCi);
      }
      else if (e.cla == Double.class)
      {
        s.insU2(INVOKEVIRTUAL, doubleVCi);
        s.insU2(INVOKEVIRTUAL, doubleCi);
      }
      else
        s.insU2(INVOKEVIRTUAL, objCi);
      s.jumpHere(if0);
    }
    s.ins0(RETURN);
    p.getCode().setIns(s, false);
    p.getCode().setLocalN(6);
    p.getCode().setStackN(5);
    y.getProcs().addProc(p);
  }
View Full Code Here

  static final Bytes DESC_object = Bytecode.utf(Class2.descript(Class2.declaredMethod1(
    Clazz.class, "object")));

  private static void makeObject(Bytecode y, int classCi)
  {
    Procedure p = new Procedure(y.cons);
    p.setModifier(Mod2.PROTECTED | Mod2.FINAL);
    p.setNameCi(p.cons.addUtf(NAME_object));
    p.setDescCi(p.cons.addUtf(DESC_object));
    Instruction s = new Instruction(p.cons, 250);
    s.insU2(NEW, classCi);
    s.ins0(DUP);
    s.insU2(INVOKESPECIAL, p.cons.addCtor0(classCi));
    s.ins0(ARETURN);
    p.getCode().setIns(s, false);
    p.getCode().setLocalN(2);
    p.getCode().setStackN(2);
    y.getProcs().addProc(p);
  }
View Full Code Here

  static final Bytes DESC_decodeD = Bytecode.utf(Class2.descript( //
  Class2.declaredMethod(Clazz.class, "decode", Object.class, int.class, double.class)));

  private static void makeDecode(Bytecode y, Property[] ds, int classCi, int type)
  {
    Procedure p = new Procedure(y.cons);
    p.setModifier(Mod2.PROTECTED | Mod2.FINAL);
    p.setNameCi(p.cons.addUtf(NAME_decode));
    p.setDescCi(p.cons.addUtf(type == 0 ? DESC_decode : type == 1 ? DESC_decodeL
      : DESC_decodeD));
    Instruction s = new Instruction(p.cons, 250);
    s.ins0(ALOAD1);
    s.insU2(CHECKCAST, classCi); // object
    s.ins0(type == 0 ? ALOAD3 : type == 1 ? LLOAD3 : DLOAD3);
    s.ins0(ILOAD2);
    long sw = s.insSwitchTable(0, ds.length - 1);
    int sw0 = s.addr; // default
    s.switchTableHere(sw, -1);
    int exCi = p.cons.addClass(ClassCastException.class);
    s.insU2(NEW, exCi);
    s.ins0(DUP);
    s.insU2(INVOKESPECIAL, p.cons.addCtor0(exCi));
    s.ins0(ATHROW);
    Property d;
    for (int i = 0; i < ds.length && (d = ds[i]) != null; i++)
      if (type == 0 ? d.cla.isPrimitive() && d.cla != boolean.class //
      : type == 1 ? d.cla != int.class && d.cla != long.class //
      : d.cla != double.class && d.cla != float.class)
        s.switchTable(sw, i, sw0);
      else
      {
        s.switchTableHere(sw, i);
        if (type == 0)
          if (d.cla == boolean.class)
            s.insUnboxNarrow(d.cla);
          else
            s.insU2(CHECKCAST, p.cons.addClass(d.cla));
        else if (type == 1 && d.cla == int.class)
          s.ins0(L2I);
        else if (type == 2 && d.cla == float.class)
          s.ins0(D2F);
        if (d.field != null)
          s.insU2(PUTFIELD, p.cons.addField(d.field));
        else
          s.insU2(INVOKEVIRTUAL, p.cons.addProc(d.method));
        s.ins0(RETURN);
      }
    p.getCode().setIns(s, false);
    p.getCode().setLocalN(5);
    p.getCode().setStackN(5);
    y.getProcs().addProc(p);
  }
View Full Code Here

      }
  }

  private void makeCreate()
  {
    Procedure p = new Procedure(cons);
    p.setModifier(Mod2.FINAL);
    p.setNameCi(cons.getCprocName(createCi));
    p.setDescCi(cons.getCprocDesc(createCi));
    Instruction s = new Instruction(cons, 250);
    s.insU2(NEW, y.head.getClassCi());
    s.ins0(DUP);
    s.insU2(INVOKESPECIAL, cons.addCproc(y.head.getClassCi(), //
      cons.addNameDesc(y.getProcs().getProc(0).getNameCi(), //
        y.getProcs().getProc(0).getDescCi())));
    s.ins0(DUP);
    s.ins0(DUP); // new, new
    s.ins0(ALOAD1);
    s.ins0(DUP);
    int j = s.insJump(IFNOTNULL);
    s.ins0(POP);
    s.insU2(GETSTATIC, cons.addField(Container.F_null));
    s.jumpHere(j);
    s.insU2(PUTFIELD, parentCi);
    if ( !lazy)
      for (int i = 1; i < csn; i++)
        if (cs[i].mode == Single.class && cs[i].cla != Container.class)
        {
          s.ins0(DUP);
          s.insS2(SIPUSH, i);
          s.insU2(INVOKEVIRTUAL, get0Ci);
          s.ins0(POP);
        }

    s.ins0(ARETURN);
    p.getCode().setIns(s, false);
    p.getCode().setLocalN(2);
    p.getCode().setStackN(5);
    y.getProcs().addProc(p);
  }
View Full Code Here

    throw new AssertionError();
  }

  private void makeIndex()
  {
    Procedure p = new Procedure(cons);
    p.setModifier(Mod2.FINAL);
    p.setNameCi(cons.getCprocName(indexCi));
    p.setDescCi(cons.getCprocDesc(indexCi));
    Instruction s = new Instruction(cons, 500);
    s.ins0(ALOAD1); // class
    s.ins0(DUP); // class
    s.insU2(INVOKEVIRTUAL, cons.addProc(M_hashCode)); // hash code
    s.insS1(BIPUSH, 31);
    s.ins0(IREM);
    long sw = s.insSwitchTable(0, 30);
    for (int i = 0; i < 31; i++)
    {
      s.switchTableHere(sw, i);
      for (int j = 1; j < cs.length; j++)
        if (cs[j].cla.hashCode() % 31 == i)
        {
          s.ins0(DUP); // class
          s.insU2(LDCW, cCis[j] = cons.addClass(cs[j].cla));
          s.insS2(IFAN, 7);
          s.insS2(SIPUSH, index(j));
          s.ins0(IRETURN);
        }
      s.ins0(ICONST0);
      s.ins0(IRETURN);
    }
    s.switchTableHere(sw, -1);
    s.ins0(ICONST0);
    s.ins0(IRETURN);
    p.getCode().setIns(s, false);
    p.getCode().setLocalN(2);
    p.getCode().setStackN(3);
    y.getProcs().addProc(p);
  }
View Full Code Here

    y.getProcs().addProc(p);
  }

  private void makeGet0()
  {
    Procedure p = new Procedure(cons);
    p.setModifier(Mod2.FINAL);
    p.setNameCi(cons.getCprocName(get0Ci));
    p.setDescCi(cons.getCprocDesc(get0Ci));
    int i0 = csn - 1;
    Instruction s = new Instruction(cons, 250);
    s.ins0(ALOAD0); // this
    s.ins0(ILOAD1);
    long sw = s.insSwitchTable( -i0, i0);
    s.switchTableHere(sw, -1);
    s.switchTableHere(sw, i0);
    int sw0 = s.addr;
    s.ins0(ACONSTNULL);
    s.ins0(ARETURN);

    int swObj = s.addr;
    s.insU2(GETSTATIC, ossCi);
    s.ins0(ILOAD1);
    s.ins0(AALOAD);
    s.ins0(ICONST0);
    s.ins0(AALOAD); // oss[i][0]
    s.ins0(ARETURN);
    int swObj_ = s.addr;
    s.insU2(GETSTATIC, ossCi);
    s.ins0(ILOAD1);
    s.ins0(INEG);
    s.ins0(AALOAD);
    s.ins0(ICONST0);
    s.ins0(AALOAD); // oss[-i][0]
    s.ins0(ARETURN);
    int circle = s.addr;
    s.insU2(NEW, cons.addClass(ClassCircularityError.class));
    s.ins0(DUPI);
    s.ins0(SWAP);
    s.insU2(INVOKESPECIAL, cons.addProc(Class2.ctor(ClassCircularityError.class,
      String.class)));
    s.ins0(ATHROW);

    int maxParamN = 0;
    for (int i = 1; i < csn; i++) // always actual bind
    {
      Bind.Clazz c = cs[i];
      maxParamN = Math.max(maxParamN, c.maxParamN);
      if (c.cla == Container.class)
      {
        s.switchTableHere(sw, i0 + i);
        s.switchTable(sw, i0 - i, sw0); // never happen
        s.ins0(ARETURN);
      }
      else if (c.mode == null) // static object
      {
        s.switchTable(sw, i0 + i, oss[i][0] == null ? sw0 : swObj);
        s.switchTable(sw, i0 - i, oss[i][0] == null ? sw0 : swObj_);
      }
      else if (c.t != null) // New and Single
      {
        s.switchTableHere(sw, i0 + i);
        if (c.mode == Single.class)
        {
          s.ins0(DUP);
          s.insU2(GETFIELD, fCis[i]);
          s.ins0(DUP);
          int j = s.insJump(IFNULL);
          s.ins0(ARETURN);
          s.jumpHere(j);
          s.ins0(POP);
        }
        s.switchTableHere(sw, i0 - i);
        s.insU2(NEW, cons.putClass(c.cla));
        s.ins0(DUP);
        int x = 1;
        for (int cb = 0; cb < c.t.ps.length; cb++)
          x = makeGet0_fp(i, s, c.t.ps[cb], oss[i], x);
        s.insU2(INVOKESPECIAL, cons.putProc(c.t.t));
        if (c.mode == Single.class)
        {
          s.ins0(ILOAD1);
          int j = s.insJump(IFIL0);
          if (c.t.ps.length > 0)
          { // never happen if ctor no parameter
            s.ins0(ALOAD0);
            s.insU2(GETFIELD, fCis[i]);
            int jj = s.insJump(IFNULL);
            s.insU2(LDCW, cons.addString(c.cla.getName()));
            s.jump(s.insJump(GOTO), circle);
            s.jumpHere(jj);
          }
          s.ins0(DUP);
          s.ins0(ALOAD0);
          s.ins0(SWAP); // o, this, o
          s.insU2(PUTFIELD, fCis[i]); // single
          s.jumpHere(j);
        }
        for (Bind.FM fm: c.fms)
          if (fm.f != null)
          {
            s.ins0(DUP);
            x = makeGet0_fp(i, s, fm, oss[i], x);
            s.insU2(PUTFIELD, cons.addField(fm.f));
          }
          else
          {
            s.ins0(DUP);
            for (Bind mp: fm.ps)
              x = makeGet0_fp(i, s, mp, oss[i], x);
            s.insU2(INVOKEVIRTUAL, cons.addProc(fm.m));
          }
        s.ins0(ARETURN);
      }
      else if (c.mode == Set.class)
      {
        s.switchTableHere(sw, i0 + i);
        s.switchTableHere(sw, i0 - i);
        s.insU2(GETFIELD, fCis[i]);
        s.ins0(ARETURN);
      }
      else if (c.mode == Parent.class)
      {
        s.switchTableHere(sw, i0 - i);
        s.ins0(DUP);
        s.insU2(GETFIELD, fCis[i]);
        s.ins0(DUP);
        int j = s.insJump(IFNULL);
        s.ins0(ARETURN);
        s.jumpHere(j);
        s.ins0(POP);

        s.switchTableHere(sw, i0 + i);
        int loop = s.addr; // n
        s.insU2(GETFIELD, parentCi); // n
        s.ins0(DUP);
        s.insU2(LDCW, cCis[i]);
        s.insU2(INVOKEVIRTUAL, indexCi); // n, j
        s.ins0(DUP);
        s.ins0(ISTORE2);
        s.jump(s.insJump(IFIE0), loop);
        s.ins0(ILOAD1);
        j = s.insJump(IFIL0);
        s.ins0(ILOAD2);
        s.ins0(INEG); // -j
        s.insU2(INVOKEVIRTUAL, get0Ci); // get0
        s.ins0(ARETURN);
        s.jumpHere(j);

        s.ins0(ILOAD2); // j
        s.insU2(INVOKEVIRTUAL, get0Ci); // get0
        s.ins0(DUP);
        s.ins0(ILOAD2);
        j = s.insJump(IFIL0);
        s.ins0(ALOAD0);
        s.ins0(SWAP); // o, this, o
        s.insU2(PUTFIELD, fCis[i]); // cache
        s.ins0(ARETURN);
        s.jumpHere(j);
        s.ins0(ARETURN);
      }
      else
        throw new AssertionError();
    }
    p.getCode().setIns(s, false);
    p.getCode().setLocalN(3);
    p.getCode().setStackN(5 + maxParamN * 2);
    y.getProcs().addProc(p);
  }
 
View Full Code Here

    return x;
  }

  private void makeSet0()
  {
    Procedure p = new Procedure(cons);
    p.setModifier(Mod2.FINAL);
    p.setNameCi(cons.getCprocName(set0Ci));
    p.setDescCi(cons.getCprocDesc(set0Ci));
    int i0 = csn - 1;
    Instruction s = new Instruction(cons, 250);
    s.ins0(ILOAD1); // index
    long sw = s.insSwitchTable( -i0, -1);
    s.switchTableHere(sw, -1);
    int sw0 = s.addr;
    s.ins0(ICONST0);
    s.ins0(IRETURN);
    for (int i = 1; i < csn; i++) // always actual bind
    {
      Bind.Clazz c = cs[i];
      if (c.mode == Set.class)
      {
        s.switchTableHere(sw, i0 - i);
        s.ins0(ALOAD0);
        s.ins0(ALOAD2);
        s.insNarrow(c.box);
        s.insU2(PUTFIELD, fCis[i]);
        s.ins0(ICONST1);
        s.ins0(IRETURN);
      }
      else if (c.mode == Parent.class)
      {
        s.switchTableHere(sw, i0 - i);
        s.ins0(ALOAD0);
        int loop = s.addr; // n
        s.insU2(GETFIELD, parentCi); // n
        s.ins0(DUP);
        s.insU2(LDCW, cCis[i]);
        s.insU2(INVOKEVIRTUAL, indexCi); // n, j
        s.ins0(DUP);
        s.ins0(ISTORE3);
        s.jump(s.insJump(IFIE0), loop);
        s.ins0(ILOAD3); // j
        s.ins0(ALOAD2);
        s.insU2(INVOKEVIRTUAL, set0Ci); // set
        s.ins0(IRETURN);
      }
      else
        s.switchTable(sw, i0 - i, sw0); // other
    }
    p.getCode().setIns(s, false);
    p.getCode().setLocalN(4);
    p.getCode().setStackN(5);
    y.getProcs().addProc(p);
  }
View Full Code Here

TOP

Related Classes of objot.bytecode.Procedure

Copyright © 2018 www.massapicom. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.