vala r2269 - in trunk: . compiler gobject vala vapi vapigen
- From: juergbi svn gnome org
- To: svn-commits-list gnome org
- Subject: vala r2269 - in trunk: . compiler gobject vala vapi vapigen
- Date: Sun, 4 Jan 2009 17:23:26 +0000 (UTC)
Author: juergbi
Date: Sun Jan 4 17:23:26 2009
New Revision: 2269
URL: http://svn.gnome.org/viewvc/vala?rev=2269&view=rev
Log:
2009-01-04 JÃrg Billeter <j bitron ch>
* gobject/valaccodecontrolflowmodule.vala:
Drop obsolete foreach support for null-terminated arrays
* gobject/valaccodearraymodule.vala:
Fix array length C expression for null-terminated array fields,
drop obsolete array_free support for null-terminated arrays
* gobject/valaccodeassignmentmodule.vala:
Correctly obey no_array_length when assigning to fields
* vala/valacodecontext.vala:
* gobject/valaccodecompiler.vala:
* compiler/valacompiler.vala:
* vapi/glib-2.0.vapi:
* vapigen/valavapigen.vala:
Use array_null_termianted attribute where appropriate
Modified:
trunk/ChangeLog
trunk/compiler/valacompiler.vala
trunk/gobject/valaccodearraymodule.vala
trunk/gobject/valaccodeassignmentmodule.vala
trunk/gobject/valaccodecompiler.vala
trunk/gobject/valaccodecontrolflowmodule.vala
trunk/vala/valacodecontext.vala
trunk/vapi/glib-2.0.vapi
trunk/vapigen/valavapigen.vala
Modified: trunk/compiler/valacompiler.vala
==============================================================================
--- trunk/compiler/valacompiler.vala (original)
+++ trunk/compiler/valacompiler.vala Sun Jan 4 17:23:26 2009
@@ -27,14 +27,14 @@
static string basedir;
static string directory;
static bool version;
- [CCode (array_length = false)]
+ [CCode (array_length = false, array_null_terminated = true)]
[NoArrayLength]
static string[] sources;
- [CCode (array_length = false)]
+ [CCode (array_length = false, array_null_terminated = true)]
[NoArrayLength]
static string[] vapi_directories;
static string library;
- [CCode (array_length = false)]
+ [CCode (array_length = false, array_null_terminated = true)]
[NoArrayLength]
static string[] packages;
static string target_glib;
@@ -50,7 +50,7 @@
static bool non_null_experimental;
static bool disable_dbus_transformation;
static string cc_command;
- [CCode (array_length = false)]
+ [CCode (array_length = false, array_null_terminated = true)]
[NoArrayLength]
static string[] cc_options;
static string dump_tree;
Modified: trunk/gobject/valaccodearraymodule.vala
==============================================================================
--- trunk/gobject/valaccodearraymodule.vala (original)
+++ trunk/gobject/valaccodearraymodule.vala Sun Jan 4 17:23:26 2009
@@ -170,7 +170,32 @@
} else if (array_expr.symbol_reference is Field) {
var field = (Field) array_expr.symbol_reference;
if (field.array_null_terminated) {
- var carray_expr = (CCodeExpression) array_expr.ccodenode;
+ var ma = (MemberAccess) array_expr;
+
+ CCodeExpression carray_expr = null;
+
+ if (field.binding == MemberBinding.INSTANCE) {
+ var cl = field.parent_symbol as Class;
+ bool is_gtypeinstance = (cl != null && !cl.is_compact);
+
+ string array_cname = field.get_cname ();
+ CCodeExpression typed_inst = (CCodeExpression) get_ccodenode (ma.inner);
+
+ CCodeExpression inst;
+ if (is_gtypeinstance && field.access == SymbolAccessibility.PRIVATE) {
+ inst = new CCodeMemberAccess.pointer (typed_inst, "priv");
+ } else {
+ inst = typed_inst;
+ }
+ if (((TypeSymbol) field.parent_symbol).is_reference_type ()) {
+ carray_expr = new CCodeMemberAccess.pointer (inst, array_cname);
+ } else {
+ carray_expr = new CCodeMemberAccess (inst, array_cname);
+ }
+ } else {
+ carray_expr = new CCodeIdentifier (field.get_cname ());
+ }
+
var len_call = new CCodeFunctionCall (new CCodeIdentifier ("g_strv_length"));
len_call.add_argument (carray_expr);
return len_call;
@@ -343,7 +368,7 @@
}
}
- private CCodeForStatement get_vala_array_free_loop (bool have_length) {
+ private CCodeForStatement get_vala_array_free_loop () {
var cbody = new CCodeBlock ();
var cptrarray = new CCodeCastExpression (new CCodeIdentifier ("array"), "gpointer*");
var cea = new CCodeElementAccess (cptrarray, new CCodeIdentifier ("i"));
@@ -351,16 +376,11 @@
var cfreecall = new CCodeFunctionCall (new CCodeIdentifier ("destroy_func"));
cfreecall.add_argument (cea);
- CCodeExpression cforcond;
-
- if (have_length) {
- var cfreecond = new CCodeBinaryExpression (CCodeBinaryOperator.INEQUALITY, cea, new CCodeConstant ("NULL"));
- cforcond = new CCodeBinaryExpression (CCodeBinaryOperator.LESS_THAN, new CCodeIdentifier ("i"), new CCodeIdentifier ("array_length"));
- cbody.add_statement (new CCodeIfStatement (cfreecond, new CCodeExpressionStatement (cfreecall)));
- } else {
- cforcond = new CCodeBinaryExpression (CCodeBinaryOperator.INEQUALITY, cea, new CCodeConstant ("NULL"));
- cbody.add_statement (new CCodeExpressionStatement (cfreecall));
- }
+ var cfreecond = new CCodeBinaryExpression (CCodeBinaryOperator.INEQUALITY, cea, new CCodeConstant ("NULL"));
+ var cforcond = new CCodeBinaryExpression (CCodeBinaryOperator.LESS_THAN, new CCodeIdentifier ("i"), new CCodeIdentifier ("array_length"));
+ var cfreeblock = new CCodeBlock ();
+ cfreeblock.add_statement (new CCodeExpressionStatement (cfreecall));
+ cbody.add_statement (new CCodeIfStatement (cfreecond, cfreeblock));
var cfor = new CCodeForStatement (cforcond, cbody);
cfor.add_initializer (new CCodeAssignment (new CCodeIdentifier ("i"), new CCodeConstant ("0")));
@@ -383,9 +403,7 @@
citdecl.add_declarator (new CCodeVariableDeclarator ("i"));
cdofree.add_statement (citdecl);
- var clencheck = new CCodeBinaryExpression (CCodeBinaryOperator.GREATER_THAN_OR_EQUAL, new CCodeIdentifier ("array_length"), new CCodeConstant ("0"));
- var ciflen = new CCodeIfStatement (clencheck, get_vala_array_free_loop (true), get_vala_array_free_loop (false));
- cdofree.add_statement (ciflen);
+ cdofree.add_statement (get_vala_array_free_loop ());
var ccondarr = new CCodeBinaryExpression (CCodeBinaryOperator.INEQUALITY, new CCodeIdentifier ("array"), new CCodeConstant ("NULL"));
var ccondfunc = new CCodeBinaryExpression (CCodeBinaryOperator.INEQUALITY, new CCodeIdentifier ("destroy_func"), new CCodeConstant ("NULL"));
Modified: trunk/gobject/valaccodeassignmentmodule.vala
==============================================================================
--- trunk/gobject/valaccodeassignmentmodule.vala (original)
+++ trunk/gobject/valaccodeassignmentmodule.vala Sun Jan 4 17:23:26 2009
@@ -145,7 +145,8 @@
bool array = false;
bool instance_delegate = false;
if (assignment.left.value_type is ArrayType) {
- array = !(head.get_array_length_cexpression (assignment.left, 1) is CCodeConstant);
+ var array_field = assignment.left.symbol_reference as Field;
+ array = (array_field == null || !array_field.no_array_length);
} else if (assignment.left.value_type is DelegateType) {
var delegate_type = (DelegateType) assignment.left.value_type;
instance_delegate = delegate_type.delegate_symbol.has_target;
@@ -172,8 +173,7 @@
if (array_type.rank == 1) {
var array_var = assignment.left.symbol_reference;
if (array_var != null && array_var.is_internal_symbol ()
- && (assignment.left.symbol_reference is LocalVariable
- || assignment.left.symbol_reference is Field)) {
+ && (array_var is LocalVariable || array_var is Field)) {
var lhs_array_size = head.get_array_size_cexpression (assignment.left);
var rhs_array_len = head.get_array_length_cexpression (assignment.left, 1);
ccomma.append_expression (new CCodeAssignment (lhs_array_size, rhs_array_len));
Modified: trunk/gobject/valaccodecompiler.vala
==============================================================================
--- trunk/gobject/valaccodecompiler.vala (original)
+++ trunk/gobject/valaccodecompiler.vala Sun Jan 4 17:23:26 2009
@@ -49,7 +49,7 @@
* @param context a code context
*/
[NoArrayLength]
- public void compile (CodeContext context, string? cc_command, [CCode (array_length = false)] string[] cc_options) {
+ public void compile (CodeContext context, string? cc_command, string[] cc_options) {
string pc = "pkg-config --cflags";
if (!context.compile_only) {
pc += " --libs";
Modified: trunk/gobject/valaccodecontrolflowmodule.vala
==============================================================================
--- trunk/gobject/valaccodecontrolflowmodule.vala (original)
+++ trunk/gobject/valaccodecontrolflowmodule.vala Sun Jan 4 17:23:26 2009
@@ -315,144 +315,61 @@
cblock.add_statement (clendecl);
}
- if (array_len is CCodeConstant) {
- // the array has no length parameter i.e. it is NULL-terminated array
-
- var it_name = "%s_it".printf (stmt.variable_name);
+ var it_name = (stmt.variable_name + "_it");
+
+ if (current_method != null && current_method.coroutine) {
+ closure_struct.add_field ("int", it_name);
+ } else {
+ var citdecl = new CCodeDeclaration ("int");
+ citdecl.add_declarator (new CCodeVariableDeclarator (it_name));
+ cblock.add_statement (citdecl);
+ }
- if (current_method != null && current_method.coroutine) {
- closure_struct.add_field (collection_type.get_cname (), it_name);
- } else {
- var citdecl = new CCodeDeclaration (collection_type.get_cname ());
- citdecl.add_declarator (new CCodeVariableDeclarator (it_name));
- cblock.add_statement (citdecl);
- }
-
- var cbody = new CCodeBlock ();
-
- CCodeExpression element_expr = get_variable_cexpression ("*%s".printf (it_name));
+ var cbody = new CCodeBlock ();
- var element_type = array_type.element_type.copy ();
- element_type.value_owned = false;
- element_expr = transform_expression (element_expr, element_type, stmt.type_reference);
-
- cfrag = new CCodeFragment ();
- append_temp_decl (cfrag, temp_vars);
- cbody.add_statement (cfrag);
- temp_vars.clear ();
-
- if (current_method != null && current_method.coroutine) {
- closure_struct.add_field (stmt.type_reference.get_cname (), stmt.variable_name);
- cbody.add_statement (new CCodeExpressionStatement (new CCodeAssignment (get_variable_cexpression (stmt.variable_name), element_expr)));
- } else {
- var cdecl = new CCodeDeclaration (stmt.type_reference.get_cname ());
- cdecl.add_declarator (new CCodeVariableDeclarator.with_initializer (stmt.variable_name, element_expr));
- cbody.add_statement (cdecl);
- }
+ CCodeExpression element_expr = new CCodeElementAccess (get_variable_cexpression (collection_backup.name), get_variable_cexpression (it_name));
- // add array length variable for stacked arrays
- if (stmt.type_reference is ArrayType) {
- var inner_array_type = (ArrayType) stmt.type_reference;
- for (int dim = 1; dim <= inner_array_type.rank; dim++) {
- if (current_method != null && current_method.coroutine) {
- closure_struct.add_field ("int", head.get_array_length_cname (stmt.variable_name, dim));
- cbody.add_statement (new CCodeExpressionStatement (new CCodeAssignment (get_variable_cexpression (head.get_array_length_cname (stmt.variable_name, dim)), new CCodeConstant ("-1"))));
- } else {
- var cdecl = new CCodeDeclaration ("int");
- cdecl.add_declarator (new CCodeVariableDeclarator.with_initializer (head.get_array_length_cname (stmt.variable_name, dim), new CCodeConstant ("-1")));
- cbody.add_statement (cdecl);
- }
- }
- }
+ var element_type = array_type.element_type.copy ();
+ element_type.value_owned = false;
+ element_expr = transform_expression (element_expr, element_type, stmt.type_reference);
- cbody.add_statement (stmt.body.ccodenode);
-
- var ccond = new CCodeBinaryExpression (CCodeBinaryOperator.INEQUALITY, new CCodeIdentifier ("*%s".printf (it_name)), new CCodeConstant ("NULL"));
-
- var cfor = new CCodeForStatement (ccond, cbody);
+ cfrag = new CCodeFragment ();
+ append_temp_decl (cfrag, temp_vars);
+ cbody.add_statement (cfrag);
+ temp_vars.clear ();
- cfor.add_initializer (new CCodeAssignment (new CCodeIdentifier (it_name), new CCodeIdentifier (collection_backup.name)));
-
- cfor.add_iterator (new CCodeAssignment (new CCodeIdentifier (it_name), new CCodeBinaryExpression (CCodeBinaryOperator.PLUS, new CCodeIdentifier (it_name), new CCodeConstant ("1"))));
- cblock.add_statement (cfor);
+ if (current_method != null && current_method.coroutine) {
+ closure_struct.add_field (stmt.type_reference.get_cname (), stmt.variable_name);
+ cbody.add_statement (new CCodeExpressionStatement (new CCodeAssignment (get_variable_cexpression (stmt.variable_name), element_expr)));
} else {
- // the array has a length parameter
-
- var it_name = (stmt.variable_name + "_it");
-
- if (current_method != null && current_method.coroutine) {
- closure_struct.add_field ("int", it_name);
- } else {
- var citdecl = new CCodeDeclaration ("int");
- citdecl.add_declarator (new CCodeVariableDeclarator (it_name));
- cblock.add_statement (citdecl);
- }
-
- var cbody = new CCodeBlock ();
-
- CCodeExpression element_expr = new CCodeElementAccess (get_variable_cexpression (collection_backup.name), get_variable_cexpression (it_name));
-
- var element_type = array_type.element_type.copy ();
- element_type.value_owned = false;
- element_expr = transform_expression (element_expr, element_type, stmt.type_reference);
-
- cfrag = new CCodeFragment ();
- append_temp_decl (cfrag, temp_vars);
- cbody.add_statement (cfrag);
- temp_vars.clear ();
-
- if (current_method != null && current_method.coroutine) {
- closure_struct.add_field (stmt.type_reference.get_cname (), stmt.variable_name);
- cbody.add_statement (new CCodeExpressionStatement (new CCodeAssignment (get_variable_cexpression (stmt.variable_name), element_expr)));
- } else {
- var cdecl = new CCodeDeclaration (stmt.type_reference.get_cname ());
- cdecl.add_declarator (new CCodeVariableDeclarator.with_initializer (stmt.variable_name, element_expr));
- cbody.add_statement (cdecl);
- }
+ var cdecl = new CCodeDeclaration (stmt.type_reference.get_cname ());
+ cdecl.add_declarator (new CCodeVariableDeclarator.with_initializer (stmt.variable_name, element_expr));
+ cbody.add_statement (cdecl);
+ }
- // add array length variable for stacked arrays
- if (stmt.type_reference is ArrayType) {
- var inner_array_type = (ArrayType) stmt.type_reference;
- for (int dim = 1; dim <= inner_array_type.rank; dim++) {
- if (current_method != null && current_method.coroutine) {
- closure_struct.add_field ("int", head.get_array_length_cname (stmt.variable_name, dim));
- cbody.add_statement (new CCodeExpressionStatement (new CCodeAssignment (get_variable_cexpression (head.get_array_length_cname (stmt.variable_name, dim)), new CCodeConstant ("-1"))));
- } else {
- var cdecl = new CCodeDeclaration ("int");
- cdecl.add_declarator (new CCodeVariableDeclarator.with_initializer (head.get_array_length_cname (stmt.variable_name, dim), new CCodeConstant ("-1")));
- cbody.add_statement (cdecl);
- }
+ // add array length variable for stacked arrays
+ if (stmt.type_reference is ArrayType) {
+ var inner_array_type = (ArrayType) stmt.type_reference;
+ for (int dim = 1; dim <= inner_array_type.rank; dim++) {
+ if (current_method != null && current_method.coroutine) {
+ closure_struct.add_field ("int", head.get_array_length_cname (stmt.variable_name, dim));
+ cbody.add_statement (new CCodeExpressionStatement (new CCodeAssignment (get_variable_cexpression (head.get_array_length_cname (stmt.variable_name, dim)), new CCodeConstant ("-1"))));
+ } else {
+ var cdecl = new CCodeDeclaration ("int");
+ cdecl.add_declarator (new CCodeVariableDeclarator.with_initializer (head.get_array_length_cname (stmt.variable_name, dim), new CCodeConstant ("-1")));
+ cbody.add_statement (cdecl);
}
}
+ }
- cbody.add_statement (stmt.body.ccodenode);
-
- var ccond_ind1 = new CCodeBinaryExpression (CCodeBinaryOperator.INEQUALITY, array_len, new CCodeConstant ("-1"));
- var ccond_ind2 = new CCodeBinaryExpression (CCodeBinaryOperator.LESS_THAN, get_variable_cexpression (it_name), array_len);
- var ccond_ind = new CCodeBinaryExpression (CCodeBinaryOperator.AND, ccond_ind1, ccond_ind2);
-
- /* only check for null if the containers elements are of reference-type */
- CCodeBinaryExpression ccond;
- if (array_type.element_type.is_reference_type_or_type_parameter ()) {
- var ccond_term1 = new CCodeBinaryExpression (CCodeBinaryOperator.EQUALITY, array_len, new CCodeConstant ("-1"));
- var ccond_term2 = new CCodeBinaryExpression (CCodeBinaryOperator.INEQUALITY, new CCodeElementAccess (new CCodeIdentifier (collection_backup.name), get_variable_cexpression (it_name)), new CCodeConstant ("NULL"));
- var ccond_term = new CCodeBinaryExpression (CCodeBinaryOperator.AND, ccond_term1, ccond_term2);
-
- ccond = new CCodeBinaryExpression (CCodeBinaryOperator.OR, ccond_ind, ccond_term);
- } else {
- /* assert when trying to iterate over value-type arrays of unknown length */
- var cassert = new CCodeFunctionCall (new CCodeIdentifier ("g_assert"));
- cassert.add_argument (ccond_ind1);
- cblock.add_statement (new CCodeExpressionStatement (cassert));
+ cbody.add_statement (stmt.body.ccodenode);
+
+ var ccond = new CCodeBinaryExpression (CCodeBinaryOperator.LESS_THAN, get_variable_cexpression (it_name), array_len);
- ccond = ccond_ind2;
- }
-
- var cfor = new CCodeForStatement (ccond, cbody);
- cfor.add_initializer (new CCodeAssignment (get_variable_cexpression (it_name), new CCodeConstant ("0")));
- cfor.add_iterator (new CCodeAssignment (get_variable_cexpression (it_name), new CCodeBinaryExpression (CCodeBinaryOperator.PLUS, get_variable_cexpression (it_name), new CCodeConstant ("1"))));
- cblock.add_statement (cfor);
- }
+ var cfor = new CCodeForStatement (ccond, cbody);
+ cfor.add_initializer (new CCodeAssignment (get_variable_cexpression (it_name), new CCodeConstant ("0")));
+ cfor.add_iterator (new CCodeAssignment (get_variable_cexpression (it_name), new CCodeBinaryExpression (CCodeBinaryOperator.PLUS, get_variable_cexpression (it_name), new CCodeConstant ("1"))));
+ cblock.add_statement (cfor);
} else if (stmt.collection.value_type.compatible (new ObjectType (glist_type)) || stmt.collection.value_type.compatible (new ObjectType (gslist_type))) {
// iterating over a GList or GSList
Modified: trunk/vala/valacodecontext.vala
==============================================================================
--- trunk/vala/valacodecontext.vala (original)
+++ trunk/vala/valacodecontext.vala Sun Jan 4 17:23:26 2009
@@ -1,6 +1,6 @@
/* valacodecontext.vala
*
- * Copyright (C) 2006-2008 JÃrg Billeter
+ * Copyright (C) 2006-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
@@ -380,7 +380,7 @@
file.mark = 2;
}
- public string? get_package_path (string pkg, [CCode (array_length_pos = 1.9)] string[] vapi_directories) {
+ public string? get_package_path (string pkg, string[] vapi_directories) {
string basename = "%s.vapi".printf (pkg);
string filename = null;
Modified: trunk/vapi/glib-2.0.vapi
==============================================================================
--- trunk/vapi/glib-2.0.vapi (original)
+++ trunk/vapi/glib-2.0.vapi Sun Jan 4 17:23:26 2009
@@ -1787,7 +1787,7 @@
public static bool set_variable (string variable, string value, bool overwrite);
[CCode (cname = "g_unsetenv")]
public static void unset_variable (string variable);
- [CCode (cname = "g_listenv", array_length = false)]
+ [CCode (cname = "g_listenv", array_length = false, array_null_terminated = true)]
public static string[] list_variables ();
[CCode (cname = "g_get_user_name")]
public static weak string get_user_name ();
@@ -1801,7 +1801,7 @@
public static weak string get_user_config_dir ();
[CCode (cname = "g_get_user_special_dir")]
public static weak string get_user_special_dir (UserDirectory directory);
- [CCode (cname = "g_get_system_data_dirs", array_length = false)]
+ [CCode (cname = "g_get_system_data_dirs", array_length = false, array_null_terminated = true)]
[NoArrayLength]
public static weak string[] get_system_data_dirs ();
[CCode (cname = "g_get_system_config_dirs")]
Modified: trunk/vapigen/valavapigen.vala
==============================================================================
--- trunk/vapigen/valavapigen.vala (original)
+++ trunk/vapigen/valavapigen.vala Sun Jan 4 17:23:26 2009
@@ -26,14 +26,14 @@
static string directory;
static bool version;
static bool quiet_mode;
- [CCode (array_length = false)]
+ [CCode (array_length = false, array_null_terminated = true)]
[NoArrayLength]
static string[] sources;
- [CCode (array_length = false)]
+ [CCode (array_length = false, array_null_terminated = true)]
[NoArrayLength]
static string[] vapi_directories;
static string library;
- [CCode (array_length = false)]
+ [CCode (array_length = false, array_null_terminated = true)]
[NoArrayLength]
static string[] packages;
static string metadata_filename;
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]