Browse Source

handle null patterns

Simon Krajewski 12 years ago
parent
commit
8fc2ece1e7
1 changed files with 12 additions and 9 deletions
  1. 12 9
      genneko.ml

+ 12 - 9
genneko.ml

@@ -446,11 +446,6 @@ and gen_expr ctx e =
 			| CFields _ -> assert false
 			| CFields _ -> assert false
 		in
 		in
 		let goto i = call p (builtin p "goto") [ident p (get_label i)] in
 		let goto i = call p (builtin p "goto") [ident p (get_label i)] in
-(*  		let goto i = EBlock [
-			call p (builtin p "print") [call p (field p (ident p "String") "new") [gen_big_string ctx p ("goto " ^ (string_of_int (lc + i)))];];
-			call p (builtin p "print") [gen_big_string ctx p "\n"];
-			goto i;
-		],p in *)
 		let state = Hashtbl.create 0 in
 		let state = Hashtbl.create 0 in
 		let v_name v = "v" ^ (string_of_int v.v_id) in
 		let v_name v = "v" ^ (string_of_int v.v_id) in
 		let get_locals e =
 		let get_locals e =
@@ -493,17 +488,25 @@ and gen_expr ctx e =
 					| _ -> est;
 					| _ -> est;
 				in
 				in
 				let def = ref None in
 				let def = ref None in
+				let pnull = ref None in
 				let cases = ExtList.List.filter_map (fun (c,dt) ->
 				let cases = ExtList.List.filter_map (fun (c,dt) ->
-					if c.c_def = CAny then begin
+					match c.c_def with
+					| CAny ->
 						def := Some (loop dt);
 						def := Some (loop dt);
 						None
 						None
-					end else
+					| CConst (TNull) ->
+						pnull := Some (loop dt);
+						None;
+					| _ ->
 						Some (s_con c,loop dt)
 						Some (s_con c,loop dt)
 				) cl in
 				) cl in
-				EBlock [
+				let e = EBlock [
 					(ESwitch (e,cases,!def),p);
 					(ESwitch (e,cases,!def),p);
 					goto num_labels;
 					goto num_labels;
-				],p
+				],p in
+				match !pnull with
+				| None -> e
+				| Some enull -> (EIf((EBinop ("==",est,null p),p),enull,Some e)),p
 		in
 		in
 		let acc = DynArray.create () in
 		let acc = DynArray.create () in
 		for i = num_labels -1 downto 0 do
 		for i = num_labels -1 downto 0 do