/* * * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You 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. * */ package org.apache.flex.compiler.internal.as.codegen; import org.apache.flex.abc.semantics.Label; import org.apache.flex.compiler.internal.tree.as.SwitchNode; /** * There is an active SwitchControlFlowContext for the syntactic region of each * switch statement. The SwitchControlFlowContext regions are pushed and popped of the * activation stack in the {@link ControlFlowContextManager} by the appropriate * reduction actions. A context is active while the switch statement's subtrees are reduced; * the SwitchControlFlowContext is set up by calling * {@link ControlFlowContextManager#startSwitchContext(SwitchNode)} in the * reduction's Prologue. The SwitchControlFlowContext is torn down by calling * {@code ControlFlowContextManager#finishSwitchControlFlowContext(InstructionList)} * in the reduction's "epilogue." ( JBURG does not have a formal epilogue construct * so for now the "epilogue" is just open coded in each reduction ). * {@code ControlFlowContextManager#finishSwitchControlFlowContext(InstructionList)} * is typically one of the last actions in the epilogue, since it may add a * pending label to the reduction's result InstructionList, and the pending * label needs to be resolved to the next statement after the statement that set * up the c-f context. * */ class SwitchControlFlowContext extends ControlFlowContext { SwitchControlFlowContext(SwitchNode node) { super(node); } /** * break statements branching out of the statement * that established this control flow context target * this label. * @see {@link #getBreakLabel()}, which creates the label. */ private Label breakLabel = null; /** * @return this control-flow context's break Label, synthesized if necessary. */ @Override Label getBreakLabel() { if ( null == this.breakLabel ) this.breakLabel = new Label("#break#" + Integer.toHexString(this.hashCode())); return this.breakLabel; } /** * @return true if the context's break label has been touched. */ boolean hasActiveBreak() { return breakLabel != null; } @Override boolean hasDefaultBreakLabel() { return true; } }