/* * Copyright 2013 Guidewire Software, Inc. */ package gw.internal.gosu.parser; import gw.internal.ext.org.objectweb.asm.ClassWriter; import gw.internal.ext.org.objectweb.asm.Label; import gw.internal.ext.org.objectweb.asm.MethodVisitor; import gw.internal.ext.org.objectweb.asm.Opcodes; import java.util.List; public class ReloadClassesIndicatorCompiler implements Opcodes { private static long _compileCount = 0; private List<String> _changedTypes; private String _strScript; public static byte[] updateReloadClassesIndicator(List<String> changedTypes, String strScript ) { return new ReloadClassesIndicatorCompiler( changedTypes, strScript ).updateReloadClassesIndicator(); } private ReloadClassesIndicatorCompiler( List<String> changedTypes, String strScript ) { _changedTypes = changedTypes; _strScript = strScript; } private byte[] updateReloadClassesIndicator() { ClassWriter cw = new ClassWriter( 0 ); MethodVisitor mv; cw.visit( V1_6, ACC_PUBLIC + ACC_SUPER, "gw/internal/gosu/parser/ReloadClassesIndicator", null, "java/lang/Object", null ); cw.visitSource( "ReloadClassesIndicator.java", null ); { mv = cw.visitMethod( ACC_PUBLIC, "<init>", "()V", null, null ); mv.visitCode(); Label l0 = new Label(); mv.visitLabel( l0 ); mv.visitLineNumber( 5, l0 ); mv.visitVarInsn( ALOAD, 0 ); mv.visitMethodInsn( INVOKESPECIAL, "java/lang/Object", "<init>", "()V" ); mv.visitInsn( RETURN ); Label l1 = new Label(); mv.visitLabel( l1 ); mv.visitLocalVariable( "this", "Lgw/internal/gosu/parser/ReloadClassesIndicator;", null, l0, l1, 0 ); mv.visitMaxs( 1, 1 ); mv.visitEnd(); } { mv = cw.visitMethod( ACC_PUBLIC + ACC_STATIC, "timestamp", "()J", null, null ); mv.visitCode(); Label l0 = new Label(); mv.visitLabel( l0 ); mv.visitLineNumber( 7, l0 ); mv.visitLdcInsn( ++_compileCount ); mv.visitInsn( LRETURN ); mv.visitMaxs( 2, 0 ); mv.visitEnd(); } { mv = cw.visitMethod( ACC_PUBLIC + ACC_STATIC, "changedTypes", "()[Ljava/lang/String;", null, null ); mv.visitCode(); Label l0 = new Label(); mv.visitLabel( l0 ); mv.visitLineNumber( 11, l0 ); mv.visitLdcInsn( _changedTypes.size() ); mv.visitTypeInsn( ANEWARRAY, "java/lang/String" ); for( int i = 0; i < _changedTypes.size(); i++ ) { mv.visitInsn( DUP ); mv.visitLdcInsn( i ); mv.visitLdcInsn( _changedTypes.get( i ) ); mv.visitInsn( AASTORE ); } mv.visitInsn( ARETURN ); mv.visitMaxs( 4, 0 ); mv.visitEnd(); } { mv = cw.visitMethod( ACC_PUBLIC + ACC_STATIC, "getScript", "()Ljava/lang/String;", null, null ); mv.visitCode(); Label l0 = new Label(); mv.visitLabel( l0 ); mv.visitLineNumber( 15, l0 ); visitStringOrNull( mv, _strScript ); mv.visitInsn( ARETURN ); mv.visitMaxs( 1, 0 ); mv.visitEnd(); } cw.visitEnd(); return cw.toByteArray(); } private void visitStringOrNull( MethodVisitor mv, String value ) { if( value == null ) { mv.visitInsn( ACONST_NULL ); } else { mv.visitLdcInsn( value ); } } }