let rec sv_of_variant = function
  | Variant.Null -> sv_undef ()
  | Variant.String s -> sv_of_string s
  | Variant.Int i -> sv_of_int i
  | Variant.Float f -> sv_of_float f
  | Variant.Bool b -> sv_of_bool b
  | Variant.Array xs -> arrayref (av_of_sv_list (List.map sv_of_variant xs))
  | Variant.Hash xs -> hashref
      (let hv = hv_empty () in
         List.iter (fun (k, v) -> hv_set hv k (sv_of_variant v)) xs;
         hv
      )