Browse Source

Fix default-arg generation. Check resolveClass/resolveEnum for correct return type.

Hugh Sanderson 15 years ago
parent
commit
298ee7c4ae
2 changed files with 22 additions and 13 deletions
  1. 14 11
      gencpp.ml
  2. 8 2
      std/Type.hx

+ 14 - 11
gencpp.ml

@@ -295,7 +295,7 @@ let gen_close_namespace output class_path =
 			(fst class_path);;
 			(fst class_path);;
 
 
 (* The basic types can have default values and are passesby value *)
 (* The basic types can have default values and are passesby value *)
-let is_basic_type = function
+let cant_be_null = function
 	| "Int" | "Bool" | "Float" | "::String" | "::haxe::io::Unsigned_char__" -> true
 	| "Int" | "Bool" | "Float" | "::String" | "::haxe::io::Unsigned_char__" -> true
 	| "int" | "bool" | "double" -> true
 	| "int" | "bool" | "double" -> true
 	| _ -> false
 	| _ -> false
@@ -430,8 +430,9 @@ let gen_arg_type_name name default_val arg_type prefix =
 	let remap_name = keyword_remap name in
 	let remap_name = keyword_remap name in
 	let type_str = (type_string arg_type) in
 	let type_str = (type_string arg_type) in
 	match default_val with
 	match default_val with
-	| Some TNull when (type_str="::String") -> (type_str,remap_name)
-	| Some constant when (is_basic_type type_str) -> ("Dynamic",prefix ^ remap_name)
+	| Some TNull  -> (type_str,remap_name)
+	| Some constant when (cant_be_null type_str) -> ("Dynamic",prefix ^ remap_name)
+	| Some constant  -> (type_str,prefix ^ remap_name)
 	| _ -> (type_str,remap_name);;
 	| _ -> (type_str,remap_name);;
 
 
 
 
@@ -1605,19 +1606,21 @@ let default_value_string = function
 let generate_default_values ctx args prefix =
 let generate_default_values ctx args prefix =
   List.iter ( fun (name,o,arg_type) -> let type_str = type_string arg_type in
   List.iter ( fun (name,o,arg_type) -> let type_str = type_string arg_type in
 	match o with
 	match o with
-	| Some TNull when (type_str = "::String") -> ()
-	| Some const when (is_basic_type type_str) ->
+	| Some TNull -> ()
+	| Some const when (type_str=="::String") ->
+		ctx.ctx_output ("if (" ^ name ^ " == null() ) "
+			^ name ^ "=" ^ (default_value_string const) ^ ");\n")
+	| Some const ->
 		ctx.ctx_output (type_str ^ " " ^ name ^ " = " ^ prefix ^ name ^ ".Default(" ^ 
 		ctx.ctx_output (type_str ^ " " ^ name ^ " = " ^ prefix ^ name ^ ".Default(" ^ 
 			(default_value_string const) ^ ");\n")
 			(default_value_string const) ^ ");\n")
 	| _ -> () ) args;;
 	| _ -> () ) args;;
 
 
 
 
-let has_default_values args =
-	List.exists ( fun (name,o,arg_type) -> let type_str = type_string arg_type in
-	match o with
-	| Some TNull when (type_str = "::String") -> false
-	| Some const when (is_basic_type type_str) -> true
-	| _ -> false ) args;;
+let has_default_values args = 
+	List.exists ( fun (_,o,_) -> match o with
+            | Some TNull -> false
+            | Some _ -> true
+            | _ -> false ) args ;;
 
 
 (*
 (*
   When a specialized class inherits from a templated class, the inherited class
   When a specialized class inherits from a templated class, the inherited class

+ 8 - 2
std/Type.hx

@@ -223,7 +223,10 @@ class Type {
 			else
 			else
 				return null;
 				return null;
 		#elseif cpp
 		#elseif cpp
-			return untyped Class.Resolve(name);
+			var result:Class<Dynamic> = Class.Resolve(name);
+			if (result!=null && result.__IsEnum() )
+				return null;
+			return result;
 		#else
 		#else
 			var cl : Class<Dynamic>;
 			var cl : Class<Dynamic>;
 		#if flash9
 		#if flash9
@@ -285,7 +288,10 @@ class Type {
 			else
 			else
 				return null;
 				return null;
 		#elseif cpp
 		#elseif cpp
-			return untyped Class.Resolve(name);
+			var result:Class<Dynamic> = Class.Resolve(name);
+			if (result!=null && !result.__IsEnum() )
+				return null;
+			return result;
 		#else
 		#else
 			var e : Dynamic;
 			var e : Dynamic;
 		#if flash9
 		#if flash9