assert toType != null;
    Item coerce(Item item, MSILType toType) {	if (toType == MSILType.VOID)	    return drop(item);	switch (item) {	case VoidItem():	case SelfItem():	    return item;	case StackItem():	    if (item.type == MSILType.BOOL && toType == MSILType.I4) //?????????		return items.StackItem(toType);	    if (item.type != toType) {		emitConvert(toType);		return items.StackItem(toType);	    }	    return item;	case LiteralItem(MSILType type, Object value):	    //log("coercing Literal " + type + " -> " + toType);	    switch (type) {	    case REF(_): return item;	    default:		return (type == toType) ? item : items.LiteralItem(toType, value);	    }	    //return (type == toType) ? item : items.LiteralItem(toType, value);	default:	    return coerce(load(item), toType);	}    }