From: brian Date: Sun, 23 May 2004 08:15:02 +0000 (-0700) Subject: make jdk 1.1 compliant part 1 X-Git-Url: http://git.megacz.com/?p=nestedvm.git;a=commitdiff_plain;h=4cc48f20c2927ad6d88f4d54e10b5fe46fcef2df make jdk 1.1 compliant part 1 darcs-hash:20040523081502-24bed-fa3c46b4733c75a6637c225464e7ad4e70177efd.gz --- diff --git a/src/org/ibex/nestedvm/ClassFileCompiler.java b/src/org/ibex/nestedvm/ClassFileCompiler.java index 3df1d4e..2f5b609 100644 --- a/src/org/ibex/nestedvm/ClassFileCompiler.java +++ b/src/org/ibex/nestedvm/ClassFileCompiler.java @@ -477,7 +477,7 @@ public class ClassFileCompiler extends Compiler implements org.apache.bcel.Const private InstructionHandle realStart; private MethodGen curMethod; - private boolean jumpable(int addr) { return jumpableAddresses.contains(new Integer(addr)); } + private boolean jumpable(int addr) { return jumpableAddresses.get(new Integer(addr)) != null; } private void emitText(int addr, DataInputStream dis, int size) throws Exn,IOException { if(textDone) throw new Exn("Multiple text segments"); @@ -570,7 +570,7 @@ public class ClassFileCompiler extends Compiler implements org.apache.bcel.Const pushConst(firstAddrOfNext); setPC(); // mark the start of the next method as jumpable - jumpableAddresses.add(new Integer(firstAddrOfNext)); + jumpableAddresses.put(new Integer(firstAddrOfNext),Boolean.TRUE); } insnList.move(returnHandle,insnList.getEnd()); @@ -648,7 +648,7 @@ public class ClassFileCompiler extends Compiler implements org.apache.bcel.Const //System.err.println("Delay slot is jumpable - This code is untested + " + toHex(nextInsn)); if(pc+4==endOfMethod) { // the delay slot is at the start of the next method - jumpableAddresses.add(new Integer(pc+8)); // make the 2nd insn of the next method jumpable + jumpableAddresses.put(new Integer(pc+8),Boolean.TRUE); // make the 2nd insn of the next method jumpable branch(pc,pc+8); // jump over it //System.err.println("delay slot: " + toHex(pc+8)); unreachable = true; diff --git a/src/org/ibex/nestedvm/Compiler.java b/src/org/ibex/nestedvm/Compiler.java index ebdf29d..b5835dd 100644 --- a/src/org/ibex/nestedvm/Compiler.java +++ b/src/org/ibex/nestedvm/Compiler.java @@ -83,7 +83,7 @@ public abstract class Compiler implements Registers { } /** A set of all addresses that can be jumped too (only available if pruneCases == true) */ - protected Set jumpableAddresses; + protected Hashtable jumpableAddresses; /** Some important symbols */ ELF.Symbol userInfo, gp; @@ -211,9 +211,9 @@ public abstract class Compiler implements Registers { if(pruneCases) { // Find all possible branches - jumpableAddresses = new HashSet(); + jumpableAddresses = new Hashtable(); - jumpableAddresses.add(new Integer(elf.header.entry)); + jumpableAddresses.put(new Integer(elf.header.entry),Boolean.TRUE); ELF.SHeader text = elf.sectionWithName(".text"); if(text == null) throw new Exn("No .text segment"); @@ -244,13 +244,13 @@ public abstract class Compiler implements Registers { _go(); } - private void findBranchesInSymtab(ELF.Symtab symtab, Set jumps) { + private void findBranchesInSymtab(ELF.Symtab symtab, Hashtable jumps) { ELF.Symbol[] symbols = symtab.symbols; int n=0; for(int i=0;i= base && t < base+size) { - if(jumps.add(new Integer(t))) { + if(jumps.put(new Integer(t),Boolean.TRUE) == null) { //System.err.println("Possible jump to " + toHex(t) + " (" + inter.sourceLine(t) + ") from " + toHex(pc) + " (" + inter.sourceLine(pc) + ")"); n++; } @@ -336,7 +336,7 @@ public abstract class Compiler implements Registers { case 17: // FPU Instructions switch(rs) { case 8: // BC1F, BC1T - if(jumps.add(new Integer(pc+branchTarget*4+4))) n++; + if(jumps.put(new Integer(pc+branchTarget*4+4),Boolean.TRUE) == null) n++; break; } break; @@ -346,13 +346,13 @@ public abstract class Compiler implements Registers { if(printStats) System.err.println("Found " + n + " additional possible branch targets in Text segment"); } - private void findBranchesInData(DataInputStream dis, int size, Set jumps, int textStart, int textEnd) throws IOException { + private void findBranchesInData(DataInputStream dis, int size, Hashtable jumps, int textStart, int textEnd) throws IOException { int count = size/4; int n=0; for(int i=0;i= textStart && word < textEnd) { - if(jumps.add(new Integer(word))) { + if(jumps.put(new Integer(word),Boolean.TRUE) == null) { //System.err.println("Added " + toHex(word) + " as possible branch target (fron data segment)"); n++; } @@ -388,7 +388,7 @@ public abstract class Compiler implements Registers { public void set(Object val) { if(field == null) return; try { - field.setAccessible(true); + /*field.setAccessible(true); NOT in JDK 1.1 */ field.set(Compiler.this,val); } catch(IllegalAccessException e) { System.err.println(e); @@ -397,7 +397,7 @@ public abstract class Compiler implements Registers { public Object get() { if(field == null) return null; try { - field.setAccessible(true); + /*field.setAccessible(true); NOT in JDK 1.1 */ return field.get(Compiler.this); } catch(IllegalAccessException e) { System.err.println(e); return null; diff --git a/src/org/ibex/nestedvm/Runtime.java b/src/org/ibex/nestedvm/Runtime.java index 272e4e6..64ebd33 100644 --- a/src/org/ibex/nestedvm/Runtime.java +++ b/src/org/ibex/nestedvm/Runtime.java @@ -359,7 +359,8 @@ public abstract class Runtime implements UsermodeConstants,Registers,Cloneable { if(page == null) throw new WriteFaultException(a<<2); int index = a&pageWordMask; int n = min(c,pageWords-index); - Arrays.fill(page,index,index+n,fourBytes); + /* Arrays.fill(page,index,index+n,fourBytes);*/ + for(int i=index;i 0) sb.append("-"); else off = -off; sb.append(off/3600); off = off%3600; if(off > 0) sb.append(":").append(off/60); off=off%60; if(off > 0) sb.append(":").append(off); if(zone.useDaylightTime()) - sb.append(zone.getDisplayName(true,TimeZone.SHORT)); + sb.append(Platform.timeZoneGetDisplayName(zone,true,false)); return sb.toString(); } @@ -93,7 +92,7 @@ public abstract class UnixRuntime extends Runtime implements Cloneable { synchronized(parent.children) { int i = parent.activeChildren.indexOf(prev); if(i == -1) throw new Error("should never happen"); - parent.activeChildren.set(i,this); + parent.activeChildren.setElementAt(this,i); } } else { int newpid = -1; @@ -194,12 +193,15 @@ public abstract class UnixRuntime extends Runtime implements Cloneable { synchronized(children) { for(;;) { if(pid == -1) { - if(exitedChildren.size() > 0) done = (UnixRuntime)exitedChildren.remove(exitedChildren.size() - 1); + if(exitedChildren.size() > 0) { + done = (UnixRuntime)exitedChildren.elementAt(exitedChildren.size() - 1); + exitedChildren.removeElementAt(exitedChildren.size() - 1); + } } else if(pid > 0) { UnixRuntime t = gs.tasks[pid]; if(t.parent != this) return -ECHILD; if(t.state == EXITED) { - if(!exitedChildren.remove(t)) throw new Error("should never happen"); + if(!exitedChildren.removeElement(t)) throw new Error("should never happen"); done = t; } } else { @@ -227,12 +229,12 @@ public abstract class UnixRuntime extends Runtime implements Cloneable { UnixRuntime child = (UnixRuntime) e.nextElement(); gs.tasks[child.pid] = null; } - exitedChildren.clear(); + exitedChildren.removeAllElements(); for(Enumeration e = activeChildren.elements(); e.hasMoreElements(); ) { UnixRuntime child = (UnixRuntime) e.nextElement(); child.parent = null; } - activeChildren.clear(); + activeChildren.removeAllElements(); } UnixRuntime _parent = parent; @@ -243,8 +245,8 @@ public abstract class UnixRuntime extends Runtime implements Cloneable { if(parent == null) { gs.tasks[pid] = null; } else { - if(!parent.activeChildren.remove(this)) throw new Error("should never happen _exited: pid: " + pid); - parent.exitedChildren.add(this); + if(!parent.activeChildren.removeElement(this)) throw new Error("should never happen _exited: pid: " + pid); + parent.exitedChildren.addElement(this); parent.children.notify(); } } @@ -287,7 +289,7 @@ public abstract class UnixRuntime extends Runtime implements Cloneable { activeChildren = new Vector(); exitedChildren = new Vector(); } - activeChildren.add(r); + activeChildren.addElement(r); state.r[V0] = 0; // return 0 to child state.pc += 4; // skip over syscall instruction @@ -531,6 +533,8 @@ public abstract class UnixRuntime extends Runtime implements Cloneable { return n; } + // FIXME: UDP is totally broken + static class SocketFD extends FD { public static final int TYPE_STREAM = 0; public static final int TYPE_DGRAM = 1; @@ -552,7 +556,7 @@ public abstract class UnixRuntime extends Runtime implements Cloneable { public void setOptions() { try { if(o != null && type() == TYPE_STREAM && !listen()) { - ((Socket)o).setKeepAlive((options & SO_KEEPALIVE) != 0); + Platform.socketSetKeepAlive((Socket)o,(options & SO_KEEPALIVE) != 0); } } catch(SocketException e) { if(STDERR_DIAG) e.printStackTrace(); @@ -584,8 +588,10 @@ public abstract class UnixRuntime extends Runtime implements Cloneable { throw new ErrnoException(EIO); } } else { + if(off != 0) throw new IllegalArgumentException("off must be 0"); DatagramSocket ds = (DatagramSocket) o; - dp.setData(a,off,length); + dp.setData(a); + dp.setLength(length); try { ds.receive(dp); } catch(IOException e) { @@ -605,8 +611,10 @@ public abstract class UnixRuntime extends Runtime implements Cloneable { throw new ErrnoException(EIO); } } else { + if(off != 0) throw new IllegalArgumentException("off must be 0"); DatagramSocket ds = (DatagramSocket) o; - dp.setData(a,off,length); + dp.setData(a); + dp.setLength(length); try { ds.send(dp); } catch(IOException e) { @@ -653,7 +661,7 @@ public abstract class UnixRuntime extends Runtime implements Cloneable { InetAddress inetAddr; try { - inetAddr = InetAddress.getByAddress(ip); + inetAddr = Platform.inetAddressFromBytes(ip); } catch(UnknownHostException e) { return -EADDRNOTAVAIL; } @@ -669,9 +677,9 @@ public abstract class UnixRuntime extends Runtime implements Cloneable { break; } case SocketFD.TYPE_DGRAM: { - DatagramSocket s = (DatagramSocket) fd.o; - if(s == null) s = new DatagramSocket(); - s.connect(inetAddr,port); + if(fd.dp == null) fd.dp = new DatagramPacket(null,0); + fd.dp.setAddress(inetAddr); + fd.dp.setPort(port); break; } default: @@ -763,7 +771,7 @@ public abstract class UnixRuntime extends Runtime implements Cloneable { copyin(addr+4,ip,4); try { - inetAddr = InetAddress.getByAddress(ip); + inetAddr = Platform.inetAddressFromBytes(ip); } catch(UnknownHostException e) { return -EADDRNOTAVAIL; } @@ -849,8 +857,8 @@ public abstract class UnixRuntime extends Runtime implements Cloneable { Socket s = (Socket) fd.o; try { - if(how == SHUT_RD || how == SHUT_RDWR) s.shutdownInput(); - if(how == SHUT_WR || how == SHUT_RDWR) s.shutdownOutput(); + if(how == SHUT_RD || how == SHUT_RDWR) Platform.socketHalfClose(s,false); + if(how == SHUT_WR || how == SHUT_RDWR) Platform.socketHalfClose(s,true); } catch(IOException e) { return -EIO; } @@ -978,7 +986,7 @@ public abstract class UnixRuntime extends Runtime implements Cloneable { } } - private static class MP implements Comparable { + private static class MP implements Sort.Sortable { public MP(String path, FS fs) { this.path = path; this.fs = fs; } public String path; public FS fs; @@ -1010,7 +1018,7 @@ public abstract class UnixRuntime extends Runtime implements Cloneable { MP[] newMPS = new MP[oldLength + 1]; if(oldLength != 0) System.arraycopy(mps,0,newMPS,0,oldLength); newMPS[oldLength] = new MP(path,fs); - Arrays.sort(newMPS); + Sort.sort(newMPS); mps = newMPS; int highdevno = 0; for(int i=0;i