private EmitCastclass ( |
||
type | ||
리턴 | void |
internal void EmitCastclass(Type type)
{
if (verboseCastFailure != null)
{
CodeEmitterLocal lb = DeclareLocal(Types.Object);
Emit(OpCodes.Stloc, lb);
Emit(OpCodes.Ldloc, lb);
Emit(OpCodes.Isinst, type);
Emit(OpCodes.Dup);
CodeEmitterLabel ok = DefineLabel();
Emit(OpCodes.Brtrue_S, ok);
Emit(OpCodes.Ldloc, lb);
Emit(OpCodes.Brfalse_S, ok); // handle null
Emit(OpCodes.Ldtoken, type);
Emit(OpCodes.Ldloc, lb);
Emit(OpCodes.Call, verboseCastFailure);
MarkLabel(ok);
}
else
{
Emit(OpCodes.Castclass, type);
}
}
internal override void EmitCheckcast(CodeEmitter ilgen) { if (IsRemapped) { TypeWrapper shadow = ClassLoaderWrapper.GetWrapperFromType(type); MethodInfo method = shadow.TypeAsBaseType.GetMethod("__<checkcast>"); if (method != null) { ilgen.Emit(OpCodes.Call, method); return; } } ilgen.EmitCastclass(type); }