Google
 

Trailing-Edge - PDP-10 Archives - decuslib20-03 - decus/20-0078/maint/tdiid.mem
There is 1 other file named tdiid.mem in the archive. Click here to see a list.











                              APPENDIX D

           SIMULA FOR DEC SYSTEM 10             TD, COMPILER
SIMULA FOR DEC SYSTEM 10             TD, COMPILER               II.D-1

780302                6                           Claes Wihlborg








 II.D    DETAILS OF THE HIDDEN/PROTECTED IMPLEMENTATION


         The  implementation  details  are  described  below  as  SIMULA
         algorithms  approximating  the  actual  assembly  code and data
         structures.

         The  current  implementation  of   HIDDEN/PROTECTED   has   the
         following main properties:

         - Whether or not an entity is visible, is entirely  decided  by
         ZQU.INVISIBLE.

         - The flag ZQU.INVISIBLE  is  only  changed  at  entry/exit  of
         class/prefixed block.

         - Thus, the visibility of an element is not  dependent  on  the
         access method, only from where access is made.
         ;

         BEGIN

           CLASS zqu(idno,no,hid,prot,next);
             INTEGER idno; COMMENT identifier number;
             BOOLEAN no,hid,prot; COMMENT not hidden protected;
             REF(zqu) next;
             BEGIN
               BOOLEAN invisible,match,virtual_match;
             END zqu ;

           CLASS zhe;
             BEGIN
               REF(zqu) declarations;
             END zhe;

           zhe CLASS zhb;
             COMMENT  ZHB is used for classes, procedures,
                      connections and prefixed blocks;
             BEGIN
               REF(zhb) prefix; COMMENT to this class or block;
               REF(zqu) hspec; COMMENT HIDDEN specifications;
             END zhb ;

           PROCEDURE error(message);VALUE message;TEXT message;;
SIMULA FOR DEC SYSTEM 10             TD, COMPILER               II.D-2

780302                6                           Claes Wihlborg








           BEGIN COMMENT  pass 1;

             CLASS level(head);
               REF(zhe) head;
               BEGIN
                 REF(level) environment;
                 REF(zqu) pspec; COMMENT  protected specifications;
                 environment:-c_level;
               END level;

             REF(level) c_level;

             PROCEDURE class_entry(idno);
               INTEGER idno ;
               BEGIN
                 normal_declaration(idno);
                 c_level:-NEW level(NEW zhb);
               END class_entry;

             PROCEDURE class_exit;
               INSPECT c_level DO BEGIN
                 IF pspec=/=NONE THEN BEGIN
                   REF(zqu) pzqu;
                   IF pspec.no THEN BEGIN
                     pzqu:-head.declarations;
                     WHILE pzqu=/=NONE DO BEGIN
                       pzqu.prot:=pzqu.invisible:=TRUE;
                       pzqu:-pzqu.next;
                     END;
                     WHILE pspec=/=NONE DO BEGIN
                       BOOLEAN found;
                       pzqu:-head.declarations;
                       WHILE pzqu=/=NONE AND NOT found DO
                         IF pzqu.idno=pspec.idno
                         THEN found:=TRUE
                         ELSE pzqu:-pzqu.next;
                       IF found THEN
                         pzqu.prot:=pzqu.invisible:=FALSE
                       ELSE error(
                         "Attribute XXXX not found.");
                       pspec:-pspec.next;
                     END;
                   END ELSE
                     WHILE pspec=/=NONE DO BEGIN
                       BOOLEAN found;
                       pzqu:-head.declarations;
SIMULA FOR DEC SYSTEM 10             TD, COMPILER               II.D-3

780302                6                           Claes Wihlborg








                       WHILE pzqu=/=NONE AND NOT found DO
                         IF pzqu.idno=pspec.idno
                         THEN found:=TRUE
                         ELSE pzqu:-pzqu.next;
                       IF found THEN
                         pzqu.prot:=pzqu.invisible:=TRUE
                       ELSE error(
                         "Attribute XXXX not found.");
                       pspec:-pspec.next;
                     END;
                 END;
                 c_level:-environment;
               END class_exit;

             PROCEDURE normal_declaration(idno);
               INTEGER idno;
               c_level.head.declarations:-
                 NEW zqu(idno,FALSE,FALSE,FALSE,
                 c_level.head.declarations);

             PROCEDURE hidden_protected_specification
               (idno,no,hid,prot);
               INTEGER idno;
               BOOLEAN no,hid,prot;
               BEGIN
                 IF hid THEN
                   (c_level.head QUA zhb).hspec:-
                     NEW zqu(idno,no,TRUE,FALSE,
                     (c_level.head QUA zhb).hspec);
                 IF prot THEN c_level.pspec:-NEW zqu
                   (idno,no,FALSE,TRUE,c_level.pspec);
               END hidden_protected_specification;

           END pass 1 ;





           BEGIN COMMENT  pass 2;

             CLASS level(pzhe);
               REF(zhe) pzhe;
               BEGIN
                 REF(level) environment;
                 REF(display_stack) sobj;
SIMULA FOR DEC SYSTEM 10             TD, COMPILER               II.D-4

780302                6                           Claes Wihlborg








                 environment:-c_level;
               END level;

             REF(level) c_level;

             CLASS display_stack(idno,pzqu);
               COMMENT  Here all redeclarations are saved;
               INTEGER idno;
               REF(zqu) pzqu;
               BEGIN
                 REF(display_stack) prev;
                 prev:-c_level.sobj;
               END display_stack;

             REF(zqu) ARRAY display_array[1:3072];
               COMMENT  Contains declared items;

             PROCEDURE hide(pzhb);
               REF(zhb) pzhb;
               INSPECT pzhb DO BEGIN
                 REF(zqu) phid,pzqu;
                 hide(prefix);
                 unprotect(THIS zhb);
                 IF hspec=/=NONE THEN BEGIN
                   WHILE pzhb=/=NONE DO BEGIN
                     pzqu:-pzhb.declarations;
                     WHILE pzqu=/=NONE DO BEGIN
                       IF NOT pzqu.invisible THEN BEGIN
                         BOOLEAN found;
                         phid:-hspec;
                         WHILE phid=/=NONE AND NOT found DO
                           IF pzqu.idno=phid.idno
                           THEN found:=TRUE
                           ELSE phid:-phid.next;
                         IF hspec.no THEN BEGIN
                           IF NOT found THEN BEGIN
                             IF pzqu.match THEN
                               pzqu.match:=FALSE
                             ELSE BEGIN
                               IF pzqu.prot THEN
                                 pzqu.invisible:=TRUE;
                               IF NOT pzqu.virtual_match THEN BEGIN
                                 INTEGER idno;
                                 REF(zhb) rzh;
                                 REF(zqu) rzq;
                                 idno:=pzqu.idno;
SIMULA FOR DEC SYSTEM 10             TD, COMPILER               II.D-5

780302                6                           Claes Wihlborg








                                 rzh:-pzhb.prefix;
                                 WHILE rzh=/=NONE DO BEGIN
                                   rzq:-rzh.declarations;
                                   WHILE rzq=/=NONE DO BEGIN
                                     IF idno=rzq.idno AND NOT
                                       rzq.invisible
                                     THEN rzq.match:=TRUE;
                                     rzq:-rzq.next;
                                   END;
                                   rzh:-rzh.prefix;
                                 END;
                               END;
                             END;
                           END;
                         END ELSE
                           IF found AND NOT phid.match THEN BEGIN
                             IF pzqu.prot THEN
                               pzqu.invisible:=TRUE;
                             IF NOT pzqu.virtual_match THEN
                               phid.match:=TRUE;
                           END;
                       END;
                       pzqu:-pzqu.next;
                     END;
                     pzhb:-pzhb.prefix;
                   END;
                   phid:-hspec;
                   WHILE phid=/=NONE DO BEGIN
                     phid.match:=FALSE;
                     phid:-phid.next;
                   END;
                 END;
               END hide;

             PROCEDURE check_hidden(pzhb);
               REF(zhb) pzhb;
               INSPECT pzhb DO
                 IF hspec=/=NONE THEN BEGIN
                   REF(zqu) pzqu,phid;
                   WHILE pzhb=/=NONE DO BEGIN
                     pzqu:-pzhb.declarations;
                     WHILE pzqu=/=NONE DO BEGIN
                       IF NOT pzqu.invisible THEN BEGIN
                         BOOLEAN found;
                         phid:-hspec;
                         WHILE  phid=/=NONE AND NOT found DO
SIMULA FOR DEC SYSTEM 10             TD, COMPILER               II.D-6

780302                6                           Claes Wihlborg








                           IF phid.idno=pzqu.idno
                           THEN found:=TRUE
                           ELSE phid:-phid.next;
                         IF found AND NOT phid.match THEN BEGIN
                           phid.match:=TRUE;
                           IF NOT(pzqu.prot OR phid.no) THEN
                             error("Attribute HIDDEN"
                             " but not PROTECTED");
                         END;
                       END;
                       pzqu:-pzqu.next;
                     END;
                     pzhb:-pzhb.prefix;
                   END;
                   phid:-hspec;
                   WHILE phid=/=NONE DO BEGIN
                     IF NOT phid.match THEN
                       error("No attribute XXXX visible");
                     phid.match:=FALSE;
                     phid:-phid.next;
                   END;
                 END hidden check;

             PROCEDURE unprotect(pzhb);
               REF(zhb) pzhb;
               BEGIN
                 REF(zqu) pzqu;
                 pzqu:-pzhb.declarations;
                 WHILE pzqu=/=NONE DO BEGIN
                   pzqu.invisible:=false;
                   pzqu:-pzqu.next
                 END
               END unprotect;

             PROCEDURE display(pzhe);
               REF(zhe) pzhe;
               INSPECT pzhe DO BEGIN
                 REF(zqu) pzqu;
                 INSPECT THIS zhe WHEN zhb DO display(prefix);
                 pzqu:-declarations;
                 WHILE pzqu=/=NONE DO BEGIN
                   IF NOT pzqu.invisible THEN BEGIN
                     c_level.sobj:-NEW display_stack
                       (pzqu.idno,display_array[pzqu.idno]);
                     display_array[pzqu.idno]:-pzqu;
                   END;
SIMULA FOR DEC SYSTEM 10             TD, COMPILER               II.D-7

780302                6                           Claes Wihlborg








                   pzqu:-pzqu.next;
                 END;
               END display;

             PROCEDURE undisplay;
               WHILE c_level.sobj=/=NONE DO BEGIN
                 display_array[c_level.sobj.idno]:-
                   c_level.sobj.pzqu;
                 c_level.sobj:-c_level.sobj.prev;
               END undisplay;

             PROCEDURE protect(pzhb);
               REF(zhb) pzhb;
               INSPECT pzhb DO BEGIN
                 REF(zqu) pzqu;
                 pzqu:-declarations;
                 WHILE pzqu=/=NONE DO BEGIN
                   IF pzqu.prot THEN pzqu.invisible:=TRUE;
                   pzqu:-pzqu.next;
                 END;
                 protect(prefix);
               END protect;

             PROCEDURE class_declaration(pzhb);
               COMMENT Called for all new classes when a declaration
               segment has been read;
               REF(zhb) pzhb;
               BEGIN
                 hide(pzhb.prefix);
                 unprotect(pzhb);
                 check_hidden(pzhb);
                 protect(pzhb);
               END class_declaration;

             REF(zqu) PROCEDURE normal_access(idno);
               INTEGER idno;
               IF display_array[idno]==NONE
               THEN error("Identifier not declared")
               ELSE normal_access:-display_array[idno];

             REF(zqu) PROCEDURE remote_access(idno,pzhb);
               INTEGER idno;
               REF(zhb) pzhb; COMMENT Qualifying class;
               BEGIN
                 REF(zqu) pzqu;
                 BOOLEAN found;
SIMULA FOR DEC SYSTEM 10             TD, COMPILER               II.D-8

780302                6                           Claes Wihlborg








                 WHILE pzhb=/=NONE AND NOT found DO BEGIN
                   pzqu:-pzhb.declarations;
                   WHILE pzqu=/=NONE AND NOT found DO
                     IF pzqu.idno=idno AND NOT pzqu.invisible
                     THEN found:=TRUE
                     ELSE pzqu:-pzqu.next;
                   pzhb:-pzhb.prefix;
                 END;
                 remote_access:-pzqu;
               END remote_access;

             PROCEDURE class_entry(pzhb);
               REF(zhb) pzhb;
               BEGIN
                 c_level:-NEW level(pzhb);
                 hide(pzhb.prefix);
                 unprotect(pzhb);
                 display(pzhb);
               END class_entry;

             PROCEDURE class_exit;
               BEGIN
                 undisplay;
                 protect(c_level.pzhe QUA zhb);
                 c_level:-c_level.environment;
               END class_exit;

             PROCEDURE entry_prefix_block(pzhb);
               REF(zhb) pzhb;
               BEGIN
                 c_level:-NEW level(pzhb);
                 hide(pzhb.prefix);
                 display(pzhb);
               END entry_prefix_block;

             PROCEDURE exit_prefix_block;
               BEGIN
                 undisplay;
                 protect((c_level.pzhe QUA zhb).prefix);
                 c_level:-c_level.environment;
               END exit_prefix_block;

             PROCEDURE entry_connection(pzhb);
               REF(zhb) pzhb;
               BEGIN
                 c_level:-NEW level(pzhb);
SIMULA FOR DEC SYSTEM 10             TD, COMPILER               II.D-9

780302                6                           Claes Wihlborg








                 display(pzhb.prefix);
               END entry_connection_block;

             PROCEDURE exit_connection;
               BEGIN
                 undisplay;
                 c_level:-c_level.environment;
               END exit_connection_block;

           END pass 2;

         END Declaration handling: DECsystem-10;

         COMMENT The  algorithms  above  show  only  the  logic  of  the
         implementation.   In  reality  they are more complicated due to
         some lists  being  merged  together  and  some  pointers  being
         substituted  with  the  relation  "placed  in  the  immediately
         following  memory  location".   As  these  details  only  would
         clutter  up  the  description they are not given here.  For the
         same reason, a lot of details which  are  irrelevant  here  are
         missing.  ;