示例#1
0
 def FindHiddenPointers(R, typ, offset):
     if (typ.form == Pointer) or (typ.form == NilTyp):
         Write(R, Fld)
         Write(R, 0)
         Files.WriteNum(R, offset)
     elif typ.form == Record:
         fld = typ.dsc
         while fld != None:
             FindHiddenPointers(R, fld.type_, fld.val + offset)
             fld = fld.next
     elif typ.form == Array:
         i = 0
         n = typ.len_
         while i < n:
             FindHiddenPointers(R, typ.base, typ.base.size * i + offset)
             i += 1
示例#2
0
def Export(modid, newSF, key):
    global Ref
    Ref = Record + 1
    filename = MakeFileName(modid, ".smb")
    R = Files.New(filename)
    #  Files.Set(R, F, 0)
    Files.WriteInt(R, 0)  #(*placeholder*)
    Files.WriteInt(R, 0)  #(*placeholder for key to be inserted at the end*)
    Files.WriteString(R, modid)
    Write(R, versionkey)

    obj = topScope.next
    while obj != None:
        if obj.expo:
            Write(R, obj.class_)
            Files.WriteString(R, obj.name)
            OutType(R, obj.type_)
            if obj.class_ == Typ:
                if obj.type_.form == Record:
                    obj0 = topScope.next  # (*check whether this is base of previously declared pointer types*)
                    while obj0 != obj:
                        if (obj0.type_.form == Pointer) and (
                                obj0.type_.base
                                == obj.type_) and (obj0.type_.ref > 0):
                            Write(R, obj0.type_.ref)
                        obj0 = obj0.next

                Write(R, 0)

            elif obj.class_ == Const:
                if obj.type_.form == Proc:
                    Files.WriteNum(R, obj.exno)
                elif obj.type_.form == Real:
                    Files.WriteInt(R, obj.val)
                else:
                    Files.WriteNum(R, obj.val)

            elif obj.class_ == Var:
                Files.WriteNum(R, obj.exno)
                if obj.type_.form == String:
                    Files.WriteNum(R, obj.val / 0x10000)
                    obj.val = obj.val % 0x10000

        obj = obj.next

    Write(R, 0)
    ##  while True:
    ##    Write(R, 0)
    ##    if Files.Length(F) % 4 == 0:
    ##      break

    for r in range(Record + 1, maxTypTab):  # Double check range! FIXME
        typtab[r] = None


##  Files.Set(R, F, 0)
##  sum = 0; # (* compute key (checksum) *)
##  while not R.eof:
##    Files.ReadInt(R, x)
##    sum = sum + x
##
##  F1 = Files.Old(filename)  # (*sum is new key*)
##  if F1 != None:
##    Files.Set(R1, F1, 4)
##    Files.ReadInt(R1, oldkey)
##  else:
##    oldkey = sum+1
##
##  if sum != oldkey:
##    if newSF:
##      key = sum
##      Files.Set(R, F, 4)
##      Files.WriteInt(R, sum)
##      Files.Register(F) # (*insert checksum*)
##    else:
##      ORS.Mark("new symbol file inhibited")
##
##  else:
##    newSF = False
##    key = sum

    return modid, newSF, key
示例#3
0
def OutType(R, t):
    global Ref

    def OutPar(R, par, n):
        if n > 0:
            OutPar(R, par.next, n - 1)
            cl = par.class_
            Write(R, cl)
            if par.rdo:
                Write(R, 1)
            else:
                Write(R, 0)
            OutType(R, par.type_)

    def FindHiddenPointers(R, typ, offset):
        if (typ.form == Pointer) or (typ.form == NilTyp):
            Write(R, Fld)
            Write(R, 0)
            Files.WriteNum(R, offset)
        elif typ.form == Record:
            fld = typ.dsc
            while fld != None:
                FindHiddenPointers(R, fld.type_, fld.val + offset)
                fld = fld.next
        elif typ.form == Array:
            i = 0
            n = typ.len_
            while i < n:
                FindHiddenPointers(R, typ.base, typ.base.size * i + offset)
                i += 1

    if t.ref > 0:  # (*type was already output*)
        Write(R, -t.ref)
    else:
        obj = t.typobj
        if obj != None:
            Write(R, Ref)
            t.ref = Ref
            Ref += 1
        else:  # (*anonymous*)
            Write(R, 0)

        Write(R, t.form)
        if t.form == Pointer:
            if t.base.ref > 0:
                Write(R, -t.base.ref)
            elif (t.base.typobj
                  == None) or not t.base.typobj.expo:  # (*base not exported*)
                Write(R, -1)
            else:
                OutType(R, t.base)

        elif t.form == Array:
            OutType(R, t.base)
            Files.WriteNum(R, t.len_)
            Files.WriteNum(R, t.size)

        elif t.form == Record:
            if t.base != None:
                OutType(R, t.base)
            else:
                OutType(R, noType)

            if obj != None:
                Files.WriteNum(R, obj.exno)
            else:
                Write(R, 0)
            Files.WriteNum(R, t.nofpar)
            Files.WriteNum(R, t.size)
            fld = t.dsc
            while fld != None:  # (*fields*)
                if fld.expo:
                    Write(R, Fld)
                    Files.WriteString(R, fld.name)
                    OutType(R, fld.type_)
                    Files.WriteNum(R, fld.val)
                else:
                    FindHiddenPointers(R, fld.type_, fld.val)

                fld = fld.next

            Write(R, 0)  # indentation!?

        elif t.form == Proc:
            OutType(R, t.base)
            OutPar(R, t.dsc, t.nofpar)
            Write(R, 0)

        if (t.mno > 0) and (obj != None):  # (*re-export, output name*)
            mod = topScope.next
            while (mod != None) and (mod.lev != t.mno):
                mod = mod.next
            if mod != None:
                Files.WriteString(R, mod.name)
                Files.WriteInt(R, mod.val)
                Files.WriteString(R, obj.name)
            else:
                ORS.Mark("re-export not found")
                Write(R, 0)
        else:
            Write(R, 0)