# HG changeset patch # User Adam Chlipala # Date 1280247128 14400 # Node ID 60e19545841be1a3cc041f6a9f7ccf81381c166f # Parent 3d06e0f7a6f33f0872e15f729666e87a3ecaf383 equalAny policies diff -r 3d06e0f7a6f3 -r 60e19545841b lib/ur/basis.urs --- a/lib/ur/basis.urs Tue Jul 27 11:42:30 2010 -0400 +++ b/lib/ur/basis.urs Tue Jul 27 12:12:08 2010 -0400 @@ -819,6 +819,8 @@ => sql_query [] ([Old = fs, New = fs] ++ tables) [] -> sql_policy +val equalAny : nm :: Name -> t ::: Type -> fs ::: {Type} -> ks ::: {{Unit}} + -> [[nm] ~ fs] => sql_table ([nm = t] ++ fs) ks -> sql_policy val equalKnown : nm :: Name -> t ::: Type -> fs ::: {Type} -> ks ::: {{Unit}} -> [[nm] ~ fs] => sql_table ([nm = t] ++ fs) ks -> sql_policy diff -r 3d06e0f7a6f3 -r 60e19545841b src/iflow.sml --- a/src/iflow.sml Tue Jul 27 11:42:30 2010 -0400 +++ b/src/iflow.sml Tue Jul 27 12:12:08 2010 -0400 @@ -1228,7 +1228,7 @@ val allowSend : atom list * exp list -> unit val send : check -> unit - val allowEqualKnown : { table : string, field : string } -> unit + val allowEqual : { table : string, field : string, known : bool } -> unit val mayTest : prop -> bool val allowInsert : atom list -> unit @@ -1509,8 +1509,8 @@ fun allowDelete v = deletable := v :: !deletable val delete = doable deletable -val testable = ref ([] : { table : string, field : string } list) -fun allowEqualKnown v = testable := v :: !testable +val testable = ref ([] : { table : string, field : string, known : bool } list) +fun allowEqual v = testable := v :: !testable fun mayTest p = case p of Reln (Eq, [e1, e2]) => @@ -1523,14 +1523,14 @@ fun allowed (tab, v) = case tab of Proj (Var tab, fd) => - List.exists (fn {table = tab', field = fd'} => + List.exists (fn {table = tab', field = fd', known} => fd' = fd - andalso tableInHyps (tab', tab)) (!testable) - andalso Cc.check (db, AReln (Known, [v])) + andalso tableInHyps (tab', tab) + andalso (not known orelse Cc.check (db, AReln (Known, [v])))) (!testable) | _ => false in if allowed (e1, e2) orelse allowed (e2, e1) then - (Cc.assert (db, AReln (Eq, [e1, e2])); + (assert [AReln (Eq, [e1, e2])]; true) else false @@ -2527,10 +2527,11 @@ St.allowSend ([p], outs) end | _ => ()) - | PolEqualKnown {table = tab, field = nm} => + | PolEqual {table = tab, field = nm, known} => (case #1 tab of - EPrim (Prim.String tab) => St.allowEqualKnown {table = String.extract (tab, 3, NONE), - field = nm} + EPrim (Prim.String tab) => St.allowEqual {table = String.extract (tab, 3, NONE), + field = nm, + known = known} | _ => ErrorMsg.errorAt loc "Table for 'equalKnown' policy isn't fully resolved.") end diff -r 3d06e0f7a6f3 -r 60e19545841b src/mono.sml --- a/src/mono.sml Tue Jul 27 11:42:30 2010 -0400 +++ b/src/mono.sml Tue Jul 27 12:12:08 2010 -0400 @@ -129,7 +129,7 @@ | PolDelete of exp | PolUpdate of exp | PolSequence of exp - | PolEqualKnown of {table : exp, field : string} + | PolEqual of {table : exp, field : string, known : bool} datatype decl' = DDatatype of (string * int * (string * int * typ option) list) list diff -r 3d06e0f7a6f3 -r 60e19545841b src/mono_print.sml --- a/src/mono_print.sml Tue Jul 27 11:42:30 2010 -0400 +++ b/src/mono_print.sml Tue Jul 27 12:12:08 2010 -0400 @@ -429,11 +429,13 @@ | PolSequence e => box [string "sendOwnIds", space, p_exp env e] - | PolEqualKnown {table = tab, field = nm} => box [string "equalKnown[", - string nm, - string "]", - space, - p_exp env tab] + | PolEqual {table = tab, field = nm, known} => box [string "equal", + string (if known then "Known" else "Any"), + string "[", + string nm, + string "]", + space, + p_exp env tab] fun p_decl env (dAll as (d, _) : decl) = case d of diff -r 3d06e0f7a6f3 -r 60e19545841b src/mono_shake.sml --- a/src/mono_shake.sml Tue Jul 27 11:42:30 2010 -0400 +++ b/src/mono_shake.sml Tue Jul 27 12:12:08 2010 -0400 @@ -67,7 +67,7 @@ | PolDelete e1 => e1 | PolUpdate e1 => e1 | PolSequence e1 => e1 - | PolEqualKnown {table = e1, ...} => e1 + | PolEqual {table = e1, ...} => e1 in usedVars st e1 end diff -r 3d06e0f7a6f3 -r 60e19545841b src/mono_util.sml --- a/src/mono_util.sml Tue Jul 27 11:42:30 2010 -0400 +++ b/src/mono_util.sml Tue Jul 27 12:12:08 2010 -0400 @@ -556,9 +556,9 @@ | PolSequence e => S.map2 (mfe ctx e, PolSequence) - | PolEqualKnown {table = tab, field = nm} => + | PolEqual {table = tab, field = nm, known = b} => S.map2 (mfe ctx tab, - fn tab => PolEqualKnown {table = tab, field = nm}) + fn tab => PolEqual {table = tab, field = nm, known = b}) and mfvi ctx (x, n, t, e, s) = S.bind2 (mft t, diff -r 3d06e0f7a6f3 -r 60e19545841b src/monoize.sml --- a/src/monoize.sml Tue Jul 27 11:42:30 2010 -0400 +++ b/src/monoize.sml Tue Jul 27 12:12:08 2010 -0400 @@ -3811,7 +3811,16 @@ ((L.EFfi ("Basis", "equalKnown"), _), nm), _), _), _), _), _), _), _), tab) => (case #1 nm of - L.CName nm => (tab, fn tab => L'.PolEqualKnown {table = tab, field = nm}) + L.CName nm => (tab, fn tab => L'.PolEqual {table = tab, field = nm, known = true}) + | _ => (poly (); (e, L'.PolClient))) + | L.EApp ((L.ECApp + ((L.ECApp + ((L.ECApp + ((L.ECApp + ((L.EFfi ("Basis", "equalAny"), _), nm), _), _), _), + _), _), _), _), tab) => + (case #1 nm of + L.CName nm => (tab, fn tab => L'.PolEqual {table = tab, field = nm, known = false}) | _ => (poly (); (e, L'.PolClient))) | _ => (poly (); (e, L'.PolClient))