[vala] Add initial support for POSIX profile
- From: Jürg Billeter <juergbi src gnome org>
- To: svn-commits-list gnome org
- Subject: [vala] Add initial support for POSIX profile
- Date: Fri, 8 May 2009 06:18:35 -0400 (EDT)
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]