Annotation of researchv10no/cmd/sml/src/translate/equal.sml, revision 1.1

1.1     ! root        1: (* Copyright 1989 by AT&T Bell Laboratories *)
        !             2: (* equal.sml *)
        !             3: signature EQUAL =
        !             4: sig
        !             5:   structure Basics : BASICS
        !             6:   structure Lambda : LAMBDA
        !             7:   val equal : Basics.ty -> Lambda.lexp
        !             8: end
        !             9: 
        !            10: structure Equal : EQUAL =
        !            11: struct
        !            12: 
        !            13:   structure Basics : BASICS = Basics
        !            14:   structure Lambda : LAMBDA = Lambda
        !            15: 
        !            16: open ErrorMsg Basics Lambda Access BasicTypes TypesUtil
        !            17: 
        !            18: fun translatepath [v] = VAR v
        !            19:   | translatepath (x::p) = SELECT(x,translatepath p)
        !            20:   | translatepath nil = ErrorMsg.impossible "equal.translatepath nil"
        !            21: 
        !            22: fun argType(POLYty{tyfun=TYFUN{arity,body=CONty(_,[domain,_])},...}, args) =
        !            23:       applyTyfun(TYFUN{arity=arity,body=domain},args)
        !            24:   | argType(CONty(_,[argty,_]), []) = argty
        !            25:   | argType _ = impossible "Equal.argType"
        !            26: 
        !            27: 
        !            28: exception Poly
        !            29: 
        !            30: fun atomeq tyc =
        !            31:          if eqTycon(tyc,!intTycon) 
        !            32:             orelse eqTycon(tyc,!boolTycon)
        !            33:             orelse eqTycon(tyc,!refTycon)
        !            34:             orelse eqTycon(tyc,!arrayTycon) then PRIM P.ieql
        !            35:          else if eqTycon(tyc,!realTycon) then PRIM P.feql
        !            36:          else if eqTycon(tyc,!stringTycon) then 
        !            37:            translatepath(!CoreInfo.stringequalPath)
        !            38:          else raise Poly
        !            39: 
        !            40: exception Notfound
        !            41: 
        !            42: val trueLexp = CON(trueDcon,RECORD[])
        !            43: val falseLexp = CON(falseDcon,RECORD[])
        !            44: 
        !            45: fun equal (concreteType : ty) : lexp =
        !            46:     let val cache : (ty * lexp * lexp ref) list ref = ref nil
        !            47:        fun enter ty =
        !            48:            let val v = VAR(mkLvar())
        !            49:                val r = ref v
        !            50:             in if !System.Control.debugging 
        !            51:                  then (print "enter: "; PrintType.printType ty; print "\n")
        !            52:                  else ();
        !            53:                cache := (ty, v, r) :: !cache; (v,r)
        !            54:            end
        !            55:        fun find ty =
        !            56:            let fun f ((t,v,e)::r) = if equalType(ty,t) then v else f r
        !            57:                  | f nil = (if !System.Control.debugging
        !            58:                              then print "find-notfound\n"
        !            59:                              else ();
        !            60:                             raise Notfound)
        !            61:             in if !System.Control.debugging 
        !            62:                 then (print "find: "; PrintType.printType ty; print "\n")
        !            63:                 else ();
        !            64:                f (!cache)
        !            65:            end
        !            66: 
        !            67:        fun test(ty) =
        !            68:        (if !System.Control.debugging
        !            69:         then (print "test: "; PrintType.printType ty; print "\n")
        !            70:         else ();
        !            71:         case ty
        !            72:          of VARty(ref(INSTANTIATED t)) => test t
        !            73:           | FLEXRECORDty(ref(CLOSED t)) => test t
        !            74:           | CONty(ref(tyc as TYCON{kind=ABStyc,eq=ref YES,...}),tyl) =>  atomeq tyc
        !            75:           | CONty(ref(tyc as TYCON{kind=ABStyc,eq=ref NO,...}),tyl) =>
        !            76:               impossible("Attempt to test opaque type for equality: "
        !            77:                                     ^ Symbol.name(tycName tyc))
        !            78:           | CONty(ref(TYCON{kind=DEFtyc _,...}),tyl) => test(reduceType ty)
        !            79:           | CONty(ref(tyc as
        !            80:                       TYCON{kind=DATAtyc([DATACON{const=false,rep,typ,...}]),
        !            81:                             ...}),
        !            82:                   tyl) =>
        !            83:               (case rep
        !            84:                  of TRANSPARENT => 
        !            85:                       (find ty handle Notfound =>
        !            86:                         let val (eqv,patch) = enter ty
        !            87:                             val v = mkLvar()
        !            88:                             val ty' = argType(!typ,tyl)
        !            89:                          in patch := FN(v,APP(test ty', VAR v));
        !            90:                             eqv
        !            91:                         end)
        !            92:                   | REF => atomeq tyc
        !            93:                   | _ => impossible "Equal #498")
        !            94:           | CONty(ref(TYCON{kind,...}), tyl) =>
        !            95:              (find ty
        !            96:               handle Notfound =>
        !            97:               let val v = mkLvar() and x=mkLvar() and y=mkLvar()
        !            98:                   val (eqv, patch) = enter ty
        !            99:                   fun inside (DATACON{const=true,...}) = trueLexp
        !           100:                     | inside (c as DATACON{typ, const=false,...}) =
        !           101:                         APP(test(argType(!typ,tyl)),
        !           102:                             RECORD[DECON(c, VAR x),
        !           103:                                    DECON(c, VAR y)])
        !           104:                   val body = 
        !           105:                       case kind
        !           106:                         of DATAtyc([dcon]) =>
        !           107:                              inside dcon       
        !           108:                          | DATAtyc(dcons) =>
        !           109:                              let fun concase dcon =
        !           110:                                      (DATAcon(dcon),
        !           111:                                       SWITCH(VAR y,[(DATAcon(dcon), inside dcon)],
        !           112:                                            SOME(falseLexp)))
        !           113:                               in SWITCH(VAR x,map concase dcons,NONE)
        !           114:                              end
        !           115:                          | RECORDtyc _ =>
        !           116:                            let fun loop(n,[ty]) =
        !           117:                                         APP(test(ty), RECORD[SELECT(n, VAR x),
        !           118:                                                SELECT(n, VAR y)])
        !           119:                                  | loop(n,ty::r) =
        !           120:                                      SWITCH(loop(n,[ty]),
        !           121:                                       [(DATAcon(trueDcon), loop(n+1,r)),
        !           122:                                        (DATAcon(falseDcon), falseLexp)],
        !           123:                                       NONE)
        !           124:                                  | loop(_,nil) = trueLexp
        !           125:                             in loop(0,tyl)
        !           126:                            end
        !           127:                          | _ => raise Poly
        !           128:                in patch := FN(v,APP(FN(x,APP(FN(y,body),
        !           129:                                              SELECT(1,VAR v))),
        !           130:                                     SELECT(0,VAR v)));
        !           131:                   eqv
        !           132:               end)
        !           133:           | _ => raise Poly)
        !           134: 
        !           135:        val body = test(concreteType)
        !           136: 
        !           137:      in FIX(map (fn (_,VAR v,_) => v | _ => impossible "Equal #324") (!cache),
        !           138:            map (fn (_,_,e) => !e) (!cache),
        !           139:            body)
        !           140:     end
        !           141:     handle Poly => translatepath(!CoreInfo.polyequalPath)
        !           142:          | Syntax =>
        !           143:           (print "equal: type = ";
        !           144:            PrintType.resetPrintType();
        !           145:            PrintType.printType concreteType; print"\n";
        !           146:            RECORD[])
        !           147:                
        !           148: end (* struct *)
        !           149: 

unix.superglobalmegacorp.com

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