changeset 7:9e67a1122e85

Fixed a bug that caused some types to be empty
author Jacob Carlborg <doob@me.com>
date Thu, 09 Jul 2009 21:17:39 +0200
parents c0cfd40362ee
children 2c0fd7bb4de6
files scripts/dgen.rb scripts/dstepgen.rb
diffstat 2 files changed, 170 insertions(+), 179 deletions(-) [+]
line wrap: on
line diff
--- a/scripts/dgen.rb	Wed Jul 08 14:29:59 2009 +0200
+++ b/scripts/dgen.rb	Thu Jul 09 21:17:39 2009 +0200
@@ -1132,7 +1132,7 @@
 				str << type
 				str << " "
 				str << get_identifier(typedef.name).nl
-			end
+			end unless type.nil?
 		end
 
 		str << "\n"
@@ -1324,7 +1324,7 @@
 		when "^"
 			get_struct_type(type[1 .. -1], type64, declared_type)
 			hash = get_struct_type(type[1 .. -1], type64, declared_type)
-			hash[:name].dup << "*"
+			hash[:name].dup << "*" unless hash.nil?
 			return hash
 		end
 	end
@@ -1460,7 +1460,7 @@
 			when "return"; return true
 
 			when "scope"; return true
-			when "shared"; return true;s
+			when "shared"; return true
 			when "short"; return true
 			when "static"; return true
 			when "struct"; return true
--- a/scripts/dstepgen.rb	Wed Jul 08 14:29:59 2009 +0200
+++ b/scripts/dstepgen.rb	Thu Jul 09 21:17:39 2009 +0200
@@ -319,7 +319,7 @@
 	# end
 	
 	def classes (header)
-		methods(header, /^@(interface)\s+(\w+)\s*:?\s*(\w*)\s*(\<([\w,\s]+)>)?$/, @classes, false)
+		methods(header, /^@(interface)\s+(\w+)\s*:?\s*(\w*)\s*(\<([\w,\s]+)>)?(\s*\{|$)/, @classes, false)
 	end	
 	
 	def protocols (header)
@@ -341,7 +341,7 @@
 		i = 0
 		parent = nil
 		protocols = nil
-		cat = nil	
+		cat = nil
 		
 		@cpp_result.each_line do |line|			
 			size = line.size
@@ -488,7 +488,7 @@
 	end	
 	
 	def structs (header)
-		re = /typedef\s+struct\s*\w*\s*((\w+)|\{([^{}]*(\{[^}]+\})?)*\}\s*([^\s]+))\s*(__attribute__\(.+\))?\s*,?(.+)?;/
+		re = /typedef\s+struct\s*\w*\s*((\w+)|\{([^{}]*(\{[^}]+\})?)*\}\s*([^\s]+))\s*(__attribute__\(.+\))?\s*(;|,(.+)?;)/
 		i = 0
 		body = nil
 		
@@ -1175,17 +1175,38 @@
 		@frameworks << framework
 	end
 	
-	def collect_header_types (header, enable_64bit)
+	def collect_cftypes (header, enable_64bit)
 		types = []
 		
-		header.cftypes.each do |cftype|			
+		header.cftypes.each do |cftype|
 			types << cftype[:type]
 		end
 		
+		resolved_types = resolve_types_helper(types, enable_64bit) if types.length > 0
+		
+		header.cftypes.each_with_index do |cftype, i|
+			cftype[enable_64bit ? :type64 : :type] = resolved_types[i]
+		end
+	end
+	
+	def collect_constants (header, enable_64bit)
+		types = []
+		
 		header.constants.each do |constant|
 			types << constant.stripped_return_type
 		end
 		
+		resolved_types = resolve_types_helper(types, enable_64bit) if types.length > 0
+		
+		header.constants.each_with_index do |constant, i|
+			constant.resolved_type = resolved_types[i] unless enable_64bit
+			constant.resolved_type64 = resolved_types[i] if enable_64bit
+		end
+	end
+	
+	def collect_structs (header, enable_64bit)
+		types = []
+		
 		header.structs.each do |struct|
 			types << struct[:name]
 			
@@ -1194,10 +1215,39 @@
 			end
 		end
 		
+		resolved_types = resolve_types_helper(types, enable_64bit) if types.length > 0
+		
+		i = 0
+		
+		header.structs.each do |struct|
+			struct[enable_64bit ? :type64 : :type] = resolved_types[i]
+			i += 1
+			
+			struct[:members].each do |member|
+				member[enable_64bit ? :type64 : :type] = resolved_types[i]
+				i += 1
+			end
+		end
+	end
+	
+	def collect_typedefs (header, enable_64bit)
+		types = []
+				
 		header.typedefs.each do |typedef|
 			types << typedef.stripped_return_type
 		end
 		
+		resolved_types = resolve_types_helper(types, enable_64bit) if types.length > 0
+		
+		header.typedefs.each_with_index do |typedef, i|
+			typedef.resolved_type = resolved_types[i] unless enable_64bit
+			typedef.resolved_type64 = resolved_types[i] if enable_64bit
+		end
+	end	
+	
+	def collect_functions (header, enable_64bit)
+		types = []
+		
 		header.functions.each do |function|
 			types << function.stripped_return_type
 			
@@ -1206,6 +1256,25 @@
 			end
 		end
 		
+		resolved_types = resolve_types_helper(types, enable_64bit) if types.length > 0
+		i = 0
+		
+		header.functions.each do |function|
+			function.resolved_type = resolved_types[i] unless enable_64bit
+			function.resolved_type64 = resolved_types[i] if enable_64bit
+			i += 1
+			
+			function.args.each do |arg|
+				arg.resolved_type = resolved_types[i] unless enable_64bit
+				arg.resolved_type64 = resolved_types[i] if enable_64bit
+				i += 1
+			end
+		end
+	end
+	
+	def collect_functions_pointers (header, enable_64bit)
+		types = []
+		
 		header.function_pointers.each do |fp, value|
 			types << value.return_type
 			
@@ -1214,7 +1283,29 @@
 			end unless value.args.nil?
 		end
 		
-		types
+		resolved_types = resolve_types_helper(types, enable_64bit) if types.length > 0
+		i = 0
+		
+		header.function_pointers.each do |fp, value|
+			value.resolved_type = resolved_types[i] unless enable_64bit
+			value.resolved_type64 = resolved_types[i] if enable_64bit
+			i += 1
+			
+			value.args.each do |arg|
+				arg.resolved_type = resolved_types[i] unless enable_64bit
+				arg.resolved_type64 = resolved_types[i] if enable_64bit
+				i += 1
+			end unless value.args.nil?
+		end
+	end	
+		
+	def collect_header_types (header, enable_64bit)
+		collect_cftypes(header, enable_64bit)
+		collect_constants(header, enable_64bit)
+		collect_structs(header, enable_64bit)
+		collect_typedefs(header, enable_64bit)
+		collect_functions(header, enable_64bit)
+		collect_functions_pointers(header, enable_64bit)
 	end
 	
 	def collect_classes_types (enable_64bit)
@@ -1230,7 +1321,22 @@
 			end
 		end
 		
-		types
+		resolved_types = resolve_types_helper(types, enable_64bit) if types.length > 0
+		i = 0
+		
+		@classes.each do |clazz, value|
+			value.methods.each do |method|				
+				method.resolved_type = resolved_types[i] unless enable_64bit
+				method.resolved_type64 = resolved_types[i] if enable_64bit
+				i += 1
+				
+				method.args.each do |arg|
+					arg.resolved_type = resolved_types[i] unless enable_64bit
+					arg.resolved_type64 = resolved_types[i] if enable_64bit
+					i += 1
+				end
+			end
+		end
 	end
 	
 	def collect_protocols_types (enable_64bit)
@@ -1246,25 +1352,24 @@
 			end
 		end
 		
-		types
+		resolved_types = resolve_types_helper(types, enable_64bit) if types.length > 0
+		i = 0
+		
+		@protocols.each do |protocol, value|
+			value.methods.each do |method|
+				method.resolved_type = resolved_types[i] unless enable_64bit
+				method.resolved_type64 = resolved_types[i] if enable_64bit
+				i += 1
+				
+				method.args.each do |arg|
+					arg.resolved_type = resolved_types[i] unless enable_64bit
+					arg.resolved_type64 = resolved_types[i] if enable_64bit
+					i += 1
+				end
+			end
+		end
 	end
 	
-	# def collect_informal_protocols_types (enable_64bit)
-	# 	types = []
-	# 	
-	# 	@informal_protocols.each do |name, methods|
-	# 		methods.each do |method|				
-	# 			types << method.stripped_return_type
-	# 			
-	# 			method.args.each do |arg|					
-	# 				types << arg.stripped_return_type
-	# 			end
-	# 		end
-	# 	end
-	# 	
-	# 	types
-	# end
-	
 	def collect_categories_types (enable_64bit)
 		types = []
 		
@@ -1278,128 +1383,8 @@
 			end
 		end
 		
-		types
-	end
-	
-	def resolve_header_types (header, enable_64bit, resolved_types, x)
-		i = x
-		
-		header.cftypes.each do |cftype|
-			cftype[enable_64bit ? :type64 : :type] = resolved_types[i]
-			i += 1
-		end
-		
-		header.constants.each do |constant|
-			constant.resolved_type = resolved_types[i] unless enable_64bit
-			constant.resolved_type64 = resolved_types[i] if enable_64bit
-			i += 1
-		end
-		
-		header.structs.each do |struct|
-			struct[enable_64bit ? :type64 : :type] = resolved_types[i]
-			i += 1
-			
-			struct[:members].each do |member|
-				member[enable_64bit ? :type64 : :type] = resolved_types[i]
-				i += 1
-			end
-		end
-		
-		header.typedefs.each do |typedef|
-			typedef.resolved_type = resolved_types[i] unless enable_64bit
-			typedef.resolved_type64 = resolved_types[i] if enable_64bit
-			i += 1
-		end
-		
-		header.functions.each do |function|
-			function.resolved_type = resolved_types[i] unless enable_64bit
-			function.resolved_type64 = resolved_types[i] if enable_64bit
-			i += 1
-			
-			function.args.each do |arg|
-				arg.resolved_type = resolved_types[i] unless enable_64bit
-				arg.resolved_type64 = resolved_types[i] if enable_64bit
-				i += 1
-			end
-		end
-		
-		header.function_pointers.each do |fp, value|
-			value.resolved_type = resolved_types[i] unless enable_64bit
-			value.resolved_type64 = resolved_types[i] if enable_64bit
-			i += 1
-			
-			value.args.each do |arg|
-				arg.resolved_type = resolved_types[i] unless enable_64bit
-				arg.resolved_type64 = resolved_types[i] if enable_64bit
-				i += 1
-			end unless value.args.nil?
-		end
-		
-		i
-	end
-	
-	def resolve_classes_types (enable_64bit, resolved_types, x)
-		i = x
-		
-		@classes.each do |clazz, value|
-			value.methods.each do |method|
-				method.resolved_type = resolved_types[i] unless enable_64bit
-				method.resolved_type64 = resolved_types[i] if enable_64bit
-				i += 1
-				
-				method.args.each do |arg|
-					arg.resolved_type = resolved_types[i] unless enable_64bit
-					arg.resolved_type64 = resolved_types[i] if enable_64bit
-					i += 1
-				end
-			end
-		end
-		
-		i
-	end
-	
-	def resolve_protocols_types (enable_64bit, resolved_types, x)
-		i = x
-		
-		@protocols.each do |protocol, value|
-			value.methods.each do |method|
-				method.resolved_type = resolved_types[i] unless enable_64bit
-				method.resolved_type64 = resolved_types[i] if enable_64bit
-				i += 1
-				
-				method.args.each do |arg|
-					arg.resolved_type = resolved_types[i] unless enable_64bit
-					arg.resolved_type64 = resolved_types[i] if enable_64bit
-					i += 1
-				end
-			end
-		end
-		
-		i
-	end
-	
-	# def resolve_informal_protocols_types (enable_64bit, resolved_types, x)
-	# 	i = x
-	# 	
-	# 	@informal_protocols.each do |name, methods|
-	# 		methods.each do |method|
-	# 			method.resolved_type = resolved_types[i] unless enable_64bit
-	# 			method.resolved_type64 = resolved_types[i] if enable_64bit
-	# 			i += 1
-	# 			
-	# 			method.args.each do |arg|
-	# 				arg.resolved_type = resolved_types[i] unless enable_64bit
-	# 				arg.resolved_type64 = resolved_types[i] if enable_64bit
-	# 				i += 1
-	# 			end
-	# 		end
-	# 	end
-	# 	
-	# 	i
-	# end
-	
-	def resolve_categories_types (enable_64bit, resolved_types, x)
-		i = x
+		resolved_types = resolve_types_helper(types, enable_64bit) if types.length > 0
+		i = 0
 		
 		@categories.each do |category, value|
 			value.methods.each do |method|
@@ -1414,8 +1399,6 @@
 				end
 			end
 		end
-		
-		i
 	end
 	
 	def get_framework_name (framework)
@@ -1425,10 +1408,26 @@
 		framework[x + 1 ... i]
 	end
 	
-	def resolve_types (enable_64bit = false)
+	def resolve_types (enable_64bit = false)		
+
+		@frameworks.each do |framework|
+			framework.headers.each do |header|
+				collect_header_types(header, enable_64bit)
+			end
+		end
+
+		@headers.each do |header|
+			collect_header_types(header, enable_64bit)
+		end		
+
+		collect_classes_types(enable_64bit)
+		collect_protocols_types(enable_64bit)
+		collect_categories_types(enable_64bit)
+	end
+	
+	def resolve_types_helper (types, enable_64bit)
 		code = "#include <stdio.h>\n"				
 		code << @import_directives
-		types = []
 		
 		@frameworks.each do |framework|			
 			framework.headers.each do |header|
@@ -1466,17 +1465,7 @@
 			code << line
 		end if !@inject_path.nil? && File.exist?(@inject_path)
 		
-		code << "\n\n"
-
-		@headers.each do |header|
-			types << collect_header_types(header, enable_64bit)
-		end
-		
-		types << collect_classes_types(enable_64bit)
-		types << collect_protocols_types(enable_64bit)
-		#types << collect_informal_protocols_types(enable_64bit)
-		types << collect_categories_types(enable_64bit)
-		
+		code << "\n\n"		
 		code << "int main ()\n{\n"
 		types.flatten!
 		
@@ -1492,22 +1481,24 @@
 			resolved_types << line
 		end
 		
-		i = 0
+		resolved_types
 		
-		@frameworks.each do |framework|
-			framework.headers.each do |header|
-				i = resolve_header_types(header, enable_64bit, resolved_types, i)
-			end
-		end
-
-		@headers.each do |header|
-			i = resolve_header_types(header, enable_64bit, resolved_types, i)
-		end
-				
-		i = resolve_classes_types(enable_64bit, resolved_types, i)
-		i = resolve_protocols_types(enable_64bit, resolved_types, i)
-		#i = resolve_informal_protocols_types(enable_64bit, resolved_types, i)
-		i = resolve_categories_types(enable_64bit, resolved_types, i)
+		# i = 0
+		# 
+		# @frameworks.each do |framework|
+		# 	framework.headers.each do |header|
+		# 		i = resolve_header_types(header, enable_64bit, resolved_types, i)
+		# 	end
+		# end
+		# 
+		# @headers.each do |header|
+		# 	i = resolve_header_types(header, enable_64bit, resolved_types, i)
+		# end
+		# 		
+		# i = resolve_classes_types(enable_64bit, resolved_types, i)
+		# i = resolve_protocols_types(enable_64bit, resolved_types, i)
+		# #i = resolve_informal_protocols_types(enable_64bit, resolved_types, i)
+		# i = resolve_categories_types(enable_64bit, resolved_types, i)
 	end
 	
 	def generate_header (xml, header)