169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal/*
269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal * Javassist, a Java-bytecode translator toolkit.
369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal * Copyright (C) 1999-2007 Shigeru Chiba. All Rights Reserved.
469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal *
569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal * The contents of this file are subject to the Mozilla Public License Version
669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal * 1.1 (the "License"); you may not use this file except in compliance with
769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal * the License.  Alternatively, the contents of this file may be used under
869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal * the terms of the GNU Lesser General Public License Version 2.1 or later.
969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal *
1069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal * Software distributed under the License is distributed on an "AS IS" basis,
1169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
1269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal * for the specific language governing rights and limitations under the
1369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal * License.
1469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal */
1569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
1669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigalpackage javassist.runtime;
1769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
1869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal/**
1969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal * A support class for implementing <code>$cflow</code>.
2069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal * This support class is required at runtime
2169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal * only if <code>$cflow</code> is used.
2269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal *
2369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal * @see javassist.CtBehavior#useCflow(String)
2469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal */
2569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigalpublic class Cflow extends ThreadLocal {
2669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    private static class Depth {
2769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        private int depth;
2869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        Depth() { depth = 0; }
2969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        int get() { return depth; }
3069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        void inc() { ++depth; }
3169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        void dec() { --depth; }
3269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    }
3369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
3469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    protected synchronized Object initialValue() {
3569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        return new Depth();
3669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    }
3769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
3869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    /**
3969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * Increments the counter.
4069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     */
4169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public void enter() { ((Depth)get()).inc(); }
4269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
4369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    /**
4469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * Decrements the counter.
4569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     */
4669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public void exit() { ((Depth)get()).dec(); }
4769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
4869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    /**
4969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * Returns the value of the counter.
5069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     */
5169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public int value() { return ((Depth)get()).get(); }
5269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal}
53