func (self *FMUL) Execute(frame *rtda.Frame) { stack := frame.OperandStack() v2 := stack.PopFloat() v1 := stack.PopFloat() result := v1 * v2 stack.PushFloat(result) }
func createStackTraceElements(tObj *heap.Object, frame *rtda.Frame) []*StackTraceElement { thread := frame.Thread() depth := thread.StackDepth() // skip unrelated frames i := uint(1) for k := tObj.Class(); k != nil; k = k.SuperClass() { i++ } if thread.TopFrameN(i).Method().Name() == "<athrow>" { i++ } stes := make([]*StackTraceElement, 0, depth) for ; i < depth; i++ { frameN := thread.TopFrameN(i) methodN := frameN.Method() classN := methodN.Class() if classN.Name() != "~shim" { // skip shim frame lineNumber := methodN.GetLineNumber(frameN.NextPC() - 1) ste := &StackTraceElement{ declaringClass: classN.NameJlsFormat(), methodName: methodN.Name(), fileName: classN.SourceFile(), lineNumber: lineNumber, } stes = append(stes, ste) } } return stes }
// private static native int findSignal(String string); // (Ljava/lang/String;)I func findSignal(frame *rtda.Frame) { vars := frame.LocalVars() vars.GetRef(0) // name stack := frame.OperandStack() stack.PushInt(0) // todo }
// private native long getUptime0(); // ()J func getUptime0(frame *rtda.Frame) { // todo uptime := int64(0) stack := frame.OperandStack() stack.PushLong(uptime) }
// private static native String getVersion0(); // ()Ljava/lang/String; func getVersion0(frame *rtda.Frame) { // todo version := rtda.JString("0") stack := frame.OperandStack() stack.PushRef(version) }
// private static native long getEntryCrc(long jzentry); // (J)J func getEntryCrc(frame *rtda.Frame) { entry := _getEntryPop(frame) crc := int64(entry.CRC32) stack := frame.OperandStack() stack.PushLong(crc) }
func _getEntryPop(frame *rtda.Frame) *gozip.File { vars := frame.LocalVars() jzentry := vars.GetLong(0) entry := getEntryFile(jzentry) return entry }
// public native void unpark(Object thread); // (Ljava/lang/Object;)V func unpark(frame *rtda.Frame) { vars := frame.LocalVars() threadObj := vars.GetRef(1) thread := threadObj.Extra().(*rtda.Thread) thread.Unpark() }
func (self *DADD) Execute(frame *rtda.Frame) { stack := frame.OperandStack() v1 := stack.PopDouble() v2 := stack.PopDouble() result := v1 + v2 stack.PushDouble(result) }
func (self *ARETURN) Execute(frame *rtda.Frame) { thread := frame.Thread() currentFrame := thread.PopFrame() invokerFrame := thread.TopFrame() ref := currentFrame.OperandStack().PopRef() invokerFrame.OperandStack().PushRef(ref) }
func (self *LRETURN) Execute(frame *rtda.Frame) { thread := frame.Thread() currentFrame := thread.PopFrame() invokerFrame := thread.TopFrame() val := currentFrame.OperandStack().PopLong() invokerFrame.OperandStack().PushLong(val) }
// native void socketConnect(InetAddress address, int port, int timeout) // throws IOException; func psi_socketConnect(frame *rtda.Frame) { vars := frame.LocalVars() this := vars.GetThis() address := vars.GetRef(1) port := vars.Get(2) holder := address.GetFieldValue("holder", "Ljava/net/InetAddress$InetAddressHolder;").(*rtc.Obj) //fmt.Println(address.Class().GetInstanceMethod("getHostAddress", "()Ljava/lang/String;").NativeMethod()) add := holder.GetFieldValue("address", "I").(int32) b := make([]byte, 4) binary.BigEndian.PutUint32(b, uint32(add)) laddr := fmt.Sprintf("%d.%d.%d.%d:%d", b[0], b[1], b[2], b[3], port) conn, err := net.Dial("tcp", laddr) if err != nil { frame.Thread().ThrowIOException(err.Error()) } //TODO what ? timeout how to implement ? _timeout := vars.GetInt(3) if _timeout > 0 { conn.SetDeadline(time.Now().Add(time.Duration(_timeout) * time.Millisecond)) } fdObj := this.GetFieldValue("fd", "Ljava/io/FileDescriptor;").(*rtc.Obj) fdObj.SetExtra(conn) }
// public static native void set(Object array, int index, Object value) // throws IllegalArgumentException, ArrayIndexOutOfBoundsException; // (Ljava/lang/Object;ILjava/lang/Object;)V func set(frame *rtda.Frame) { vars := frame.LocalVars() arr := vars.GetRef(0) index := vars.GetInt(1) value := vars.GetRef(2) if arr == nil { frame.Thread().ThrowNPE() return } if !arr.IsArray() { frame.Thread().ThrowIllegalArgumentException("Argument is not an array") return } if index < 0 || index >= heap.ArrayLength(arr) { frame.Thread().ThrowArrayIndexOutOfBoundsExceptionNoMsg() return } if !arr.IsPrimitiveArray() { arr.Refs()[index] = value return } //TODO Consistent with the current need to determine whether the type and source type // Such as: // [I // java/lang/Integer // frame.Thread().ThrowIllegalArgumentException("argument type mismatch") // primitive array primitiveDescriptorStr := arr.Class().Name()[1:] if primitiveDescriptorStr != value.GetPrimitiveDescriptor() { frame.Thread().ThrowIllegalArgumentException("argument type mismatch") return } unboxed := box.Unbox(value, primitiveDescriptorStr) primitiveDescriptor := arr.Class().Name()[1] switch primitiveDescriptor { case 'Z': arr.Booleans()[index] = int8(unboxed.(int32)) case 'B': arr.Bytes()[index] = int8(unboxed.(int32)) case 'C': arr.Chars()[index] = uint16(unboxed.(int32)) case 'S': arr.Shorts()[index] = int16(unboxed.(int32)) case 'I': arr.Ints()[index] = unboxed.(int32) case 'J': arr.Longs()[index] = unboxed.(int64) case 'F': arr.Floats()[index] = unboxed.(float32) case 'D': arr.Doubles()[index] = unboxed.(float64) } }
// private native void writeBytes(byte b[], int off, int len, boolean append) throws IOException; // ([BIIZ)V func writeBytes(frame *rtda.Frame) { vars := frame.LocalVars() fosObj := vars.GetRef(0) // this byteArrObj := vars.GetRef(1) // b offset := vars.GetInt(2) // off length := vars.GetInt(3) // len //vars.GetBoolean(4) // append fdObj := fosObj.GetFieldValue("fd", "Ljava/io/FileDescriptor;").(*rtc.Obj) if fdObj.Extra() == nil { goFd := fdObj.GetFieldValue("fd", "I").(int32) switch goFd { case 0: fdObj.SetExtra(os.Stdin) case 1: fdObj.SetExtra(os.Stdout) case 2: fdObj.SetExtra(os.Stderr) } } goFile := fdObj.Extra().(*os.File) goBytes := byteArrObj.GoBytes() goBytes = goBytes[offset : offset+length] goFile.Write(goBytes) }
// public static native void arraycopy(Object src, int srcPos, Object dest, int destPos, int length) // (Ljava/lang/Object;ILjava/lang/Object;II)V func arraycopy(frame *rtda.Frame) { vars := frame.LocalVars() src := vars.GetRef(0) srcPos := vars.GetInt(1) dest := vars.GetRef(2) destPos := vars.GetInt(3) length := vars.GetInt(4) // NullPointerException if src == nil || dest == nil { panic("NPE") // todo } // ArrayStoreException if !checkArrayCopy(src, dest) { panic("ArrayStoreException") } // IndexOutOfBoundsException if srcPos < 0 || destPos < 0 || length < 0 || srcPos+length > rtc.ArrayLength(src) || destPos+length > rtc.ArrayLength(dest) { panic("IndexOutOfBoundsException") // todo } rtc.ArrayCopy(src, dest, srcPos, destPos, length) }
func (self *IADD) Execute(frame *rtda.Frame) { stack := frame.OperandStack() v2 := stack.PopInt() v1 := stack.PopInt() result := v1 + v2 stack.PushInt(result) }
// private static native int getEntryFlag(long jzentry); // (J)I func getEntryFlag(frame *rtda.Frame) { entry := _getEntryPop(frame) flag := int32(entry.Flags) stack := frame.OperandStack() stack.PushInt(flag) }
func (self *LADD) Execute(frame *rtda.Frame) { stack := frame.OperandStack() v2 := stack.PopLong() v1 := stack.PopLong() result := v1 + v2 stack.PushLong(result) }
// private static native long getEntrySize(long jzentry); // (J)J func getEntrySize(frame *rtda.Frame) { entry := _getEntryPop(frame) size := int64(entry.UncompressedSize64) stack := frame.OperandStack() stack.PushLong(size) }
//(Ljava/lang/String;)[Ljava/net/InetAddress; func i6di_lookupAllHostAddr(frame *rtda.Frame) { vars := frame.LocalVars() host := rtda.GoString(vars.GetRef(1)) address, _ := net.LookupHost(host) constructorCount := uint(len(address)) inetAddress := heap.BootLoader().LoadClass("java/net/InetAddress") inetAddressArr := inetAddress.NewArray(constructorCount) stack := frame.OperandStack() stack.PushRef(inetAddressArr) //TODO //getByName descriptor:(Ljava/lang/String;)Ljava/net/InetAddress; //if constructorCount > 0 { // thread := frame.Thread() // constructorObjs := inetAddressArr.Refs() // inetAddressGetByNameMethod := inetAddress.GetStaticMethod("getByName", "(Ljava/lang/String;)Ljava/net/InetAddress;") // fmt.Println(constructorObjs[0]) // fmt.Println(inetAddressGetByNameMethod) // fmt.Println(thread) // thread.InvokeMethodWithShim(inetAddressGetByNameMethod, []interface{}{ // constructorObjs[0], // rtda.JString(host), // }) //} }
// public native int getModifiers(); // ()I func getModifiers(frame *rtda.Frame) { class := _popClass(frame) modifiers := class.GetAccessFlags() stack := frame.OperandStack() stack.PushInt(int32(modifiers)) }
// private native void interrupt0(); // ()V func interrupt0(frame *rtda.Frame) { vars := frame.LocalVars() this := vars.GetThis() thread := _extraThread(this) thread.Interrupt() }
// public native long getStartupTime(); // ()J func getStartupTime(frame *rtda.Frame) { // todo startupTime := int64(0) stack := frame.OperandStack() stack.PushLong(startupTime) }
// private static native void setErr0(PrintStream err); // (Ljava/io/PrintStream;)V func setErr0(frame *rtda.Frame) { vars := frame.LocalVars() err := vars.GetRef(0) sysClass := frame.Method().Class() sysClass.SetStaticValue("err", "Ljava/io/PrintStream;", err) }
//private native int socketRead0(FileDescriptor fd, byte b[], int off, int len, int timeout) // java/net/SocketInputStream~socketRead0~(Ljava/io/FileDescriptor;[BIII)I func sis_socketRead0(frame *rtda.Frame) { vars := frame.LocalVars() //this := vars.GetThis() fd := vars.GetRef(1) buf := vars.GetRef(2) off := vars.GetInt(3) _len := vars.GetInt(4) conn := fd.Extra().(net.Conn) _timeout := vars.GetInt(5) if _timeout > 0 { conn.SetDeadline(time.Now().Add(time.Duration(_timeout) * time.Millisecond)) } goBuf := buf.GoBytes() goBuf = goBuf[off : off+_len] n, err := conn.Read(goBuf) if err == nil || n > 0 || err == io.EOF { frame.OperandStack().PushInt(int32(n)) } else { // todo panic(err.Error()) //frame.Thread().ThrowIOException(err.Error()) } }
// private static native void setIn0(InputStream in); // (Ljava/io/InputStream;)V func setIn0(frame *rtda.Frame) { vars := frame.LocalVars() in := vars.GetRef(0) sysClass := frame.Method().Class() sysClass.SetStaticValue("in", "Ljava/io/InputStream;", in) }
// private native void open(String name, int mode) throws FileNotFoundException; // (Ljava/lang/String;)V func raf_open(frame *rtda.Frame) { vars := frame.LocalVars() this := vars.GetThis() name := vars.GetRef(1) mode := vars.GetInt(2) //flag flag := 0 if mode&1 > 0 { flag |= os.O_RDONLY } //write if mode&2 > 0 { flag |= os.O_RDWR | os.O_CREATE } if mode&4 > 0 { flag |= os.O_SYNC | os.O_CREATE } if mode&8 > 0 { //TODO:O_DSYNC flag |= os.O_SYNC | os.O_CREATE } goName := rtda.GoString(name) if goFile, err := os.OpenFile(goName, flag, 0660); err != nil { frame.Thread().ThrowFileNotFoundException(goName) } else { this.SetExtra(goFile) } }
// private static native void setOut0(PrintStream out); // (Ljava/io/PrintStream;)V func setOut0(frame *rtda.Frame) { vars := frame.LocalVars() out := vars.GetRef(0) sysClass := frame.Method().Class() sysClass.SetStaticValue("out", "Ljava/io/PrintStream;", out) }
// public native int addressSize(); // ()I func addressSize(frame *rtda.Frame) { // vars := frame.LocalVars() // vars.GetRef(0) // this stack := frame.OperandStack() stack.PushInt(8) // todo unsafe.Sizeof(int) }
func (self *SWAP) Execute(frame *rtda.Frame) { stack := frame.OperandStack() val1 := stack.PopSlot() val2 := stack.PopSlot() stack.PushSlot(val1) stack.PushSlot(val2) }