From 900cae7b13276968e3d6013f6ea67347242e1b4d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Sim=C3=B5es?= Date: Thu, 29 Apr 2021 03:25:28 +0100 Subject: [PATCH] Fix System.Device GpioPin.Read (#1898) --- ...gpio_native_System_Device_Gpio_GpioPin.cpp | 33 +++++++++++++------ 1 file changed, 23 insertions(+), 10 deletions(-) diff --git a/src/System.Device.Gpio/sys_dev_gpio_native_System_Device_Gpio_GpioPin.cpp b/src/System.Device.Gpio/sys_dev_gpio_native_System_Device_Gpio_GpioPin.cpp index ff010bd401..d4b313ac5c 100644 --- a/src/System.Device.Gpio/sys_dev_gpio_native_System_Device_Gpio_GpioPin.cpp +++ b/src/System.Device.Gpio/sys_dev_gpio_native_System_Device_Gpio_GpioPin.cpp @@ -21,21 +21,34 @@ HRESULT Library_sys_dev_gpio_native_System_Device_Gpio_GpioPin::Read___SystemDev CLR_RT_StackFrame &stack) { NANOCLR_HEADER(); - { - bool pinValue; - CLR_RT_HeapBlock *pThis = stack.This(); - FAULT_ON_NULL(pThis); + CLR_RT_TypeDef_Index gpioPinTypeDef; + CLR_RT_HeapBlock *hbObj; + bool pinValue; - if (pThis[FIELD___disposedValue].NumericByRef().u1 != 0) - { - NANOCLR_SET_AND_LEAVE(CLR_E_OBJECT_DISPOSED); - } + CLR_RT_HeapBlock &top = stack.PushValue(); - NANOCLR_CHECK_HRESULT(Read(pThis, pinValue)); + CLR_RT_HeapBlock *pThis = stack.This(); + FAULT_ON_NULL(pThis); - stack.SetResult_I4(pinValue); + if (pThis[FIELD___disposedValue].NumericByRef().u1 != 0) + { + NANOCLR_SET_AND_LEAVE(CLR_E_OBJECT_DISPOSED); } + + NANOCLR_CHECK_HRESULT(Read(pThis, pinValue)); + + // find type definition, don't bother checking the result as it exists for sure + g_CLR_RT_TypeSystem.FindTypeDef("GpioPin", "System.Device.Gpio", gpioPinTypeDef); + + // create an instance of + NANOCLR_CHECK_HRESULT(g_CLR_RT_ExecutionEngine.NewObjectFromIndex(top, gpioPinTypeDef)); + + // dereference the object in order to reach its fields + hbObj = top.Dereference(); + + hbObj[Library_sys_dev_gpio_native_System_Device_Gpio_PinValue::FIELD___value].NumericByRef().u1 = pinValue; + NANOCLR_NOCLEANUP(); }