From: Matthew F. <fl...@ml...> - 2006-05-19 15:04:24
|
Reworked the treatment of compile-time constants so that they are elaborated into the program at the proper size. This should fix the XML type errors on platforms with word constants that are not 32-bits. ---------------------------------------------------------------------- U mlton/branches/on-20050822-x86_64-branch/mlton/ast/char-size.fun U mlton/branches/on-20050822-x86_64-branch/mlton/ast/char-size.sig U mlton/branches/on-20050822-x86_64-branch/mlton/ast/prim-tycons.fun U mlton/branches/on-20050822-x86_64-branch/mlton/ast/prim-tycons.sig U mlton/branches/on-20050822-x86_64-branch/mlton/ast/real-size.fun U mlton/branches/on-20050822-x86_64-branch/mlton/ast/real-size.sig U mlton/branches/on-20050822-x86_64-branch/mlton/ast/word-size.fun U mlton/branches/on-20050822-x86_64-branch/mlton/ast/word-size.sig U mlton/branches/on-20050822-x86_64-branch/mlton/atoms/const-type.fun U mlton/branches/on-20050822-x86_64-branch/mlton/atoms/const-type.sig U mlton/branches/on-20050822-x86_64-branch/mlton/atoms/const.fun U mlton/branches/on-20050822-x86_64-branch/mlton/atoms/const.sig U mlton/branches/on-20050822-x86_64-branch/mlton/atoms/type-ops.fun U mlton/branches/on-20050822-x86_64-branch/mlton/atoms/type-ops.sig U mlton/branches/on-20050822-x86_64-branch/mlton/elaborate/elaborate-core.fun U mlton/branches/on-20050822-x86_64-branch/mlton/elaborate/type-env.fun U mlton/branches/on-20050822-x86_64-branch/mlton/main/compile.fun U mlton/branches/on-20050822-x86_64-branch/mlton/main/lookup-constant.fun ---------------------------------------------------------------------- Modified: mlton/branches/on-20050822-x86_64-branch/mlton/ast/char-size.fun =================================================================== --- mlton/branches/on-20050822-x86_64-branch/mlton/ast/char-size.fun 2006-05-17 21:18:10 UTC (rev 4549) +++ mlton/branches/on-20050822-x86_64-branch/mlton/ast/char-size.fun 2006-05-19 22:04:19 UTC (rev 4550) @@ -10,36 +10,36 @@ open S -datatype t = C1 | C2 | C4 +datatype t = C8 | C16 | C32 -val all = [C1, C2, C4] +val all = [C8, C16, C32] fun bits s = Bits.fromInt (case s of - C1 => 8 - | C2 => 16 - | C4 => 32) + C8 => 8 + | C16 => 16 + | C32 => 32) val equals = op = fun fromBits b = case Bits.toInt b of - 8 => C1 - | 16 => C2 - | 32 => C4 + 8 => C8 + | 16 => C16 + | 32 => C32 | _ => Error.bug "CharSize.frombits" val memoize = fn f => let - val c1 = f C1 - val c2 = f C2 - val c4 = f C4 + val c8 = f C8 + val c16 = f C16 + val c32 = f C32 in - fn C1 => c1 - | C2 => c2 - | C4 => c4 + fn C8 => c8 + | C16 => c16 + | C32 => c32 end val cardinality = memoize (fn s => IntInf.pow (2, Bits.toInt (bits s))) Modified: mlton/branches/on-20050822-x86_64-branch/mlton/ast/char-size.sig =================================================================== --- mlton/branches/on-20050822-x86_64-branch/mlton/ast/char-size.sig 2006-05-17 21:18:10 UTC (rev 4549) +++ mlton/branches/on-20050822-x86_64-branch/mlton/ast/char-size.sig 2006-05-19 22:04:19 UTC (rev 4550) @@ -13,7 +13,7 @@ sig include CHAR_SIZE_STRUCTS - datatype t = C1 | C2 | C4 + datatype t = C8 | C16 | C32 val all: t list val bits: t -> Bits.t Modified: mlton/branches/on-20050822-x86_64-branch/mlton/ast/prim-tycons.fun =================================================================== --- mlton/branches/on-20050822-x86_64-branch/mlton/ast/prim-tycons.fun 2006-05-17 21:18:10 UTC (rev 4549) +++ mlton/branches/on-20050822-x86_64-branch/mlton/ast/prim-tycons.fun 2006-05-19 22:04:19 UTC (rev 4550) @@ -50,35 +50,39 @@ memo (fn s => case Vector.peek (all, fn (_, s') => equalsA (s, s')) of - NONE => Error.bug "PrimTycons.make" + NONE => Error.bug "PrimTycons.make.fromSize" | SOME (tycon, _) => tycon) fun is t = Vector.exists (all, fn (t', _) => equals (t, t')) + fun de t = + case Vector.peek (all, fn (t', _) => equals (t, t')) of + NONE => Error.bug "PrimTycons.make.de" + | SOME (_, s') => s' val prims = Vector.toListMap (all, fn (tycon, _) => (tycon, Arity 0, admitsEquality)) in - (fromSize, all, is, prims) + (fromSize, all, is, de, prims) end in - val (char, _, isCharX, primChars) = + val (char, _, isCharX, deCharX, primChars) = let open CharSize in make ("char", all, bits, equals, memoize, Sometimes) end - val (int, ints, isIntX, primInts) = + val (int, ints, isIntX, deIntX, primInts) = let open IntSize in make ("int", all, bits, equals, memoize, Sometimes) end - val (real, reals, isRealX, primReals) = + val (real, reals, isRealX, deRealX, primReals) = let open RealSize in make ("real", all, bits, equals, memoize, Never) end - val (word, words, isWordX, primWords) = + val (word, words, isWordX, deWordX, primWords) = let open WordSize in @@ -88,7 +92,7 @@ val defaultChar = fn () => case !Control.defaultChar of - "char8" => char CharSize.C1 + "char8" => char CharSize.C8 | _ => Error.bug "PrimTycons.defaultChar" val defaultInt = fn () => case !Control.defaultInt of @@ -112,6 +116,7 @@ | _ => Error.bug "PrimTycons.defaultWord" val isIntX = fn c => equals (c, intInf) orelse isIntX c +val deIntX = fn c => if equals (c, intInf) then NONE else SOME (deIntX c) val prims = [(array, Arity 1, Always), Modified: mlton/branches/on-20050822-x86_64-branch/mlton/ast/prim-tycons.sig =================================================================== --- mlton/branches/on-20050822-x86_64-branch/mlton/ast/prim-tycons.sig 2006-05-17 21:18:10 UTC (rev 4549) +++ mlton/branches/on-20050822-x86_64-branch/mlton/ast/prim-tycons.sig 2006-05-19 22:04:19 UTC (rev 4550) @@ -37,10 +37,14 @@ val arrow: tycon val bool: tycon val char: CharSize.t -> tycon + val deCharX: tycon -> CharSize.t val defaultChar: unit -> tycon val defaultInt: unit -> tycon val defaultReal: unit -> tycon val defaultWord: unit -> tycon + val deIntX: tycon -> IntSize.t option + val deRealX: tycon -> RealSize.t + val deWordX: tycon -> WordSize.t val exn: tycon val int: IntSize.t -> tycon val ints: (tycon * IntSize.t) vector Modified: mlton/branches/on-20050822-x86_64-branch/mlton/ast/real-size.fun =================================================================== --- mlton/branches/on-20050822-x86_64-branch/mlton/ast/real-size.fun 2006-05-17 21:18:10 UTC (rev 4549) +++ mlton/branches/on-20050822-x86_64-branch/mlton/ast/real-size.fun 2006-05-19 22:04:19 UTC (rev 4550) @@ -14,8 +14,6 @@ val all = [R32, R64] -val default = R64 - val compare = fn (R32, R32) => EQUAL | (R32, _) => LESS Modified: mlton/branches/on-20050822-x86_64-branch/mlton/ast/real-size.sig =================================================================== --- mlton/branches/on-20050822-x86_64-branch/mlton/ast/real-size.sig 2006-05-17 21:18:10 UTC (rev 4549) +++ mlton/branches/on-20050822-x86_64-branch/mlton/ast/real-size.sig 2006-05-19 22:04:19 UTC (rev 4550) @@ -19,7 +19,6 @@ val bits: t -> Bits.t val bytes: t -> Bytes.t val compare: t * t -> Relation.t - val default: t val equals: t * t -> bool val layout: t -> Layout.t val memoize: (t -> 'a) -> t -> 'a Modified: mlton/branches/on-20050822-x86_64-branch/mlton/ast/word-size.fun =================================================================== --- mlton/branches/on-20050822-x86_64-branch/mlton/ast/word-size.fun 2006-05-17 21:18:10 UTC (rev 4549) +++ mlton/branches/on-20050822-x86_64-branch/mlton/ast/word-size.fun 2006-05-19 22:04:19 UTC (rev 4550) @@ -34,6 +34,8 @@ val byte = fromBits (Bits.fromInt 8) +val bool = fromBits (Bits.fromInt 32) + val allVector = Vector.tabulate (65, fn i => if isValidSize i then SOME (fromBits (Bits.fromInt i)) Modified: mlton/branches/on-20050822-x86_64-branch/mlton/ast/word-size.sig =================================================================== --- mlton/branches/on-20050822-x86_64-branch/mlton/ast/word-size.sig 2006-05-17 21:18:10 UTC (rev 4549) +++ mlton/branches/on-20050822-x86_64-branch/mlton/ast/word-size.sig 2006-05-19 22:04:19 UTC (rev 4550) @@ -20,6 +20,7 @@ val + : t * t -> t val all: t list val bits: t -> Bits.t + val bool: t val bytes: t -> Bytes.t val byte: t val cardinality: t -> IntInf.t Modified: mlton/branches/on-20050822-x86_64-branch/mlton/atoms/const-type.fun =================================================================== --- mlton/branches/on-20050822-x86_64-branch/mlton/atoms/const-type.fun 2006-05-17 21:18:10 UTC (rev 4549) +++ mlton/branches/on-20050822-x86_64-branch/mlton/atoms/const-type.fun 2006-05-19 22:04:19 UTC (rev 4550) @@ -11,12 +11,12 @@ open S -datatype t = Bool | Real | String | Word +datatype t = Bool | Real of RealSize.t | String | Word of WordSize.t val toString = fn Bool => "Bool" - | Real => "Real" + | Real rs => "Real" ^ (RealSize.toString rs) | String => "String" - | Word => "Word" + | Word ws => "Word" ^ (WordSize.toString ws) end Modified: mlton/branches/on-20050822-x86_64-branch/mlton/atoms/const-type.sig =================================================================== --- mlton/branches/on-20050822-x86_64-branch/mlton/atoms/const-type.sig 2006-05-17 21:18:10 UTC (rev 4549) +++ mlton/branches/on-20050822-x86_64-branch/mlton/atoms/const-type.sig 2006-05-19 22:04:19 UTC (rev 4550) @@ -8,13 +8,15 @@ signature CONST_TYPE_STRUCTS = sig + structure RealSize: REAL_SIZE + structure WordSize: WORD_SIZE end signature CONST_TYPE = sig include CONST_TYPE_STRUCTS - datatype t = Bool | Real | String | Word + datatype t = Bool | Real of RealSize.t | String | Word of WordSize.t val toString: t -> string end Modified: mlton/branches/on-20050822-x86_64-branch/mlton/atoms/const.fun =================================================================== --- mlton/branches/on-20050822-x86_64-branch/mlton/atoms/const.fun 2006-05-17 21:18:10 UTC (rev 4549) +++ mlton/branches/on-20050822-x86_64-branch/mlton/atoms/const.fun 2006-05-19 22:04:19 UTC (rev 4550) @@ -11,7 +11,10 @@ open S -structure ConstType = ConstType () +structure ConstType = ConstType (struct + structure RealSize = RealX.RealSize + structure WordSize = WordX.WordSize + end) structure SmallIntInf = struct Modified: mlton/branches/on-20050822-x86_64-branch/mlton/atoms/const.sig =================================================================== --- mlton/branches/on-20050822-x86_64-branch/mlton/atoms/const.sig 2006-05-17 21:18:10 UTC (rev 4549) +++ mlton/branches/on-20050822-x86_64-branch/mlton/atoms/const.sig 2006-05-19 22:04:19 UTC (rev 4550) @@ -20,6 +20,8 @@ include CONST_STRUCTS structure ConstType: CONST_TYPE + sharing ConstType.RealSize = RealX.RealSize + sharing ConstType.WordSize = WordX.WordSize structure SmallIntInf: sig Modified: mlton/branches/on-20050822-x86_64-branch/mlton/atoms/type-ops.fun =================================================================== --- mlton/branches/on-20050822-x86_64-branch/mlton/atoms/type-ops.fun 2006-05-17 21:18:10 UTC (rev 4549) +++ mlton/branches/on-20050822-x86_64-branch/mlton/atoms/type-ops.fun 2006-05-19 22:04:19 UTC (rev 4550) @@ -33,7 +33,6 @@ val word = WordSize.memoize (fn s => nullary (Tycon.word s)) end -val defaultReal = real RealSize.default val defaultWord = word WordSize.default local Modified: mlton/branches/on-20050822-x86_64-branch/mlton/atoms/type-ops.sig =================================================================== --- mlton/branches/on-20050822-x86_64-branch/mlton/atoms/type-ops.sig 2006-05-17 21:18:10 UTC (rev 4549) +++ mlton/branches/on-20050822-x86_64-branch/mlton/atoms/type-ops.sig 2006-05-19 22:04:19 UTC (rev 4550) @@ -50,7 +50,6 @@ val deVector: t -> t val deWeak: t -> t val deWeakOpt: t -> t option - val defaultReal: t val defaultWord: t val exn: t val intInf: t Modified: mlton/branches/on-20050822-x86_64-branch/mlton/elaborate/elaborate-core.fun =================================================================== --- mlton/branches/on-20050822-x86_64-branch/mlton/elaborate/elaborate-core.fun 2006-05-17 21:18:10 UTC (rev 4549) +++ mlton/branches/on-20050822-x86_64-branch/mlton/elaborate/elaborate-core.fun 2006-05-19 22:04:19 UTC (rev 4550) @@ -2616,11 +2616,15 @@ if Tycon.equals (c, Tycon.bool) then ConstType.Bool else if Tycon.isIntX c - then ConstType.Word + then case Tycon.deIntX c of + NONE => bug () + | SOME is => + ConstType.Word + (WordSize.fromBits (IntSize.bits is)) else if Tycon.isRealX c - then ConstType.Real + then ConstType.Real (Tycon.deRealX c) else if Tycon.isWordX c - then ConstType.Word + then ConstType.Word (Tycon.deWordX c) else if Tycon.equals (c, Tycon.vector) andalso 1 = Vector.length ts andalso @@ -2628,7 +2632,8 @@ (Vector.sub (ts, 0))) of NONE => false | SOME (c, _) => - Tycon.isCharX c) + Tycon.isCharX c + andalso (Tycon.deCharX c = CharSize.C8)) then ConstType.String else bug () val finish = Modified: mlton/branches/on-20050822-x86_64-branch/mlton/elaborate/type-env.fun =================================================================== --- mlton/branches/on-20050822-x86_64-branch/mlton/elaborate/type-env.fun 2006-05-17 21:18:10 UTC (rev 4549) +++ mlton/branches/on-20050822-x86_64-branch/mlton/elaborate/type-env.fun 2006-05-19 22:04:19 UTC (rev 4550) @@ -771,7 +771,7 @@ open Ops Type fun char s = con (Tycon.char s, Vector.new0 ()) - val string = con (Tycon.vector, Vector.new1 (char CharSize.C1)) + val string = con (Tycon.vector, Vector.new1 (char CharSize.C8)) val unit = tuple (Vector.new0 ()) Modified: mlton/branches/on-20050822-x86_64-branch/mlton/main/compile.fun =================================================================== --- mlton/branches/on-20050822-x86_64-branch/mlton/main/compile.fun 2006-05-17 21:18:10 UTC (rev 4549) +++ mlton/branches/on-20050822-x86_64-branch/mlton/main/compile.fun 2006-05-19 22:04:19 UTC (rev 4550) @@ -445,7 +445,7 @@ let fun get (name: string): Bytes.t = case lookupConstant ({default = NONE, name = name}, - ConstType.Word) of + ConstType.Word WordSize.default) of Const.Word w => Bytes.fromInt (WordX.toInt w) | _ => Error.bug "Compile.elaborate: GC_state offset must be an int" in Modified: mlton/branches/on-20050822-x86_64-branch/mlton/main/lookup-constant.fun =================================================================== --- mlton/branches/on-20050822-x86_64-branch/mlton/main/lookup-constant.fun 2006-05-17 21:18:10 UTC (rev 4549) +++ mlton/branches/on-20050822-x86_64-branch/mlton/main/lookup-constant.fun 2006-05-19 22:04:19 UTC (rev 4550) @@ -16,7 +16,6 @@ structure RealX = RealX structure WordX = WordX end -structure RealSize = RealX.RealSize structure WordSize = WordX.WordSize val buildConstants: (string * (unit -> string)) list = @@ -61,7 +60,7 @@ List.map (gcFields, fn s => {name = s, value = concat ["offsetof (struct GC_state, ", s, ")"], - ty = ConstType.Word}) + ty = ConstType.Word WordSize.default}) fun build (constants, out) = let @@ -85,9 +84,15 @@ val (format, value) = case ty of Bool => ("%s", concat [value, "? \"true\" : \"false\""]) - | Real => ("%.20f", value) + | Real _ => ("%.20f", value) | String => ("%s", value) - | Word => ("%u", value) + | Word ws => + (case WordSize.prim (WordSize.roundUpToPrim ws) of + WordSize.W8 => "%\"PRIu8\"" + | WordSize.W16 => "%\"PRIu16\"" + | WordSize.W32 => "%\"PRIu32\"" + | WordSize.W64 => "%\"PRIu64\"", + value) in concat ["fprintf (stdout, \"", name, " = ", format, "\\n\", ", value, ");"] @@ -158,19 +163,16 @@ Bool => (case Bool.fromString value of NONE => error "bool" - | SOME b => - Const.Word (WordX.fromIntInf - (if b then 1 else 0, WordSize.default))) - | Real => - (case RealX.make (value, RealSize.default) of + | SOME b => Const.Word (WordX.fromIntInf (if b then 1 else 0, WordSize.bool))) + | Real rs => + (case RealX.make (value, rs) of NONE => error "real" | SOME r => Const.Real r) | String => Const.string value - | Word => + | Word ws => (case IntInf.fromString value of - NONE => error "int" - | SOME i => - Const.Word (WordX.fromIntInf (i, WordSize.default))) + NONE => error "word" + | SOME i => Const.Word (WordX.fromIntInf (i, ws))) end in lookupConstant |