[vala] Add initial support for POSIX profile



commit 268e31d5ccfa3dc3670fc26e49dc6ed6835bc7dc
Author: Jürg Billeter <j bitron ch>
Date:   Tue May 5 21:54:03 2009 +0200

    Add initial support for POSIX profile
    
    Add --profile command-line option.
    
    Code compiled with valac --profile posix will not depend on GLib or
    GObject. However, many language features are currently not supported
    with the POSIX profile.
---
 compiler/valacompiler.vala         |   78 ++++++++++++++-------
 gobject/valaccodebasemodule.vala   |  134 +++++++++++++++++++++++-------------
 gobject/valaccodecompiler.vala     |   36 ++++++----
 gobject/valaccodegenerator.vala    |   53 +++++++++-----
 gobject/valaccodemethodmodule.vala |   27 ++++---
 gobject/valaccodestructmodule.vala |   30 +++++++--
 vala/Makefile.am                   |    1 +
 vala/valacodecontext.vala          |    2 +
 vala/valaprofile.vala              |   26 +++++++
 vala/valasemanticanalyzer.vala     |   22 ++++--
 vala/valastruct.vala               |   19 +++++-
 vapi/posix.vapi                    |  124 +++++++++++++++++++++++++++++++++
 12 files changed, 420 insertions(+), 132 deletions(-)

diff --git a/compiler/valacompiler.vala b/compiler/valacompiler.vala
index 25cc2c5..6d3a1b2 100644
--- a/compiler/valacompiler.vala
+++ b/compiler/valacompiler.vala
@@ -64,6 +64,7 @@ class Vala.Compiler {
 	static string[] defines;
 	static bool quiet_mode;
 	static bool verbose_mode;
+	static string profile;
 
 	private CodeContext context;
 
@@ -93,6 +94,7 @@ class Vala.Compiler {
 		{ "Xcc", 'X', 0, OptionArg.STRING_ARRAY, ref cc_options, "Pass OPTION to the C compiler", "OPTION..." },
 		{ "dump-tree", 0, 0, OptionArg.FILENAME, ref dump_tree, "Write code tree to FILE", "FILE" },
 		{ "save-temps", 0, 0, OptionArg.NONE, ref save_temps, "Keep temporary files", null },
+		{ "profile", 0, 0, OptionArg.STRING, ref profile, "Use the given profile instead of the default", "PROFILE" },
 		{ "quiet", 'q', 0, OptionArg.NONE, ref quiet_mode, "Do not print messages to the console", null },
 		{ "verbose", 'v', 0, OptionArg.NONE, ref verbose_mode, "Print additional messages to the console", null },
 		{ "target-glib", 0, 0, OptionArg.STRING, ref target_glib, "Target version of glib for code generation", "MAJOR.MINOR" },
@@ -197,6 +199,16 @@ class Vala.Compiler {
 		context.debug = debug;
 		context.thread = thread;
 		context.save_temps = save_temps;
+		if (profile == "posix") {
+			context.profile = Profile.POSIX;
+			context.add_define ("POSIX");
+		} else if (profile == "gobject-2.0" || profile == "gobject" || profile == null) {
+			// default profile
+			context.profile = Profile.GOBJECT;
+			context.add_define ("GOBJECT");
+		} else {
+			Report.error (null, "Unknown profile %s".printf (profile));
+		}
 
 		if (defines != null) {
 			foreach (string define in defines) {
@@ -204,28 +216,35 @@ class Vala.Compiler {
 			}
 		}
 
-		int glib_major = 2;
-		int glib_minor = 12;
-		if (target_glib != null && target_glib.scanf ("%d.%d", out glib_major, out glib_minor) != 2) {
-			Report.error (null, "Invalid format for --target-glib");
-		}
+		if (context.profile == Profile.POSIX) {
+			/* default package */
+			if (!add_package (context, "posix")) {
+				Report.error (null, "posix not found in specified Vala API directories");
+			}
+		} else if (context.profile == Profile.GOBJECT) {
+			int glib_major = 2;
+			int glib_minor = 12;
+			if (target_glib != null && target_glib.scanf ("%d.%d", out glib_major, out glib_minor) != 2) {
+				Report.error (null, "Invalid format for --target-glib");
+			}
+
+			context.target_glib_major = glib_major;
+			context.target_glib_minor = glib_minor;
+			if (context.target_glib_major != 2) {
+				Report.error (null, "This version of valac only supports GLib 2");
+			}
 
-		context.target_glib_major = glib_major;
-		context.target_glib_minor = glib_minor;
-		if (context.target_glib_major != 2) {
-			Report.error (null, "This version of valac only supports GLib 2");
+			/* default packages */
+			if (!add_package (context, "glib-2.0")) {
+				Report.error (null, "glib-2.0 not found in specified Vala API directories");
+			}
+			if (!add_package (context, "gobject-2.0")) {
+				Report.error (null, "gobject-2.0 not found in specified Vala API directories");
+			}
 		}
 
 		context.codegen = new CCodeGenerator ();
 
-		/* default packages */
-		if (!add_package (context, "glib-2.0")) {
-			Report.error (null, "glib-2.0 not found in specified Vala API directories");
-		}
-		if (!add_package (context, "gobject-2.0")) {
-			Report.error (null, "gobject-2.0 not found in specified Vala API directories");
-		}
-
 		if (packages != null) {
 			foreach (string package in packages) {
 				if (!add_package (context, package)) {
@@ -245,8 +264,13 @@ class Vala.Compiler {
 				if (source.has_suffix (".vala") || source.has_suffix (".gs")) {
 					var source_file = new SourceFile (context, rpath);
 
-					// import the GLib namespace by default (namespace of backend-specific standard library)
-					source_file.add_using_directive (new UsingDirective (new UnresolvedSymbol (null, "GLib", null)));
+					if (context.profile == Profile.POSIX) {
+						// import the Posix namespace by default (namespace of backend-specific standard library)
+						source_file.add_using_directive (new UsingDirective (new UnresolvedSymbol (null, "Posix", null)));
+					} else if (context.profile == Profile.GOBJECT) {
+						// import the GLib namespace by default (namespace of backend-specific standard library)
+						source_file.add_using_directive (new UsingDirective (new UnresolvedSymbol (null, "GLib", null)));
+					}
 
 					context.add_source_file (source_file);
 				} else if (source.has_suffix (".vapi")) {
@@ -328,18 +352,18 @@ class Vala.Compiler {
 
 			interface_writer.write_file (context, vapi_filename);
 
+			if (context.profile == Profile.GOBJECT) {
+				var gir_writer = new GIRWriter ();
+				string gir_filename = "%s.gir".printf (library);
 
-			var gir_writer = new GIRWriter ();
-			string gir_filename = "%s.gir".printf (library);
+				// put .gir file in current directory unless -d has been explicitly specified
+				if (directory != null && !Path.is_absolute (gir_filename)) {
+					gir_filename = "%s%c%s".printf (context.directory, Path.DIR_SEPARATOR, gir_filename);
+				}
 
-			// put .gir file in current directory unless -d has been explicitly specified
-			if (directory != null && !Path.is_absolute (gir_filename)) {
-				gir_filename = "%s%c%s".printf (context.directory, Path.DIR_SEPARATOR, gir_filename);
+				gir_writer.write_file (context, gir_filename);
 			}
 
-			gir_writer.write_file (context, gir_filename);
-
-
 			library = null;
 		}
 		if (internal_vapi_filename != null) {
diff --git a/gobject/valaccodebasemodule.vala b/gobject/valaccodebasemodule.vala
index 2bfc97f..c5987eb 100644
--- a/gobject/valaccodebasemodule.vala
+++ b/gobject/valaccodebasemodule.vala
@@ -84,7 +84,7 @@ internal class Vala.CCodeBaseModule : CCodeModule {
 	public DataType bool_type;
 	public DataType char_type;
 	public DataType uchar_type;
-	public DataType unichar_type;
+	public DataType? unichar_type;
 	public DataType short_type;
 	public DataType ushort_type;
 	public DataType int_type;
@@ -215,7 +215,6 @@ internal class Vala.CCodeBaseModule : CCodeModule {
 		bool_type = new BooleanType ((Struct) root_symbol.scope.lookup ("bool"));
 		char_type = new IntegerType ((Struct) root_symbol.scope.lookup ("char"));
 		uchar_type = new IntegerType ((Struct) root_symbol.scope.lookup ("uchar"));
-		unichar_type = new IntegerType ((Struct) root_symbol.scope.lookup ("unichar"));
 		short_type = new IntegerType ((Struct) root_symbol.scope.lookup ("short"));
 		ushort_type = new IntegerType ((Struct) root_symbol.scope.lookup ("ushort"));
 		int_type = new IntegerType ((Struct) root_symbol.scope.lookup ("int"));
@@ -234,38 +233,45 @@ internal class Vala.CCodeBaseModule : CCodeModule {
 		double_type = new FloatingType ((Struct) root_symbol.scope.lookup ("double"));
 		string_type = new ObjectType ((Class) root_symbol.scope.lookup ("string"));
 
-		var glib_ns = root_symbol.scope.lookup ("GLib");
-
-		gtype_type = (TypeSymbol) glib_ns.scope.lookup ("Type");
-		gobject_type = (TypeSymbol) glib_ns.scope.lookup ("Object");
-		gerror_type = new ErrorType (null, null);
-		glist_type = (Class) glib_ns.scope.lookup ("List");
-		gslist_type = (Class) glib_ns.scope.lookup ("SList");
-		gstringbuilder_type = (TypeSymbol) glib_ns.scope.lookup ("StringBuilder");
-		garray_type = (TypeSymbol) glib_ns.scope.lookup ("Array");
-		gbytearray_type = (TypeSymbol) glib_ns.scope.lookup ("ByteArray");
-		gptrarray_type = (TypeSymbol) glib_ns.scope.lookup ("PtrArray");
-
-		gquark_type = new IntegerType ((Struct) glib_ns.scope.lookup ("Quark"));
-		gvalue_type = (Struct) glib_ns.scope.lookup ("Value");
-		mutex_type = (Struct) glib_ns.scope.lookup ("StaticRecMutex");
-
-		type_module_type = (TypeSymbol) glib_ns.scope.lookup ("TypeModule");
-
-		if (context.module_init_method != null) {
-			module_init_fragment = new CCodeFragment ();
-			foreach (FormalParameter parameter in context.module_init_method.get_parameters ()) {
-				if (parameter.parameter_type.data_type == type_module_type) {
-					in_plugin = true;
-					module_init_param_name = parameter.name;
-					break;
+		var unichar_struct = (Struct) root_symbol.scope.lookup ("unichar");
+		if (unichar_struct != null) {
+			unichar_type = new IntegerType (unichar_struct);
+		}
+
+		if (context.profile == Profile.GOBJECT) {
+			var glib_ns = root_symbol.scope.lookup ("GLib");
+
+			gtype_type = (TypeSymbol) glib_ns.scope.lookup ("Type");
+			gobject_type = (TypeSymbol) glib_ns.scope.lookup ("Object");
+			gerror_type = new ErrorType (null, null);
+			glist_type = (Class) glib_ns.scope.lookup ("List");
+			gslist_type = (Class) glib_ns.scope.lookup ("SList");
+			gstringbuilder_type = (TypeSymbol) glib_ns.scope.lookup ("StringBuilder");
+			garray_type = (TypeSymbol) glib_ns.scope.lookup ("Array");
+			gbytearray_type = (TypeSymbol) glib_ns.scope.lookup ("ByteArray");
+			gptrarray_type = (TypeSymbol) glib_ns.scope.lookup ("PtrArray");
+
+			gquark_type = new IntegerType ((Struct) glib_ns.scope.lookup ("Quark"));
+			gvalue_type = (Struct) glib_ns.scope.lookup ("Value");
+			mutex_type = (Struct) glib_ns.scope.lookup ("StaticRecMutex");
+
+			type_module_type = (TypeSymbol) glib_ns.scope.lookup ("TypeModule");
+
+			if (context.module_init_method != null) {
+				module_init_fragment = new CCodeFragment ();
+				foreach (FormalParameter parameter in context.module_init_method.get_parameters ()) {
+					if (parameter.parameter_type.data_type == type_module_type) {
+						in_plugin = true;
+						module_init_param_name = parameter.name;
+						break;
+					}
 				}
 			}
-		}
 
-		var dbus_ns = root_symbol.scope.lookup ("DBus");
-		if (dbus_ns != null) {
-			dbus_object_type = (TypeSymbol) dbus_ns.scope.lookup ("Object");
+			var dbus_ns = root_symbol.scope.lookup ("DBus");
+			if (dbus_ns != null) {
+				dbus_object_type = (TypeSymbol) dbus_ns.scope.lookup ("Object");
+			}
 		}
 
 		header_declarations = new CCodeDeclarationSpace ();
@@ -292,8 +298,12 @@ internal class Vala.CCodeBaseModule : CCodeModule {
 			once.append (new CCodeNewline ());
 			once.append (header_declarations.include_directives);
 			once.append (new CCodeNewline ());
-			once.append (new CCodeIdentifier ("G_BEGIN_DECLS"));
-			once.append (new CCodeNewline ());
+
+			if (context.profile == Profile.GOBJECT) {
+				once.append (new CCodeIdentifier ("G_BEGIN_DECLS"));
+				once.append (new CCodeNewline ());
+			}
+
 			once.append (new CCodeNewline ());
 			once.append (header_declarations.type_declaration);
 			once.append (new CCodeNewline ());
@@ -303,8 +313,12 @@ internal class Vala.CCodeBaseModule : CCodeModule {
 			once.append (new CCodeNewline ());
 			once.append (header_declarations.constant_declaration);
 			once.append (new CCodeNewline ());
-			once.append (new CCodeIdentifier ("G_END_DECLS"));
-			once.append (new CCodeNewline ());
+
+			if (context.profile == Profile.GOBJECT) {
+				once.append (new CCodeIdentifier ("G_END_DECLS"));
+				once.append (new CCodeNewline ());
+			}
+
 			once.append (new CCodeNewline ());
 			once.write (writer);
 			writer.close ();
@@ -323,8 +337,12 @@ internal class Vala.CCodeBaseModule : CCodeModule {
 			once.append (new CCodeNewline ());
 			once.append (internal_header_declarations.include_directives);
 			once.append (new CCodeNewline ());
-			once.append (new CCodeIdentifier ("G_BEGIN_DECLS"));
-			once.append (new CCodeNewline ());
+
+			if (context.profile == Profile.GOBJECT) {
+				once.append (new CCodeIdentifier ("G_BEGIN_DECLS"));
+				once.append (new CCodeNewline ());
+			}
+
 			once.append (new CCodeNewline ());
 			once.append (internal_header_declarations.type_declaration);
 			once.append (new CCodeNewline ());
@@ -334,8 +352,12 @@ internal class Vala.CCodeBaseModule : CCodeModule {
 			once.append (new CCodeNewline ());
 			once.append (internal_header_declarations.constant_declaration);
 			once.append (new CCodeNewline ());
-			once.append (new CCodeIdentifier ("G_END_DECLS"));
-			once.append (new CCodeNewline ());
+
+			if (context.profile == Profile.GOBJECT) {
+				once.append (new CCodeIdentifier ("G_END_DECLS"));
+				once.append (new CCodeNewline ());
+			}
+
 			once.append (new CCodeNewline ());
 			once.write (writer);
 			writer.close ();
@@ -418,10 +440,12 @@ internal class Vala.CCodeBaseModule : CCodeModule {
 		wrappers = new HashSet<string> (str_hash, str_equal);
 		generated_external_symbols = new HashSet<Symbol> ();
 
-		header_declarations.add_include ("glib.h");
-		internal_header_declarations.add_include ("glib.h");
-		source_declarations.add_include ("glib.h");
-		source_declarations.add_include ("glib-object.h");
+		if (context.profile == Profile.GOBJECT) {
+			header_declarations.add_include ("glib.h");
+			internal_header_declarations.add_include ("glib.h");
+			source_declarations.add_include ("glib.h");
+			source_declarations.add_include ("glib-object.h");
+		}
 
 		source_file.accept_children (codegen);
 
@@ -1086,9 +1110,9 @@ internal class Vala.CCodeBaseModule : CCodeModule {
 		} else if (type.data_type is Enum) {
 			var en = (Enum) type.data_type;
 			generate_enum_declaration (en, decl_space);
-		} else if (type is StructValueType) {
-			var struct_type = (StructValueType) type;
-			generate_struct_declaration ((Struct) struct_type.type_symbol, decl_space);
+		} else if (type is ValueType) {
+			var value_type = (ValueType) type;
+			generate_struct_declaration ((Struct) value_type.type_symbol, decl_space);
 		} else if (type is ArrayType) {
 			var array_type = (ArrayType) type;
 			generate_type_declaration (array_type.element_type, decl_space);
@@ -2445,7 +2469,12 @@ internal class Vala.CCodeBaseModule : CCodeModule {
 	}
 
 	public override void visit_boolean_literal (BooleanLiteral expr) {
-		expr.ccodenode = new CCodeConstant (expr.value ? "TRUE" : "FALSE");
+		if (context.profile == Profile.GOBJECT) {
+			expr.ccodenode = new CCodeConstant (expr.value ? "TRUE" : "FALSE");
+		} else {
+			source_declarations.add_include ("stdbool.h");
+			expr.ccodenode = new CCodeConstant (expr.value ? "true" : "false");
+		}
 	}
 
 	public override void visit_character_literal (CharacterLiteral expr) {
@@ -2482,6 +2511,9 @@ internal class Vala.CCodeBaseModule : CCodeModule {
 	}
 
 	public override void visit_null_literal (NullLiteral expr) {
+		if (context.profile != Profile.GOBJECT) {
+			source_declarations.add_include ("stddef.h");
+		}
 		expr.ccodenode = new CCodeConstant ("NULL");
 	}
 
@@ -2758,7 +2790,7 @@ internal class Vala.CCodeBaseModule : CCodeModule {
 			return true;
 		} else if (st == char_type.data_type) {
 			return true;
-		} else if (st == unichar_type.data_type) {
+		} else if (unichar_type != null && st == unichar_type.data_type) {
 			return true;
 		} else if (st == short_type.data_type) {
 			return true;
@@ -2827,6 +2859,9 @@ internal class Vala.CCodeBaseModule : CCodeModule {
 	}
 
 	public virtual void generate_class_declaration (Class cl, CCodeDeclarationSpace decl_space) {
+		if (decl_space.add_symbol_declaration (cl, cl.get_cname ())) {
+			return;
+		}
 	}
 
 	public virtual void generate_interface_declaration (Interface iface, CCodeDeclarationSpace decl_space) {
@@ -3826,6 +3861,9 @@ internal class Vala.CCodeBaseModule : CCodeModule {
 		}
 		return node.ccodenode;
 	}
+
+	public override void visit_class (Class cl) {
+	}
 }
 
 // vim:sw=8 noet
diff --git a/gobject/valaccodecompiler.vala b/gobject/valaccodecompiler.vala
index 31e395a..2f61a31 100644
--- a/gobject/valaccodecompiler.vala
+++ b/gobject/valaccodecompiler.vala
@@ -50,29 +50,38 @@ public class Vala.CCodeCompiler {
 	 */
 	[NoArrayLength]
 	public void compile (CodeContext context, string? cc_command, string[] cc_options) {
+		bool use_pkgconfig = false;
+
 		string pc = "pkg-config --cflags";
 		if (!context.compile_only) {
 			pc += " --libs";
 		}
-		pc += " gobject-2.0";
-		if (context.thread) {
-			pc += " gthread-2.0";
+		if (context.profile == Profile.GOBJECT) {
+			use_pkgconfig = true;
+			pc += " gobject-2.0";
+			if (context.thread) {
+				pc += " gthread-2.0";
+			}
 		}
 		foreach (string pkg in context.get_packages ()) {
-			if (package_exists (pkg))
+			if (package_exists (pkg)) {
+				use_pkgconfig = true;
 				pc += " " + pkg;
+			}
 		}
-		string pkgflags;
-		int exit_status;
-		try {
-			Process.spawn_command_line_sync (pc, out pkgflags, null, out exit_status);
-			if (exit_status != 0) {
-				Report.error (null, "pkg-config exited with status %d".printf (exit_status));
+		string pkgflags = "";
+		if (use_pkgconfig) {
+			try {
+				int exit_status;
+				Process.spawn_command_line_sync (pc, out pkgflags, null, out exit_status);
+				if (exit_status != 0) {
+					Report.error (null, "pkg-config exited with status %d".printf (exit_status));
+					return;
+				}
+			} catch (SpawnError e) {
+				Report.error (null, e.message);
 				return;
 			}
-		} catch (SpawnError e) {
-			Report.error (null, e.message);
-			return;
 		}
 
 		// TODO compile the C code files in parallel
@@ -118,6 +127,7 @@ public class Vala.CCodeCompiler {
 		}
 
 		try {
+			int exit_status;
 			Process.spawn_command_line_sync (cmdline, null, null, out exit_status);
 			if (exit_status != 0) {
 				Report.error (null, "cc exited with status %d".printf (exit_status));
diff --git a/gobject/valaccodegenerator.vala b/gobject/valaccodegenerator.vala
index 9d9b3c8..52b57d6 100644
--- a/gobject/valaccodegenerator.vala
+++ b/gobject/valaccodegenerator.vala
@@ -32,28 +32,45 @@ public class Vala.CCodeGenerator : CodeGenerator {
 	public CCodeModule head;
 
 	public CCodeGenerator () {
-		/* included by inheritance
-		head = new CCodeBaseModule (this, head);
-		head = new CCodeStructModule (this, head);
-		head = new CCodeMethodModule (this, head);
-		head = new CCodeControlFlowModule (this, head);
-		head = new CCodeMemberAccessModule (this, head);
-		head = new CCodeAssignmentModule (this, head);
-		head = new CCodeMethodCallModule (this, head);
-		head = new CCodeArrayModule (this, head);
-		head = new CCodeDelegateModule (this, head);
-		head = new GErrorModule (this, head);
-		head = new GTypeModule (this, head);
-		head = new GObjectModule (this, head);
-		head = new GSignalModule (this, head);
-		head = new GAsyncModule (this, head);
-		head = new DBusClientModule (this, head);
-		*/
-		head = new DBusServerModule (this, head);
 	}
 
 	public override void emit (CodeContext context) {
+		if (context.profile == Profile.GOBJECT) {
+			/* included by inheritance
+			head = new CCodeBaseModule (this, head);
+			head = new CCodeStructModule (this, head);
+			head = new CCodeMethodModule (this, head);
+			head = new CCodeControlFlowModule (this, head);
+			head = new CCodeMemberAccessModule (this, head);
+			head = new CCodeAssignmentModule (this, head);
+			head = new CCodeMethodCallModule (this, head);
+			head = new CCodeArrayModule (this, head);
+			head = new CCodeDelegateModule (this, head);
+			head = new GErrorModule (this, head);
+			head = new GTypeModule (this, head);
+			head = new GObjectModule (this, head);
+			head = new GSignalModule (this, head);
+			head = new GAsyncModule (this, head);
+			head = new DBusClientModule (this, head);
+			*/
+			head = new DBusServerModule (this, head);
+		} else {
+			/* included by inheritance
+			head = new CCodeBaseModule (this, head);
+			head = new CCodeStructModule (this, head);
+			head = new CCodeMethodModule (this, head);
+			head = new CCodeControlFlowModule (this, head);
+			head = new CCodeMemberAccessModule (this, head);
+			head = new CCodeAssignmentModule (this, head);
+			head = new CCodeMethodCallModule (this, head);
+			head = new CCodeArrayModule (this, head);
+			*/
+			head = new CCodeDelegateModule (this, head);
+		}
+
 		head.emit (context);
+
+		head = null;
 	}
 
 	public override void visit_source_file (SourceFile source_file) {
diff --git a/gobject/valaccodemethodmodule.vala b/gobject/valaccodemethodmodule.vala
index ffbe24d..f1bdd9a 100644
--- a/gobject/valaccodemethodmodule.vala
+++ b/gobject/valaccodemethodmodule.vala
@@ -218,7 +218,7 @@ internal class Vala.CCodeMethodModule : CCodeStructModule {
 			if (cl != null && !cl.is_compact) {
 				if (cl.base_class == null) {
 					in_fundamental_creation_method = true;
-				} else if (cl.is_subtype_of (gobject_type)) {
+				} else if (gobject_type != null && cl.is_subtype_of (gobject_type)) {
 					in_gobject_creation_method = true;
 				}
 			}
@@ -603,16 +603,18 @@ internal class Vala.CCodeMethodModule : CCodeStructModule {
 			cmain.add_parameter (new CCodeFormalParameter ("argv", "char **"));
 			var main_block = new CCodeBlock ();
 
-			if (context.thread) {
-				var thread_init_call = new CCodeFunctionCall (new CCodeIdentifier ("g_thread_init"));
-				thread_init_call.line = cmain.line;
-				thread_init_call.add_argument (new CCodeConstant ("NULL"));
-				main_block.add_statement (new CCodeExpressionStatement (thread_init_call)); 
-			}
+			if (context.profile == Profile.GOBJECT) {
+				if (context.thread) {
+					var thread_init_call = new CCodeFunctionCall (new CCodeIdentifier ("g_thread_init"));
+					thread_init_call.line = cmain.line;
+					thread_init_call.add_argument (new CCodeConstant ("NULL"));
+					main_block.add_statement (new CCodeExpressionStatement (thread_init_call)); 
+				}
 
-			var type_init_call = new CCodeExpressionStatement (new CCodeFunctionCall (new CCodeIdentifier ("g_type_init")));
-			type_init_call.line = cmain.line;
-			main_block.add_statement (type_init_call);
+				var type_init_call = new CCodeExpressionStatement (new CCodeFunctionCall (new CCodeIdentifier ("g_type_init")));
+				type_init_call.line = cmain.line;
+				main_block.add_statement (type_init_call);
+			}
 
 			var main_call = new CCodeFunctionCall (new CCodeIdentifier (function.name));
 			if (m.get_parameters ().size == 1) {
@@ -944,7 +946,8 @@ internal class Vala.CCodeMethodModule : CCodeStructModule {
 	public override void visit_creation_method (CreationMethod m) {
 		bool visible = !m.is_private_symbol ();
 
-		if (m.body != null && current_type_symbol is Class && current_class.is_subtype_of (gobject_type)) {
+		if (m.body != null && current_type_symbol is Class
+		    && gobject_type != null && current_class.is_subtype_of (gobject_type)) {
 			int n_params = 0;
 			foreach (Statement stmt in m.body.get_statements ()) {
 				var expr_stmt = stmt as ExpressionStatement;
@@ -995,7 +998,7 @@ internal class Vala.CCodeMethodModule : CCodeStructModule {
 			source_type_member_definition.append (vfunc);
 		}
 
-		if (current_type_symbol is Class && current_class.is_subtype_of (gobject_type)
+		if (current_type_symbol is Class && gobject_type != null && current_class.is_subtype_of (gobject_type)
 		    && (((CreationMethod) m).n_construction_params > 0 || current_class.get_type_parameters ().size > 0)) {
 			var ccond = new CCodeBinaryExpression (CCodeBinaryOperator.GREATER_THAN, new CCodeIdentifier ("__params_it"), new CCodeIdentifier ("__params"));
 			var cdofreeparam = new CCodeBlock ();
diff --git a/gobject/valaccodestructmodule.vala b/gobject/valaccodestructmodule.vala
index 8132c74..e449a7c 100644
--- a/gobject/valaccodestructmodule.vala
+++ b/gobject/valaccodestructmodule.vala
@@ -34,6 +34,22 @@ internal class Vala.CCodeStructModule : CCodeBaseModule {
 			return;
 		}
 
+		if (st.is_boolean_type ()) {
+			// typedef for boolean types
+			decl_space.add_include ("stdbool.h");
+			st.set_cname ("bool");
+			return;
+		} else if (st.is_integer_type ()) {
+			// typedef for integral types
+			decl_space.add_include ("stdint.h");
+			st.set_cname ("%sint%d_t".printf (st.signed ? "" : "u", st.width));
+			return;
+		} else if (st.is_floating_type ()) {
+			// typedef for floating types
+			st.set_cname (st.width == 64 ? "double" : "float");
+			return;
+		}
+
 		if (st.has_type_id) {
 			decl_space.add_type_declaration (new CCodeNewline ());
 			var macro = "(%s_get_type ())".printf (st.get_lower_case_cname (null));
@@ -135,13 +151,15 @@ internal class Vala.CCodeStructModule : CCodeBaseModule {
 
 		st.accept_children (codegen);
 
-		if (st.is_disposable ()) {
-			add_struct_copy_function (st);
-			add_struct_destroy_function (st);
-		}
+		if (!st.is_boolean_type () && !st.is_integer_type () && !st.is_floating_type ()) {
+			if (st.is_disposable ()) {
+				add_struct_copy_function (st);
+				add_struct_destroy_function (st);
+			}
 
-		add_struct_dup_function (st);
-		add_struct_free_function (st);
+			add_struct_dup_function (st);
+			add_struct_free_function (st);
+		}
 
 		current_type_symbol = old_type_symbol;
 		instance_finalize_fragment = old_instance_finalize_fragment;
diff --git a/vala/Makefile.am b/vala/Makefile.am
index 4cffa3e..ea92234 100644
--- a/vala/Makefile.am
+++ b/vala/Makefile.am
@@ -107,6 +107,7 @@ libvalacore_la_VALASOURCES = \
 	valapointerindirection.vala \
 	valapointertype.vala \
 	valapostfixexpression.vala \
+	valaprofile.vala \
 	valapropertyaccessor.vala \
 	valaproperty.vala \
 	valarealliteral.vala \
diff --git a/vala/valacodecontext.vala b/vala/valacodecontext.vala
index 460874f..adc6063 100644
--- a/vala/valacodecontext.vala
+++ b/vala/valacodecontext.vala
@@ -130,6 +130,8 @@ public class Vala.CodeContext {
 	 */
 	public bool save_temps { get; set; }
 
+	public Profile profile { get; set; }
+
 	/**
 	 * Target major version number of glib for code generation.
 	 */
diff --git a/vala/valaprofile.vala b/vala/valaprofile.vala
new file mode 100644
index 0000000..c3d5591
--- /dev/null
+++ b/vala/valaprofile.vala
@@ -0,0 +1,26 @@
+/* valaprofile.vala
+ *
+ * Copyright (C) 2009  Jürg Billeter
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301  USA
+ *
+ * Author:
+ * 	Jürg Billeter <j bitron ch>
+ */
+
+public enum Vala.Profile {
+	POSIX,
+	GOBJECT
+}
diff --git a/vala/valasemanticanalyzer.vala b/vala/valasemanticanalyzer.vala
index 45de1a9..47f806a 100644
--- a/vala/valasemanticanalyzer.vala
+++ b/vala/valasemanticanalyzer.vala
@@ -90,15 +90,25 @@ public class Vala.SemanticAnalyzer : CodeVisitor {
 		uint_type = new IntegerType ((Struct) root_symbol.scope.lookup ("uint"));
 		long_type = new IntegerType ((Struct) root_symbol.scope.lookup ("long"));
 		ulong_type = new IntegerType ((Struct) root_symbol.scope.lookup ("ulong"));
-		size_t_type = new IntegerType ((Struct) root_symbol.scope.lookup ("size_t"));
-		ssize_t_type = new IntegerType ((Struct) root_symbol.scope.lookup ("ssize_t"));
 		int8_type = new IntegerType ((Struct) root_symbol.scope.lookup ("int8"));
-		unichar_type = new IntegerType ((Struct) root_symbol.scope.lookup ("unichar"));
 		double_type = new FloatingType ((Struct) root_symbol.scope.lookup ("double"));
 
-		// TODO: don't require GLib namespace in semantic analyzer
-		var glib_ns = root_symbol.scope.lookup ("GLib");
-		if (glib_ns != null) {
+		var unichar_struct = (Struct) root_symbol.scope.lookup ("unichar");
+		if (unichar_struct != null) {
+			unichar_type = new IntegerType (unichar_struct);
+		}
+		var size_t_struct = (Struct) root_symbol.scope.lookup ("size_t");
+		if (size_t_struct != null) {
+			size_t_type = new IntegerType (size_t_struct);
+		}
+		var ssize_t_struct = (Struct) root_symbol.scope.lookup ("ssize_t");
+		if (ssize_t_struct != null) {
+			ssize_t_type = new IntegerType (ssize_t_struct);
+		}
+
+		if (context.profile == Profile.GOBJECT) {
+			var glib_ns = root_symbol.scope.lookup ("GLib");
+
 			object_type = (Class) glib_ns.scope.lookup ("Object");
 			type_type = new IntegerType ((Struct) glib_ns.scope.lookup ("Type"));
 
diff --git a/vala/valastruct.vala b/vala/valastruct.vala
index 337e432..573aa97 100644
--- a/vala/valastruct.vala
+++ b/vala/valastruct.vala
@@ -91,6 +91,10 @@ public class Vala.Struct : TypeSymbol {
 	 */
 	public bool has_type_id { get; set; default = true; }
 
+	public int width { get; set; default = 32; }
+
+	public bool signed { get; set; default = true; }
+
 	/**
 	 * Creates a new struct.
 	 *
@@ -412,6 +416,12 @@ public class Vala.Struct : TypeSymbol {
 		if (a.has_argument ("rank")) {
 			rank = a.get_integer ("rank");
 		}
+		if (a.has_argument ("width")) {
+			width = a.get_integer ("width");
+		}
+		if (a.has_argument ("signed")) {
+			signed = a.get_bool ("signed");
+		}
 	}
 
 	private void process_floating_type_attribute (Attribute a) {
@@ -419,6 +429,9 @@ public class Vala.Struct : TypeSymbol {
 		if (a.has_argument ("rank")) {
 			rank = a.get_integer ("rank");
 		}
+		if (a.has_argument ("width")) {
+			width = a.get_integer ("width");
+		}
 	}
 	
 	/**
@@ -579,7 +592,8 @@ public class Vala.Struct : TypeSymbol {
 				return true;
 			}
 		}
-		return get_attribute ("SimpleType") != null;
+		return (boolean_type || integer_type || floating_type
+		        || get_attribute ("SimpleType") != null);
 	}
 
 	/**
@@ -718,7 +732,8 @@ public class Vala.Struct : TypeSymbol {
 			m.check (analyzer);
 		}
 
-		if (!external && !external_package && base_type == null && get_fields ().size == 0) {
+		if (!external && !external_package && base_type == null && get_fields ().size == 0
+		    && !is_boolean_type () && !is_integer_type () && !is_floating_type ()) {
 			error = true;
 			Report.error (source_reference, "structs cannot be empty");
 		}
diff --git a/vapi/posix.vapi b/vapi/posix.vapi
index 3987175..d487e65 100644
--- a/vapi/posix.vapi
+++ b/vapi/posix.vapi
@@ -20,6 +20,126 @@
  * 	Jürg Billeter <j bitron ch>
  */
 
+#if POSIX
+[CCode (cname = "bool", cheader_filename = "stdbool.h", default_value = "false")]
+[BooleanType]
+public struct bool {
+}
+
+[CCode (cname = "char", default_value = "\'\\0\'")]
+[IntegerType (rank = 2, min = 0, max = 127)]
+public struct char {
+}
+
+[CCode (cname = "unsigned char", default_value = "\'\\0\'")]
+[IntegerType (rank = 3, min = 0, max = 255)]
+public struct uchar {
+}
+
+[CCode (cname = "int", default_value = "0")]
+[IntegerType (rank = 6)]
+public struct int {
+}
+
+[CCode (cname = "unsigned int", default_value = "0U")]
+[IntegerType (rank = 7)]
+public struct uint {
+}
+
+[CCode (cname = "short", default_value = "0")]
+[IntegerType (rank = 4, min = -32768, max = 32767)]
+public struct short {
+}
+
+[CCode (cname = "unsigned short", default_value = "0U")]
+[IntegerType (rank = 5, min = 0, max = 65535)]
+public struct ushort {
+}
+
+[CCode (cname = "long", default_value = "0L")]
+[IntegerType (rank = 8)]
+public struct long {
+}
+
+[CCode (cname = "unsigned long", default_value = "0UL")]
+[IntegerType (rank = 9)]
+public struct ulong {
+}
+
+[CCode (cname = "size_t", cheader_filename = "sys/types.h", default_value = "0UL")]
+[IntegerType (rank = 9)]
+public struct size_t {
+}
+
+[CCode (cname = "ssize_t", cheader_filename = "sys/types.h", default_value = "0L")]
+[IntegerType (rank = 8)]
+public struct ssize_t {
+}
+
+[CCode (cname = "int8_t", cheader_filename = "stdint.h", default_value = "0")]
+[IntegerType (rank = 1, min = -128, max = 127)]
+public struct int8 {
+}
+
+[CCode (cname = "uint8_t", cheader_filename = "stdint.h", default_value = "0U")]
+[IntegerType (rank = 3, min = 0, max = 255)]
+public struct uint8 {
+}
+
+[CCode (cname = "int16_t", cheader_filename = "stdint.h", default_value = "0")]
+[IntegerType (rank = 4, min = -32768, max = 32767)]
+public struct int16 {
+}
+
+[CCode (cname = "uint16_t", cheader_filename = "stdint.h", default_value = "0U")]
+[IntegerType (rank = 5, min = 0, max = 65535)]
+public struct uint16 {
+}
+
+[CCode (cname = "int32_t", cheader_filename = "stdint.h", default_value = "0")]
+[IntegerType (rank = 6)]
+public struct int32 {
+}
+
+[CCode (cname = "uint32_t", cheader_filename = "stdint.h", default_value = "0U")]
+[IntegerType (rank = 7)]
+public struct uint32 {
+}
+
+[CCode (cname = "int64_t", cheader_filename = "stdint.h", default_value = "0LL")]
+[IntegerType (rank = 10)]
+public struct int64 {
+}
+
+[CCode (cname = "uint64_t", cheader_filename = "stdint.h", default_value = "0ULL")]
+[IntegerType (rank = 11)]
+public struct uint64 {
+}
+
+[CCode (cname = "float", default_value = "0.0F")]
+[FloatingType (rank = 1)]
+public struct float {
+}
+
+[CCode (cname = "double", default_value = "0.0")]
+[FloatingType (rank = 2)]
+public struct double {
+}
+
+[CCode (cheader_filename = "time.h")]
+[IntegerType (rank = 8)]
+public struct time_t {
+	[CCode (cname = "time")]
+	public time_t ();
+}
+
+[Compact]
+[Immutable]
+[CCode (cname = "char", const_cname = "const char", copy_function = "strdup", free_function = "free", cheader_filename = "stdlib.h,string.h")]
+public class string {
+}
+#endif
+
 [CCode (cprefix = "", lower_case_cprefix = "")]
 namespace Posix {
 	[CCode (cheader_filename = "assert.h")]
@@ -427,6 +547,10 @@ namespace Posix {
 	[CCode (cheader_filename = "signal.h")]
 	public sighandler_t signal (int signum, sighandler_t? handler);
 
+	[CCode (cheader_filename = "stdio.h")]
+	[PrintfFormat]
+	public void printf (string format,...);
+
 	[CCode (cheader_filename = "stdlib.h")]
 	public void abort ();
 	[CCode (cheader_filename = "stdlib.h")]



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]