Package erjang.beam.repr.Operands

Examples of erjang.beam.repr.Operands.DestinationOperand


          switch (code) {
          case fmove:
          case move: {
            Insn.SD insn = (Insn.SD) insn_;
            SourceOperand src = insn.src;
            DestinationOperand dst = insn.dest;

            Type srcType = getType(current, src);

            // Determine type after possible conversion:
            Type dstType = srcType;
            if (dst.testFReg() != null) {
              dstType = Type.DOUBLE_TYPE; // FRegs are always unboxed
            } else if (sizeof(current, src) > sizeof(current, dst)) { // Conversion needed
              if (srcType.equals(Type.DOUBLE_TYPE)) {
                dstType = EDOUBLE_TYPE; // Box
              } else {
                throw new Error("why?" + insn.toSymbolic()
                    + "; srcType="+getType(current,src));
              }
            }

            current = setType(current, dst, dstType);
            continue next_insn;
          }
          case put_string: {
            Insn.ByD insn = (Insn.ByD) insn_;
            DestinationOperand dst = insn.dest;
            current = setType(current, dst, ESEQ_TYPE);
            continue next_insn;
          }

          case jump: {
            Insn.L insn = (Insn.L) insn_;
            current = branch(current, insn.label, insn_idx);
            continue next_insn;

          }

          case send: {
            current.touchx(0, 2);
            current = current.setx(0, current.getx(1), FV.this);
            continue next_insn;
          }

          case fnegate: {
            Insn.LSD insn = (Insn.LSD)insn_;
            EAtom name = insn.opcode().symbol;
            SourceOperand[] parms = new SourceOperand[] {
              insn.src
            };
            Type type = getBifResult("erlang", name.getName(),
                         parmTypes(current, parms), false);
            current = setType(current, insn.dest, type);

            continue next_insn;
          }
          case fadd:
          case fsub:
          case fmul:
          case fdiv:
          {
            Insn.LSSD insn = (Insn.LSSD) insn_;
            EAtom name = insn.opcode().symbol;
            SourceOperand[] parms = new SourceOperand[] {
              insn.src1, insn.src2
            };
            Type type = getBifResult("erlang", name.getName(),
                         parmTypes(current, parms), false);
            current = setType(current, insn.dest, type);

            continue next_insn;
          }

           case gc_bif1:
           case gc_bif2:
           case gc_bif3:
          {
            // {gc_bif,BifName,F,Live,[A1,A2?],Reg};

            Insn.GcBif insn = (Insn.GcBif) insn_;
            boolean is_guard = (insn.label.nr != 0);

            current = branch(current, insn.label, insn_idx);

            EAtom name = insn.ext_fun.fun;
            SourceOperand[] parms = insn.argList();

            Type type = getBifResult("erlang", name.getName(),
                         parmTypes(current, parms), is_guard);

            current = setType(current, insn.dest, type);

            continue next_insn;
          }

          case bif0:
          case bif1:
          case bif2:
          {
            Insn.Bif insn = (Insn.Bif) insn_;
            current = branch(current, insn.label, insn_idx);

            EAtom name = insn.ext_fun.fun;
            SourceOperand[] parms = insn.argList();

            Type type = getBifResult("erlang", name.getName(),
                         parmTypes(current, parms), false);

            current = setType(current, insn.dest, type);

            continue next_insn;
          }


          case is_tuple: {
           
            if (insn_idx+1 < insns.size()) {
            Insn next_insn = insns.get(insn_idx+1);
            if (next_insn.opcode() == BeamOpcode.test_arity) {
             
              if (this.map[insn_idx+1] == null) {
                this.map[insn_idx+1] = this.map[insn_idx];
              }
             
              int this_fail = decode_labelref(((Insn.L)insn_).label, this.map[insn_idx].exh);
              int next_fail = decode_labelref(((Insn.L)next_insn).label, this.map[insn_idx+1].exh);

              if (this_fail == next_fail) {

                Arg this_arg = src_arg(insn_idx, ((Insn.LD)insn_).dest);
                Arg next_arg = src_arg(insn_idx+1, ((Insn.LD)next_insn).dest);

                if (this_arg.equals(next_arg)) {
                  // SKIP THIS INSTRUCTION!                 
                  continue next_insn;
                }
              }
            }
            }
           
          }
           

            // Tests:
            // LS:
          case is_integer:
          case is_float:
          case is_number:
          case is_atom:
          case is_pid:
          case is_reference:
          case is_port:
          case is_nil:
          case is_binary:
          case is_list:
          case is_nonempty_list:
          case is_function:
          case is_boolean:
          case is_bitstr:
            // LSI:
          case test_arity:
          case bs_test_tail2:
          case bs_test_unit:
            // LSS:
          case is_lt:
          case is_ge:
          case is_eq:
          case is_ne:
          case is_eq_exact:
          case is_ne_exact:
          case is_function2:
            // LSBi:
          case bs_match_string:
            // LSII:
          case bs_skip_utf8:
          case bs_skip_utf16:
          case bs_skip_utf32:
            // LSIID:
          case bs_start_match2:
          case bs_get_utf8:
          case bs_get_utf16:
          case bs_get_utf32:
            // LSSII:
          case bs_skip_bits2:
            // LSISIID:
          case bs_get_integer2:
          case bs_get_float2:
          case bs_get_binary2:
          {
            try {
              current = analyze_test(current, (Insn.L)insn_, insn_idx);
            } catch (Error e) {
              throw new Error(" at "
                      + LabeledBlock.this.block_label + ":"
                      + insn_idx, e);
            }
            assert (current != null);
            continue next_insn;
          }

          case fconv: {
            // unbox and convert to DOUBLE
            Insn.SD insn = (Insn.SD) insn_;
            getType(current, insn.src);
            current = setType(current, insn.dest,
                      Type.DOUBLE_TYPE);
            continue next_insn;
          }

          case init: {
            Insn.D insn = (Insn.D) insn_;
            current = setType(current, insn.dest, ENIL_TYPE);
            continue next_insn;
          }

          case set_tuple_element: {
            Insn.SDI insn = (Insn.SDI) insn_;
            getType(current, insn.src);
            getType(current, insn.dest);
            continue next_insn;
          }

          case get_tuple_element: {
            Insn.SID insn = (Insn.SID) insn_;
            getType(current, insn.src);
            current = setType(current, insn.dest, EOBJECT_TYPE);
            continue next_insn;
          }

          case get_list: {
            Insn.SDD insn = (Insn.SDD) insn_;
            current = setType(current, insn.dest1, EOBJECT_TYPE);

            Type list_type = getType(current, insn.src);
            Type tail_type =
              (list_type == ELIST_TYPE || list_type == ESEQ_TYPE)
              ? ESEQ_TYPE : EOBJECT_TYPE;
            current = setType(current, insn.dest2, tail_type);

            continue next_insn;
          }

          case put_list: {
            Insn.SSD insn = (Insn.SSD) insn_;

            Type head_type = getType(current, insn.src1);
            Type tail_type = getType(current, insn.src2);

            if (tail_type == null) {
              throw new Error("value: " + insn.src2.toSymbolic()
                  + " has no type");
            }

            Type list_type = (tail_type.equals(ENIL_TYPE)
                      || tail_type.equals(ESEQ_TYPE)
                      || tail_type.equals(ELIST_TYPE))
              ? ELIST_TYPE : ECONS_TYPE;
            current = setType(current, insn.dest, list_type);

            continue next_insn;
          }

          case put_tuple: {
            Insn.ID insn = (Insn.ID) insn_;
            int arity = insn.i1;
            current = setType(current, insn.dest, getTupleType(arity));
            continue next_insn;
          }

          case K_try: {
            Insn.YL insn = (Insn.YL) insn_;
            current = setType(current, insn.y, EOBJECT_TYPE);
            current = installExceptionHandler(current, insn.label, insn_idx);
            continue next_insn;
          }

          case try_end: {
            current = current.popExceptionHandler();
            continue next_insn;
          }

          case try_case: {
            Insn.Y insn = (Insn.Y) insn_;
            getType(current, insn.y);
            current = current.popExceptionHandler();
            current = current.setx(0, EATOM_TYPE, FV.this); // exc.class
            current = current.setx(1, EOBJECT_TYPE, FV.this); // value/reason
            current = current.setx(2, EOBJECT_TYPE, FV.this); // exc.object
            continue next_insn;
          }

          case try_case_end:
            continue next_insn;

          case raise: {
            Insn.SS insn = (Insn.SS) insn_;

            checkArg(current, insn.src1);
            checkArg(current, insn.src2);
            current = setType(current, Operands.XReg.get(0), EOBJECT_TYPE);
            continue next_insn;
          }

          case K_catch: {
            Insn.YL insn = (Insn.YL) insn_;
            current = installExceptionHandler(current, insn.label, insn_idx);
            continue next_insn;
          }

          case catch_end: {
            current = current.popExceptionHandler();
            current = current.setx(0, EOBJECT_TYPE, FV.this); // value
            continue next_insn;
          }

          case make_fun2: {
            Insn.F insn = (Insn.F) insn_;
            current.touchx(0, insn.anon_fun.free_vars);
            current = current.setx(0, EFUN_TYPE, FV.this);
            continue next_insn;
          }

          case loop_rec: {
            Insn.LD insn = (Insn.LD) insn_;
            current = branch(current, insn.label, insn_idx);
            current = setType(current, insn.dest, EOBJECT_TYPE);
            continue next_insn;
          }

          case remove_message:
            // assume this insn overrides X0
            // current = current.setx(0, EOBJECT_TYPE, FV.this);
            continue next_insn;

          case loop_rec_end:
          case timeout: {
            // log.finer(insn);
            continue next_insn;
          }

          case wait_timeout: {
            checkArg(current, ((Insn.LS)insn_).src);
          } // fall-through
          case wait: {
            Insn.L insn = (Insn.L) insn_;
            current = branch(current, insn.label, insn_idx);
            continue next_insn;
          }

          case deallocate:
          case trim: {
            Insn.I insn = (Insn.I) insn_;
            int howmuch = insn.i1;
            current = current.trim_y(howmuch);
            continue next_insn;
          }

            // this is really a no-op in jave
          case on_load:
          case test_heap: {
            continue next_insn;
          }

          case allocate_zero:
          case allocate_heap_zero: {
            Insn.I insn = (Insn.I) insn_;
            int slots = insn.i1;
            current = current.alloc_y(slots);
            for (int slot = 0; slot < slots; slot++) {
              current = current.sety(slot, ENIL_TYPE);
            }
            continue next_insn;
          }

          case allocate:
          case allocate_heap: {
            Insn.I insn = (Insn.I) insn_;
            current = current.alloc_y(insn.i1);
            continue next_insn;
          }

          case fcheckerror:
          case fclearerror:
            continue next_insn;
           
          case recv_mark:
          case recv_set:
            continue next_insn;

           
          case put: {
            Insn.S insn = (Insn.S) insn_;
            checkArg(current, insn.src);
            continue next_insn;
          }

          case select_tuple_arity: {
            Insn.Select insn = (Insn.Select) insn_;
            current = branch(current, insn.defaultLabel, insn_idx);

            checkArg(current, insn.src);

            DestinationOperand dest = insn.src.testDestination();
            Operands.SelectList jumpTable = insn.jumpTable;
            int len = jumpTable.size();
            for (int i=0; i<len; i++) {
              Operands.Operand value = jumpTable.getValue(i);
              Operands.Label target = jumpTable.getLabel(i);
View Full Code Here


          Type t1 = getType(current, insn.src1);
          Type t2 = getType(current, insn.src2);

          if (!t1.equals(t2)) {
            //TODO: for reg-vs-reg, we should really use the GLB.
            DestinationOperand reg;
            if ((reg = insn.src1.testDestination()) != null) {
              current = setType(current, reg, t2);
            }
            if ((reg = insn.src2.testDestination()) != null) {
              current = setType(current, reg, t1);
View Full Code Here

      }

      case init:
      case bs_context_to_binary:
      {
        DestinationOperand dest = readDestination();
        return new Insn.D(opcode, dest);
      }

      case make_fun2:
      {
        int fun_ref = readCodeInteger();
        return new Insn.F(opcode, fun_ref, anonFun(fun_ref));
      }

      case try_end:
      case catch_end:
      case try_case:
      {
        YReg y = readYReg();
        return new Insn.Y(opcode, y);
      }

      case bs_put_string:
      {
        ByteString bin = readBytestringRef();
        return new Insn.By(opcode, bin);
      }

      //---------- 2-ary ----------
      case allocate:
      case allocate_zero:
      case trim:
      case apply_last:
      {
        int i1 = readCodeInteger();
        int i2 = readCodeInteger();
        return new Insn.II(opcode, i1, i2);
      }

      case test_heap:
      {
        AllocList al = readAllocList();
        int i2 = readCodeInteger();
        return new Insn.WI(opcode, al, i2);
      }

      case call:
      case call_only:
      {
        int i1 = readCodeInteger();
        Label label = readLabel();
        return new Insn.IL(opcode, i1, label,
                   functionAtLabel(label.nr));
      }

      case call_ext:
      case call_ext_only:
      {
        int i1 = readCodeInteger();
        int ext_fun_ref = readCodeInteger();
        return new Insn.IE(opcode, i1, extFun(ext_fun_ref));
      }

      case bs_save2:
      case bs_restore2:
      {
        DestinationOperand dest = readDestination();

        int i2;
        if ((peekTag() & 0x7) == ATOM4_TAG) {
          if (readAtom().getEAtom() != START_ATOM)
            throw new IOException("integer or 'start' expected");
          i2 = -1;
        } else i2 = readCodeInteger();
        return new Insn.DI(opcode, dest, i2, true);
      }

      case move:
      case fmove:
      case fconv:
      {
        SourceOperand src = readSource();
        DestinationOperand dest = readDestination();
        return new Insn.SD(opcode, src, dest);
      }

      case put_tuple:
      {
        int i1 = readCodeInteger();
        DestinationOperand dest = readDestination();
        return new Insn.ID(opcode, i1, dest);
      }

      case loop_rec:
      {
        Label label = readLabel();
        DestinationOperand dest = readDestination();
        return new Insn.LD(opcode, label, dest);
      }

      case K_try:
      case K_catch:
      {
        YReg y = readYReg();
        Label label = readLabel();
        return new Insn.YL(opcode, y, label);
      }

      case is_integer:
      case is_float:
      case is_number:
      case is_atom:
      case is_pid:
      case is_reference:
      case is_port:
      case is_nil:
      case is_binary:
      case is_list:
      case is_nonempty_list:
      case is_tuple:
      case is_function:
      case is_boolean:
      case is_bitstr:
      {
        Label label = readLabel();
        DestinationOperand src = readDestination();
        return new Insn.LD(opcode, label, src, true);
      }

      case wait_timeout:
      {
        Label label = readLabel();
        SourceOperand src = readSource();
        return new Insn.LS(opcode, label, src, false);
      }

      case raise:
      {
        SourceOperand src1 = readSource();
        SourceOperand src2 = readSource();
        return new Insn.SS(opcode, src1, src2);
      }

      case put_string:
      {
        ByteString bin = readBytestringRef();
        DestinationOperand dest = readDestination();
        return new Insn.ByD(opcode, bin, dest);
      }

      //---------- 3-ary ----------
      case allocate_heap:
      case allocate_heap_zero:
      {
        int i1 = readCodeInteger();
        AllocList al = readAllocList();
        int i3 = readCodeInteger();
        return new Insn.IWI(opcode, i1, al, i3);
      }

      case func_info:
      {
        Atom mod = readAtom();
        Atom fun = readAtom();
        int arity = readCodeInteger();
        return new Insn.AAI(opcode, mod,fun,arity);
      }

      case call_ext_last:
      {
        int arity = readCodeInteger();
        int ext_fun_ref = readCodeInteger();
        int dealloc = readCodeInteger();
        return new Insn.IEI(opcode, arity, extFun(ext_fun_ref), dealloc);
      }

      case put_list:
      {
        SourceOperand src1 = readSource();
        SourceOperand src2 = readSource();
        DestinationOperand dest = readDestination();
        return new Insn.SSD(opcode, src1, src2, dest);
      }

      case get_tuple_element:
      {
        SourceOperand src = readSource();
        int i = readCodeInteger();
        DestinationOperand dest = readDestination();
        return new Insn.SID(opcode, src, i, dest);
      }

      case set_tuple_element:
      {
        SourceOperand src = readSource();
        DestinationOperand dest = readDestination();
        int i = readCodeInteger();
        return new Insn.SDI(opcode, src, dest, i);
      }

      case get_list:
      {
        SourceOperand src = readSource();
        DestinationOperand dest1 = readDestination();
        DestinationOperand dest2 = readDestination();
        return new Insn.SDD(opcode, src, dest1, dest2);
      }

      case test_arity:
      case bs_test_tail2:
      case bs_test_unit:
      {
        Label label = readLabel();
        DestinationOperand dest = readDestination();
        int i1 = readCodeInteger();
        return new Insn.LDI(opcode, label, dest, i1, true);
      }

      case is_lt:
      case is_ge:
      case is_eq:
      case is_ne:
      case is_eq_exact:
      case is_ne_exact:
      {
        Label label = readLabel();
        SourceOperand src1 = readSource();
        SourceOperand src2 = readSource();
        return new Insn.LSS(opcode, label, src1, src2, true);
      }

      case is_function2:
      {
        Label label = readLabel();
        DestinationOperand dest = readDestination();
        SourceOperand src = readSource();
        return new Insn.LDS(opcode, label, dest, src, true);
      }

      case fnegate:
      case bs_utf8_size:
      case bs_utf16_size:
      {
        Label label = readLabel();
        SourceOperand src = readSource();
        DestinationOperand dest = readDestination();
        return new Insn.LSD(opcode, label, src, dest);
      }

      case call_last:
      {
        int i1 = readCodeInteger();
        Label label = readLabel();
        int i3 = readCodeInteger();
        return new Insn.ILI(opcode, i1, label, i3,
                  functionAtLabel(label.nr));
      }

      case fadd:
      case fsub:
      case fmul:
      case fdiv:
      {
        Label label = readLabel();
        SourceOperand src1 = readSource();
        SourceOperand src2 = readSource();
        DestinationOperand dest = readDestination();
        return new Insn.LSSD(opcode, label, src1, src2, dest, true);
      }

      case bs_add:
      {
        Label label = readLabel();
        SourceOperand src1 = readSource();
        SourceOperand src2 = readSource();
        int i3 = readCodeInteger();
        DestinationOperand dest = readDestination();
        return new Insn.LSSID(opcode, label, src1, src2, i3, dest);
      }

      case bs_skip_utf8:
      case bs_skip_utf16:
      case bs_skip_utf32:
      {
        Label label = readLabel();
        DestinationOperand dest = readDestination();
        int i3 = readCodeInteger();
        int i4 = readCodeInteger();
        return new Insn.LDII(opcode, label, dest, i3, i4);
      }

      case bs_match_string:
      {
        Label label = readLabel();
        DestinationOperand dest = readDestination();
        BitString bin = readBitstringRef();
        return new Insn.LDBi(opcode, label, dest, bin);
      }

      case bs_put_utf8:
      case bs_put_utf16:
      case bs_put_utf32:
      {
        Label label = readLabel();
        int i2 = readCodeInteger();
        SourceOperand src = readSource();
        return new Insn.LIS(opcode, label, i2, src, true);
      }

      case bs_start_match2:
      case bs_get_utf8:
      case bs_get_utf16:
      case bs_get_utf32:
      {
        Label label = readLabel();
        DestinationOperand dest1 = readDestination();
        int i3 = readCodeInteger();
        int i4 = readCodeInteger();
        DestinationOperand dest2 = readDestination();
        return new Insn.LDIID(opcode, label, dest1, i3, i4, dest2,
                    opcode != BeamOpcode.bs_start_match2);
      }

      case bs_put_integer:
      case bs_put_float:
      case bs_put_binary:
      {
        Label label = readLabel();
        SourceOperand src2 = readSource();
        int i3 = readCodeInteger();
        int i4 = readCodeInteger();
        SourceOperand src5 = readSource();
        return new Insn.LSIIS(opcode, label, src2, i3, i4, src5, true);
      }

      case bs_init2:
      case bs_init_bits:
      {
        Label label = readOptionalLabel();
        SourceOperand src2;
        if ((peekTag() & 0x7) == CODEINT4_TAG) {
          int i2 = readCodeInteger();
          src2 = new Operands.Int(i2);
        } else {
          src2 = readSource();
        }
        int i3 = readCodeInteger();
        int i4 = readCodeInteger();
        int i5 = readCodeInteger();
        DestinationOperand dest = readDestination();
        return new Insn.LSIIID(opcode, label, src2, i3, i4, i5, dest, true);
      }

      case bs_skip_bits2:
      {
        Label label = readLabel();
        DestinationOperand dest = readDestination();
        SourceOperand src = readSource();
        int i3 = readCodeInteger();
        int i4 = readCodeInteger();
        return new Insn.LDSII(opcode, label, dest, src, i3, i4);
      }

      case bs_get_integer2:
      case bs_get_float2:
      case bs_get_binary2:
      {
        Label label = readLabel();
        DestinationOperand dest2 = readDestination();
        int i3 = readCodeInteger();
        SourceOperand src4 = readSource();
        int i5 = readCodeInteger();
        int i6 = readCodeInteger();
        DestinationOperand dest = readDestination();
        return new Insn.LDISIID(opcode, label, dest2, i3, src4, i5, i6, dest);
      }

      case bs_append: // LSIIISIS
      {
        Label label = readLabel();
        SourceOperand src2 = readSource();
        int i3 = readCodeInteger();
        int i4 = readCodeInteger();
        int i5 = readCodeInteger();
        SourceOperand src6 = readSource();
        int i7 = readCodeInteger();
        DestinationOperand dest8 = readDestination();
        return new Insn.BSAppend(opcode, label, src2, i3, i4, i5, src6, i7, dest8);
      }

      case bs_private_append: // LSISID
      {
        Label label = readLabel();
        SourceOperand src2 = readSource();
        int i3 = readCodeInteger();
        SourceOperand src4 = readSource();
        int i5 = readCodeInteger();
        DestinationOperand dest = readDestination();
        return new Insn.BSPrivateAppend(opcode, label, src2, i3, src4, i5, dest);
      }

      case select_val:
      case select_tuple_arity:
      {
        SourceOperand src = readSource();
        Label defaultLbl = readLabel();
        SelectList jumpTable = readSelectList();
        return new Insn.Select(opcode, src, defaultLbl, jumpTable);
      }

      //---------- BIFs ----------
      case bif0: {
        Label optLabel = readOptionalLabel();
        int ext_fun_ref = readCodeInteger();
        DestinationOperand dest = readDestination();
        return new Insn.Bif(opcode, optLabel, extFun(ext_fun_ref), dest);
      }
      case bif1: {
        Label optLabel = readOptionalLabel();
        int ext_fun_ref = readCodeInteger();
        SourceOperand arg = readSource();
        DestinationOperand dest = readDestination();
        return new Insn.Bif(opcode, optLabel, extFun(ext_fun_ref), arg, dest);
      }
      case bif2: {
        Label optLabel = readOptionalLabel();
        int ext_fun_ref = readCodeInteger();
        SourceOperand arg1 = readSource();
        SourceOperand arg2 = readSource();
        DestinationOperand dest = readDestination();
        return new Insn.Bif(opcode, optLabel, extFun(ext_fun_ref), arg1, arg2, dest);
      }

      case gc_bif1: {
        Label optLabel = readOptionalLabel();
        int save = readCodeInteger();
        int ext_fun_ref = readCodeInteger();
        SourceOperand arg = readSource();
        DestinationOperand dest = readDestination();
        return new Insn.GcBif(opcode, optLabel, extFun(ext_fun_ref), save, arg, dest);
      }
      case gc_bif2: {
        Label optLabel = readOptionalLabel();
        int save = readCodeInteger();
        int ext_fun_ref = readCodeInteger();
        SourceOperand arg1 = readSource();
        SourceOperand arg2 = readSource();
        DestinationOperand dest = readDestination();
        return new Insn.GcBif(opcode, optLabel, extFun(ext_fun_ref), save, arg1, arg2, dest);
      }
      case gc_bif3: {
        Label optLabel = readOptionalLabel();
        int save = readCodeInteger();
        int ext_fun_ref = readCodeInteger();
        SourceOperand arg1 = readSource();
        SourceOperand arg2 = readSource();
        SourceOperand arg3 = readSource();
        DestinationOperand dest = readDestination();
        return new Insn.GcBif(opcode, optLabel, extFun(ext_fun_ref), save, arg1, arg2, arg3, dest);
      }

      default:
        throw new IOException("Unknown instruction: "+opcode);
View Full Code Here

TOP

Related Classes of erjang.beam.repr.Operands.DestinationOperand

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.