blob: b485933561bbfb2a4d61ba451ce7dbe1c3150911 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
import org.objectweb.asm.MethodVisitor
import org.objectweb.asm.ClassWriter
import org.objectweb.asm.Label
import static org.objectweb.asm.Opcodes.ACC_PUBLIC
import static org.objectweb.asm.Opcodes.ACC_STATIC
import static org.objectweb.asm.Opcodes.ACC_SUPER
import static org.objectweb.asm.Opcodes.ALOAD
import static org.objectweb.asm.Opcodes.ATHROW
import static org.objectweb.asm.Opcodes.INVOKESPECIAL
import static org.objectweb.asm.Opcodes.RETURN
import static org.objectweb.asm.Opcodes.V1_5
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath "org.ow2.asm:asm:$asmVersion"
}
}
/**
* This tasks generates an utility class which allows sneaky throwing.
*/
task exceptionUtils {
ext.classFiles = [
"${buildDir}/generated-classes/org/codehaus/groovy/runtime/ExceptionUtils.class",
"${compileJava.destinationDir}/org/codehaus/groovy/runtime/ExceptionUtils.class"]
outputs.files classFiles
doLast {
ClassWriter cw = new ClassWriter(0);
MethodVisitor mv;
cw.visit(V1_5, ACC_PUBLIC + ACC_SUPER, 'org/codehaus/groovy/runtime/ExceptionUtils', null, 'java/lang/Object', null);
cw.visitSource('ExceptionUtils.java', null);
mv = cw.visitMethod(ACC_PUBLIC, '<init>', '()V', null, null);
mv.visitCode();
Label l0 = new Label();
mv.visitLabel(l0);
mv.visitLineNumber(18, l0);
mv.visitVarInsn(ALOAD, 0);
mv.visitMethodInsn(INVOKESPECIAL, 'java/lang/Object', '<init>', '()V', false);
mv.visitInsn(RETURN);
Label l1 = new Label();
mv.visitLabel(l1);
mv.visitLocalVariable('this', 'Lorg/codehaus/groovy/runtime/ExceptionUtils;', null, l0, l1, 0);
mv.visitMaxs(1, 1);
mv.visitEnd();
mv = cw.visitMethod(ACC_PUBLIC + ACC_STATIC, 'sneakyThrow', '(Ljava/lang/Throwable;)V', null, null);
mv.visitCode();
Label l2 = new Label();
mv.visitLabel(l2);
mv.visitLineNumber(20, l2);
mv.visitVarInsn(ALOAD, 0);
mv.visitInsn(ATHROW);
Label l3 = new Label();
mv.visitLabel(l3);
mv.visitLocalVariable('e', 'Ljava/lang/Throwable;', null, l2, l3, 0);
mv.visitMaxs(1, 1);
mv.visitEnd();
cw.visitEnd();
logger.lifecycle('Generating ExceptionUtils')
classFiles.each { classFile ->
def output = file(classFile)
output.parentFile.mkdirs()
output.withOutputStream {
it << cw.toByteArray()
}
}
}
}