Prechádzať zdrojové kódy

fixed unnamed fields generation

Nicolas Cannasse 9 rokov pred
rodič
commit
2de73e6b61
1 zmenil súbory, kde vykonal 16 pridanie a 4 odobranie
  1. 16 4
      src/generators/hl2c.ml

+ 16 - 4
src/generators/hl2c.ml

@@ -251,6 +251,13 @@ let write_c version file (code:code) =
 
 	line "";
 	line "// Types implementation";
+
+	let unamed_field fid = "$_f" ^ string_of_int fid in
+
+	let obj_field fid name =
+		if name = "" then unamed_field fid else ident name
+	in
+
 	Array.iter (fun t ->
 		match t with
 		| HObj o ->
@@ -261,8 +268,13 @@ let write_c version file (code:code) =
 				(match o.psuper with
 				| None -> expr ("hl_type *$type");
 				| Some c -> loop c);
-				Array.iter (fun (n,_,t) ->
-					expr (var_type n t)
+				Array.iteri (fun i (n,_,t) ->
+					let rec abs_index p v =
+						match p with
+						| None -> v
+						| Some o -> abs_index o.psuper (Array.length o.pfields + v)
+					in
+					expr (var_type (if n = "" then unamed_field (abs_index o.psuper i) else n) t)
 				) o.pfields;
 			in
 			loop o;
@@ -682,7 +694,7 @@ let write_c version file (code:code) =
 			match rtype obj with
 			| HObj o ->
 				let name, t = resolve_field o fid in
-				sexpr "%s->%s = %s" (reg obj) (ident name) (rcast v t)
+				sexpr "%s->%s = %s" (reg obj) (obj_field fid name) (rcast v t)
 			| HVirtual vp ->
 				let name, nid, t = vp.vfields.(fid) in
 				let dset = sprintf "hl_dyn_set%s(%s->value,%ld/*%s*/%s,%s)" (dyn_prefix t) (reg obj) (hash nid) name (type_value_opt (rtype v)) (reg v) in
@@ -697,7 +709,7 @@ let write_c version file (code:code) =
 			match rtype obj with
 			| HObj o ->
 				let name, t = resolve_field o fid in
-				sexpr "%s%s->%s" (rassign r t) (reg obj) (ident name)
+				sexpr "%s%s->%s" (rassign r t) (reg obj) (obj_field fid name)
 			| HVirtual v ->
 				let name, nid, t = v.vfields.(fid) in
 				let dget = sprintf "(%s)hl_dyn_get%s(%s->value,%ld/*%s*/%s)" (ctype t) (dyn_prefix t) (reg obj) (hash nid) name (type_value_opt t) in