diff --git a/src/main/java/dan200/computercraft/core/asm/Generator.java b/src/main/java/dan200/computercraft/core/asm/Generator.java index a57e8e44e..c559c4112 100644 --- a/src/main/java/dan200/computercraft/core/asm/Generator.java +++ b/src/main/java/dan200/computercraft/core/asm/Generator.java @@ -56,11 +56,11 @@ public final class Generator private final LoadingCache, List>> classCache = CacheBuilder .newBuilder() - .build( CacheLoader.from( this::build ) ); + .build( CacheLoader.from( catching( this::build, Collections.emptyList() ) ) ); private final LoadingCache> methodCache = CacheBuilder .newBuilder() - .build( CacheLoader.from( this::build ) ); + .build( CacheLoader.from( catching( this::build, Optional.empty() ) ) ); Generator( Class base, List> context, Function wrap ) { @@ -358,4 +358,22 @@ private Boolean loadArg( MethodVisitor mw, Class target, Method method, java. arg.getName(), method.getDeclaringClass().getName(), method.getName() ); return null; } + + @SuppressWarnings( "Guava" ) + private static com.google.common.base.Function catching( Function function, U def ) + { + return x -> { + try + { + return function.apply( x ); + } + catch( Exception | LinkageError e ) + { + // LinkageError due to possible codegen bugs and NoClassDefFoundError. The latter occurs when fetching + // methods on a class which references non-existent (i.e. client-only) types. + ComputerCraft.log.error( "Error generating @LuaFunctions", e ); + return def; + } + }; + } }