Annotation of researchv10no/cmd/cfront/ooptcfront/template.h, revision 1.1

1.1     ! root        1: /* -*- Mode:C++ -*- */
        !             2: /*
        !             3:        $Source: /usr3/lang/benson/work/stripped_cfront/RCS/template.h,v $ $RCSfile: template.h,v $
        !             4:        $Revision: 1.4 $                $Date: 90/04/02 11:31:35 $
        !             5:        $Author: sam $          $Locker:  $
        !             6:        $State: Exp $
        !             7: */
        !             8: /*
        !             9:     $Header: /usr3/lang/benson/work/stripped_cfront/RCS/template.h,v 1.4 90/04/02 11:31:35 sam Exp $
        !            10: 
        !            11:     Copyright 1989 by Object Design, Inc., Burlington, Mass.
        !            12:     All rights reserved.
        !            13: 
        !            14: */
        !            15: 
        !            16: 
        !            17: /*****************************************************************************
        !            18: *                                                                           *
        !            19: * This file contains types pertinent to the implementation of the           *
        !            20: * parametrized type facility.                                               *
        !            21: *                                                                           *
        !            22: *****************************************************************************/
        !            23: 
        !            24: enum bool { true = 1, false = 0 } ;
        !            25: 
        !            26: typedef class templ *Ptempl ;
        !            27: 
        !            28: typedef class templ_inst *Ptempl_inst ;
        !            29: 
        !            30: typedef class function_template *Pfunt ;
        !            31: 
        !            32: typedef class templ_classdef *Ptclass ;
        !            33: 
        !            34: typedef class tree_template *Ptreet ;
        !            35: 
        !            36: 
        !            37: // A Lisp style cons cell to help build lists. The parametrized type facility,
        !            38: // should obviate the need for this type-unsafe nonsense.
        !            39: class cons {
        !            40: public:
        !            41:   void *car ;
        !            42:   cons *cdr ;
        !            43:   cons (void *pcar, cons *pcdr) { car = pcar ; cdr = pcdr ; } ;
        !            44: } ;
        !            45: 
        !            46: typedef cons *Pcons ;
        !            47: 
        !            48: 
        !            49: 
        !            50: /*****************************************************************************
        !            51: *                                                                           *
        !            52: * The class template_compilation holds the state, and the associated methods *
        !            53: * used during template compilation. There is exactly one instance of the     *
        !            54: * type, it is mainly a device used to enforce modularity.  In reality, it    *
        !            55: * would never need to be instantiated since all it's members are static.     *
        !            56: * However, since the type::mem for of reference is not supported as         *
        !            57: * yet(cfront 1.2), we need an instantiation to get to the members via       *
        !            58: * pointer syntax instead.                                                   *
        !            59: *                                                                           *
        !            60: * A templ_compilation holds the state relevant to the syntax analysis of a   *
        !            61: * class or member function template definition.                                     *
        !            62: *                                                                           *
        !            63: *****************************************************************************/
        !            64: 
        !            65: class templ_compilation {
        !            66:   static  Plist param_end,   // make append easier
        !            67:                 param_tn ;   // The type names introduced by the parameters
        !            68: 
        !            69: public:
        !            70:   static Ptempl  list ;      // The list of templates for the compilation
        !            71:   static Plist   params ;    // The list of parameters to the template
        !            72:   static Ptempl  owner  ;    // The template when compiling a member
        !            73:                              //     function.
        !            74:   static table   *templates ; // The templates defined during this compilation
        !            75:   
        !            76:   static Ptreet  tree_templates; // The list of tree templates
        !            77: 
        !            78:   static bool    in_progress; // a template compilation is in progress
        !            79:   // instantiation parameter parsing in progress. Used in the lexer to ensure
        !            80:   // that name string are consed in the heap, rather than being retained as
        !            81:   // pointers into the lex buffer.
        !            82:   static int     parameters_in_progress ;
        !            83: 
        !            84:   // the list of templates referenced by the top level definition being compiled.
        !            85:   static Pcons   templ_refs ;
        !            86:   static Pcons   last_cons ;
        !            87:   static Ptype   any_type ;  // canonical "ANY" type for formal parms
        !            88:   
        !            89:   // true, if currently compiling an expression tree template
        !            90:   static TOK   curr_tree_template ;
        !            91: 
        !            92:   void append_ref(Ptempl_inst ref) ;
        !            93:   void start() ;
        !            94:   
        !            95:   void collect(TOK parm_type, Pname namep) ;
        !            96:   void collect(Pname namep) ;
        !            97: 
        !            98:   void enter_parameters() ;
        !            99:   void introduce_class_templ(Pname cnamep) ;
        !           100:   void end(Pname class_name) ;
        !           101:   Pname forward_declaration(Pname class_name) ;
        !           102:   void instantiate_ref_templ() ;
        !           103:   void clear_ref_templ() ;
        !           104: 
        !           105:   Pname check_tname(Pname p) ;
        !           106:   bool  current_template(Pname p, Pexpr actuals) ;
        !           107:   Ptempl is_template(Pname p) ;
        !           108:   Ptempl is_template(char *s);
        !           109:   void end_of_compilation() ;   // Done with compilation, instantiate bodies
        !           110:   templ_compilation()  ;
        !           111: 
        !           112:   static Pname tree_parameter(char *s) ; // return true if the name is a tree parameter
        !           113: 
        !           114: private:
        !           115:   void append_parameter(Pname p) ;
        !           116:   
        !           117: } ;
        !           118: 
        !           119: 
        !           120: 
        !           121: // The canonical template_compilation instance. templ_compilation exists as a
        !           122: // class simply to provide a code and data packaging mechanism. There is
        !           123: // exactly one generated instance of it.
        !           124: 
        !           125: extern templ_compilation *templp ;
        !           126: 
        !           127: // should actually be static member functions of templ_compilation
        !           128: Pname parametrized_typename (Pname p, Pexpr actuals) ;
        !           129: Pbase parametrized_basetype (Pname p, Pexpr actuals) ;
        !           130: 
        !           131: 
        !           132: 
        !           133: 
        !           134: // the basis for class and member function templates
        !           135: class basic_template {
        !           136:   friend templ_compilation ;
        !           137: protected:
        !           138:   Plist       formals ;        // The formal arguments to the template
        !           139:   Pcons       templ_refs ;     // The templates referenced by this template
        !           140: 
        !           141:   // check class constraints placed on formals while processing member
        !           142:   // function bodies. 
        !           143:   bool check_constraints(Pexpr actuals) ;
        !           144:   
        !           145:   // ensure that use of formals is consistent across, class, member and
        !           146:   // forward declarations
        !           147:   void check_formals(Plist formals) ;
        !           148: 
        !           149: public:
        !           150:   // used to order template class definitions for instantiations. Not being
        !           151:   // used as yet.
        !           152:   int        definition_number ;
        !           153: 
        !           154:   // used to generate the definition numbers, used by the above member.
        !           155:   static int definition_tick ;
        !           156:         
        !           157:   Plist get_formals() {return formals ;}
        !           158: } ;
        !           159: 
        !           160: 
        !           161: 
        !           162: // the template for a class
        !           163: class templ  : public basic_template { 
        !           164:   Pbase       basep ;          // COBJ basetype for the template
        !           165:   Ptempl_inst insts  ;         // instantiations of the template
        !           166:   Pfunt       fns  ;           // member function declarations
        !           167:   Pfunt       fns_end ;        // last fun in the above list
        !           168:   
        !           169:   // Use these state variables to set up the correct state for error
        !           170:   // processing. They are used by the "error" routines for statement numbers.
        !           171:   Pname       Cdcl ;
        !           172:   Pstmt       Cstmt ;
        !           173:   
        !           174:   friend templ_inst ;
        !           175:   friend function_template ;
        !           176: 
        !           177:   // used to detect loops during instantiation; a count greater than two is
        !           178:   // indicative of a non-terminating instantiation sequence
        !           179:   int         open_instantiations ;
        !           180:   
        !           181:   Ptempl_inst get_match(Pexpr actuals,
        !           182:                        Ptempl_inst exclude,
        !           183:                        bool match_instantiated_only) ;
        !           184:   bool check_actual_args (Pexpr actuals) ;
        !           185: 
        !           186: public:
        !           187:   Ptempl      next ;           // connects all the class templates in the comp
        !           188:   Pname       namep ;          // the TNAME for the template class
        !           189:   bool        defined ;        // the actual definition, not just a forward
        !           190:                               // declaration has been seen.
        !           191: 
        !           192:   Pname       members ;        // note the members to catch redefinition errors
        !           193: 
        !           194:   Ptempl_inst get_inst(Pexpr actuals, Ptempl_inst exclude = 0) ;
        !           195:   templ(Plist parms, Pname p) ;
        !           196:   void resolve_forward_decl(Plist parms, Pclass c) ;
        !           197:   void instantiate_forward_decl() ;
        !           198:   
        !           199:   // The uninstantiated base type
        !           200:   Pbase basetype() {return basep; }
        !           201:   // The basetype for a specific instantiation
        !           202:   Pbase inst_basetype(Pexpr actuals) ;
        !           203: 
        !           204:   Pname typename(Pexpr actuals) ;
        !           205:   
        !           206:   Pfunt collect_function_member(Pname fname) ;
        !           207:   bool  has_tree_expr_formals() ;
        !           208:   bool instantiate_bodies() ;
        !           209: } ;
        !           210: 
        !           211: 
        !           212: 
        !           213: // Member function templates
        !           214: class function_template : public basic_template {
        !           215:   Pname       fn ;             // The name of the member function
        !           216:   Pfunt       next ;           // connects the list of member functions
        !           217: 
        !           218:   friend templ ;
        !           219:   friend templ_inst ;
        !           220: 
        !           221: public:
        !           222:   function_template (templ & owner, Plist params, Pname n) ;
        !           223: } ;
        !           224: 
        !           225: 
        !           226: 
        !           227: // compiler internal expression templates, used to implement Objectstore constructs
        !           228: class tree_template : public basic_template {
        !           229:   TOK         kind ;          // STATEMENT or EXPRESSION
        !           230:   Pnode       e ;             // the post-syntax tree representing the
        !           231:                              // expression or statement constituting the
        !           232:                               // template.
        !           233:   Ptreet      next ;          // the next expression template
        !           234:   static      int count ;     // the number of instantiations
        !           235:                                 
        !           236: public:
        !           237:   char        *string ;       // the name used for template lookup
        !           238:   tree_template(TOK tree_kind, char *s, Plist params, Pnode tree,
        !           239:                Pcons references) ;
        !           240:   static  Ptreet get(char *s) ;
        !           241:   Pname   get_parameter(char *s) ;
        !           242:   static  void test() ;
        !           243:   Pexpr expand(Pexpr actuals) ;
        !           244: } ;
        !           245: 
        !           246: 
        !           247: 
        !           248: 
        !           249: // Global state variables that must be saved around an instantiation. The
        !           250: // saving of state was required in the implementstion that interspersed decl
        !           251: // processing and instantiation, rather than the current strategy, which only
        !           252: // forces instantiations at the top level outside of any dcl-processing
        !           253: // context. It is retained in case we ever go back to the "interspersed" style
        !           254: // of instantiation. 
        !           255: class state {
        !           256: 
        !           257: public:
        !           258:   Pname       Cdcl ;      // the global variables used by the error routines
        !           259:   Pstmt       Cstmt ;
        !           260:   Pname       dcl_list ;  // Holds the list of typedef names that are hidden
        !           261:   Loc         curloc ;
        !           262:   
        !           263:   int         curr_file ;
        !           264:   Pexpr       curr_expr ;
        !           265:   Pin         curr_icall ;
        !           266:   Pstmt       curr_loop;
        !           267:   Pblock      curr_block;
        !           268:   Pstmt       curr_switch;
        !           269: 
        !           270:   int         bound  ;   
        !           271:   int         inline_restr ;
        !           272:   Loc         last_line ;
        !           273: 
        !           274:   int         no_of_badcall;
        !           275:   int         no_of_undcl ;
        !           276:   
        !           277:   Pname       badcall ;
        !           278:   Pname       undcl ;
        !           279: 
        !           280:   state() {} ; // prevent used before set warnings.
        !           281:   void save() ;
        !           282:   
        !           283:   void init() ; 
        !           284:   void restore() ; 
        !           285: } ;
        !           286: 
        !           287: 
        !           288: class pointer_hash ; 
        !           289: class tree_copy_info ;
        !           290: 
        !           291: 
        !           292: // A template starts out being uninstantiated, and is class_instantiated when
        !           293: // there is a refrence to it with actual arguments. It is body_instantiated at
        !           294: // the end of compilation, when all its function members are instantiated.
        !           295: enum inst_status { uninstantiated, class_instantiated, body_instantiated };
        !           296: 
        !           297: // templ_inst captures the arguments used in the instantiation of a template.
        !           298: // These instantiations are rooted in the templ object. 
        !           299: class templ_inst {
        !           300:   
        !           301:   friend class template_instantiation ;
        !           302: 
        !           303:   Pname      tname ;         // The instantiation name, it is the TNAME that
        !           304:                              // leads up to an actual instantiation of the class
        !           305:   Pname      namep ;         // The version of TNAME in the ktbl
        !           306:   Pexpr      actuals ;       // instantiation arguments, chained using ELIST
        !           307:                             // as an expression "cons" node, e1 is the car
        !           308:                             // and e2 the cdr. The car points to a name node.
        !           309:   Ptempl_inst next ;         // The linked list of instantiations for this
        !           310:                              // template.
        !           311:   Ptempl_inst next_active ;  // The list of currently active instantiations.
        !           312:   state       context ;      // the context of this instantiation
        !           313:   Ptempl_inst forward ;      // This instantiation is the same as the one
        !           314:                              // pointed to.
        !           315: 
        !           316:   // Contains the list of global names that are hidden during an
        !           317:   // instantiation.
        !           318:   Plist hidden_globals ;
        !           319: 
        !           320:   // The class correspondence table. This table is initialized 
        !           321:   // when the class definition is instantiated. Subsequently, it is used to
        !           322:   // initial member correspondence tables before the copy process is
        !           323:   // initiated.
        !           324:   pointer_hash        *corr ;
        !           325: 
        !           326:   // the instantiation's copy of the formals
        !           327:   Plist  inst_formals ;
        !           328:        
        !           329:   inst_status status ;
        !           330:   
        !           331:   friend class templ ;
        !           332:   friend class templ_classdef ;
        !           333:   friend class tree_template ;
        !           334:   friend Pcons make_ref_copy(pointer_hash &h, tree_copy_info &info,
        !           335:                             Pcons old_templ_refs);
        !           336:   
        !           337:   templ_inst (Pexpr act,  Ptempl owner) ;
        !           338:   bool actuals_match(Pexpr check_actuals) ;
        !           339:   void instantiate_match(Ptempl_inst match) ;
        !           340:   void kludge_copy(Pbase source_base) ;
        !           341:   // create a copy of the class type subtree preparatory to the ensuing
        !           342:   // instantiation. Return a non-zero value, only if there was no need to
        !           343:   // create a copy, ie. an identical instantiation already existed.
        !           344:   Ptempl_inst class_copy(Pcons &templ_refs, bool recopy) ;
        !           345:   Pcons ref_copy(pointer_hash &h, tree_copy_info &info, Pcons old_templ_refs) ;
        !           346:     
        !           347:   // save and restore state around the template instantiation
        !           348:   void save_state(Pname p) ;
        !           349:   void restore_state() ;
        !           350:   
        !           351:   // Used to collect references to this template by a definition
        !           352:   Ptempl_inst note_ref() ;
        !           353:   char *instantiation_string() ;
        !           354:   
        !           355:   void expose_parameter_names() ;
        !           356:   void hide_parameter_names() ;
        !           357:   
        !           358: public:
        !           359:   Ptempl        def ;           // The template definition, for which this is an
        !           360:                             // instantiation.
        !           361:   bool         refp ;        // A flag used to note template references during
        !           362:                             // a C++ definition
        !           363:   void print_error_loc() ;   // Wants to be a static function
        !           364:   // Bind the formals before an instantiation
        !           365:   void bind_formals() ;
        !           366: 
        !           367:   Ptempl_inst canonical_instantiation() {
        !           368:     return ( forward ? forward : this ) ;
        !           369:   }
        !           370: 
        !           371:   // get the class associated with this instantiation
        !           372:   Pclass get_class() { return Pclass(Pbase(tname->tp)->b_name->tp) ;}
        !           373:                              
        !           374:   void instantiate(bool reinstantiate = false) ;
        !           375:   static Ptempl_inst head ;  // Head of the list of active instantiations.
        !           376:   void print_pretty_name() ;
        !           377:   char *mangled_name(char *buffer) ;
        !           378:   // The uninstantiated basetype
        !           379:   Pbase def_basetype() { return def->basep ; } ;
        !           380:   // A general way of determining whether two template instantiations are
        !           381:   // the same
        !           382:   bool  same(Ptempl_inst t) ;
        !           383:   bool copy_hook(Pnode&) ;
        !           384:   // return a copy of the function tree starting with it's name
        !           385:   Pname function_copy(Pfunt fnt, Pcons &templ_refs) ;
        !           386: 
        !           387:   // special check for instantiations used in qualifiers for template function
        !           388:   // member declarations. 
        !           389:   bool check_qualifier(Plist formals) ;
        !           390:   Pname get_parameter(char *s) ;
        !           391: } ;
        !           392: 
        !           393: 
        !           394: 
        !           395: // Experimental debugging toggle
        !           396: extern int zdebug  ;
        !           397: 
        !           398: 
        !           399: // The class node used for template classes.
        !           400: // Rep invariant:
        !           401: // class_base == uninstantiated_template_class ||
        !           402: // class_base  == instantiated_template_class
        !           403: 
        !           404: class templ_classdef : public classdef {
        !           405: public:
        !           406:   Ptempl_inst inst ;              // a pointer to the instantiation; the
        !           407:                                  // instantiation also points back to it via
        !           408:                                   // the tname ->cobj->name->class path
        !           409:   templ_classdef(Ptempl_inst i) ;
        !           410:   Pname unparametrized_tname() { return inst->def->namep ; } 
        !           411:   void instantiate() { inst->instantiate() ; }
        !           412: 
        !           413: } ;
        !           414: 
        !           415: 
        !           416: // Safe accessor functions for navigating through COBJ base classes
        !           417: 
        !           418: extern class_type_enum get_class_base (Pbase b) ;
        !           419: 
        !           420: extern Ptclass get_template_class (Pbase b) ;
        !           421: 
        !           422: extern Ptempl_inst get_templ_inst(Pbase b) ;
        !           423:  
        !           424: 
        !           425: /*
        !           426:    $Log:       template.h,v $
        !           427:  * Revision 1.4  90/04/02  11:31:35  sam
        !           428:  * Made comments current.
        !           429:  * 
        !           430:  * Revision 1.3  90/03/30  18:50:55  sam
        !           431:  * 1) Added the introduce_class_templ member function to the templ_compilation 
        !           432:  * class.
        !           433:  * 2) Rationalized the definition of class templ. Made basic_template be it's
        !           434:  * base class, instead of type. The latter was the base type, simply so that
        !           435:  * it could be stored in a table associating strings with types. Don't have
        !           436:  * to resolve to such kludgery in the PT world.
        !           437:  * 3) Added the member open_instantiations to detect non-terminating
        !           438:  * instantiations
        !           439:  * 
        !           440:  * Revision 1.2  90/03/27  10:16:27  sam
        !           441:  * > Merged in revision 1.13 from the main line of development 
        !           442:  * 
        !           443:  * Revision 1.1  89/11/20  08:50:58  benson
        !           444:  * Initial revision
        !           445:  * 
        !           446:  * Revision 1.11  89/10/16  15:25:00  sam
        !           447:  * use pointer_hash rather than Hash as the type of the correspondence table.
        !           448:  * 
        !           449:  * Revision 1.10  89/09/26  16:44:34  sam
        !           450:  * fix the forward declaration of template classes
        !           451:  * 
        !           452:  * Revision 1.9  89/09/18  16:37:37  sam
        !           453:  * provide for error recovery upon argument mismatch in a template instantiation
        !           454:  * 
        !           455:  * 
        !           456:  * Revision 1.8  89/09/15  09:31:50  benson
        !           457:  * move tree_template.string into the public section.
        !           458:  * 
        !           459:  * Revision 1.7  89/08/30  13:02:12  sam
        !           460:  * added support for dealing with __expressions in class formal templates
        !           461:  * 
        !           462:  * Revision 1.6  89/08/28  09:42:05  sam
        !           463:  * Support for nested references in internal templates. These nested 
        !           464:  * references are instantiated whenever an expansion takes place.
        !           465:  * 
        !           466:  * Revision 1.5  89/08/23  10:26:00  sam
        !           467:  * support for BS style formal syntax. refer to 1.5 templates.c for more 
        !           468:  * detailed comments.
        !           469:  * 
        !           470:  * Revision 1.4  89/08/11  14:57:09  sam
        !           471:  *  implementation of multiple instantiation templates.
        !           472:  * 
        !           473:  * Revision 1.3  89/07/27  11:33:40  sam
        !           474:  * the comments in template.c 1.3 describe the modifications.
        !           475:  * 
        !           476:  * Revision 1.2  89/07/07  14:34:11  sam
        !           477:  * Added the templ_classdef::unparametrized_type_name() function member, as part
        !           478:  * of the base init fix.
        !           479:  * 
        !           480:  * Revision 1.1  89/06/29  09:21:32  benson
        !           481:  * Initial revision
        !           482:  * 
        !           483:  * Revision 1.1  89/06/22  16:29:29  sam
        !           484:  * Initial revision
        !           485:  * 
        !           486: 
        !           487: 
        !           488:    end_log
        !           489: */
        !           490: 
        !           491: 
        !           492: 
        !           493: /*
        !           494:    $Log $
        !           495: 
        !           496: 
        !           497:    end_log
        !           498: */

unix.superglobalmegacorp.com

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