001// Copyright 2011 The Apache Software Foundation 002// 003// Licensed under the Apache License, Version 2.0 (the "License"); 004// you may not use this file except in compliance with the License. 005// You may obtain a copy of the License at 006// 007// http://www.apache.org/licenses/LICENSE-2.0 008// 009// Unless required by applicable law or agreed to in writing, software 010// distributed under the License is distributed on an "AS IS" BASIS, 011// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 012// See the License for the specific language governing permissions and 013// limitations under the License. 014 015package org.apache.tapestry5.internal.plastic; 016 017import org.apache.tapestry5.internal.plastic.asm.Label; 018import org.apache.tapestry5.plastic.InstructionBuilder; 019import org.apache.tapestry5.plastic.InstructionBuilderCallback; 020import org.apache.tapestry5.plastic.TryCatchBlock; 021import org.apache.tapestry5.plastic.TryCatchCallback; 022 023public class TryCatchBlockImpl extends Lockable implements TryCatchBlock 024{ 025 private final InstructionBuilder builder; 026 027 private final InstructionBuilderState state; 028 029 private final Label startLabel, endLabel; 030 031 TryCatchBlockImpl(InstructionBuilder builder, InstructionBuilderState state) 032 { 033 this.builder = builder; 034 this.state = state; 035 036 this.startLabel = new Label(); 037 this.endLabel = new Label(); 038 } 039 040 public void addTry(InstructionBuilderCallback callback) 041 { 042 state.visitor.visitLabel(startLabel); 043 044 callback.doBuild(builder); 045 046 state.visitor.visitLabel(endLabel); 047 } 048 049 public void addCatch(String exceptionClassName, InstructionBuilderCallback callback) 050 { 051 assert exceptionClassName != null; 052 053 doCatch(state.nameCache.toInternalName(exceptionClassName), callback); 054 } 055 056 private void doCatch(String exceptionInternalName, InstructionBuilderCallback callback) 057 { 058 check(); 059 060 Label handler = state.newLabel(); 061 062 callback.doBuild(builder); 063 064 state.visitor.visitTryCatchBlock(startLabel, endLabel, handler, exceptionInternalName); 065 } 066 067 public void addFinally(InstructionBuilderCallback callback) 068 { 069 doCatch(null, callback); 070 } 071 072 void doCallback(TryCatchCallback callback) 073 { 074 assert callback != null; 075 076 callback.doBlock(this); 077 078 lock(); 079 } 080 081}