Java tutorial
/* * @(#)$Id$ * * Copyright 2006-2008 Makoto YUI * * Licensed 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. * * Contributors: * Makoto YUI - initial implementation */ package xbird.xquery.compile; import java.util.IdentityHashMap; import xbird.util.collections.IndexedSet; import org.objectweb.asm.*; /** * * <DIV lang="en"></DIV> * <DIV lang="ja"></DIV> * * @author Makoto YUI (yuin405+xbird@gmail.com) */ public final class MethodGenerator implements MethodVisitor { private final MethodVisitor mv; private final IndexedSet<Object> objectCodes; public MethodGenerator(MethodVisitor mv) { this.mv = mv; this.objectCodes = new IndexedSet<Object>(new IdentityHashMap<Object, Integer>(128)); } public int defineLocal(Object obj, Label start, Label end) { int slot = objectCodes.indexOf(obj); if (slot != -1) { return slot + 1; } slot = objectCodes.addIndexOf(obj) + 1; visitLocalVariable(String.valueOf(slot), BytecodeHelper.getDescriptor(obj.getClass()), start, end, slot); return slot; } public AnnotationVisitor visitAnnotation(String desc, boolean visible) { return mv.visitAnnotation(desc, visible); } public AnnotationVisitor visitAnnotationDefault() { return mv.visitAnnotationDefault(); } public void visitAttribute(Attribute attr) { mv.visitAttribute(attr); } public void visitCode() { mv.visitCode(); } public void visitEnd() { mv.visitEnd(); } public void visitFieldInsn(int opcode, String owner, String name, String desc) { mv.visitFieldInsn(opcode, owner, name, desc); } public void visitFrame(int type, int nLocal, Object[] local, int nStack, Object[] stack) { mv.visitFrame(type, nLocal, local, nStack, stack); } public void visitIincInsn(int var, int increment) { mv.visitIincInsn(var, increment); } public void visitInsn(int opcode) { mv.visitInsn(opcode); } public void visitIntInsn(int opcode, int operand) { mv.visitIntInsn(opcode, operand); } public void visitJumpInsn(int opcode, Label label) { mv.visitJumpInsn(opcode, label); } public void visitLabel(Label label) { mv.visitLabel(label); } public void visitLdcInsn(Object cst) { mv.visitLdcInsn(cst); } public void visitLineNumber(int line, Label start) { mv.visitLineNumber(line, start); } public void visitLocalVariable(String name, String desc, Label start, Label end, int index) { mv.visitLocalVariable(name, desc, null, start, end, index); } public void visitLocalVariable(String name, String desc, String signature, Label start, Label end, int index) { mv.visitLocalVariable(name, desc, signature, start, end, index); } public void visitLookupSwitchInsn(Label dflt, int[] keys, Label[] labels) { mv.visitLookupSwitchInsn(dflt, keys, labels); } public void visitMaxs(int maxStack, int maxLocals) { mv.visitMaxs(maxStack, maxLocals); } public void visitMethodInsn(int opcode, String owner, String name, String desc) { mv.visitMethodInsn(opcode, owner, name, desc); } public void visitMultiANewArrayInsn(String desc, int dims) { mv.visitMultiANewArrayInsn(desc, dims); } public AnnotationVisitor visitParameterAnnotation(int parameter, String desc, boolean visible) { return mv.visitParameterAnnotation(parameter, desc, visible); } public void visitTableSwitchInsn(int min, int max, Label dflt, Label[] labels) { mv.visitTableSwitchInsn(min, max, dflt, labels); } public void visitTryCatchBlock(Label start, Label end, Label handler, String type) { mv.visitTryCatchBlock(start, end, handler, type); } public void visitTypeInsn(int opcode, String desc) { mv.visitTypeInsn(opcode, desc); } public void visitVarInsn(int opcode, int var) { mv.visitVarInsn(opcode, var); } }