why3doc index index


module Zrealloc2

use int.Int
use int.Power
use int.EuclideanDivision
use map.Map
use mach.int.Int32GMP
use mach.c.C
use lemmas.Lemmas
use util.Util
use compare.Compare
use mach.int.UInt64GMP
use int.Abs
use mpz.Z
use mpz.Zutil

function alloc_of_bits (bits: int) : int
= if bits <= 0 then 1 else div (bits + 63) 64

let partial wmpz_realloc2 (x:mpz_ptr) (bits:uint64) : unit
  requires { mpz.readers[x] = 0 }
  requires { div (bits - 1) 64 < max_int32 }
  requires { 1 <= mpz.alloc[x] }
  ensures  { forall y. y <> x -> mpz_unchanged y mpz (old mpz) }
  ensures  { mpz.readers[x] = 0 }
  ensures  { mpz.alloc[x] = alloc_of_bits bits }
  ensures  { if alloc_of_bits bits >= old mpz.abs_size[x]
             then mpz.abs_size[x] = old mpz.abs_size[x]
                  /\ mpz.abs_value_of[x] = old mpz.abs_value_of[x]
             else mpz.abs_size[x] = 0 }
=
  let ghost obits = bits in
  let bits = bits - (if bits <> 0 then 1 else 0) in
  let new_alloc = UInt64GMP.to_int32 (1 + (bits / 64)) in
  assert { new_alloc = alloc_of_bits obits };
  let p = get_write_ptr x in
  assert { forall y. y <> x -> mpz_unchanged y mpz (old mpz) };
  let ghost op = { p } in
  let ghost os = abs_size_of x in
  let q = realloc p new_alloc in
  c_assert (is_not_null q);
  if Int32.(>) (abs_size_of x) new_alloc
  then begin
    set_size_0 x; (* data has shrunk, reset x to 0 *)
  end
  else begin
    value_sub_frame (pelts q) (pelts op) 0 (p2i os);
  end;
  set_alloc x new_alloc;
  set_ptr x q;
  release_writer x q

end

Generated by why3doc 1.7.0