001 /* 002 * Copyright 2010-2013 JetBrains s.r.o. 003 * 004 * Licensed under the Apache License, Version 2.0 (the "License"); 005 * you may not use this file except in compliance with the License. 006 * You may obtain a copy of the License at 007 * 008 * http://www.apache.org/licenses/LICENSE-2.0 009 * 010 * Unless required by applicable law or agreed to in writing, software 011 * distributed under the License is distributed on an "AS IS" BASIS, 012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 013 * See the License for the specific language governing permissions and 014 * limitations under the License. 015 */ 016 017 package org.jetbrains.jet.codegen.inline; 018 019 import org.jetbrains.asm4.AnnotationVisitor; 020 import org.jetbrains.asm4.Label; 021 import org.jetbrains.asm4.MethodVisitor; 022 import org.jetbrains.asm4.Opcodes; 023 import org.jetbrains.asm4.commons.InstructionAdapter; 024 025 public class RemapVisitor extends InstructionAdapter { 026 027 private final Label end; 028 029 private final VarRemapper remapper; 030 031 private final boolean remapReturn; 032 033 protected RemapVisitor(MethodVisitor mv, Label end, VarRemapper.ParamRemapper remapper, boolean remapReturn) { 034 super(InlineCodegenUtil.API, mv); 035 this.end = end; 036 this.remapper = remapper; 037 this.remapReturn = remapReturn; 038 } 039 040 @Override 041 public void visitInsn(int opcode) { 042 if (remapReturn && opcode >= Opcodes.IRETURN && opcode <= Opcodes.RETURN) { 043 super.visitJumpInsn(Opcodes.GOTO, end); 044 } 045 else { 046 super.visitInsn(opcode); 047 } 048 } 049 050 @Override 051 public void visitIincInsn(int var, int increment) { 052 remapper.visitIincInsn(var, increment, mv); 053 } 054 055 @Override 056 public void visitVarInsn(int opcode, int var) { 057 remapper.visitVarInsn(opcode, var, new InstructionAdapter(mv)); 058 } 059 060 @Override 061 public void visitLocalVariable( 062 String name, String desc, String signature, Label start, Label end, int index 063 ) { 064 065 } 066 067 @Override 068 public AnnotationVisitor visitAnnotationDefault() { 069 return null; 070 } 071 072 @Override 073 public void visitMaxs(int maxStack, int maxLocals) { 074 075 } 076 077 @Override 078 public AnnotationVisitor visitAnnotation(String desc, boolean visible) { 079 return null; 080 } 081 082 @Override 083 public AnnotationVisitor visitParameterAnnotation(int parameter, String desc, boolean visible) { 084 return null; 085 } 086 087 @Override 088 public void visitFieldInsn(int opcode, String owner, String name, String desc) { 089 if (name.equals("$$$this")) { 090 super.visitVarInsn(Opcodes.ALOAD, 0); 091 } else { 092 super.visitFieldInsn(opcode, owner, name, desc); 093 } 094 } 095 096 //TODO not skip for lambdas 097 @Override 098 public void visitLineNumber(int line, Label start) { 099 100 } 101 }