فهرست منبع

refactor pos writer slightly

Simon Krajewski 1 سال پیش
والد
کامیت
8e031e72bb
2فایلهای تغییر یافته به همراه35 افزوده شده و 10 حذف شده
  1. 32 6
      src/compiler/hxb/hxbReader.ml
  2. 3 4
      src/compiler/hxb/hxbWriter.ml

+ 32 - 6
src/compiler/hxb/hxbReader.ml

@@ -936,6 +936,34 @@ class hxb_reader
 			v.v_type <- self#read_type_instance;
 			v
 		in
+		let update_pmin () =
+			fctx.pos := {!(fctx.pos) with pmin = self#read_leb128};
+		in
+		let update_pmax () =
+			fctx.pos := {!(fctx.pos) with pmax = self#read_leb128};
+		in
+		let update_pminmax () =
+			let pmin = self#read_leb128 in
+			let pmax = self#read_leb128 in
+			fctx.pos := {!(fctx.pos) with pmin; pmax};
+		in
+		let update_p () =
+			fctx.pos := self#read_pos;
+		in
+		let read_relpos () =  match self#read_u8 with
+			| 0 ->
+				()
+			| 1 ->
+				update_pmin ()
+			| 2 ->
+				update_pmax ()
+			| 3 ->
+				update_pminmax ()
+			| 4 ->
+				update_p ()
+			| _ ->
+				assert false
+		in
 		let rec loop () =
 			let t = fctx.t_pool.(self#read_uleb128) in
 			let rec loop2 () =
@@ -1175,18 +1203,16 @@ class hxb_reader
 						TBinop(op,e1,e2)
 					(* pos 241-244*)
 					| 241 ->
-						fctx.pos := {!(fctx.pos) with pmin = self#read_leb128};
+						update_pmin();
 						loop2 ()
 					| 242 ->
-						fctx.pos := {!(fctx.pos) with pmax = self#read_leb128};
+						update_pmax();
 						loop2 ()
 					| 243 ->
-						let pmin = self#read_leb128 in
-						let pmax = self#read_leb128 in
-						fctx.pos := {!(fctx.pos) with pmin; pmax};
+						update_pminmax();
 						loop2 ()
 					| 244 ->
-						fctx.pos := self#read_pos;
+						update_p();
 						loop2 ()
 					(* rest 250-254 *)
 					| 250 ->

+ 3 - 4
src/compiler/hxb/hxbWriter.ml

@@ -293,7 +293,6 @@ class pos_writer
 	(chunk_initial : chunk)
 	(stats : hxb_writer_stats)
 	(p_initial : pos)
-	(write_equal : bool)
 = object(self)
 
 	val mutable p_file = p_initial.pfile
@@ -306,7 +305,7 @@ class pos_writer
 		chunk#write_leb128 p.pmin;
 		chunk#write_leb128 p.pmax;
 
-	method write_pos (chunk : chunk) (offset : int) (p : pos) =
+	method write_pos (chunk : chunk) (write_equal : bool) (offset : int) (p : pos) =
 		if p.pfile != p_file then begin
 			(* File changed, write full pos *)
 			chunk#write_u8 (4 + offset);
@@ -1247,7 +1246,7 @@ class hxb_writer
 		let rec loop e =
 
 			self#write_texpr_type_instance fctx e.etype;
-			fctx.pos_writer#write_pos chunk 240 e.epos;
+			fctx.pos_writer#write_pos chunk false 240 e.epos;
 
 			match e.eexpr with
 			(* values 0-19 *)
@@ -1584,7 +1583,7 @@ class hxb_writer
 
 	method start_texpr (p: pos) =
 		let restore = self#start_temporary_chunk in
-		let fctx = create_field_writer_context (new pos_writer chunk stats p false) in
+		let fctx = create_field_writer_context (new pos_writer chunk stats p) in
 		fctx,(fun () ->
 			restore(fun new_chunk ->
 				let items = fctx.t_pool#items in