Annotation of researchv10no/cmd/cfront/ooptcfront/expr.hmm, revision 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.