本文整理汇总了C#中IProtoSerializer.EmitRead方法的典型用法代码示例。如果您正苦于以下问题:C# IProtoSerializer.EmitRead方法的具体用法?C# IProtoSerializer.EmitRead怎么用?C# IProtoSerializer.EmitRead使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类IProtoSerializer
的用法示例。
在下文中一共展示了IProtoSerializer.EmitRead方法的4个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C#代码示例。
示例1: ReadNullCheckedTail
internal void ReadNullCheckedTail(Type type, IProtoSerializer tail, Compiler.Local valueFrom)
{
#if !FX11
Type underlyingType;
if (type.IsValueType && (underlyingType = Helpers.GetUnderlyingType(type)) != null)
{
if(tail.RequiresOldValue)
{
// we expect the input value to be in valueFrom; need to unpack it from T?
using (Local loc = GetLocalWithValue(type, valueFrom))
{
LoadAddress(loc, type);
EmitCall(type.GetMethod("GetValueOrDefault", Helpers.EmptyTypes));
}
}
else
{
Helpers.DebugAssert(valueFrom == null); // not expecting a valueFrom in this case
}
tail.EmitRead(this, null); // either unwrapped on the stack or not provided
if (tail.ReturnsValue)
{
// now re-wrap the value
EmitCtor(type, underlyingType);
}
return;
}
#endif
// either a ref-type of a non-nullable struct; treat "as is", even if null
// (the type-serializer will handle the null case; it needs to allow null
// inputs to perform the correct type of subclass creation)
tail.EmitRead(this, valueFrom);
}
示例2: EmitReadAndAddItem
private static void EmitReadAndAddItem(Compiler.CompilerContext ctx, Compiler.Local list, IProtoSerializer tail, MethodInfo add)
{
ctx.LoadValue(list);
Type itemType = tail.ExpectedType;
if (tail.RequiresOldValue)
{
if (itemType.IsValueType || !tail.ReturnsValue)
{
// going to need a variable
using (Compiler.Local item = new Compiler.Local(ctx, itemType))
{
if (itemType.IsValueType)
{ // initialise the struct
ctx.LoadAddress(item, itemType);
ctx.EmitCtor(itemType);
}
else
{ // assign null
ctx.LoadNullRef();
ctx.StoreValue(item);
}
tail.EmitRead(ctx, item);
if (!tail.ReturnsValue) { ctx.LoadValue(item); }
}
}
else
{ // no variable; pass the null on the stack and take the value *off* the stack
ctx.LoadNullRef();
tail.EmitRead(ctx, null);
}
}
else
{
if (tail.ReturnsValue)
{ // out only (on the stack); just emit it
tail.EmitRead(ctx, null);
}
else
{ // doesn't take anything in nor return anything! WTF?
throw new InvalidOperationException();
}
}
// our "Add" is chosen either to take the correct type, or to take "object";
// we may need to box the value
Type addParamType = add.GetParameters()[0].ParameterType;
if(addParamType != itemType) {
if (addParamType == typeof(object))
{
ctx.CastToObject(itemType);
}
else
{
throw new InvalidOperationException("Conflicting item/add type");
}
}
ctx.EmitCall(add);
if (add.ReturnType != typeof(void))
{
ctx.DiscardValue();
}
}
示例3: CompilerContext
/*public static ProtoCallback BuildCallback(IProtoTypeSerializer head)
{
Type type = head.ExpectedType;
CompilerContext ctx = new CompilerContext(type, true, true);
using (Local typedVal = new Local(ctx, type))
{
ctx.LoadValue(Local.InputValue);
ctx.CastFromObject(type);
ctx.StoreValue(typedVal);
CodeLabel[] jumpTable = new CodeLabel[4];
for(int i = 0 ; i < jumpTable.Length ; i++) {
jumpTable[i] = ctx.DefineLabel();
}
ctx.LoadReaderWriter();
ctx.Switch(jumpTable);
ctx.Return();
for(int i = 0 ; i < jumpTable.Length ; i++) {
ctx.MarkLabel(jumpTable[i]);
if (head.HasCallbacks((TypeModel.CallbackType)i))
{
head.EmitCallback(ctx, typedVal, (TypeModel.CallbackType)i);
}
ctx.Return();
}
}
ctx.Emit(OpCodes.Ret);
return (ProtoCallback)ctx.method.CreateDelegate(
typeof(ProtoCallback));
}*/
public static ProtoDeserializer BuildDeserializer(IProtoSerializer head, TypeModel model)
{
Type type = head.ExpectedType;
CompilerContext ctx = new CompilerContext(type, false, true, model, typeof(object));
using (Local typedVal = new Local(ctx, type))
{
if (!type.IsValueType)
{
ctx.LoadValue(ctx.InputValue);
ctx.CastFromObject(type);
ctx.StoreValue(typedVal);
}
else
{
ctx.LoadValue(ctx.InputValue);
CodeLabel notNull = ctx.DefineLabel(), endNull = ctx.DefineLabel();
ctx.BranchIfTrue(notNull, true);
ctx.LoadAddress(typedVal, type);
ctx.EmitCtor(type);
ctx.Branch(endNull, true);
ctx.MarkLabel(notNull);
ctx.LoadValue(ctx.InputValue);
ctx.CastFromObject(type);
ctx.StoreValue(typedVal);
ctx.MarkLabel(endNull);
}
head.EmitRead(ctx, typedVal);
if (head.ReturnsValue) {
ctx.StoreValue(typedVal);
}
ctx.LoadValue(typedVal);
ctx.CastToObject(type);
}
ctx.Emit(OpCodes.Ret);
return (ProtoDeserializer)ctx.method.CreateDelegate(
typeof(ProtoDeserializer));
}
示例4: WriteFieldHandler
private void WriteFieldHandler(
Compiler.CompilerContext ctx, Type expected, Compiler.Local loc,
Compiler.CodeLabel handler, Compiler.CodeLabel @continue, IProtoSerializer serializer)
{
ctx.MarkLabel(handler);
if (serializer.ExpectedType == forType) {
EmitCreateIfNull(ctx, expected, loc);
serializer.EmitRead(ctx, loc);
}
else {
ctx.LoadValue(loc);
ctx.Cast(serializer.ExpectedType);
serializer.EmitRead(ctx, null);
}
if (serializer.ReturnsValue)
{ // update the variable
ctx.StoreValue(loc);
}
ctx.Branch(@continue, false); // "continue"
}