protected override void WriteNotEmpty(WriterMethodBuilderContext context) { var typeCode = GroBufTypeCodeMap.GetTypeCode(Type); context.WriteTypeCode(typeCode); context.GoToCurrentLocation(); // stack: [&result[index]] var il = context.Il; switch (typeCode) { case GroBufTypeCode.Int8: case GroBufTypeCode.UInt8: case GroBufTypeCode.Boolean: il.Ldc_I4(1); context.AssertLength(); context.LoadObj(); // stack: [&result[index], obj] il.Stind(typeof(byte)); // result[index] = obj context.IncreaseIndexBy1(); // index = index + 1 break; case GroBufTypeCode.Int16: case GroBufTypeCode.UInt16: il.Ldc_I4(2); context.AssertLength(); context.LoadObj(); // stack: [&result[index], obj] il.Stind(typeof(short)); // result[index] = obj context.IncreaseIndexBy2(); // index = index + 2 break; case GroBufTypeCode.Int32: case GroBufTypeCode.UInt32: il.Ldc_I4(4); context.AssertLength(); context.LoadObj(); // stack: [&result[index], obj] il.Stind(typeof(int)); // result[index] = obj context.IncreaseIndexBy4(); // index = index + 4 break; case GroBufTypeCode.Int64: case GroBufTypeCode.UInt64: il.Ldc_I4(8); context.AssertLength(); context.LoadObj(); // stack: [&result[index], obj] il.Stind(typeof(long)); // result[index] = obj context.IncreaseIndexBy8(); // index = index + 8 break; case GroBufTypeCode.Single: il.Ldc_I4(4); context.AssertLength(); context.LoadObj(); // stack: [&result[index], obj] il.Stind(typeof(float)); // result[index] = obj context.IncreaseIndexBy4(); // index = index + 4 break; case GroBufTypeCode.Double: il.Ldc_I4(8); context.AssertLength(); context.LoadObj(); // stack: [&result[index], obj] il.Stind(typeof(double)); // result[index] = obj context.IncreaseIndexBy8(); // index = index + 8 break; case GroBufTypeCode.Decimal: il.Ldc_I4(16); context.AssertLength(); context.LoadObjByRef(); // stack: [&result[index], &obj] il.Ldind(typeof(long)); // stack: [&result[index], (int64)*obj] il.Stind(typeof(long)); // result[index] = (int64)*obj context.IncreaseIndexBy8(); // index = index + 8 context.GoToCurrentLocation(); // stack: [&result[index]] context.LoadObjByRef(); // stack: [&result[index], &obj] il.Ldc_I4(8); // stack: [&result[index], &obj, 8] il.Add(); // stack: [&result[index], &obj + 8] il.Ldind(typeof(long)); // stack: [&result[index], *(&obj+8)] il.Stind(typeof(long)); // result[index] = (int64)*(obj + 8) context.IncreaseIndexBy8(); // index = index + 8 break; default: throw new NotSupportedException(); } }