diff -Naur ocaml-3.09.2/bytecomp/byteretyper.ml ocaml-3.09.2-retype/bytecomp/byteretyper.ml --- ocaml-3.09.2/bytecomp/byteretyper.ml 1970-01-01 02:00:00.000000000 +0200 +++ ocaml-3.09.2-retype/bytecomp/byteretyper.ml 2006-07-13 00:35:44.000000000 +0300 @@ -0,0 +1,182 @@ +open Misc +open Instruct +open Emitcode + +type error = + No_file_given + | Too_many_files + | File_not_found of string + | Not_an_object_file of string + | Illegal_renaming of string * string + | Forward_reference of string * Ident.t + +exception Error of error + +let events = ref ([] : debug_event list) +let primitives = ref ([] : string list) +let force_link = ref false +let relocs = ref ([] : (reloc_info * int) list) + +type member = + { pm_file: string; + pm_name: string; + pm_cu: compilation_unit } + +(* Record a debugging event *) + +let accumulate_debug ev = + events := ev :: !events + +let build_global_target oc input_name target_name member coercion pos acc_id = + let component = Some acc_id in + let lam = + Translmod.transl_retyping component (Ident.create_persistent target_name) + coercion in + let instrs = Bytegen.compile_implementation target_name lam in + let rel = Emitcode.to_packed_file oc instrs in + relocs := List.map (fun (r, ofs) -> (r, pos + ofs)) rel @ !relocs + +(* Read the bytecode from a .cmo file. + Write bytecode to channel [oc]. + Accumulate relocs, debug info, etc. + Return size of bytecode. *) + +let append_bytecode targetname oc objfile compunit = + let ic = open_in_bin objfile in + try + Bytelink.check_consistency objfile compunit; + primitives := compunit.cu_primitives @ !primitives; + if compunit.cu_force_link then force_link := true; + seek_in ic compunit.cu_pos; + Misc.copy_file_chunk ic oc compunit.cu_codesize; + if !Clflags.debug && compunit.cu_debug > 0 then begin + seek_in ic compunit.cu_debug; + List.iter accumulate_debug (input_value ic); + end; + close_in ic; + compunit.cu_codesize + with x -> close_in ic; raise x + +let read_member_info file = + let name = + String.capitalize(Filename.basename(chop_extension_if_any file)) in + let kind = + if Filename.check_suffix file ".cmo" then begin + let ic = open_in_bin file in + try + let buffer = String.create (String.length Config.cmo_magic_number) in + really_input ic buffer 0 (String.length Config.cmo_magic_number); + if buffer <> Config.cmo_magic_number then + raise(Error(Not_an_object_file file)); + let compunit_pos = input_binary_int ic in + seek_in ic compunit_pos; + let compunit = (input_value ic : compilation_unit) in + if compunit.cu_name <> name then + raise(Error(Illegal_renaming(file, compunit.cu_name))); + close_in ic; + compunit + with x -> + close_in ic; + raise x + end else + raise(Error(Not_an_object_file file)) in + { pm_file = file; pm_name = name; pm_cu = kind } + +let artif_id id = + String.contains (Ident.name id) '.' + +let rename_relocations inputname relocs acc_id= + List.map (fun(rinfo, n) -> let rinfo = + match rinfo with + Reloc_setglobal id -> + if id = Ident.create_persistent inputname then + Reloc_setglobal acc_id + else if artif_id id then + Reloc_setglobal (Ident.create_persistent (inputname ^ "." ^ (Ident.name id))) + else + rinfo + | Reloc_getglobal id -> + if id = Ident.create_persistent inputname then + Reloc_getglobal acc_id + else if artif_id id then + Reloc_getglobal (Ident.create_persistent (inputname ^ "." ^ (Ident.name id))) + else + rinfo + | _ -> rinfo in + (rinfo, n)) relocs + +let retype_object_file file targetfile targetname coercion = + let member = read_member_info file in + let oc = open_out_bin targetfile in + try + output_string oc Config.cmo_magic_number; + let pos_depl = pos_out oc in + output_binary_int oc 0; + let pos_code = pos_out oc in + let ofs = append_bytecode targetname oc member.pm_file member.pm_cu in + let input_name = String.capitalize(Filename.basename(chop_extension_if_any file)) in + let acc_id = Ident.create_persistent "module." in + build_global_target oc input_name targetname member coercion ofs acc_id; + let pos_debug = pos_out oc in + if !Clflags.debug && !events <> [] then begin + output_value oc (List.rev !events); + end; + let pos_final = pos_out oc in + let imports = List.map + (fun (name, crc) -> if (name <> input_name) then (name, crc) + else (targetname, Env.crc_of_unit targetname)) + member.pm_cu.cu_imports in + let relocs = (rename_relocations input_name member.pm_cu.cu_reloc acc_id) @ !relocs in + let compunit = + { cu_name = targetname; + cu_pos = pos_code; + cu_codesize = pos_debug - pos_code; + cu_reloc = relocs; + cu_imports = imports; + cu_primitives = !primitives; + cu_force_link = !force_link; + cu_debug = if pos_final > pos_debug then pos_debug else 0; + cu_debugsize = pos_final - pos_debug } in + output_value oc compunit; + seek_out oc pos_depl; + output_binary_int oc pos_final; + close_out oc + with x -> + close_out oc; + raise x + +let retype_file file targetfile = + let file = try find_in_path !Config.load_path file + with Not_found -> raise(Error(File_not_found file)) in + let prefix = chop_extension_if_any targetfile in + let targetcmi = prefix ^ ".cmi" in + let targetname = String.capitalize(Filename.basename prefix) in + try + let coercion = Typemod.retype_unit file targetcmi targetname in + retype_object_file file targetfile targetname coercion + with x -> + remove_file targetfile; raise x + +let retype_files filelist targetfile = + match filelist with + [] -> raise(Error(No_file_given)) + | [file] -> retype_file file targetfile + | _ -> raise(Error(Too_many_files)) + +open Format + +let report_error ppf = function + No_file_given -> + fprintf ppf "%s" "No input file given" + | Too_many_files -> + fprintf ppf "%s" "Cannot retype more than one file a time" + | File_not_found file -> + fprintf ppf "File %s not found" file + | Not_an_object_file typ -> + fprintf ppf "%s is not an object type" typ + | Illegal_renaming (name1, name2) -> + fprintf ppf "illegal renaming: %s" (name1 ^ " -> " ^ name2) + | Forward_reference(file, ident) -> + fprintf ppf "Forward reference to %s in file %s" (Ident.name ident) file + + diff -Naur ocaml-3.09.2/bytecomp/byteretyper.mli ocaml-3.09.2-retype/bytecomp/byteretyper.mli --- ocaml-3.09.2/bytecomp/byteretyper.mli 1970-01-01 02:00:00.000000000 +0200 +++ ocaml-3.09.2-retype/bytecomp/byteretyper.mli 2006-07-06 21:34:06.000000000 +0300 @@ -0,0 +1,13 @@ +val retype_files : string list -> string -> unit + +type error = + No_file_given + | Too_many_files + | File_not_found of string + | Not_an_object_file of string + | Illegal_renaming of string * string + | Forward_reference of string * Ident.t + +exception Error of error + +val report_error: Format.formatter -> error -> unit diff -Naur ocaml-3.09.2/bytecomp/translmod.ml ocaml-3.09.2-retype/bytecomp/translmod.ml --- ocaml-3.09.2/bytecomp/translmod.ml 2004-08-12 15:55:11.000000000 +0300 +++ ocaml-3.09.2-retype/bytecomp/translmod.ml 2006-07-06 22:45:45.000000000 +0300 @@ -651,6 +651,10 @@ assert false in Lprim(Psetglobal target_name, [Lprim(Pmakeblock(0, Immutable), components)]) +let transl_retyping component_name target_name coercion = + let component = apply_coercion coercion (get_component component_name) in + Lprim(Psetglobal target_name, [component]) + let transl_store_package component_names target_name coercion = let rec make_sequence fn pos arg = match arg with diff -Naur ocaml-3.09.2/bytecomp/translmod.mli ocaml-3.09.2-retype/bytecomp/translmod.mli --- ocaml-3.09.2/bytecomp/translmod.mli 2004-04-09 16:32:27.000000000 +0300 +++ ocaml-3.09.2-retype/bytecomp/translmod.mli 2006-07-06 21:34:37.000000000 +0300 @@ -24,6 +24,8 @@ val transl_toplevel_definition: structure -> lambda val transl_package: Ident.t option list -> Ident.t -> module_coercion -> lambda +val transl_retyping: + Ident.t option -> Ident.t -> module_coercion -> lambda val transl_store_package: Ident.t option list -> Ident.t -> module_coercion -> int * lambda diff -Naur ocaml-3.09.2/.depend ocaml-3.09.2-retype/.depend --- ocaml-3.09.2/.depend 2006-01-24 15:39:53.000000000 +0200 +++ ocaml-3.09.2-retype/.depend 2006-07-19 17:52:43.000000000 +0300 @@ -264,6 +264,7 @@ bytecomp/bytegen.cmi: bytecomp/lambda.cmi bytecomp/instruct.cmi bytecomp/bytelink.cmi: bytecomp/symtable.cmi bytecomp/emitcode.cmi bytecomp/bytepackager.cmi: typing/ident.cmi +bytecomp/byteretyper.cmi: typing/ident.cmi bytecomp/emitcode.cmi: bytecomp/lambda.cmi bytecomp/instruct.cmi \ typing/ident.cmi bytecomp/instruct.cmi: typing/types.cmi parsing/location.cmi \ @@ -318,6 +319,14 @@ utils/misc.cmx bytecomp/instruct.cmx typing/ident.cmx typing/env.cmx \ bytecomp/emitcode.cmx utils/config.cmx utils/clflags.cmx \ bytecomp/bytelink.cmx bytecomp/bytegen.cmx bytecomp/bytepackager.cmi +bytecomp/byteretyper.cmo: typing/typemod.cmi bytecomp/translmod.cmi \ + utils/misc.cmi bytecomp/instruct.cmi typing/ident.cmi typing/env.cmi \ + bytecomp/emitcode.cmi utils/config.cmi utils/clflags.cmi \ + bytecomp/bytelink.cmi bytecomp/bytegen.cmi bytecomp/byteretyper.cmi +bytecomp/byteretyper.cmx: typing/typemod.cmx bytecomp/translmod.cmx \ + utils/misc.cmx bytecomp/instruct.cmx typing/ident.cmx typing/env.cmx \ + bytecomp/emitcode.cmx utils/config.cmx utils/clflags.cmx \ + bytecomp/bytelink.cmx bytecomp/bytegen.cmx bytecomp/byteretyper.cmi bytecomp/bytesections.cmo: utils/config.cmi bytecomp/bytesections.cmi bytecomp/bytesections.cmx: utils/config.cmx bytecomp/bytesections.cmi bytecomp/dll.cmo: utils/misc.cmi utils/config.cmi bytecomp/dll.cmi @@ -439,8 +448,8 @@ asmcomp/clambda.cmi: bytecomp/lambda.cmi typing/ident.cmi \ parsing/asttypes.cmi asmcomp/closure.cmi: bytecomp/lambda.cmi asmcomp/clambda.cmi -asmcomp/cmm.cmi: typing/ident.cmi asmcomp/cmmgen.cmi: asmcomp/cmm.cmi asmcomp/clambda.cmi +asmcomp/cmm.cmi: typing/ident.cmi asmcomp/codegen.cmi: asmcomp/cmm.cmi asmcomp/comballoc.cmi: asmcomp/mach.cmi asmcomp/compilenv.cmi: typing/ident.cmi asmcomp/clambda.cmi @@ -454,8 +463,8 @@ asmcomp/printmach.cmi: asmcomp/reg.cmi asmcomp/mach.cmi asmcomp/proc.cmi: asmcomp/reg.cmi asmcomp/mach.cmi asmcomp/reg.cmi: asmcomp/cmm.cmi -asmcomp/reload.cmi: asmcomp/mach.cmi asmcomp/reloadgen.cmi: asmcomp/reg.cmi asmcomp/mach.cmi +asmcomp/reload.cmi: asmcomp/mach.cmi asmcomp/schedgen.cmi: asmcomp/mach.cmi asmcomp/linearize.cmi asmcomp/scheduling.cmi: asmcomp/linearize.cmi asmcomp/selectgen.cmi: utils/tbl.cmi asmcomp/reg.cmi asmcomp/mach.cmi \ @@ -463,8 +472,8 @@ asmcomp/selection.cmi: asmcomp/mach.cmi asmcomp/cmm.cmi asmcomp/spill.cmi: asmcomp/mach.cmi asmcomp/split.cmi: asmcomp/mach.cmi -asmcomp/arch.cmo: utils/misc.cmi -asmcomp/arch.cmx: utils/misc.cmx +asmcomp/arch.cmo: utils/misc.cmi utils/config.cmi +asmcomp/arch.cmx: utils/misc.cmx utils/config.cmx asmcomp/asmgen.cmo: asmcomp/split.cmi asmcomp/spill.cmi asmcomp/selection.cmi \ asmcomp/scheduling.cmi asmcomp/reload.cmi asmcomp/reg.cmi \ asmcomp/proc.cmi asmcomp/printmach.cmi asmcomp/printlinear.cmi \ @@ -519,8 +528,6 @@ utils/misc.cmx bytecomp/lambda.cmx typing/ident.cmx asmcomp/compilenv.cmx \ utils/clflags.cmx asmcomp/clambda.cmx parsing/asttypes.cmi \ asmcomp/closure.cmi -asmcomp/cmm.cmo: typing/ident.cmi asmcomp/arch.cmo asmcomp/cmm.cmi -asmcomp/cmm.cmx: typing/ident.cmx asmcomp/arch.cmx asmcomp/cmm.cmi asmcomp/cmmgen.cmo: typing/types.cmi bytecomp/switch.cmi asmcomp/proc.cmi \ typing/primitive.cmi utils/misc.cmi bytecomp/lambda.cmi typing/ident.cmi \ utils/config.cmi asmcomp/compilenv.cmi asmcomp/cmm.cmi utils/clflags.cmi \ @@ -531,6 +538,8 @@ utils/config.cmx asmcomp/compilenv.cmx asmcomp/cmm.cmx utils/clflags.cmx \ asmcomp/clambda.cmx parsing/asttypes.cmi asmcomp/arch.cmx \ asmcomp/cmmgen.cmi +asmcomp/cmm.cmo: typing/ident.cmi asmcomp/arch.cmo asmcomp/cmm.cmi +asmcomp/cmm.cmx: typing/ident.cmx asmcomp/arch.cmx asmcomp/cmm.cmi asmcomp/codegen.cmo: asmcomp/split.cmi asmcomp/spill.cmi asmcomp/reload.cmi \ asmcomp/reg.cmi asmcomp/printmach.cmi asmcomp/printlinear.cmi \ asmcomp/printcmm.cmi asmcomp/liveness.cmi asmcomp/linearize.cmi \ @@ -551,16 +560,16 @@ utils/config.cmi asmcomp/clambda.cmi asmcomp/compilenv.cmi asmcomp/compilenv.cmx: utils/misc.cmx typing/ident.cmx typing/env.cmx \ utils/config.cmx asmcomp/clambda.cmx asmcomp/compilenv.cmi +asmcomp/emitaux.cmo: asmcomp/emitaux.cmi +asmcomp/emitaux.cmx: asmcomp/emitaux.cmi asmcomp/emit.cmo: asmcomp/reg.cmi asmcomp/proc.cmi utils/misc.cmi \ asmcomp/mach.cmi parsing/location.cmi asmcomp/linearize.cmi \ asmcomp/emitaux.cmi utils/config.cmi asmcomp/compilenv.cmi \ - asmcomp/cmm.cmi asmcomp/arch.cmo asmcomp/emit.cmi + asmcomp/cmm.cmi utils/clflags.cmi asmcomp/arch.cmo asmcomp/emit.cmi asmcomp/emit.cmx: asmcomp/reg.cmx asmcomp/proc.cmx utils/misc.cmx \ asmcomp/mach.cmx parsing/location.cmx asmcomp/linearize.cmx \ asmcomp/emitaux.cmx utils/config.cmx asmcomp/compilenv.cmx \ - asmcomp/cmm.cmx asmcomp/arch.cmx asmcomp/emit.cmi -asmcomp/emitaux.cmo: asmcomp/emitaux.cmi -asmcomp/emitaux.cmx: asmcomp/emitaux.cmi + asmcomp/cmm.cmx utils/clflags.cmx asmcomp/arch.cmx asmcomp/emit.cmi asmcomp/interf.cmo: asmcomp/reg.cmi asmcomp/proc.cmi utils/misc.cmi \ asmcomp/mach.cmi asmcomp/interf.cmi asmcomp/interf.cmx: asmcomp/reg.cmx asmcomp/proc.cmx utils/misc.cmx \ @@ -595,32 +604,34 @@ asmcomp/arch.cmx asmcomp/proc.cmi asmcomp/reg.cmo: asmcomp/cmm.cmi asmcomp/reg.cmi asmcomp/reg.cmx: asmcomp/cmm.cmx asmcomp/reg.cmi -asmcomp/reload.cmo: asmcomp/reloadgen.cmi asmcomp/reload.cmi -asmcomp/reload.cmx: asmcomp/reloadgen.cmx asmcomp/reload.cmi asmcomp/reloadgen.cmo: asmcomp/reg.cmi utils/misc.cmi asmcomp/mach.cmi \ asmcomp/reloadgen.cmi asmcomp/reloadgen.cmx: asmcomp/reg.cmx utils/misc.cmx asmcomp/mach.cmx \ asmcomp/reloadgen.cmi +asmcomp/reload.cmo: asmcomp/reloadgen.cmi asmcomp/reg.cmi asmcomp/mach.cmi \ + asmcomp/cmm.cmi asmcomp/arch.cmo asmcomp/reload.cmi +asmcomp/reload.cmx: asmcomp/reloadgen.cmx asmcomp/reg.cmx asmcomp/mach.cmx \ + asmcomp/cmm.cmx asmcomp/arch.cmx asmcomp/reload.cmi asmcomp/schedgen.cmo: asmcomp/reg.cmi utils/misc.cmi asmcomp/mach.cmi \ asmcomp/linearize.cmi asmcomp/cmm.cmi asmcomp/arch.cmo \ asmcomp/schedgen.cmi asmcomp/schedgen.cmx: asmcomp/reg.cmx utils/misc.cmx asmcomp/mach.cmx \ asmcomp/linearize.cmx asmcomp/cmm.cmx asmcomp/arch.cmx \ asmcomp/schedgen.cmi -asmcomp/scheduling.cmo: asmcomp/schedgen.cmi asmcomp/mach.cmi \ - asmcomp/arch.cmo asmcomp/scheduling.cmi -asmcomp/scheduling.cmx: asmcomp/schedgen.cmx asmcomp/mach.cmx \ - asmcomp/arch.cmx asmcomp/scheduling.cmi +asmcomp/scheduling.cmo: asmcomp/schedgen.cmi asmcomp/scheduling.cmi +asmcomp/scheduling.cmx: asmcomp/schedgen.cmx asmcomp/scheduling.cmi asmcomp/selectgen.cmo: utils/tbl.cmi asmcomp/reg.cmi asmcomp/proc.cmi \ utils/misc.cmi asmcomp/mach.cmi typing/ident.cmi asmcomp/cmm.cmi \ asmcomp/arch.cmo asmcomp/selectgen.cmi asmcomp/selectgen.cmx: utils/tbl.cmx asmcomp/reg.cmx asmcomp/proc.cmx \ utils/misc.cmx asmcomp/mach.cmx typing/ident.cmx asmcomp/cmm.cmx \ asmcomp/arch.cmx asmcomp/selectgen.cmi -asmcomp/selection.cmo: asmcomp/selectgen.cmi asmcomp/reg.cmi utils/misc.cmi \ - asmcomp/mach.cmi asmcomp/cmm.cmi asmcomp/arch.cmo asmcomp/selection.cmi -asmcomp/selection.cmx: asmcomp/selectgen.cmx asmcomp/reg.cmx utils/misc.cmx \ - asmcomp/mach.cmx asmcomp/cmm.cmx asmcomp/arch.cmx asmcomp/selection.cmi +asmcomp/selection.cmo: asmcomp/selectgen.cmi asmcomp/reg.cmi asmcomp/proc.cmi \ + utils/misc.cmi asmcomp/mach.cmi asmcomp/cmm.cmi asmcomp/arch.cmo \ + asmcomp/selection.cmi +asmcomp/selection.cmx: asmcomp/selectgen.cmx asmcomp/reg.cmx asmcomp/proc.cmx \ + utils/misc.cmx asmcomp/mach.cmx asmcomp/cmm.cmx asmcomp/arch.cmx \ + asmcomp/selection.cmi asmcomp/spill.cmo: asmcomp/reg.cmi asmcomp/proc.cmi utils/misc.cmi \ asmcomp/mach.cmi asmcomp/spill.cmi asmcomp/spill.cmx: asmcomp/reg.cmx asmcomp/proc.cmx utils/misc.cmx \ @@ -650,25 +661,27 @@ bytecomp/translmod.cmi bytecomp/translcore.cmi bytecomp/translclass.cmi \ parsing/syntaxerr.cmi bytecomp/symtable.cmi driver/pparse.cmi \ parsing/location.cmi parsing/lexer.cmi typing/includemod.cmi \ - typing/env.cmi typing/ctype.cmi bytecomp/bytepackager.cmi \ - bytecomp/bytelink.cmi bytecomp/bytelibrarian.cmi driver/errors.cmi + typing/env.cmi typing/ctype.cmi bytecomp/byteretyper.cmi \ + bytecomp/bytepackager.cmi bytecomp/bytelink.cmi \ + bytecomp/bytelibrarian.cmi driver/errors.cmi driver/errors.cmx: utils/warnings.cmx typing/typetexp.cmx typing/typemod.cmx \ typing/typedecl.cmx typing/typecore.cmx typing/typeclass.cmx \ bytecomp/translmod.cmx bytecomp/translcore.cmx bytecomp/translclass.cmx \ parsing/syntaxerr.cmx bytecomp/symtable.cmx driver/pparse.cmx \ parsing/location.cmx parsing/lexer.cmx typing/includemod.cmx \ - typing/env.cmx typing/ctype.cmx bytecomp/bytepackager.cmx \ - bytecomp/bytelink.cmx bytecomp/bytelibrarian.cmx driver/errors.cmi + typing/env.cmx typing/ctype.cmx bytecomp/byteretyper.cmx \ + bytecomp/bytepackager.cmx bytecomp/bytelink.cmx \ + bytecomp/bytelibrarian.cmx driver/errors.cmi +driver/main_args.cmo: driver/main_args.cmi +driver/main_args.cmx: driver/main_args.cmi driver/main.cmo: utils/warnings.cmi utils/misc.cmi driver/main_args.cmi \ driver/errors.cmi utils/config.cmi driver/compile.cmi utils/clflags.cmi \ - bytecomp/bytepackager.cmi bytecomp/bytelink.cmi \ + bytecomp/byteretyper.cmi bytecomp/bytepackager.cmi bytecomp/bytelink.cmi \ bytecomp/bytelibrarian.cmi driver/main.cmi driver/main.cmx: utils/warnings.cmx utils/misc.cmx driver/main_args.cmx \ driver/errors.cmx utils/config.cmx driver/compile.cmx utils/clflags.cmx \ - bytecomp/bytepackager.cmx bytecomp/bytelink.cmx \ + bytecomp/byteretyper.cmx bytecomp/bytepackager.cmx bytecomp/bytelink.cmx \ bytecomp/bytelibrarian.cmx driver/main.cmi -driver/main_args.cmo: driver/main_args.cmi -driver/main_args.cmx: driver/main_args.cmi driver/optcompile.cmo: utils/warnings.cmi typing/unused_var.cmi \ typing/typemod.cmi typing/typedtree.cmi bytecomp/translmod.cmi \ bytecomp/simplif.cmi typing/printtyp.cmi bytecomp/printlambda.cmi \ diff -Naur ocaml-3.09.2/driver/errors.ml ocaml-3.09.2-retype/driver/errors.ml --- ocaml-3.09.2/driver/errors.ml 2005-11-09 17:58:47.000000000 +0200 +++ ocaml-3.09.2-retype/driver/errors.ml 2006-07-06 21:35:18.000000000 +0300 @@ -60,6 +60,8 @@ Bytelibrarian.report_error ppf code | Bytepackager.Error code -> Bytepackager.report_error ppf code + | Byteretyper.Error code -> + Byteretyper.report_error ppf code | Sys_error msg -> fprintf ppf "I/O error: %s" msg | Warnings.Errors (n) -> diff -Naur ocaml-3.09.2/driver/main_args.ml ocaml-3.09.2-retype/driver/main_args.ml --- ocaml-3.09.2/driver/main_args.ml 2005-12-28 19:27:03.000000000 +0200 +++ ocaml-3.09.2-retype/driver/main_args.ml 2006-07-19 17:31:48.000000000 +0300 @@ -42,6 +42,7 @@ val _pack : unit -> unit val _pp : string -> unit val _principal : unit -> unit + val _retype : unit -> unit val _rectypes : unit -> unit val _thread : unit -> unit val _vmthread : unit -> unit @@ -114,6 +115,7 @@ "-principal", Arg.Unit F._principal, " Check principality of type inference"; "-rectypes", Arg.Unit F._rectypes, " Allow arbitrary recursive types"; + "-retype", Arg.Unit F._retype, " Retype module to new signature"; "-thread", Arg.Unit F._thread, " Generate code that supports the system threads library"; "-unsafe", Arg.Unit F._unsafe, diff -Naur ocaml-3.09.2/driver/main_args.mli ocaml-3.09.2-retype/driver/main_args.mli --- ocaml-3.09.2/driver/main_args.mli 2005-05-09 16:39:17.000000000 +0300 +++ ocaml-3.09.2-retype/driver/main_args.mli 2006-07-19 17:32:07.000000000 +0300 @@ -43,6 +43,7 @@ val _pp : string -> unit val _principal : unit -> unit val _rectypes : unit -> unit + val _retype : unit -> unit val _thread : unit -> unit val _vmthread : unit -> unit val _unsafe : unit -> unit diff -Naur ocaml-3.09.2/driver/main.ml ocaml-3.09.2-retype/driver/main.ml --- ocaml-3.09.2/driver/main.ml 2005-05-09 16:39:17.000000000 +0300 +++ ocaml-3.09.2-retype/driver/main.ml 2006-07-19 17:33:06.000000000 +0300 @@ -118,6 +118,7 @@ let _pp s = preprocessor := Some s let _principal = set principal let _rectypes = set recursive_types + let _retype = set retype let _thread = set use_threads let _vmthread = set use_vmthreads let _unsafe = set fast @@ -161,6 +162,10 @@ Bytepackager.package_files (List.rev !objfiles) (extract_output !output_name) end + else if !retype then begin + Compile.init_path(); + Byteretyper.retype_files (List.rev !objfiles) (extract_output !output_name) + end else if not !compile_only && !objfiles <> [] then begin Compile.init_path(); Bytelink.link (List.rev !objfiles) (default_output !output_name) diff -Naur ocaml-3.09.2/Makefile ocaml-3.09.2-retype/Makefile --- ocaml-3.09.2/Makefile 2006-02-09 11:17:23.000000000 +0200 +++ ocaml-3.09.2-retype/Makefile 2006-07-19 17:33:43.000000000 +0300 @@ -66,7 +66,8 @@ BYTECOMP=bytecomp/meta.cmo bytecomp/instruct.cmo bytecomp/bytegen.cmo \ bytecomp/printinstr.cmo bytecomp/opcodes.cmo bytecomp/emitcode.cmo \ bytecomp/bytesections.cmo bytecomp/dll.cmo bytecomp/symtable.cmo \ - bytecomp/bytelink.cmo bytecomp/bytelibrarian.cmo bytecomp/bytepackager.cmo + bytecomp/bytelink.cmo bytecomp/bytelibrarian.cmo bytecomp/bytepackager.cmo \ + bytecomp/byteretyper.cmo ASMCOMP=asmcomp/arch.cmo asmcomp/cmm.cmo asmcomp/printcmm.cmo \ asmcomp/reg.cmo asmcomp/mach.cmo asmcomp/proc.cmo \ diff -Naur ocaml-3.09.2/stdlib/sys.ml ocaml-3.09.2-retype/stdlib/sys.ml --- ocaml-3.09.2/stdlib/sys.ml 2006-04-14 12:53:48.000000000 +0300 +++ ocaml-3.09.2-retype/stdlib/sys.ml 2006-07-19 18:08:47.000000000 +0300 @@ -78,4 +78,4 @@ (* OCaml version string, must be in the format described in sys.mli. *) -let ocaml_version = "3.09.2";; +let ocaml_version = "3.09.2+retyping";; diff -Naur ocaml-3.09.2/tools/ocamlcp.ml ocaml-3.09.2-retype/tools/ocamlcp.ml --- ocaml-3.09.2/tools/ocamlcp.ml 2005-05-09 16:39:17.000000000 +0300 +++ ocaml-3.09.2-retype/tools/ocamlcp.ml 2006-07-19 17:34:30.000000000 +0300 @@ -70,6 +70,7 @@ let _pack = option "-pack" let _pp s = incompatible "-pp" let _principal = option "-principal" + let _retype = option "-retype" let _rectypes = option "-rectypes" let _thread () = option "-thread" () let _vmthread () = option "-vmthread" () diff -Naur ocaml-3.09.2/typing/env.ml ocaml-3.09.2-retype/typing/env.ml --- ocaml-3.09.2/typing/env.ml 2005-08-13 23:59:37.000000000 +0300 +++ ocaml-3.09.2-retype/typing/env.ml 2006-07-19 17:50:09.000000000 +0300 @@ -146,7 +146,7 @@ (* Reading persistent structures from .cmi files *) -let read_pers_struct modname filename = +let read_pers_struct modname filename cache = let ic = open_in_bin filename in try let buffer = String.create (String.length cmi_magic_number) in @@ -169,8 +169,10 @@ ps_filename = filename } in if ps.ps_name <> modname then raise(Error(Illegal_renaming(ps.ps_name, filename))); - check_consistency filename ps.ps_crcs; - Hashtbl.add persistent_structures modname ps; + if cache then begin + check_consistency filename ps.ps_crcs; + Hashtbl.add persistent_structures modname ps; + end; ps with End_of_file | Failure _ -> close_in ic; @@ -180,7 +182,7 @@ try Hashtbl.find persistent_structures name with Not_found -> - read_pers_struct name (find_in_path_uncap !load_path (name ^ ".cmi")) + read_pers_struct name (find_in_path_uncap !load_path (name ^ ".cmi")) true let reset_cache () = current_unit := ""; @@ -717,7 +719,10 @@ (* Read a signature from a file *) let read_signature modname filename = - let ps = read_pers_struct modname filename in ps.ps_sig + let ps = read_pers_struct modname filename true in ps.ps_sig + +let read_signature_no_cache modname filename = + let ps = read_pers_struct modname filename false in ps.ps_sig (* Return the CRC of the interface of the given compilation unit *) diff -Naur ocaml-3.09.2/typing/env.mli ocaml-3.09.2-retype/typing/env.mli --- ocaml-3.09.2/typing/env.mli 2005-08-13 23:59:37.000000000 +0300 +++ ocaml-3.09.2-retype/typing/env.mli 2006-07-06 21:38:23.000000000 +0300 @@ -86,6 +86,8 @@ val read_signature: string -> string -> signature (* Arguments: module name, file name. Results: signature. *) +val read_signature_no_cache: string -> string -> signature + (* Arguments: module name, file name. Results: signature. *) val save_signature: signature -> string -> string -> unit (* Arguments: signature, module name, file name. *) val save_signature_with_imports: diff -Naur ocaml-3.09.2/typing/typemod.ml ocaml-3.09.2-retype/typing/typemod.ml --- ocaml-3.09.2/typing/typemod.ml 2005-08-08 12:41:51.000000000 +0300 +++ ocaml-3.09.2-retype/typing/typemod.ml 2006-08-30 22:11:17.000000000 +0300 @@ -859,6 +859,25 @@ Tcoerce_none end +let retype_unit objfile cmifile modulename = + let pref = chop_extension_if_any objfile in + let modname = String.capitalize(Filename.basename pref) in + let sg = Env.read_signature_no_cache modname (pref ^ ".cmi") in + if Filename.check_suffix objfile ".cmi" then + raise(Error(Location.none, Implementation_is_required objfile)); + let mlifile = + chop_extension_if_any cmifile ^ !Config.interface_suffix in + if Sys.file_exists cmifile then begin + let dclsig = Env.read_signature modulename cmifile in + let coercion = Includemod.compunit "(obtained by retyping)" sg mlifile dclsig + in coercion + end else begin + if Sys.file_exists mlifile then begin + raise(Error(Location.in_file mlifile, Interface_not_compiled mlifile)) + end; + raise(Error(Location.none, Signature_expected)) + end + (* Error report *) open Printtyp diff -Naur ocaml-3.09.2/typing/typemod.mli ocaml-3.09.2-retype/typing/typemod.mli --- ocaml-3.09.2/typing/typemod.mli 2005-08-08 12:41:52.000000000 +0300 +++ ocaml-3.09.2-retype/typing/typemod.mli 2006-07-19 17:40:01.000000000 +0300 @@ -34,6 +34,9 @@ val package_units: string list -> string -> string -> Typedtree.module_coercion +val retype_unit: + string -> string -> string -> Typedtree.module_coercion + type error = Unbound_module of Longident.t | Unbound_modtype of Longident.t diff -Naur ocaml-3.09.2/utils/clflags.ml ocaml-3.09.2-retype/utils/clflags.ml --- ocaml-3.09.2/utils/clflags.ml 2005-08-01 18:51:09.000000000 +0300 +++ ocaml-3.09.2-retype/utils/clflags.ml 2006-07-19 17:41:19.000000000 +0300 @@ -52,6 +52,7 @@ and dllpaths = ref ([] : string list) (* -dllpath *) and make_package = ref false (* -pack *) and for_package = ref (None: string option) (* -for-pack *) +and retype = ref false (* -retype *) let dump_parsetree = ref false (* -dparsetree *) and dump_rawlambda = ref false (* -drawlambda *) and dump_lambda = ref false (* -dlambda *) diff -Naur ocaml-3.09.2/utils/clflags.mli ocaml-3.09.2-retype/utils/clflags.mli --- ocaml-3.09.2/utils/clflags.mli 2005-10-26 16:23:27.000000000 +0300 +++ ocaml-3.09.2-retype/utils/clflags.mli 2006-07-19 17:49:03.000000000 +0300 @@ -49,6 +49,7 @@ val dllpaths : string list ref val make_package : bool ref val for_package : string option ref +val retype : bool ref val dump_parsetree : bool ref val dump_rawlambda : bool ref val dump_lambda : bool ref