]> git.ipfire.org Git - thirdparty/vim.git/commitdiff
patch 8.2.2390: Vim9: using positive offset is unexpected v8.2.2390
authorBram Moolenaar <Bram@vim.org>
Fri, 22 Jan 2021 16:51:06 +0000 (17:51 +0100)
committerBram Moolenaar <Bram@vim.org>
Fri, 22 Jan 2021 16:51:06 +0000 (17:51 +0100)
Problem:    Vim9: using positive offset is unexpected.
Solution:   Use int8_T instead of char. (James McCoy)

src/version.c
src/vim9.h
src/vim9compile.c
src/vim9execute.c

index 568756b85f09d16d04dce26ff9565e288f4df8d0..722c8332fc3d6314f8cd80cd292d6a1469f8fc63 100644 (file)
@@ -750,6 +750,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    2390,
 /**/
     2389,
 /**/
index e6c4087c617df189715e534c8532a5b4a6c863b9..8d4faa3d11b505109af19821a17ee7082d40b425 100644 (file)
@@ -224,8 +224,8 @@ typedef struct {
 // arguments to ISN_CHECKTYPE
 typedef struct {
     type_T     *ct_type;
-    char       ct_off;         // offset in stack (positive), 1 is bottom
-    char       ct_arg_idx;     // argument index or zero
+    int8_T     ct_off;         // offset in stack, -1 is bottom
+    int8_T     ct_arg_idx;     // argument index or zero
 } checktype_T;
 
 // arguments to ISN_STORENR
index 2fad4ac34b736dad19dc3631d672d9f429453d37..ae5cb12f3f7afcb13daedebe1872fa8487a2d341 100644 (file)
@@ -826,10 +826,8 @@ generate_TYPECHECK(
     if ((isn = generate_instr(cctx, ISN_CHECKTYPE)) == NULL)
        return FAIL;
     isn->isn_arg.type.ct_type = alloc_type(expected);
-    // Use the negated offset so that it's always positive.  Some systems don't
-    // support negative numbers for "char".
-    isn->isn_arg.type.ct_off = (char)-offset;
-    isn->isn_arg.type.ct_arg_idx = argidx;
+    isn->isn_arg.type.ct_off = (int8_T)offset;
+    isn->isn_arg.type.ct_arg_idx = (int8_T)argidx;
 
     // type becomes expected
     ((type_T **)stack->ga_data)[stack->ga_len + offset] = expected;
index b5f4be34e3f6e99af5864f3a4497d40c335c4020..21f7bb24ff24f552056501146738004d3c99d79f 100644 (file)
@@ -3240,7 +3240,7 @@ call_def_function(
                {
                    checktype_T *ct = &iptr->isn_arg.type;
 
-                   tv = STACK_TV_BOT(-(int)ct->ct_off);
+                   tv = STACK_TV_BOT((int)ct->ct_off);
                    SOURCING_LNUM = iptr->isn_lnum;
                    if (check_typval_type(ct->ct_type, tv, ct->ct_arg_idx)
                                                                       == FAIL)
@@ -4242,11 +4242,11 @@ ex_disassemble(exarg_T *eap)
                      if (ct->ct_arg_idx == 0)
                          smsg("%4d CHECKTYPE %s stack[%d]", current,
                                          type_name(ct->ct_type, &tofree),
-                                         -(int)ct->ct_off);
+                                         (int)ct->ct_off);
                      else
                          smsg("%4d CHECKTYPE %s stack[%d] arg %d", current,
                                          type_name(ct->ct_type, &tofree),
-                                         -(int)ct->ct_off,
+                                         (int)ct->ct_off,
                                          (int)ct->ct_arg_idx);
                      vim_free(tofree);
                      break;