Branch: Tag:

2020-10-05

2020-10-05 17:20:11 by Henrik Grubbström (Grubba) <grubba@grubba.org>

Compiler [Typechecker]: Adjusted API for remap_markers().

remap_markers() can now be used to evaluate markers.

3803:    remap->allocated &= ~(1 << (m & 0x0f));   }    + static struct pike_type *lookup_marker(struct mapping *markers, int marker) + { +  struct svalue key, *val; +  +  if (!markers || !marker) return NULL; +  +  SET_SVAL(key, T_INT, NUMBER_NUMBER, integer, marker); +  +  val = low_mapping_lookup(markers, &key); +  if (!val) return NULL; +  +  if (TYPEOF(*val) == PIKE_T_TYPE) { +  return val->u.type; +  } +  return NULL; + } +  + static void store_marker(struct mapping *markers, int marker, +  struct pike_type *value) + { +  struct svalue key, val; +  +  if (!markers || !marker) return; +  +  SET_SVAL(key, T_INT, NUMBER_NUMBER, integer, marker); +  SET_SVAL(val, T_TYPE, 0, type, value); +  mapping_insert(markers, &key, &val); + } +    static void push_remap_markers(struct pike_type *t, -  +  struct mapping *markers,    struct remap_state *remap,    enum pt_remap_flags flags)   {
3820:    case T_ASSIGN:    {    int marker = alloc_remap_marker(remap, CAR_TO_INT(t), flags); -  push_remap_markers(t->cdr, remap, flags); +  +  if (!markers || !(flags & PT_FLAG_REMAP_EVAL_MARKERS)) { +  push_remap_markers(t->cdr, markers, remap, flags);    push_assign_type(marker); -  +  } else { +  struct pike_type *old = lookup_marker(markers, marker); +  struct pike_type *new = t->cdr; +  if (old) { +  new = or_pike_types(old, new, 0); +  } else { +  add_ref(new); +  } +  store_marker(markers, marker, new); +  free_pike_type(new); +  push_remap_markers(t->cdr, markers, remap, flags); +  } +  +  if (flags & PT_FLAG_REMAP_BOTH_MARKERS) { +  marker = alloc_remap_marker(remap, CAR_TO_INT(t), +  flags ^ PT_FLAG_REMAP_SWAP_MARKERS); +  +  if (!markers || !(flags & PT_FLAG_REMAP_EVAL_MARKERS)) { +  push_assign_type(marker); +  } else { +  struct pike_type *old = lookup_marker(markers, marker); +  struct pike_type *new = t->cdr; +  if (old) { +  new = or_pike_types(old, new, 0); +  } else { +  add_ref(new); +  } +  store_marker(markers, marker, new); +  free_pike_type(new); +  push_remap_markers(t->cdr, markers, remap, flags); +  +  switch(flags & PT_FLAG_REMAP_BOTH_MARKERS_MASK) { +  case PT_FLAG_REMAP_BOTH_MARKERS_AND: +  push_type(T_AND);    break; -  +  case PT_FLAG_REMAP_BOTH_MARKERS_OR: +  push_type(T_OR); +  break; +  default: +  Pike_fatal("Unsupported marker joining method.\n"); +  break;    } -  +  } +  } +  break; +  }       case '0': case '1': case '2': case '3': case '4':    case '5': case '6': case '7': case '8': case '9':    {    int marker = remap_marker(remap, t->type, flags); -  +  struct pike_type *value = lookup_marker(markers, marker); +  +  if (value) { +  push_remap_markers(value, markers, remap, flags); +  } else if ((markers) && (flags & PT_FLAG_REMAP_EVAL_MARKERS)) { +  /* Marker without matching assign. */ +  /* FIXME: Report error? */ +  push_type(T_MIXED); +  } else { +  +  /* Remap the marker. */ +     if (!marker) {    /* FIXME: Improve error handling here. */    push_type(T_MIXED);    } else {    push_type(marker);    } -  +  } +     if (flags & PT_FLAG_REMAP_BOTH_MARKERS) {    marker = remap_marker(remap, t->type,    flags ^ PT_FLAG_REMAP_SWAP_MARKERS); -  +  value = lookup_marker(markers, marker); +  +  if (value) { +  push_remap_markers(value, markers, remap, flags); +  } else if ((markers) && (flags & PT_FLAG_REMAP_EVAL_MARKERS)) { +  /* Marker without matching assign. */ +  /* FIXME: Report error? */ +  push_type(T_MIXED); +  } else { +  +  /* Remap the marker. */ +     if (!marker) {    /* FIXME: Improve error handling here. */    push_type(T_MIXED);    } else {    push_type(marker);    } -  +  } +     switch(flags & PT_FLAG_REMAP_BOTH_MARKERS_MASK) {    case PT_FLAG_REMAP_BOTH_MARKERS_AND:    push_type(T_AND);
3860:    }       case PIKE_T_NAME: -  push_remap_markers(t->cdr, remap, flags); +  push_remap_markers(t->cdr, markers, remap, flags);    push_type_name((struct pike_string *)(t->car));    break;       case PIKE_T_ATTRIBUTE: -  push_remap_markers(t->cdr, remap, flags); +  push_remap_markers(t->cdr, markers, remap, flags);    push_type_attribute((struct pike_string *)(t->car));    break;       case T_SCOPE: -  push_remap_markers(t->cdr, remap, flags); +  push_remap_markers(t->cdr, markers, remap, flags);    push_scope_type(CAR_TO_INT(t));    break;       case PIKE_T_OPERATOR: -  push_remap_markers(t->car, remap, flags); +  push_remap_markers(t->car, markers, remap, flags);       if (t->type & 0x8000) { -  push_remap_markers(t->cdr, remap, flags); +  push_remap_markers(t->cdr, markers, remap, flags);    push_reverse_type(t->type);    } else {    switch(t->type) {
3909:    case T_NOT:    case T_TYPE:    case PIKE_T_AUTO: -  push_remap_markers(t->car, remap, flags); +  push_remap_markers(t->car, markers, remap, flags);    push_type(t->type);    break;   
3924:    case T_ARRAY:    case T_STRING:    case PIKE_T_TRANSITIVE: -  push_remap_markers(t->car, remap, flags); -  push_remap_markers(t->cdr, remap, flags); +  push_remap_markers(t->car, markers, remap, flags); +  push_remap_markers(t->cdr, markers, remap, flags);    push_reverse_type(t->type);    break;    }
3935:    * Remap markers (if any) in the type.    */   static struct pike_type *remap_markers(struct pike_type *t, +  struct mapping *markers,    struct remap_state *remap,    enum pt_remap_flags flags)   {    type_stack_mark(); -  push_remap_markers(t, remap, flags); +  push_remap_markers(t, markers, remap, flags);    return pop_unfinished_type();   }   
4006:    int marker = remap_marker(remap, a->type, remap_flags);    if (!marker) return NULL;    -  tmp = remap_markers(b, remap, remap_flags ^ PT_FLAG_REMAP_SWAP_MARKERS); +  tmp = remap_markers(b, NULL, remap, +  remap_flags ^ PT_FLAG_REMAP_SWAP_MARKERS);    if (!tmp) return NULL;    type_stack_mark();    push_finished_type(tmp);
4042:    remap_flags ^ PT_FLAG_REMAP_SWAP_MARKERS);    if (!marker) return NULL;    -  tmp = remap_markers(a, remap, remap_flags); +  tmp = remap_markers(a, NULL, remap, remap_flags);    if (!tmp) return NULL;    type_stack_mark();    push_finished_type(tmp);
4142:    /* NB: We need to remap b->cdr separately to avoid remapping    * markers in a and b->car twice.    */ -  tmp2 = remap_markers(b->cdr, remap, +  tmp2 = remap_markers(b->cdr, NULL, remap,    remap_flags ^ PT_FLAG_REMAP_SWAP_MARKERS);    ret = low_subtract_types(tmp, tmp2, NULL, aflags, bflags, 0);    free_type(tmp);
4320:    }       type_stack_mark(); -  push_remap_markers(a, remap, remap_flags); +  push_remap_markers(a, NULL, remap, remap_flags);    return pop_unfinished_type();    }   
4342:    /* Either of a and/or b is a complex type, or a partial overlap. */       type_stack_mark(); -  push_remap_markers(a, remap, remap_flags); -  push_remap_markers(b, remap, remap_flags ^ PT_FLAG_REMAP_SWAP_MARKERS); +  push_remap_markers(a, NULL, remap, remap_flags); +  push_remap_markers(b, NULL, remap, +  remap_flags ^ PT_FLAG_REMAP_SWAP_MARKERS);    push_type(T_NOT);    push_reverse_type(T_AND);   
4446:    }    if (a->type == T_MIXED) {    type_stack_mark(); -  push_remap_markers(b, remap, remap_flags ^ PT_FLAG_REMAP_SWAP_MARKERS); +  push_remap_markers(b, NULL, remap, +  remap_flags ^ PT_FLAG_REMAP_SWAP_MARKERS);    push_type(T_NOT);    return pop_unfinished_type();    }
4457:    if (a->type == T_NOT) {    /* DeMorgan and(not(a), not(b)) <==> not(or(a, b)) */    type_stack_mark(); -  push_remap_markers(a->car, remap, remap_flags); -  push_remap_markers(b, remap, remap_flags ^ PT_FLAG_REMAP_SWAP_MARKERS); +  push_remap_markers(a->car, NULL, remap, remap_flags); +  push_remap_markers(b, NULL, remap, +  remap_flags ^ PT_FLAG_REMAP_SWAP_MARKERS);    push_type(T_OR);    push_type(T_NOT);    return pop_unfinished_type();
4468:    if (((a->type & PIKE_T_MASK) == PIKE_T_OPERATOR) ||    ((b->type & PIKE_T_MASK) == PIKE_T_OPERATOR)) {    type_stack_mark(); -  push_remap_markers(a, remap, remap_flags); -  push_remap_markers(b, remap, remap_flags ^ PT_FLAG_REMAP_SWAP_MARKERS); +  push_remap_markers(a, NULL, remap, remap_flags); +  push_remap_markers(b, NULL, remap, +  remap_flags ^ PT_FLAG_REMAP_SWAP_MARKERS);    push_type(T_NOT);    push_reverse_type(T_AND);    return pop_unfinished_type();
4640:       if (a == b) {    /* FIXME: Perform masking of remap_flags here. */ -  return remap_markers(a, remap, +  return remap_markers(a, NULL, remap,    remap_flags | PT_FLAG_REMAP_BOTH_MARKERS_AND);    }   
4667:    int marker = remap_marker(remap, a->type, remap_flags);    if (!marker) return NULL;    -  tmp = remap_markers(b, remap, remap_flags ^ PT_FLAG_REMAP_SWAP_MARKERS); +  tmp = remap_markers(b, NULL, remap, +  remap_flags ^ PT_FLAG_REMAP_SWAP_MARKERS);    if (!tmp) return NULL;    type_stack_mark();    push_finished_type(tmp);
4703:    remap_flags ^ PT_FLAG_REMAP_SWAP_MARKERS);    if (!marker) return NULL;    -  tmp = remap_markers(a, remap, remap_flags); +  tmp = remap_markers(a, NULL, remap, remap_flags);    if (!tmp) return NULL;    type_stack_mark();    push_finished_type(tmp);
4797:    return NULL;    }    free_type(tmp); -  tmp = remap_markers(a->car, remap, remap_flags); +  tmp = remap_markers(a->car, NULL, remap, remap_flags);    } else {    tmp = low_intersect_types(a->car, b, remap, aflags, bflags, remap_flags);    if (!tmp) return NULL;
4808:    }    if (a->cdr->type == T_NOT) {    free_type(tmp2); -  tmp2 = remap_markers(a->cdr, remap, remap_flags); +  tmp2 = remap_markers(a->cdr, NULL, remap, remap_flags);    }    }   
4845:    tmp2 = low_intersect_types(a, b->car, remap, aflags, bflags, remap_flags);    if (tmp2) {    free_type(tmp2); -  tmp2 = remap_markers(b->car, remap, +  tmp2 = remap_markers(b->car, NULL, remap,    remap_flags ^ PT_FLAG_REMAP_SWAP_MARKERS);    }    } else {
4854:    tmp2 = low_intersect_types(a, b->cdr, remap, aflags, bflags, remap_flags);    if (tmp2 && (b->cdr->type == T_NOT)) {    free_type(tmp2); -  tmp2 = remap_markers(b->cdr, remap, +  tmp2 = remap_markers(b->cdr, NULL, remap,    remap_flags ^ PT_FLAG_REMAP_SWAP_MARKERS);    }    }
5041:    nargs = pop_stack_mark();       /* Either of a and/or b is a complex type. */ -  tmp = remap_markers(a, remap, remap_flags); +  tmp = remap_markers(a, NULL, remap, remap_flags);    push_finished_type(tmp);    free_type(tmp);    -  tmp = remap_markers(b, remap, remap_flags); +  tmp = remap_markers(b, NULL, remap, remap_flags);    push_finished_type(tmp);    free_type(tmp);   
5157:    }       if (a->type == T_MIXED) { -  return remap_markers(b, remap, remap_flags ^ PT_FLAG_REMAP_SWAP_MARKERS); +  return remap_markers(b, NULL, remap, +  remap_flags ^ PT_FLAG_REMAP_SWAP_MARKERS);    }    if (b->type == T_MIXED) { -  return remap_markers(a, remap, remap_flags); +  return remap_markers(a, NULL, remap, remap_flags);    }       if (a->type == T_NOT) {    if (b->type == T_NOT) {    /* DeMorgan and(not(a), not(b)) <==> not(or(a, b)) */    type_stack_mark(); -  push_remap_markers(a->car, remap, remap_flags); -  push_remap_markers(b->car, remap, remap_flags ^ PT_FLAG_REMAP_SWAP_MARKERS); +  push_remap_markers(a->car, NULL, remap, remap_flags); +  push_remap_markers(b->car, NULL, remap, +  remap_flags ^ PT_FLAG_REMAP_SWAP_MARKERS);    push_type(T_OR);    push_type(T_NOT);    return pop_unfinished_type();
5185:    if (((a->type & PIKE_T_MASK) == PIKE_T_OPERATOR) ||    ((b->type & PIKE_T_MASK) == PIKE_T_OPERATOR)) {    type_stack_mark(); -  push_remap_markers(a, remap, remap_flags); -  push_remap_markers(b, remap, remap_flags ^ PT_FLAG_REMAP_SWAP_MARKERS); +  push_remap_markers(a, NULL, remap, remap_flags); +  push_remap_markers(b, NULL, remap, +  remap_flags ^ PT_FLAG_REMAP_SWAP_MARKERS);    push_reverse_type(T_AND);    return pop_unfinished_type();    }