/** * 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.assembler; /** * Object to represent a parameter or local variable. * * @param <T> * the variable type */ public final class Variable<T> implements MutableValue<T> { private final String name; private final Type type; private final int slot; private boolean alive = true; Variable(String name, Type type, int slot) { this.name = name; this.type = type; this.slot = slot; } /** * Returns the variable name. * * @return the variable name */ public String getName() { return name; } /** * Returns the variable type. * * @return the variable type */ public Type getType() { return type; } /** * Returns the bytecode index slot. * * @return the bytecode slot */ int getSlot() { return slot < 0 ? -slot : slot; } /** * Returns {@code true} if a slot is required for this variable. * * @return {@code true} if a slot is required */ boolean hasSlot() { return slot >= 0; } /** * Marks this variable as dead. */ void free() { alive = false; } /** * Returns {@code true} if the variable is in scope. * * @return {@code true} if the variable is in scope */ boolean isAlive() { return alive; } /** * Performs an unchecked type cast. * * @param <U> * the target type * @return this variable */ @SuppressWarnings("unchecked") public <U extends T> Variable<U> uncheckedCast() { return (Variable<U>) this; } @Override public void load(InstructionAssembler assembler) { assembler.load(this); } @Override public void store(InstructionAssembler assembler) { assembler.store(this); } }