Annotation of researchv10no/cmd/cfront/ooptcfront/expr.hmm, revision 1.1.1.1

1.1       root        1: *** /tmp/,RCSt1a12446  Tue Nov  7 09:28:11 1989
                      2: --- /tmp/,RCSt2a12446  Tue Nov  7 09:28:14 1989
                      3: ***************
                      4: *** 2,8 ****
                      5:   /*ident      "@(#)ctrans:src/expr.c  1.1.5.30" */
                      6:   /*
                      7:        $Source: /usr3/lang/benson/work/stripped_cfront/O/RCS/expr.c,v $ $RCSfile: expr.c,v $
                      8: !      $Revision: 1.12 $               $Date: 89/10/10 08:39:50 $
                      9:        $Author: benson $               $Locker:  $
                     10:        $State: Exp $
                     11:   */
                     12: --- 2,8 ----
                     13:   /*ident      "@(#)ctrans:src/expr.c  1.1.5.30" */
                     14:   /*
                     15:        $Source: /usr3/lang/benson/work/stripped_cfront/O/RCS/expr.c,v $ $RCSfile: expr.c,v $
                     16: !      $Revision: 1.15 $               $Date: 89/10/20 14:29:13 $
                     17:        $Author: benson $               $Locker:  $
                     18:        $State: Exp $
                     19:   */
                     20: ***************
                     21: *** 166,171 ****
                     22: --- 166,172 ----
                     23:   extern               ignore_const;
                     24:   extern int   logical_context;
                     25:   extern               ref_initializer;
                     26: + extern int   refd;
                     27:   
                     28:   class expr_undo : public basic_undo {
                     29:       extended_error_state * ees;
                     30: ***************
                     31: *** 176,181 ****
                     32: --- 177,186 ----
                     33:       int ref_cast;
                     34:       int logical_context;
                     35:       int ref_initializer;
                     36: +     dcl_context * cc;
                     37: +     int refd;
                     38: +     int extended_error_state_stack_ptr;
                     39: + 
                     40:     public:
                     41:       expr_undo (Pexpr msg_expr) {
                     42:        doing_index_maint = :: doing_index_maint;
                     43: ***************
                     44: *** 185,190 ****
                     45: --- 190,198 ----
                     46:        ref_cast = :: ref_cast;
                     47:        ref_initializer = :: ref_initializer;
                     48:        logical_context = :: logical_context;
                     49: +      cc = :: cc;
                     50: +      refd = :: refd;
                     51: +      extended_error_state_stack_ptr = extended_error_state::stack_ptr;
                     52:        if(msg_expr) ees = extended_error_state::push(msg_expr);
                     53:       };
                     54:       virtual ~expr_undo () {
                     55: ***************
                     56: *** 195,201 ****
                     57:        :: ref_cast = ref_cast;
                     58:           :: ref_initializer = ref_initializer;
                     59:           :: logical_context = logical_context;
                     60: !      if(ees) extended_error_state::pop ();
                     61:         };
                     62:   };
                     63:   
                     64: --- 203,211 ----
                     65:        :: ref_cast = ref_cast;
                     66:           :: ref_initializer = ref_initializer;
                     67:           :: logical_context = logical_context;
                     68: !      :: cc = cc;
                     69: !      :: refd = refd;
                     70: !      extended_error_state::pop_to(extended_error_state_stack_ptr);
                     71:         };
                     72:   };
                     73:   
                     74: ***************
                     75: *** 203,213 ****
                     76:     public:
                     77:       static int level;
                     78:       expr_undo0 () { level ++; };
                     79: !    ~expr_undo0 () { level --; };
                     80:   };
                     81:   
                     82:   int expr_undo0::level = 0;
                     83:   
                     84:   Pexpr expr::typ (Ptable tbl)
                     85:   {
                     86:       Pexpr        original;
                     87: --- 213,263 ----
                     88:     public:
                     89:       static int level;
                     90:       expr_undo0 () { level ++; };
                     91: !     virtual ~expr_undo0 () { level --; };
                     92:   };
                     93:   
                     94:   int expr_undo0::level = 0;
                     95:   
                     96: + int in_expr_typ ()
                     97: + {
                     98: +     return expr_undo0::level > 0;
                     99: + }
                    100: + 
                    101: + extern Pname indexable_member_reference (Pexpr, int);
                    102: + 
                    103: + Ptype add_idx_or_const_to_type(Ptype t, int cnst, int idx)
                    104: + {
                    105: +     if(cnst) idx = 0;                /* const is stronger, we never bother to add both */
                    106: + 
                    107: +     switch(t->base) {
                    108: +       case RPTR:
                    109: +      if(idx) err::print ('i', "Indexable REFERENCE. Not supported.");
                    110: +      Pptr(t)->rdo = cnst;
                    111: +      return t;
                    112: +       case VEC:
                    113: +      if(idx) err::print ('i', "Indexable VECTOR. Not supported.");
                    114: +      return t;               /* already const, can't be indexable */
                    115: +       case PTR:
                    116: +      Pptr p = Pptr(t);
                    117: +      Pptr np = new ptr(p->base, p->typ);
                    118: +      *np = *p;
                    119: +      np->rdo = cnst;
                    120: +      np->rdo_indexable = idx;
                    121: +      return np;
                    122: +       case FCT:
                    123: +       case OVERLOAD:
                    124: +      return t;                       /* should never get called on one of these,
                    125: +                                         but don't take chances */
                    126: +       default:
                    127: +      Pbase b = Pbase(t);
                    128: +      Pbase nb = new basetype (0, 0);
                    129: +      *nb = *b;
                    130: +      nb->b_const = cnst;
                    131: +      nb->b_indexable = idx;
                    132: +      return nb;
                    133: +     }
                    134: + }
                    135: + 
                    136:   Pexpr expr::typ (Ptable tbl)
                    137:   {
                    138:       Pexpr        original;
                    139: ***************
                    140: *** 230,235 ****
                    141: --- 280,286 ----
                    142:        expr_undo Undo (this);
                    143:        return_value = typ0(tbl);
                    144:       }
                    145: + 
                    146:       if(original) dcl_capture::expr_typ(original, return_value);
                    147:       return return_value;
                    148:   }
                    149: ***************
                    150: *** 710,719 ****
                    151:                }
                    152:            }
                    153:   
                    154: - /*
                    155: -      x.m is not a const even if x is a const object, this case is handled
                    156: -      by lval() rejecting it
                    157: - */
                    158:   
                    159:            if (mem->tp) {
                    160:                tp = mem->tp;
                    161: --- 761,766 ----
                    162: ***************
                    163: *** 752,758 ****
                    164:                }
                    165:            }
                    166:            /* function or static member */
                    167: !          return e->tp->base == RPTR ? e->contents() : e;
                    168:        }
                    169:   
                    170:   /*?? case G_CALL: */
                    171: --- 799,831 ----
                    172:                }
                    173:            }
                    174:            /* function or static member */
                    175: !          Pexpr result = e->tp->base == RPTR ? e->contents() : e;
                    176: ! 
                    177: !          /* Now propagate const from the LHS to the result */
                    178: ! 
                    179: !          /* can't have fct or vec as e1 of DOT or REF */
                    180: !          int e1_const = e1 && e1->tp->tconst(const_const);
                    181: !          int e1_idx = e1 && e1->tp->tconst(const_idx);
                    182: !          Pptr e1_ptr;
                    183: !          if (e1 && e1->tp) e1_ptr = e1->tp->is_ptr ();
                    184: !          /* const foo * C; C->bar; is a const */
                    185: !          int e1_pt_const = e1_ptr && e1_ptr->typ->tconst (const_const);
                    186: ! 
                    187: !          /* if something is const without indexable, 
                    188: !             there is no earthly reason to propagage indexable
                    189: !             since const is the stronger restriction. */
                    190: ! 
                    191: !          if((e1_const && base == DOT) || e1_pt_const)
                    192: !              result->tp = add_idx_or_const_to_type(result->tp, 1, 0);
                    193: !          else if(e1_idx)
                    194: !              result->tp = add_idx_or_const_to_type(result->tp, 0, 1);
                    195: !          /* an indexable member can be ->'ed, but something
                    196: !             that inherited indexable cannot be ->'ed */
                    197: !          else if (indexable_member_reference(result, 0) && base == DOT
                    198: !                   && !doing_index_maint)
                    199: !              result->tp = add_idx_or_const_to_type(result->tp, 0, 1);
                    200: !          
                    201: !          return result;
                    202:        }
                    203:   
                    204:   /*?? case G_CALL: */
                    205: ***************
                    206: *** 1100,1110 ****
                    207:            }
                    208:        }
                    209:   
                    210:        if (tp->is_ref())
                    211: !          return contents();
                    212:   
                    213: !      return this;
                    214:   
                    215:        case G_ADDROF:
                    216:        case ADDROF:
                    217:   /*error('d',"addrof(%d) %k %d",base,e2->base,e2->base); */
                    218: --- 1173,1190 ----
                    219:            }
                    220:        }
                    221:   
                    222: +      Pexpr result;
                    223:        if (tp->is_ref())
                    224: !          result = contents();
                    225: !      else result = this;
                    226:   
                    227: !      /* For a deref, if the ptr dereffed is indexable,
                    228: !         the result is also indexable. But const is not carried. */
                    229: !      if(e1 && e1->tp->tconst(const_idx))
                    230: !          result->tp = add_idx_or_const_to_type(result->tp, 0, 1);
                    231:   
                    232: +      return result;
                    233: + 
                    234:        case G_ADDROF:
                    235:        case ADDROF:
                    236:   /*error('d',"addrof(%d) %k %d",base,e2->base,e2->base); */
                    237: ***************
                    238: *** 1906,1916 ****
                    239:   }
                    240:   
                    241:   
                    242: ! static char     rcsinfo[] = "$Header: /usr3/lang/benson/work/stripped_cfront/O/RCS/expr.c,v 1.12 89/10/10 08:39:50 benson Exp $";
                    243:   
                    244:   
                    245:   
                    246:   /* $Log:     expr.c,v $
                    247:    * Revision 1.12  89/10/10  08:39:50  benson
                    248:    * tix error handler for malformed expressions.
                    249:    * 
                    250: --- 1986,2005 ----
                    251:   }
                    252:   
                    253:   
                    254: ! static char     rcsinfo[] = "$Header: /usr3/lang/benson/work/stripped_cfront/O/RCS/expr.c,v 1.15 89/10/20 14:29:13 benson Exp $";
                    255:   
                    256:   
                    257:   
                    258:   /* $Log:     expr.c,v $
                    259: +  * Revision 1.15  89/10/20  14:29:13  benson
                    260: +  * get const and indexable propagation closer to right.
                    261: +  * 
                    262: +  * Revision 1.14  89/10/16  08:14:09  benson
                    263: +  * support for prohibiting some assignments to indexable items.
                    264: +  * 
                    265: +  * Revision 1.13  89/10/11  15:55:34  benson
                    266: +  * enforce enherited const. enforce restrictions on indexable data members.,
                    267: +  * 
                    268:    * Revision 1.12  89/10/10  08:39:50  benson
                    269:    * tix error handler for malformed expressions.
                    270:    * 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.