Beispiel #1
0
        public void EmitDeserialize(Emit emiter, Local value)
        {
            var elementType = value.LocalType.GetElementType();

            //value = new Type[100];
            emiter.LoadConstant(100);
            emiter.NewArray(elementType);
            emiter.StoreLocal(value);

            var loop      = emiter.DefineLabel();
            var loopCheck = emiter.DefineLabel();

            using (var ex = emiter.DeclareLocal <Exception>("_ex"))
                using (var element = emiter.DeclareLocal(elementType, "element"))
                    using (var i = emiter.DeclareLocal <int>("i"))
                    {
                        emiter.MarkLabel(loop);

                        var eb = emiter.BeginExceptionBlock();
                        if (_compiler != null)
                        {
                            _compiler.EmitDeserialize(emiter, element);
                        }
                        else if (_serializer != null)
                        {
                            emiter.CallDeserializer(_serializer, element);
                        }
                        else
                        {
                            emiter.CallDeserializerForType(elementType, element);
                        }
                        var cb = emiter.BeginCatchBlock <Exception>(eb);
                        emiter.StoreLocal(ex);
                        emiter.EndCatchBlock(cb);
                        emiter.EndExceptionBlock(eb);

                        // value[i] = element
                        emiter.LoadLocal(value);
                        emiter.LoadLocal(i);
                        emiter.LoadLocal(element);
                        emiter.StoreElement(elementType);

                        // ++i
                        emiter.LoadLocal(i);
                        emiter.LoadConstant(1);
                        emiter.Add();
                        emiter.StoreLocal(i);

                        // i < length
                        emiter.MarkLabel(loopCheck);
                        emiter.LoadLocal(i);
                        emiter.LoadConstant(100);
                        emiter.BranchIfLess(loop);
                    }
        }