package code.instr;

import code.space.Computation;
import code.space.Space;
import code.stuff.Logger;
import code.stuff.Tracer;
import code.term.Term;
import code.term.Variable;

/**
 * Store a fresh uninstantiated variable in a register
 *
 * @author Sergio Antoy
 * @since June 17, 2003
 */

public class StoreVar implements Instruction {
    private final int register;

    public StoreVar(int register) {
        if (register > Space.freeVar) {
            throw new RuntimeException
		("The maximum number of free variables in a rule is " + 
		 Space.freeVar);
        }
        this.register = register;
    }

    public void execute(Computation computation) {
        Variable v = new Variable();
        Term term = new Term(v);
        Space.instance.varRegister[register] = term;
        if (Tracer.instruction) {
            Logger.logln(computation.getIdString() + 
			 ": StoreVar: " + term + " in register " + register);
        }
    }

    public String printAsTxtLoadable() { return "StoreVar " + register; }
}
