[mono][interp] Fix handling of boolean comparison (#88193)
authorVlad Brezae <brezaevlad@gmail.com>
Thu, 29 Jun 2023 16:47:57 +0000 (19:47 +0300)
committerGitHub <noreply@github.com>
Thu, 29 Jun 2023 16:47:57 +0000 (11:47 -0500)
A boolean value is actually stored as byte behind the scenes, so it can have a value range from 0..255, not just 0/1. Stop converting it to 0/1 when loading it since it can lead to comparison issues.

src/mono/mono/mini/interp/interp.c

index cc60eac..d24727f 100644 (file)
@@ -869,17 +869,13 @@ stackval_to_data (MonoType *type, stackval *val, void *data, gboolean pinvoke)
        }
        /* printf ("TODAT0 %p\n", data); */
        switch (type->type) {
+       case MONO_TYPE_BOOLEAN:
        case MONO_TYPE_I1:
        case MONO_TYPE_U1: {
                guint8 *p = (guint8*)data;
                *p = GINT32_TO_UINT8 (val->data.i);
                return MINT_STACK_SLOT_SIZE;
        }
-       case MONO_TYPE_BOOLEAN: {
-               guint8 *p = (guint8*)data;
-               *p = (val->data.i != 0);
-               return MINT_STACK_SLOT_SIZE;
-       }
        case MONO_TYPE_I2:
        case MONO_TYPE_U2:
        case MONO_TYPE_CHAR: {