X-Git-Url: http://git.megacz.com/?p=nestedvm.git;a=blobdiff_plain;f=src%2Forg%2Fibex%2Fnestedvm%2FRuntimeCompiler.java;fp=src%2Forg%2Fibex%2Fnestedvm%2FRuntimeCompiler.java;h=f5ae49c908a6d767f405d180894b208e17d50d00;hp=2d0a182f6a38b0f69d476c7d641d6742b971af12;hb=b43a6aee72ac892e7d25e3fa03d8474a5ed10f17;hpb=ba0fb468d28a02271671ce6e805016953cb68df2 diff --git a/src/org/ibex/nestedvm/RuntimeCompiler.java b/src/org/ibex/nestedvm/RuntimeCompiler.java index 2d0a182..f5ae49c 100644 --- a/src/org/ibex/nestedvm/RuntimeCompiler.java +++ b/src/org/ibex/nestedvm/RuntimeCompiler.java @@ -21,15 +21,33 @@ public class RuntimeCompiler { } String className = "nestedvm.runtimecompiled_" + id; System.err.println("RuntimeCompiler: Building " + className); - String options = "nosupportcall"; - if(extraoptions != null) options += "," + extraoptions; + byte[] bytecode; + try { + bytecode = runCompiler(data,className,extraoptions,null); + } catch(Compiler.Exn e) { + if(e.getMessage() != null || e.getMessage().indexOf("constant pool full") != -1) + bytecode = runCompiler(data,className,extraoptions,"lessconstants"); + else + throw e; + } + return singleClassLoader.fromBytes(className,bytecode); + } + + private static byte[] runCompiler(Seekable data, String name, String options, String moreOptions) throws IOException, Compiler.Exn { ByteArrayOutputStream baos = new ByteArrayOutputStream(); - ClassFileCompiler c = new ClassFileCompiler(data,className,baos); - c.parseOptions(options); - c.go(); + + try { + ClassFileCompiler c = new ClassFileCompiler(data,name,baos); + c.parseOptions("nosupportcall,maxinsnpermethod=256"); + if(options != null) c.parseOptions(options); + if(moreOptions != null) c.parseOptions(moreOptions); + c.go(); + } finally { + data.seek(0); + } + baos.close(); - byte[] bytecode = baos.toByteArray(); - return singleClassLoader.fromBytes(className,bytecode); + return baos.toByteArray(); } private static class SingleClassLoader extends ClassLoader {