internal override CodeElement ToCodeElement() { if (val.ptr == null) { return(new CodeElementUIntInt(1, val.Int)); } TPointerXT xt = val.ptr as TPointerXT; if (xt != null) { if (val.x != 0) { throw new Exception( "Cannot compile XT: non-zero offset"); } return(new CodeElementUIntInt(1, xt.Target.Slot)); } TPointerBlob bp = val.ptr as TPointerBlob; if (bp != null) { return(new CodeElementUIntInt(1, val.x + bp.Blob.Address)); } TPointerExpr cx = val.ptr as TPointerExpr; if (cx != null) { return(new CodeElementUIntExpr(1, cx, val.x)); } throw new Exception(String.Format( "Cannot embed constant (type = {0})", val.ptr.GetType().FullName)); }
internal override Word GetReference(T0Comp ctx) { TPointerXT xt = val.ptr as TPointerXT; if (xt == null) { return(null); } xt.Resolve(ctx); return(xt.Target); }
/* * Convert this value to an XT. On failure, an exception is thrown. */ internal TPointerXT ToXT() { TPointerXT xt = ptr as TPointerXT; if (xt == null) { throw new Exception( "value is not an xt: " + ToString()); } return(xt); }
/* * Add a "call" opcode whose target is an XT value (which may be * resolved or as yet unresolved). */ internal void Call(TPointerXT xt) { if (xt.Target == null) { Add(new OpcodeCall(), xt.Name); } else { Add(new OpcodeCall(xt.Target)); } }
internal override bool Equals(TPointerBase tp) { TPointerXT tx = tp as TPointerXT; return(tx != null && Name == tx.Name); }