Browse Source

added debug infos in bytecode

Nicolas Cannasse 9 years ago
parent
commit
5090c8cc0f
1 changed files with 64 additions and 8 deletions
  1. 64 8
      src/generators/genhl.ml

+ 64 - 8
src/generators/genhl.ml

@@ -5356,7 +5356,7 @@ let write_index_gen b i =
 		b (i land 0xFF);
 	end
 
-let write_code ch code =
+let write_code ch code debug =
 
 	let types = gather_types code in
 	let byte = IO.write_byte ch in
@@ -5445,7 +5445,11 @@ let write_code ch code =
 	in
 
 	IO.nwrite ch "HLB";
-	IO.write_byte ch code.version;
+	byte code.version;
+
+	let flags = ref 0 in
+	if debug then flags := !flags lor 1;
+	byte !flags;
 
 	write_index (Array.length code.ints);
 	write_index (Array.length code.floats);
@@ -5459,11 +5463,19 @@ let write_code ch code =
 	Array.iter (IO.write_real_i32 ch) code.ints;
 	Array.iter (IO.write_double ch) code.floats;
 
-	let str_length = ref 0 in
-	Array.iter (fun str -> str_length := !str_length + String.length str + 1) code.strings;
-	IO.write_i32 ch !str_length;
-	Array.iter (IO.write_string ch) code.strings;
-	Array.iter (fun str -> write_index (String.length str)) code.strings;
+	let write_strings strings =
+		let str_length = ref 0 in
+		Array.iter (fun str -> str_length := !str_length + String.length str + 1) strings;
+		IO.write_i32 ch !str_length;
+		Array.iter (IO.write_string ch) strings;
+		Array.iter (fun str -> write_index (String.length str)) strings;
+	in
+	write_strings code.strings;
+
+	if debug then begin
+		write_index (Array.length code.debugfiles);
+		write_strings code.debugfiles;
+	end;
 
 	DynArray.iter (fun t ->
 		match t with
@@ -5530,6 +5542,49 @@ let write_code ch code =
 			write_type t
 	) types.arr;
 
+	let write_debug_infos debug =
+		let curfile = ref (-1) in
+		let curpos = ref 0 in
+		let rcount = ref 0 in
+		let rec flush_repeat p =
+			if !rcount > 0 then begin
+				if !rcount > 15 then begin
+					byte ((15 lsl 2) lor 2);
+					rcount := !rcount - 15;
+					flush_repeat(p)
+				end else begin
+					let delta = p - !curpos in
+					let delta = (if delta > 0 && delta < 4 then delta else 0) in
+					byte ((delta lsl 6) lor (!rcount lsl 2) lor 2);
+					rcount := 0;
+					curpos := !curpos + delta;
+				end
+			end
+		in
+		Array.iter (fun (f,p) ->
+			if f <> !curfile then begin
+				flush_repeat(p);
+				curfile := f;
+				byte ((f lsr 7) lor 1);
+				byte (f land 0xFF);
+			end;
+			if p <> !curpos then flush_repeat(p);
+			if p = !curpos then
+				rcount := !rcount + 1
+			else
+				let delta = p - !curpos in
+				if delta > 0 && delta < 32 then
+					byte ((delta lsl 3) lor 4)
+				else begin
+					byte (p lsl 3);
+					byte (p lsr 5);
+					byte (p lsr 13);
+				end;
+				curpos := p;
+		) debug;
+		flush_repeat(!curpos)
+	in
+
 	Array.iter write_type code.globals;
 	Array.iter (fun (lib_index, name_index,ttype,findex) ->
 		write_index lib_index;
@@ -5544,6 +5599,7 @@ let write_code ch code =
 		write_index (Array.length f.code);
 		Array.iter write_type f.regs;
 		Array.iter write_op f.code;
+		if debug then write_debug_infos f.debug;
 	) code.functions
 
 (* --------------------------------------------------------------------------------------------------------------------- *)
@@ -6977,7 +7033,7 @@ let generate com =
 		write_c com.Common.version com.file code
 	else begin
 		let ch = IO.output_string() in
-		write_code ch code;
+		write_code ch code true;
 		let str = IO.close_out ch in
 		let ch = open_out_bin com.file in
 		output_string ch str;