1 TITLE DECLARATION PROCESSOR
\r
7 .GLOBAL STBL,TYPFND,TYPSGR,CHKDCL,TESTR,VALG,INCR1,TYPG,ISTRUC,TMATCH,SAT
\r
8 .GLOBAL TYPMIS,CHKAB,CHKARG,IGDECL,LOCQQ,APLQ,CALER,IEQUAL,IIGLOC,IGLOC
\r
9 .GLOBAL CHLOCI,INCONS,SPCCHK,WTYP1
\r
11 ; Subr to allow user to access the DECL checking code
\r
13 MFUNCTION CHECKD,SUBR,[DECL?]
\r
21 PUSHJ P,TMATCX ; CHECK THEM
\r
33 ; Subr to turn DECL checking on and off.
\r
35 MFUNCTION %DECL,SUBR,[DECL-CHECK]
\r
47 ; Change special unspecial normal mode
\r
49 MFUNCTION SPECM%,SUBR,[SPECIAL-MODE]
\r
55 MOVE C,SPCCHK ; GET CURRENT
\r
56 JUMPGE AB,MODER ; RET CURRENT
\r
57 GETYP 0,(AB) ; CHECK IT IS ATOM
\r
62 CAMN 0,MQUOTE UNSPECIAL
\r
64 CAMN 0,MQUOTE SPECIAL
\r
69 MODER: MOVSI A,TATOM
\r
70 MOVE B,MQUOTE SPECIAL
\r
72 MOVE B,MQUOTE UNSPECIAL
\r
75 ; Function to turn special checking on and of
\r
77 MFUNCTION SPECC%,SUBR,[SPECIAL-CHECK]
\r
96 ; Finction to set decls for GLOBAL values.
\r
98 MFUNCTION GDECL,FSUBR
\r
116 HRRZ D,(C) ; MAKE SURE PAIRS
\r
117 JUMPE D,GDECLL ; LOSER, GO AWAY
\r
122 MOVEM 0,1(TB) ; READY FOR NEXT CALL
\r
123 MOVE C,1(C) ; SAVE ATOM LIST
\r
129 JRST GDECL1 ; OUT OF ATOMS
\r
130 GETYP 0,(C) ; IS THIS AN ATOM
\r
132 JRST GDECLL ; NO, LOSE
\r
136 PUSHJ P,IIGLOC ; GET ITS VAL (OR MAKE ONE)
\r
137 GETYP 0,(B) ; UNBOUND?
\r
139 JRST CHKCUR ; CHECK CURRENT VALUE
\r
140 MOVE C,3(TB) ; GET DECL
\r
144 CHKCUR: HRRZ D,3(TB)
\r
162 TYPMI3: MOVE E,(TP) ; POINT BACK TO SLOT
\r
163 MOVE A,-1(E) ; ATOM TO A
\r
165 MOVE D,(E) ; GET OLD VALUE
\r
167 JRST TYPMIS ; GO COMPLAIN
\r
169 GDECLL: PUSH TP,$TATOM
\r
170 PUSH TP,EQUOTE BAD-ARGUMENT-LIST
\r
173 MFUNCTION UNMANIFEST,SUBR
\r
177 PUSH P,[HLLZS -2(B)]
\r
180 MFUNCTION MANIFEST,SUBR
\r
184 PUSH P,[HLLOS -2(B)]
\r
185 MANLP: JUMPGE AB,RETT
\r
195 MFUNCTION MANIFQ,SUBR,[MANIFEST?]
\r
204 PUSHJ P,IGLOC ; GET POINTER IF ANY
\r
213 MFUNCTION GETDECL,SUBR,[GET-DECL]
\r
220 HRRZ C,-2(B) ; GET GLOBAL DECL
\r
221 GETD1: JUMPE C,RETF
\r
230 RETMAN: MOVSI A,TATOM
\r
231 MOVE B,MQUOTE MANIFEST
\r
234 GTLOCA: HLRZ C,2(B) ; LOCAL DECL
\r
237 MFUNCTION PUTDECL,SUBR,[PUT-DECL]
\r
242 SKIPA E,[HRLM B,2(C)]
\r
243 MOVE E,[HRRM B,-2(C)]
\r
245 GETYP 0,(B) ; ANY VALUE
\r
248 MOVE C,(B) ; GET CURRENT VALUE
\r
254 PUTD1: MOVE C,2(AB) ; GET DECL BACK
\r
256 PUSHJ P,INCONS ; CONS IT UP
\r
257 MOVE C,1(AB) ; LOCATIVE BACK
\r
263 TYPMI4: MOVE E,1(AB) ; GET LOCATIVE
\r
264 MOVE A,-1(E) ; NOW ATOM
\r
265 MOVEI C,2(AB) ; POINT TO DECL
\r
266 MOVE D,(E) ; AND CURRENT VAL
\r
270 GTLOC: GETYP 0,(AB)
\r
275 HRRZ 0,(AB) ; LOCAL OR GLOBAL
\r
278 MOVE B,1(AB) ; RETURN LOCATIVE IN B
\r
281 ; Interface between EVAL and declaration processor.
\r
282 ; E points into stack at a binding and C points to decl list.
\r
284 CHKDCL: SKIPE IGDECL ; IGNORING DECLS?
\r
285 POPJ P, ; YUP, JUST LEAVE
\r
287 PUSH TP,$TTP ; SAVE BINDING
\r
289 MOVE A,-4(E) ; GET ATOM
\r
290 MOVSI 0,TLIST ; SETUP FOR INTERRUPTABLE
\r
295 SETZB B,0 ; CLOBBER FOR INTGO
\r
298 HRRZ D,(C) ; MAKE SURE EVEN ELEMENTS
\r
300 GETYP B,(C) ; MUST BE LIST OF ATOMS
\r
303 MOVE B,1(C) ; GET LIST
\r
306 CAMN A,1(B) ; SKIP IF NOT WINNER
\r
307 JRST DCLQ ; MAY BE WINNER
\r
308 DCL3: HRRZ B,(B) ; CDR ON
\r
309 JUMPN B,DCL1 ; JUMP IF MORE
\r
311 HRRZ C,(D) ; CDR MAIN LIST
\r
312 JUMPN C,DCL2 ; AND JUMP IF WINNING
\r
314 PUSHJ P,E.GET ; GET BINDING BACK
\r
315 SUB TP,[2,,2] ; POP OF JUNK
\r
318 DCLQ: GETYP C,(B) ; CHECK ATOMIC
\r
321 PUSHJ P,E.GET ; GOT IT
\r
322 PUSH TP,$TLIST ; SAVE PATTERN
\r
324 MOVE B,1(D) ; GET PATTERN
\r
326 MOVE C,-3(E) ; PROPOSED VALUE
\r
328 PUSHJ P,TMATCH ; MATCH TYPE
\r
329 JRST TYPMI1 ; LOSER
\r
330 DCLQ1: MOVE E,-2(TP)
\r
331 MOVE C,-5(E) ; CHECK FOR SPEC CHANGE
\r
332 SKIPE 0 ; MAKE SURE NON ZERO IS -1
\r
334 SKIPL SPCCHK ; SKIP IF NORMAL UNSPECIAL
\r
335 SETCM 0 ; COMPLEMENT
\r
346 MOVEM C,(E) ; STORE DECLS
\r
351 TYPMI1: MOVE E,-2(TP)
\r
355 MOVE E,-2(TP) ; GET POINTER TO BIND
\r
356 MOVE D,-3(E) ; GET VAL
\r
358 HRRZ C,(TP) ; DCL LIST
\r
359 MOVE A,-4(E) ; GET ATOM
\r
361 TYPMIS: PUSH TP,$TATOM
\r
362 PUSH TP,EQUOTE TYPE-MISMATCH
\r
368 JSP E,CHKARG ; HACK DEFER
\r
371 MOVEI A,4 ; 3 ERROR ARGS
\r
374 BADCL: PUSHJ P,E.GET
\r
376 PUSH TP,EQUOTE BAD-DECLARATION-LIST
\r
379 ; ROUTINE TO RESSET INT STUFF
\r
387 ; Declarations processor for MUDDLE type declarations.
\r
388 ; Receives a pattern in a and B and an object in C and D.
\r
389 ; It skip returns if the object fits otherwise it doesn't.
\r
390 ; Declaration syntax errors are caught and sent to ERROR.
\r
392 TMATCH: MOVEI 0,1 ; RET SPECIAL INDICATOR
\r
393 SKIPE IGDECL ; IGNORING DECLS?
\r
394 JRST CPOPJ1 ; YUP, ACT LIKE THEY WON
\r
396 TMATCX: GETYP 0,A ; GET PATTERNS TYPE
\r
397 CAIN 0,TFORM ; MUST BE FORM OR ATOM
\r
400 JRST TERR1 ; WRONG TYPE FOR A DCL
\r
402 ; SIMPLE TYPE MATCHER
\r
404 TYPMAT: GETYP E,C ; OBJECTS TYPE TO E
\r
406 PUSHJ P,TYPFND ; CONVERT TYPE NAME TO CODE
\r
407 JRST SPECS ; NOT A TYPE NAME, TRY SPECIALS
\r
408 POP P,E ; RESTORE TYPE OF OBJECT
\r
409 MOVEI 0,0 ; SPECIAL INDICATOR
\r
410 CAIN E,(D) ; SKIP IF LOSERS
\r
411 CPOPJ1: AOS (P) ; GOOD RETURN
\r
414 SPECS: POP P,A ; RESTORE OBJECTS TYPE
\r
416 JRST CPOPJ1 ; RETURN IMMEDIATELY IF ANYTHING WINS
\r
417 CAMN B,MQUOTE STRUCTURED
\r
418 JRST ISTRUC ; LET ISTRUC DO THE WORK
\r
419 CAMN B,MQUOTE APPLICABLE
\r
421 CAME B,MQUOTE LOCATIVE
\r
425 ; ARRIVE HERE FOR A FORM IN THE DCLS
\r
427 TMAT1: JUMPE B,TERR3 ; EMPTY FORM LOSES
\r
428 HRRZ E,(B) ; CDR IT
\r
429 JUMPE E,TMAT3 ; CANT BE SPECIAL/UNSPECIAL, LEAVE
\r
430 PUSHJ P,0ATGET ; GET POSSIBLE ATOM IN 0
\r
431 JRST TEXP1 ; NOT ATOM
\r
432 CAME 0,MQUOTE SPECIAL
\r
433 CAMN 0,MQUOTE UNSPECIAL
\r
434 JRST TMAT2 ; IGNORE SPECIAL/UNSPECIAL
\r
435 TMAT3: PUSHJ P,TEXP1
\r
438 MOVEI 0,0 ; RET UNSPECIAL INDICATION
\r
441 TEXP1: JUMPE B,TERR3 ; EMPTY FORM
\r
442 GETYP 0,A ; CHECK CURRENT TYPE
\r
443 CAIN 0,TATOM ; IF ATOM,
\r
444 JRST TYPMA1 ; SIMPLE MATCH
\r
447 GETYP 0,(B) ; WHAT IS FIRST ELEMEMT
\r
448 CAIE 0,TFORM ; FORM=> <<OR ..>....> OR <<PRIMTYPE FOO>....>
\r
450 PUSH TP,$TLIST ; SAVE LIST
\r
452 MOVE B,1(B) ; GET FORM
\r
456 TDZA 0,0 ; REMEMBER LACK OF SKIP
\r
460 MOVE B,(TP) ; GET BACK SAVED LIST
\r
462 JUMPE 0,CPOPJ ; LOSERS EXIT IMMEDIATELY
\r
463 HRRZ B,(B) ; OTHERWISE REST THE LIST AND FALL INTO ELETYPE
\r
465 ; CHECKS TYPES OF ELEMENTS OF STRUCTURES
\r
467 ELETYP: JUMPE B,CPOPJ1 ; EMPTY=> WON
\r
468 PUSH TP,$TLIST ; SAVE DCL LIST
\r
470 MOVE A,C ; GET OBJ IN A AND B
\r
472 PUSHJ P,TYPSGR ; GET REST/NTH CODE
\r
473 JRST ELETYL ; LOSER
\r
476 PUSH P,C ; SAVE CODE
\r
477 PUSH TP,[0] ; AND SLOTS
\r
480 ; MAIN ELEMENT SCANNING LOOP
\r
482 ELETY1: XCT TESTR(C) ; SKIP IF OBJ NOT EMPTY
\r
483 JRST ELETY2 ; CHEK EMPTY WINNER
\r
484 XCT TYPG(C) ; GET ELEMENT
\r
486 JSP E,CHKAB ; CHECK OUT DEFER
\r
487 MOVEM A,-1(TP) ; AND SAVE IT
\r
490 MOVE D,B ; FOR OTHER MATCHERS
\r
491 MOVE B,-4(TP) ; GET PATTERN
\r
493 GETYP 0,(B) ; GET TYPE OF <1 pattern>
\r
494 MOVE B,1(B) ; GET ATOM OR WHATEVER
\r
495 CAIE 0,TATOM ; ATOM ... SIMPLE TYPE
\r
497 PUSHJ P,TYPMAT ; DO SIMPLE TYPE MATCH
\r
498 JRST ELETY4 ; LOSER
\r
500 ; HERE TO REST EVERYTHING AND GO ON BACK
\r
502 ELETY6: MOVE D,-2(TP) ; GET OBJ POINTER
\r
503 MOVE C,(P) ; GET INCREMENT CODE
\r
505 MOVEM D,-2(TP) ; SAVED INCREMENTED GOODIR
\r
509 ELETY9: HRRZ B,@-4(TP) ; CDR IT
\r
513 ; HERE IF PATTERN EMPTY
\r
515 ELETY8: AOS -1(P) ; SKIP RETURN
\r
516 ELETY4: SETZM DSTO(PVP)
\r
521 ELETYL: SUB TP,[2,,2]
\r
524 ; HERE TO HANDLE EMPTY OBJECT
\r
526 ELETY2: MOVE B,-4(TP) ; GET PATTERN
\r
527 GETYP 0,(B) ; CHECK FOR [REST ...]
\r
530 JRST ELETY4 ; LOSER
\r
531 HLRZ 0,1(B) ; SIZE OF IT
\r
532 CAILE 0,-4 ; MUST BE 2
\r
534 MOVE B,1(B) ; GET IT
\r
535 PUSHJ P,0ATGET ; LOOK FOR REST
\r
538 JRST ELETY8 ; WINNER!!!!
\r
539 JRST ELETY4 ; LOSER
\r
541 ; HERE TO CHECK OUT A FORM ELEMNT
\r
543 ELETY3: CAIE 0,TFORM
\r
546 PUSHJ P,TEXP1 ; AND ANALYSE IT
\r
547 JRST ELETY4 ; LOSER
\r
548 MOVE 0,-3(TP) ; RESET DSTO
\r
550 JRST ELETY6 ; WINNER
\r
552 ; CHECK FOR VECTOR IN PATTERN
\r
554 ELETY7: CAIE 0,TVEC ; SKIP IF WINNER
\r
555 JRST TERR12 ; YET ANOTHER ERROR
\r
556 HLRE C,B ; CHECK LEENGTH
\r
557 CAMLE C,[-4] ; MUST BE 2 LONG
\r
559 PUSHJ P,0ATGET ; 1ST ELEMENT ATOM?
\r
560 JRST ELET71 ; COULD BE FORM
\r
563 MOVNI 0,1 ; FLAG USED IN RESTIT
\r
564 PUSHJ P,RESTIT ; CHECK REST OF STRUCTUR
\r
566 JRST ELETY8 ; WIN AND DONE
\r
568 ; CHECK FOR [fix .... ]
\r
570 ELET71: CAIE 0,TFIX
\r
574 MOVE 0,1(B) ; GET NUMBER
\r
575 IMULI 0,-1(C) ; COUNT MORE
\r
576 PUSHJ P,RESTIT ; AND CHECK FIX NUM OF ELEMENTS
\r
578 MOVE D,-2(TP) ; GET OBJECT BACK
\r
579 MOVE 0,-3(TP) ; RESET DSTO
\r
581 MOVE C,(P) ; RESTORE CODE FOR RESTING ETC.
\r
585 ; HERE TO DO A TASTEFUL TYPMAT
\r
590 TDZA 0,0 ; REMEMBER LOSSAGE
\r
591 MOVEI 0,1 ; OR WINNAGE
\r
593 POP TP,C ; RESTORE OBJECT
\r
594 JUMPN 0,CPOPJ1 ; SKIPPED BEFORE, SKIP AGAIN
\r
597 ; HERE TO SKIP SPECIAL/UNSPECIAL
\r
599 TMAT2: CAME 0,MQUOTE SPECIAL
\r
602 PUSH P,0 ; SAVE INDICATOR
\r
603 GETYP A,(E) ; TYPE OF NEW PAT
\r
604 MOVE B,1(E) ; VALUE
\r
612 ; LOOK FOR <OR... OR <PRIMTYPE....
\r
614 TEXP12: CAIE 0,TATOM
\r
616 MOVE 0,1(B) ; GET ATOM
\r
617 CAMN 0,MQUOTE QUOTE
\r
618 JRST MQUOT ; MATCH A QUOTED OBJECT
\r
620 CAMN 0,MQUOTE PRIMTYPE
\r
621 JRST ACTORT ; FALL INTO ACTOR HACKER
\r
624 MOVE B,0 ; GET ATOM
\r
625 PUSH TP,C ; SAVE OBJ
\r
633 JUMPN 0,.+3 ; TO ELETYP IF WON
\r
635 POPJ P, ; ELSE LOSE
\r
651 ; THIS CODE HANDLES ORs AND PRIMTYPEs
\r
652 ACTRT1: SKIPA E,[PACT]
\r
654 ACTORT: MOVEI E,TEXP1
\r
655 JUMPE B,TERR6 ; EMPTY, LOSE
\r
656 PUSHJ P,0ATGET ; ATOM TO 0
\r
660 HRRZ 0,(B) ; REST IT FLUSHING OR
\r
662 PUSH TP,$TLIST ; SAVE LSIT
\r
664 PUSH P,E ; SAVE ELEMENT CHECKER
\r
666 ORLP: SKIPN B,(TP) ; ANY LEFT?
\r
667 JRST ORDON ; NOPE, LOSE
\r
668 HRRZ 0,(B) ; SAVE THE REST
\r
670 GETYP 0,(B) ; WHAT ARE WE ORing
\r
671 MOVE A,(B) ; TYPE WORD
\r
672 MOVE B,1(B) ; AND ITEM
\r
673 PUSHJ P,@(P) ; EITHER PACT OR TEXP1
\r
674 JRST ORLP ; HAVEN'T WON YET
\r
675 AOS -1(P) ; SKIP RETURN FOR WINNER
\r
677 ORDON: SUB TP,[2,,2] ; FLUSH TEMP
\r
681 ; HERE TO PRIMTYPE ACTORS
\r
685 JUMPE B,TERR6 ; EMPTY FORM
\r
686 MOVE 0,1(B) ; FIRST ELEMENT MUST BE PRIMTYPE
\r
687 PACT2: CAME 0,MQUOTE PRIMTYPE
\r
689 HRRZ B,(B) ; GET PRIMTYPE
\r
691 GETYP A,C ; GET OBJ TYPE
\r
692 GETYP 0,(B) ; GET PATTERN TYPE
\r
693 CAIE 0,TATOM ; BETTER BE ATOM
\r
695 PUSH TP,$TLIST ; SAVE DCL LIST
\r
699 PUSHJ P,SAT ; GET STORAGE TYPE
\r
702 MOVE B,@STBL(A) ; GET PRIM NAME
\r
705 MOVSI C,(D) ; FAKE OUT TYPMAT
\r
716 PACT1: CAIE 0,TATOM
\r
720 PTEMP: MOVE B,-2(TP)
\r
722 CAMN B,MQUOTE TEMPLATE
\r
727 ; RESTIT - TYPE CHECK SELECTED NUMBER OF ELEMENTS IN STRUCTURE
\r
729 RESTIT: PUSH TP,$TVEC ; SAVE TYPE
\r
730 ADD B,[2,,2] ; SKIP OVER CRUFT
\r
731 PUSH TP,B ; AND VAL
\r
734 RESTI1: PUSH P,A ; SAVE DISP HACK
\r
735 PUSH P,0 ; AND COUNT HACK
\r
736 RESTI4: SKIPL (P) ; SKIP IF DOING ALL
\r
737 SOSL (P) ; SKIP IF DONE
\r
739 AOS -2(P) ; SKIP RET
\r
740 RESTI5: SUB P,[2,,2] ; POP JUNK
\r
743 RESTI6: MOVE C,-3(P) ; REST CODE
\r
744 MOVE D,-6(TP) ; SET UP FOR REST
\r
745 MOVE E,-7(TP) ; DONT FORGET DSTO
\r
747 XCT TESTR(C) ; DONE?
\r
748 JRST RESTI2 ; YES, CHECK WINNAGE
\r
750 XCT VALG(C) ; GET VAL ANDTYPE
\r
751 JSP E,CHKAB ; CHECK DEFER
\r
752 XCT INCR1(C) ; REST IT
\r
753 MOVEM D,-6(TP) ; SAVE LIST
\r
755 MOVEM E,-7(TP) ; FIXUP
\r
759 SKIPL A,(TP) ; ANY MORE?
\r
760 MOVE A,-2(TP) ; NO RECYCLE
\r
761 ADD A,[2,,2] ; BUMP
\r
762 MOVEM A,(TP) ; AND SAVE
\r
763 MOVE B,-1(A) ; GET ELEMENT
\r
768 MOVEI E,TYPMAT ; ATOM --> SIMPLE TYPE
\r
769 CAIN 0,TFORM ; FORM--> HAIRY PATTERN
\r
771 PUSHJ P,(E) ; DO IT
\r
775 RESTI2: SKIPGE (P) ; SKIP IF WON
\r
776 AOS -2(P) ; COUNTERACT CPOPJ1
\r
782 ; HERE TO MATHC A QUOTED OBJ
\r
783 ; B/ FORM QUOTE... C,D/ OBJECT TO MATCH AGAINST
\r
785 MQUOT: HRRZ B,(B) ; LOOK AT NEXT
\r
787 GETYP A,(B) ; GET TYPE
\r
789 MOVE B,1(B) ; AND VALUE
\r
790 JSP E,CHKAB ; HACK DEFER
\r
805 0ATGET: GETYP 0,(B)
\r
806 CAIE 0,TATOM ; SKIP IF ATOM
\r
808 MOVE 0,1(B) ; GET ATOM
\r
811 TERR9: MOVS A,0 ; TYPE TO A
\r
815 TERR1: MOVE E,EQUOTE DECL-ELEMENT-NOT-FORM-OR-ATOM
\r
818 TERR2: MOVSI A,TATOM
\r
819 MOVE E,EQUOTE ATOM-NOT-TYPE-NAME-OR-SPECIAL-SYMBOL
\r
822 TERR3: MOVE E,EQUOTE EMPTY-FORM-IN-DECL
\r
824 TERR7: MOVE E,EQUOTE EMPTY-OR/PRIMTYPE-FORM
\r
827 TERR8: MOVS A,0 ; TYPE TO A
\r
828 MOVE E,EQUOTE NON-TYPE-FOR-PRIMTYPE-ARG
\r
830 TERR12: MOVE E,EQUOTE ELEMENT-TYPE-NOT-ATOM-FORM-OR-VECTOR
\r
832 TERR13: MOVE E,EQUOTE VECTOR-LESS-THAN-2-ELEMENTS
\r
834 TERR14: MOVE E,EQUOTE FIRST-VECTOR-ELEMENT-NOT-REST-OR-A-FIX
\r
836 TERRD: PUSH TP,$TATOM
\r
837 PUSH TP,EQUOTE BAD-TYPE-SPECIFICATION
\r