pike.git / src / pike_types.cmod

version» Context lines:

pike.git/src/pike_types.cmod:3632:    low_or_pike_types(a,b,1|zero_implied);    res = pop_unfinished_type();   #if 0    fprintf(stderr, " ==> ");    simple_describe_type(res);    fprintf(stderr, "\n");   #endif    return res;   }    - static void even_lower_and_pike_types(struct pike_type *t1, -  struct pike_type *t2) - { -  while(t2 && (t2->type == T_OR)) -  { -  even_lower_and_pike_types(t1, t2->car); -  t2 = t2->cdr; -  } -  if (!t1 || !t2) { -  return; -  } -  if (t1->type == t2->type) { -  if (t1->type == T_INT) { -  INT32 i1, i2; -  INT32 upper_bound, lower_bound; -  i1 = CDR_TO_INT(t1); -  i2 = CDR_TO_INT(t2); -  upper_bound = MINIMUM(i1,i2); -  -  i1 = CAR_TO_INT(t1); -  i2 = CAR_TO_INT(t2); -  lower_bound = MAXIMUM(i1,i2); -  -  if (upper_bound >= lower_bound) { -  push_int_type(lower_bound, upper_bound); -  push_type(T_OR); -  } -  } else if (t1->type == T_STRING) { -  push_type(PIKE_T_UNKNOWN); -  even_lower_and_pike_types(t1->cdr, t2->cdr); -  push_unlimited_array_type(T_STRING); -  push_type(T_OR); -  } else { -  push_finished_type(t1); -  push_type(T_OR); -  } -  } - } -  - static int lower_and_pike_types(struct pike_type *t1, struct pike_type *t2) - { -  int is_complex = 0; -  while(t1->type == T_OR) -  { -  is_complex |= lower_and_pike_types(t1->car, t2); -  t1 = t1->cdr; -  } -  switch(t1->type) { -  case T_ZERO: -  case T_VOID: -  break; -  case T_STRING: -  case T_FLOAT: -  case T_INT: -  even_lower_and_pike_types(t1, t2); -  break; -  default: -  return 1; -  } -  return is_complex; - } -  - /* FIXME: T_STRING! */ - static int low_and_push_complex_pike_type(struct pike_type *type) - { -  int is_complex = 0; -  while(type->type == T_OR) -  { -  int new_complex; -  new_complex = low_and_push_complex_pike_type(type->car); -  if (new_complex) { -  if (is_complex) { -  push_type(T_OR); -  } else { -  is_complex = 1; -  } -  } -  type = type->cdr; -  } -  switch(type->type) { -  case T_VOID: -  case T_ZERO: -  case T_STRING: -  case T_FLOAT: -  case T_INT: -  /* Simple type. Already handled. */ -  break; -  default: -  push_finished_type(type); -  if (is_complex) { -  push_type(T_OR); -  } -  return 1; -  } -  return is_complex; - } -  - /* FIXME: T_STRING! */ - static void low_and_pike_types(struct pike_type *t1, -  struct pike_type *t2) - { -  if (!t1 || !t2) { -  push_type(PIKE_T_UNKNOWN); -  } else if(t1->type == T_VOID || t2->type == T_VOID) { -  push_type(T_VOID); -  } -  else if(t1->type == T_ZERO || -  t2->type == T_ZERO) -  { -  push_type(T_ZERO); -  } -  else if(t1->type == T_MIXED) -  { -  push_finished_type(t2); -  } -  else if(t2->type == T_MIXED) -  { -  push_finished_type(t1); -  } -  else if(t1->type == T_INT && t2->type == T_INT) -  { -  INT32 i1,i2; -  INT32 upper_bound, lower_bound; -  i1 = CDR_TO_INT(t1); -  i2 = CDR_TO_INT(t2); -  upper_bound = MINIMUM(i1,i2); -  -  i1 = CAR_TO_INT(t1); -  i2 = CAR_TO_INT(t2); -  lower_bound = MAXIMUM(i1,i2); -  -  if (upper_bound >= lower_bound) { -  push_int_type(lower_bound, upper_bound); -  } else { -  /* No overlap! */ -  /* FIXME: Warn? */ -  push_type(T_VOID); -  } -  } -  else if (t1->type == T_SCOPE) -  { -  if (t2->type == T_SCOPE) { -  low_and_pike_types(t1->cdr, t2->cdr); -  if (t1->car > t2->car) -  push_scope_type(CAR_TO_INT(t1)); -  else -  push_scope_type(CAR_TO_INT(t2)); -  } else { -  low_and_pike_types(t1->cdr, t2); -  push_scope_type(CAR_TO_INT(t1)); -  } -  } -  else if (t2->type == T_SCOPE) -  { -  low_and_pike_types(t1, t2->cdr); -  push_scope_type(CAR_TO_INT(t2)); -  } -  else if ((t1->type == T_STRING) && (t2->type == T_STRING)) { -  low_and_pike_types(t1->cdr, t2->cdr); -  push_unlimited_array_type(T_STRING); -  } -  else if((t1->type == T_FLOAT) && (t2->type == T_FLOAT)) -  { -  push_finished_type(t1); -  } -  else if(low_pike_types_le(t1, t2, 0, 0)) -  { -  push_finished_type(t1); -  } -  else if(low_pike_types_le(t2, t1, 0, 0)) -  { -  push_finished_type(t2); -  } -  else -  { -  push_type(T_ZERO); -  -  if (lower_and_pike_types(t1, t2)) { -  /* t1 contains complex types. */ -  if (low_and_push_complex_pike_type(t2)) { -  /* t2 also contains complex types. */ -  low_and_push_complex_pike_type(t1); -  push_reverse_joiner_type(T_AND); -  push_type(T_OR); -  } -  } -  /* push_finished_type(t1); */ -  /* very_low_and_pike_types(t2,t1); */ -  } - } -  +    struct pike_type *and_pike_types(struct pike_type *a,    struct pike_type *b)   {    return type_binop(PT_BINOP_AND, a, b, 0, 0, 0);   }      static struct pike_type *low_object_lfun_type(struct pike_type *t, short lfun)   {    struct program *p;    int i;