/**
* Copyright (c) 2012-2016 André Bargull
* Alle Rechte vorbehalten / All Rights Reserved. Use is subject to license terms.
*
* <https://github.com/anba/es6draft>
*/
package com.github.anba.es6draft.compiler;
import com.github.anba.es6draft.compiler.assembler.Jump;
/**
* Specialized {@link Jump} objects.
*/
final class Labels {
private Labels() {
}
/**
* Label for {@code break} statements.
*/
static final class BreakLabel extends Jump {
}
/**
* Label for {@code continue} statements.
*/
static final class ContinueLabel extends Jump {
}
/**
* Label for {@code return} statements.
*/
static final class ReturnLabel extends Jump {
}
/**
* Wraps an existing {@link Jump}.
*/
static final class TempLabel extends Jump {
private final Jump wrapped;
TempLabel(Jump wrapped) {
this.wrapped = wrapped;
}
/**
* Returns the wrapped {@link Jump}.
*
* @return the wrapped label
*/
Jump getWrapped() {
return wrapped;
}
/**
* Recursively unwraps this temp label.
*
* @return the wrapped label
*/
Jump unwrap() {
Jump w = wrapped;
while (w instanceof TempLabel) {
w = ((TempLabel) w).wrapped;
}
return w;
}
/**
* Returns {@code true} if the wrapped label is a {@code return} label.
*
* @return {@code true} if {@code return} label
*/
boolean isReturn() {
return unwrap() instanceof ReturnLabel;
}
@Override
public String toString() {
return String.format("TempLabel [%s]", unwrap().getClass().getSimpleName());
}
}
}