Rudy Ges 2 年之前
父节点
当前提交
e3fe2b9791
共有 4 个文件被更改,包括 98 次插入43 次删除
  1. 86 37
      src/compiler/hxb/hxbReader.ml
  2. 6 0
      src/compiler/hxb/hxbWriter.ml
  3. 5 6
      src/typing/typeloadModule.ml
  4. 1 0
      src/typing/typeloadParse.ml

+ 86 - 37
src/compiler/hxb/hxbReader.ml

@@ -156,8 +156,8 @@ class hxb_reader
 			pmin = min;
 			pmin = min;
 			pmax = max;
 			pmax = max;
 		} in
 		} in
-		Printf.eprintf "Read pos: %s\n" (Printer.s_pos pos);
-		MessageReporting.display_source_at com pos;
+		(* Printf.eprintf "Read pos: %s\n" (Printer.s_pos pos); *)
+		(* MessageReporting.display_source_at com pos; *)
 		pos
 		pos
 
 
 	method read_metadata_entry : metadata_entry =
 	method read_metadata_entry : metadata_entry =
@@ -364,38 +364,38 @@ class hxb_reader
 	(* 	(k,e) *)
 	(* 	(k,e) *)
 
 
 	method read_tfunction_arg =
 	method read_tfunction_arg =
-		Printf.eprintf "   read_tfunction_arg\n";
+		(* Printf.eprintf "   read_tfunction_arg\n"; *)
 		let v = self#read_var in
 		let v = self#read_var in
 		let cto = self#read_option (fun () -> self#read_texpr) in
 		let cto = self#read_option (fun () -> self#read_texpr) in
 		(v,cto)
 		(v,cto)
 
 
 	method read_tfunction =
 	method read_tfunction =
-		Printf.eprintf "   read_tfunction\n";
+		(* Printf.eprintf "   read_tfunction\n"; *)
 		let args = self#read_list16 (fun () -> self#read_tfunction_arg) in
 		let args = self#read_list16 (fun () -> self#read_tfunction_arg) in
 		let r = self#read_type_instance in
 		let r = self#read_type_instance in
 		let e = self#read_texpr in
 		let e = self#read_texpr in
-		Printf.eprintf "   read_tfunction done\n";
+		(* Printf.eprintf "   read_tfunction done\n"; *)
 		{
 		{
 			tf_args = args;
 			tf_args = args;
 			tf_type = r;
 			tf_type = r;
 			tf_expr = e;
 			tf_expr = e;
 		}
 		}
 
 
-	method read_switch_case =
-		(* list_8 *)
-		Printf.eprintf "   read_switch_case\n";
-		let el = self#read_list8 (fun () -> self#read_texpr) in
-		let e = self#read_texpr in
-		{
-			case_patterns = el;
-			case_expr = e;
-		}
-
-	method read_catch =
-		Printf.eprintf "   read_catch\n";
-		let v = self#read_var in
-		let e = self#read_texpr in
-		(v,e)
+	(* method read_switch_case = *)
+	(* 	(1* list_8 *1) *)
+	(* 	(1* Printf.eprintf "   read_switch_case\n"; *1) *)
+	(* 	let el = self#read_list8 (fun () -> self#read_texpr) in *)
+	(* 	let e = self#read_texpr in *)
+	(* 	{ *)
+	(* 		case_patterns = el; *)
+	(* 		case_expr = e; *)
+	(* 	} *)
+
+	(* method read_catch = *)
+	(* 	(1* Printf.eprintf "   read_catch\n"; *1) *)
+	(* 	let v = self#read_var in *)
+	(* 	let e = self#read_texpr in *)
+	(* 	(v,e) *)
 
 
 	method read_tfield_access =
 	method read_tfield_access =
 		match IO.read_byte ch with
 		match IO.read_byte ch with
@@ -466,7 +466,7 @@ class hxb_reader
 		let pos = self#read_pos in
 		let pos = self#read_pos in
 
 
 		let i = IO.read_byte ch in
 		let i = IO.read_byte ch in
-		Printf.eprintf "      -- loop [%d] --\n" i;
+		Printf.eprintf "      -- texpr [%d] --\n" i;
 		let e = match i with
 		let e = match i with
 			(* values 0-19 *)
 			(* values 0-19 *)
 			| 0 -> TConst TNull
 			| 0 -> TConst TNull
@@ -516,13 +516,39 @@ class hxb_reader
 				let e1 = self#read_texpr in
 				let e1 = self#read_texpr in
 				let e2 = self#read_texpr in
 				let e2 = self#read_texpr in
 				TArray (e1,e2)
 				TArray (e1,e2)
-			(* TODO 61-63 *)
+			| 61 -> TParenthesis self#read_texpr
+			| 62 -> TArrayDecl self#read_texpr_list
+			| 63 ->
+				let fl = self#read_list16 (fun () ->
+					let name = self#read_string in
+					let p = self#read_pos in
+					let qs = match IO.read_byte ch with
+						| 0 -> NoQuotes
+						| 1 -> DoubleQuotes
+						| _ -> assert false
+					in
+					let e = self#read_texpr in
+					((name,p,qs),e)
+				) in
+				TObjectDecl fl
 			| 64 ->
 			| 64 ->
 				let e1 = self#read_texpr in
 				let e1 = self#read_texpr in
 				let el = self#read_texpr_list in
 				let el = self#read_texpr_list in
 				TCall(e1,el)
 				TCall(e1,el)
 
 
 			(* branching 80-89 *)
 			(* branching 80-89 *)
+			| 80 ->
+				let e1 = self#read_texpr in
+				let e2 = self#read_texpr in
+				TIf(e1,e2,None)
+			| 84 ->
+				let e1 = self#read_texpr in
+				let e2 = self#read_texpr in
+				TWhile(e1,e2,NormalWhile)
+			| 85 ->
+				let e1 = self#read_texpr in
+				let e2 = self#read_texpr in
+				TWhile(e1,e2,DoWhile)
 
 
 			(* control flow 90-99 *)
 			(* control flow 90-99 *)
 			| 90 -> TReturn None
 			| 90 -> TReturn None
@@ -565,12 +591,12 @@ class hxb_reader
 			| 124 -> TCast(self#read_texpr,None)
 			| 124 -> TCast(self#read_texpr,None)
 			| 126 ->
 			| 126 ->
 				let c = self#read_class_ref in
 				let c = self#read_class_ref in
-				Printf.eprintf "      -- [%d] c.name = %s --\n" i (snd c.cl_path);
+				(* Printf.eprintf "      -- [%d] c.name = %s --\n" i (snd c.cl_path); *)
 				let tl = self#read_types in
 				let tl = self#read_types in
-				Printf.eprintf "      -- [%d] tl.len = %d --\n" i (List.length tl);
+				(* Printf.eprintf "      -- [%d] tl.len = %d --\n" i (List.length tl); *)
 				let el = self#read_texpr_list in
 				let el = self#read_texpr_list in
-				Printf.eprintf "      -- [%d] el.len = %d --\n" i (List.length el);
-				Printf.eprintf "      -- [%d] ready --\n" i;
+				(* Printf.eprintf "      -- [%d] el.len = %d --\n" i (List.length el); *)
+				(* Printf.eprintf "      -- [%d] ready --\n" i; *)
 				TNew(c,tl,el)
 				TNew(c,tl,el)
 
 
 			(* unops 140-159 *)
 			(* unops 140-159 *)
@@ -626,15 +652,15 @@ class hxb_reader
 				in
 				in
 
 
 				let op = get_binop (i - 160) in
 				let op = get_binop (i - 160) in
-				Printf.eprintf "      -- [%d] e1 --\n" i;
+				(* Printf.eprintf "      -- [%d] e1 --\n" i; *)
 				let e1 = self#read_texpr in
 				let e1 = self#read_texpr in
-				Printf.eprintf "      -- [%d] read e1 at: --\n" i;
-				MessageReporting.display_source_at com e1.epos;
-				Printf.eprintf "      -- [%d] e2 --\n" i;
+				(* Printf.eprintf "      -- [%d] read e1 at: --\n" i; *)
+				(* MessageReporting.display_source_at com e1.epos; *)
+				(* Printf.eprintf "      -- [%d] e2 --\n" i; *)
 				let e2 = self#read_texpr in
 				let e2 = self#read_texpr in
-				Printf.eprintf "      -- [%d] read e2 at: --\n" i;
-				MessageReporting.display_source_at com e2.epos;
-				Printf.eprintf "      -- [%d] binop ready --\n" i;
+				(* Printf.eprintf "      -- [%d] read e2 at: --\n" i; *)
+				(* MessageReporting.display_source_at com e2.epos; *)
+				(* Printf.eprintf "      -- [%d] binop ready --\n" i; *)
 				TBinop(op,e1,e2)
 				TBinop(op,e1,e2)
 
 
 			(* rest 250-254 *)
 			(* rest 250-254 *)
@@ -646,8 +672,8 @@ class hxb_reader
 				assert false
 				assert false
 		in
 		in
 
 
-		Printf.eprintf "   Done reading texpr at:\n";
-		MessageReporting.display_source_at com pos;
+		(* Printf.eprintf "   Done reading texpr at:\n"; *)
+		(* MessageReporting.display_source_at com pos; *)
 
 
 		{
 		{
 			eexpr = e;
 			eexpr = e;
@@ -662,7 +688,6 @@ class hxb_reader
 	method read_class_field (m : module_def) : tclass_field =
 	method read_class_field (m : module_def) : tclass_field =
 		let name = self#read_string in
 		let name = self#read_string in
 		Printf.eprintf "    Read class field %s\n" name;
 		Printf.eprintf "    Read class field %s\n" name;
-		(* TODO fix fietd type param reading *)
 		self#read_type_parameters m ([],name) (fun a ->
 		self#read_type_parameters m ([],name) (fun a ->
 			Printf.eprintf "     Read field type param (len = %d)\n" (Array.length a);
 			Printf.eprintf "     Read field type param (len = %d)\n" (Array.length a);
 			field_type_parameters <- a
 			field_type_parameters <- a
@@ -782,29 +807,53 @@ class hxb_reader
 	method read_abstract (m : module_def) (a : tabstract) =
 	method read_abstract (m : module_def) (a : tabstract) =
 		self#read_common_module_type m (Obj.magic a);
 		self#read_common_module_type m (Obj.magic a);
 		a.a_impl <- self#read_option (fun () -> self#read_class_ref);
 		a.a_impl <- self#read_option (fun () -> self#read_class_ref);
+		Printf.eprintf "Read type instance...\n";
 		a.a_this <- self#read_type_instance;
 		a.a_this <- self#read_type_instance;
 			(* TODO check list 8 vs 16 *)
 			(* TODO check list 8 vs 16 *)
+		Printf.eprintf "Read from...\n";
 		a.a_from <- self#read_list16 (fun () -> self#read_type_instance);
 		a.a_from <- self#read_list16 (fun () -> self#read_type_instance);
 			(* TODO check list 8 vs 16 *)
 			(* TODO check list 8 vs 16 *)
+		Printf.eprintf "Read @:from fields...\n";
 		a.a_from_field <- self#read_list16 (fun () ->
 		a.a_from_field <- self#read_list16 (fun () ->
+		let name = self#read_string in
+		self#read_type_parameters m ([],name) (fun a ->
+			Printf.eprintf "     Read field type param (len = %d)\n" (Array.length a);
+			field_type_parameters <- a
+		);
 			let t = self#read_type_instance in
 			let t = self#read_type_instance in
 			let cf = self#read_field_ref in
 			let cf = self#read_field_ref in
 			(t,cf)
 			(t,cf)
 		);
 		);
 			(* TODO check list 8 vs 16 *)
 			(* TODO check list 8 vs 16 *)
+		Printf.eprintf "Read to...\n";
 		a.a_to <- self#read_list16 (fun () -> self#read_type_instance);
 		a.a_to <- self#read_list16 (fun () -> self#read_type_instance);
 			(* TODO check list 8 vs 16 *)
 			(* TODO check list 8 vs 16 *)
+		Printf.eprintf "Read @:to fields...\n";
 		a.a_to_field <- self#read_list16 (fun () ->
 		a.a_to_field <- self#read_list16 (fun () ->
+		Printf.eprintf "1\n";
+		let name = self#read_string in
+		self#read_type_parameters m ([],name) (fun a ->
+			Printf.eprintf "     Read field type param (len = %d)\n" (Array.length a);
+			field_type_parameters <- a
+		);
 			let t = self#read_type_instance in
 			let t = self#read_type_instance in
+		Printf.eprintf "2\n";
 			let cf = self#read_field_ref in
 			let cf = self#read_field_ref in
+		Printf.eprintf "3\n";
 			(t,cf)
 			(t,cf)
 		);
 		);
 			(* TODO check list 8 vs 16 *)
 			(* TODO check list 8 vs 16 *)
+		(* Printf.eprintf "1\n"; *)
 		a.a_array <- self#read_list16 (fun () -> self#read_field_ref);
 		a.a_array <- self#read_list16 (fun () -> self#read_field_ref);
+		(* Printf.eprintf "2\n"; *)
 		a.a_read <- self#read_option (fun () -> self#read_field_ref);
 		a.a_read <- self#read_option (fun () -> self#read_field_ref);
+		(* Printf.eprintf "3\n"; *)
 		a.a_write <- self#read_option (fun () -> self#read_field_ref);
 		a.a_write <- self#read_option (fun () -> self#read_field_ref);
+		(* Printf.eprintf "4\n"; *)
 		a.a_call <- self#read_option (fun () -> self#read_field_ref);
 		a.a_call <- self#read_option (fun () -> self#read_field_ref);
-		a.a_enum <- self#read_bool
+		(* Printf.eprintf "5\n"; *)
+		a.a_enum <- self#read_bool;
+		Printf.eprintf "Done.\n";
 
 
 	(* Chunks *)
 	(* Chunks *)
 
 

+ 6 - 0
src/compiler/hxb/hxbWriter.ml

@@ -843,13 +843,19 @@ class ['a] hxb_writer
 		self#write_type_instance a.a_this;
 		self#write_type_instance a.a_this;
 		chunk#write_list a.a_from self#write_type_instance;
 		chunk#write_list a.a_from self#write_type_instance;
 		chunk#write_list a.a_from_field (fun (t,cf) ->
 		chunk#write_list a.a_from_field (fun (t,cf) ->
+			chunk#write_string cf.cf_name;
 			self#set_field_type_parameters cf.cf_params;
 			self#set_field_type_parameters cf.cf_params;
+		chunk#write_list cf.cf_params self#write_type_parameter_forward;
+		chunk#write_list cf.cf_params self#write_type_parameter_data;
 			self#write_type_instance t;
 			self#write_type_instance t;
 			self#write_field_ref (ClassStatic c) cf;
 			self#write_field_ref (ClassStatic c) cf;
 		);
 		);
 		chunk#write_list a.a_to self#write_type_instance;
 		chunk#write_list a.a_to self#write_type_instance;
 		chunk#write_list a.a_to_field (fun (t,cf) ->
 		chunk#write_list a.a_to_field (fun (t,cf) ->
+			chunk#write_string cf.cf_name;
 			self#set_field_type_parameters cf.cf_params;
 			self#set_field_type_parameters cf.cf_params;
+		chunk#write_list cf.cf_params self#write_type_parameter_forward;
+		chunk#write_list cf.cf_params self#write_type_parameter_data;
 			self#write_type_instance t;
 			self#write_type_instance t;
 			self#write_field_ref (ClassStatic c) cf;
 			self#write_field_ref (ClassStatic c) cf;
 		);
 		);

+ 5 - 6
src/typing/typeloadModule.ml

@@ -829,20 +829,19 @@ let rec get_reader ctx input p =
 
 
 and load_hxb_module ctx path p =
 and load_hxb_module ctx path p =
 	(* Modules failing to load so far *)
 	(* Modules failing to load so far *)
-	(* match snd path with *)
-	(* (1* | "ArrayIterator" *1) *)
-	(* (1* | "ArrayKeyValueIterator" *1) *)
-	(* (1* | "StdTypes" *1) *)
+	match snd path with
+	(* | "ArrayIterator" *)
+	(* | "ArrayKeyValueIterator" *)
+	(* | "StdTypes" *)
 	(* | "Any" *)
 	(* | "Any" *)
 	(* 	-> raise Not_found *)
 	(* 	-> raise Not_found *)
-	(* | _ -> (); *)
+	| _ -> ();
 
 
 	let l = ((Common.dump_path ctx.com) :: "hxb" :: (Common.platform_name_macro ctx.com) :: fst path @ [snd path]) in
 	let l = ((Common.dump_path ctx.com) :: "hxb" :: (Common.platform_name_macro ctx.com) :: fst path @ [snd path]) in
 	let filepath = (List.fold_left (fun acc s -> acc ^ "/" ^ s) "." l) ^ ".hxb" in
 	let filepath = (List.fold_left (fun acc s -> acc ^ "/" ^ s) "." l) ^ ".hxb" in
 	let ch = try open_in_bin filepath with Sys_error _ -> raise Not_found in
 	let ch = try open_in_bin filepath with Sys_error _ -> raise Not_found in
 	let input = IO.input_channel ch in
 	let input = IO.input_channel ch in
 
 
-	(* TODO store reader somewhere *)
 	Printf.eprintf "Loading %s from %s...\n" (snd path) filepath;
 	Printf.eprintf "Loading %s from %s...\n" (snd path) filepath;
 	let m = (get_reader ctx input p)#read true p in
 	let m = (get_reader ctx input p)#read true p in
 	close_in ch;
 	close_in ch;

+ 1 - 0
src/typing/typeloadParse.ml

@@ -298,6 +298,7 @@ let parse_module' com m p =
 	file,remap,pack,decls
 	file,remap,pack,decls
 
 
 let parse_module ctx m p =
 let parse_module ctx m p =
+	raise Not_found;
 	let file,remap,pack,decls = parse_module' ctx.com m p in
 	let file,remap,pack,decls = parse_module' ctx.com m p in
 	if pack <> !remap then begin
 	if pack <> !remap then begin
 		let spack m = if m = [] then "`package;`" else "`package " ^ (String.concat "." m) ^ ";`" in
 		let spack m = if m = [] then "`package;`" else "`package " ^ (String.concat "." m) ^ ";`" in