Branch: Tag:

2020-09-26

2020-09-26 12:35:31 by Henrik Grubbström (Grubba) <grubba@grubba.org>

Compiler [Typechecker]: Fixed some issues with the marker remapper.

* The flags are now in an enum.
* The flag constants have been renamed slightly.
* The PT_FLAG_REMAP_SWAP_MARKERS flag should now work as intended.
* free_marker() now also receives the flags. This is needed
to avoid issues with PT_FLAG_REMAP_SWAP_MARKERS.

3718:    unsigned INT32 allocated;   };    - static int alloc_remap_marker(struct remap_state *remap, int marker, int flags) + static int alloc_remap_marker(struct remap_state *remap, int marker, +  enum pt_remap_flags flags)   {    int ret;       if (!remap) return '0' | (marker & 0x0f);    -  if (flags & PT_FLAG_SWAP_MARKERS) flags ^= 0x10; +  if (flags & PT_FLAG_REMAP_SWAP_MARKERS) marker ^= 0x10;       if ((ret = remap->map[marker & 0x1f])) return ret;   
3740:    return 0;   }    - static int remap_marker(struct remap_state *remap, int marker, int flags) + static int remap_marker(struct remap_state *remap, int marker, +  enum pt_remap_flags flags)   {    int ret;       if (!remap) return '0' | (marker & 0x0f);    -  if (flags & PT_FLAG_SWAP_MARKERS) flags ^= 0x10; +  if (flags & PT_FLAG_REMAP_SWAP_MARKERS) marker ^= 0x10;       if ((ret = remap->map[marker & 0x1f])) return ret;   
3762:    return 0;   }    - static void free_marker(struct remap_state *remap, int marker) + static void free_marker(struct remap_state *remap, int marker, +  enum pt_remap_flags flags)   {    int m;       if (!remap) return;    -  +  if (flags & PT_FLAG_REMAP_SWAP_MARKERS) marker ^= 0x10; +     if (!(m = remap->map[marker & 0x1f])) return;       remap->map[marker & 0x1f] = 0;
3776:      static void push_remap_markers(struct pike_type *t,    struct remap_state *remap, -  int flags) +  enum pt_remap_flags flags)   {    if (!remap) {    push_finished_type(t);
3801:    {    int marker = remap_marker(remap, t->type, flags);    if (!marker) { -  /* FIXME: Improved error handling here. */ +  /* FIXME: Improve error handling here. */    push_type(T_MIXED);    } else {    push_type(marker);    } -  if (flags & PT_FLAG_BOTH_MARKERS) { -  marker = remap_marker(remap, t->type ^ 0x10, flags); +  if (flags & PT_FLAG_REMAP_BOTH_MARKERS) { +  marker = remap_marker(remap, t->type, +  flags ^ PT_FLAG_REMAP_SWAP_MARKERS);    if (!marker) { -  /* FIXME: Improved error handling here. */ +  /* FIXME: Improve error handling here. */    push_type(T_MIXED);    } else {    push_type(marker);    } -  switch(flags & PT_FLAG_BOTH_MARKERS_MASK) { -  case PT_FLAG_BOTH_MARKERS_AND: +  switch(flags & PT_FLAG_REMAP_BOTH_MARKERS_MASK) { +  case PT_FLAG_REMAP_BOTH_MARKERS_AND:    push_type(T_AND);    break; -  case PT_FLAG_BOTH_MARKERS_OR: +  case PT_FLAG_REMAP_BOTH_MARKERS_OR:    push_type(T_OR);    break;    default:
3906:    */   static struct pike_type *remap_markers(struct pike_type *t,    struct remap_state *remap, -  int flags) +  enum pt_remap_flags flags)   {    type_stack_mark();    push_remap_markers(t, remap, flags);