protected override void AllocNativeToManaged(ILCodeStream codeStream) { ILEmitter emitter = _ilCodeStreams.Emitter; MethodDesc ctor = ManagedType.GetParameterlessConstructor(); if (ctor == null) { throw new InvalidProgramException(); } codeStream.Emit(ILOpcode.newobj, emitter.NewToken(ctor)); StoreManagedValue(codeStream); }
protected override void AllocNativeToManaged(ILCodeStream codeStream) { var emitter = _ilCodeStreams.Emitter; var lNull = emitter.NewCodeLabel(); // Check for null LoadNativeValue(codeStream); codeStream.Emit(ILOpcode.brfalse, lNull); codeStream.Emit(ILOpcode.newobj, emitter.NewToken( ManagedType.GetParameterlessConstructor())); StoreManagedValue(codeStream); codeStream.EmitLabel(lNull); }
protected override void TransformNativeToManaged(ILCodeStream codeStream) { ILEmitter emitter = _ilCodeStreams.Emitter; ILCodeLabel lNonNull = emitter.NewCodeLabel(); LoadManagedValue(codeStream); codeStream.Emit(ILOpcode.brtrue, lNonNull); MethodDesc ctor = ManagedType.GetParameterlessConstructor(); if (ctor == null) { throw new InvalidProgramException(); } codeStream.Emit(ILOpcode.newobj, emitter.NewToken(ctor)); StoreManagedValue(codeStream); codeStream.EmitLabel(lNonNull); LoadNativeAddr(codeStream); LoadManagedValue(codeStream); codeStream.Emit(ILOpcode.call, _ilCodeStreams.Emitter.NewToken( InteropStateManager.GetStructMarshallingNativeToManagedThunk(ManagedType))); }