package builtin.system; import builtin.BuiltinSub; import gui.Constants; import gui.Heap; import gui.MintException; import gui.Pointer; import gui.PointerTools; import gui.SmartList; /** * * @author Oliver Chu */ public class Inject extends BuiltinSub { private Pointer wrap(int i) { return new Pointer(Constants.INT_TYPE, i); } @Override public Pointer apply(SmartList<Pointer> args) throws MintException { Pointer argument = args.get(0); if (argument.type == Constants.INT_TYPE) { int argVal = argument.value; switch (argVal) { case 0: return Constants.MINT_NULL; case 1: return Constants.MINT_TRUE; case 2: return Constants.MINT_FALSE; case -1: return Heap.allocateReal(Double.NaN); case -2: return Heap.allocateReal(Double.POSITIVE_INFINITY); default: return wrap(~argVal); } } else { SmartList<Pointer> ptr = PointerTools.dereferenceList(argument); if (ptr == null || ptr.size() < 2) { return Constants.MINT_NULL; } return new Pointer(Constants.STR_TYPE, ptr.get(1).value); } } }