From e7c36cdcb7f15dee83de03a0e8ef8af8f94b75ab Mon Sep 17 00:00:00 2001 From: Kresten Krab Thorup Date: Wed, 6 Jun 2012 15:29:31 +0200 Subject: [PATCH] If JIT fails, fallback to interpreter This is actually a hack, but works if e.g. the generated byte code is too large. --- src/main/java/erjang/EModuleLoader.java | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/src/main/java/erjang/EModuleLoader.java b/src/main/java/erjang/EModuleLoader.java index bf407a4c..8515e904 100644 --- a/src/main/java/erjang/EModuleLoader.java +++ b/src/main/java/erjang/EModuleLoader.java @@ -77,9 +77,18 @@ public static EModule load_module(String moduleName, EBinary beamBin) throws IOE loaded_module = erjang.beam.interpreter.Interpreter.beamFileToEModule(bfd); after = System.currentTimeMillis(); } else { // Use compiler - EModuleClassLoader moduleClassLoader = ErjangCodeCache.getModuleClassLoader(moduleName, beamBin, beamParser); - after = System.currentTimeMillis(); - loaded_module = load_compiled_module(moduleName, moduleClassLoader); + try { + EModuleClassLoader moduleClassLoader = ErjangCodeCache.getModuleClassLoader(moduleName, beamBin, beamParser); + after = System.currentTimeMillis(); + loaded_module = load_compiled_module(moduleName, moduleClassLoader); + } catch (RuntimeException e) { + + use_interpreter = true; + // i something fails, ... try interpreted ... + BeamFileData bfd = beamParser.load(beamBin.toByteArray()); + loaded_module = erjang.beam.interpreter.Interpreter.beamFileToEModule(bfd); + after = System.currentTimeMillis(); + } } if (log.isLoggable(Level.FINE)) { long after_load = System.currentTimeMillis();