[vala] dova: Do not emit empty arrays for empty lists, sets, or maps
- From: Jürg Billeter <juergbi src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [vala] dova: Do not emit empty arrays for empty lists, sets, or maps
- Date: Fri, 6 Aug 2010 16:40:25 +0000 (UTC)
commit 822caa5aeec93294d814176a2d8910eb551a3122
Author: Jürg Billeter <j bitron ch>
Date: Fri Aug 6 17:25:14 2010 +0200
dova: Do not emit empty arrays for empty lists, sets, or maps
codegen/valadovavaluemodule.vala | 125 ++++++++++++++++++++++----------------
1 files changed, 72 insertions(+), 53 deletions(-)
---
diff --git a/codegen/valadovavaluemodule.vala b/codegen/valadovavaluemodule.vala
index ba9d211..cabf73b 100644
--- a/codegen/valadovavaluemodule.vala
+++ b/codegen/valadovavaluemodule.vala
@@ -541,28 +541,34 @@ internal class Vala.DovaValueModule : DovaObjectModule {
public override void visit_list_literal (ListLiteral expr) {
expr.accept_children (codegen);
- var array_type = new ArrayType (expr.element_type, 1, expr.source_reference);
- array_type.inline_allocated = true;
- array_type.fixed_length = true;
- array_type.length = expr.get_expressions ().size;
-
var ce = new CCodeCommaExpression ();
- var temp_var = get_temp_variable (array_type, true, expr);
- var name_cnode = get_variable_cexpression (temp_var.name);
+ int length = expr.get_expressions ().size;
- temp_vars.insert (0, temp_var);
+ if (length == 0) {
+ ce.append_expression (new CCodeConstant ("NULL"));
+ } else {
+ var array_type = new ArrayType (expr.element_type, 1, expr.source_reference);
+ array_type.inline_allocated = true;
+ array_type.fixed_length = true;
+ array_type.length = length;
- int i = 0;
- foreach (Expression e in expr.get_expressions ()) {
- ce.append_expression (new CCodeAssignment (new CCodeElementAccess (name_cnode, new CCodeConstant (i.to_string ())), (CCodeExpression) e.ccodenode));
- i++;
- }
+ var temp_var = get_temp_variable (array_type, true, expr);
+ var name_cnode = get_variable_cexpression (temp_var.name);
- ce.append_expression (name_cnode);
+ temp_vars.insert (0, temp_var);
+
+ int i = 0;
+ foreach (Expression e in expr.get_expressions ()) {
+ ce.append_expression (new CCodeAssignment (new CCodeElementAccess (name_cnode, new CCodeConstant (i.to_string ())), (CCodeExpression) e.ccodenode));
+ i++;
+ }
+
+ ce.append_expression (name_cnode);
+ }
var list_creation = new CCodeFunctionCall (new CCodeIdentifier ("dova_list_new"));
list_creation.add_argument (get_type_id_expression (expr.element_type));
- list_creation.add_argument (new CCodeConstant (array_type.length.to_string ()));
+ list_creation.add_argument (new CCodeConstant (length.to_string ()));
list_creation.add_argument (ce);
expr.ccodenode = list_creation;
@@ -571,28 +577,34 @@ internal class Vala.DovaValueModule : DovaObjectModule {
public override void visit_set_literal (SetLiteral expr) {
expr.accept_children (codegen);
- var array_type = new ArrayType (expr.element_type, 1, expr.source_reference);
- array_type.inline_allocated = true;
- array_type.fixed_length = true;
- array_type.length = expr.get_expressions ().size;
-
var ce = new CCodeCommaExpression ();
- var temp_var = get_temp_variable (array_type, true, expr);
- var name_cnode = get_variable_cexpression (temp_var.name);
+ int length = expr.get_expressions ().size;
- temp_vars.insert (0, temp_var);
+ if (length == 0) {
+ ce.append_expression (new CCodeConstant ("NULL"));
+ } else {
+ var array_type = new ArrayType (expr.element_type, 1, expr.source_reference);
+ array_type.inline_allocated = true;
+ array_type.fixed_length = true;
+ array_type.length = length;
- int i = 0;
- foreach (Expression e in expr.get_expressions ()) {
- ce.append_expression (new CCodeAssignment (new CCodeElementAccess (name_cnode, new CCodeConstant (i.to_string ())), (CCodeExpression) e.ccodenode));
- i++;
- }
+ var temp_var = get_temp_variable (array_type, true, expr);
+ var name_cnode = get_variable_cexpression (temp_var.name);
- ce.append_expression (name_cnode);
+ temp_vars.insert (0, temp_var);
+
+ int i = 0;
+ foreach (Expression e in expr.get_expressions ()) {
+ ce.append_expression (new CCodeAssignment (new CCodeElementAccess (name_cnode, new CCodeConstant (i.to_string ())), (CCodeExpression) e.ccodenode));
+ i++;
+ }
+
+ ce.append_expression (name_cnode);
+ }
var set_creation = new CCodeFunctionCall (new CCodeIdentifier ("dova_set_new"));
set_creation.add_argument (get_type_id_expression (expr.element_type));
- set_creation.add_argument (new CCodeConstant (array_type.length.to_string ()));
+ set_creation.add_argument (new CCodeConstant (length.to_string ()));
set_creation.add_argument (ce);
expr.ccodenode = set_creation;
@@ -601,40 +613,47 @@ internal class Vala.DovaValueModule : DovaObjectModule {
public override void visit_map_literal (MapLiteral expr) {
expr.accept_children (codegen);
- var key_array_type = new ArrayType (expr.map_key_type, 1, expr.source_reference);
- key_array_type.inline_allocated = true;
- key_array_type.fixed_length = true;
- key_array_type.length = expr.get_keys ().size;
-
var key_ce = new CCodeCommaExpression ();
- var key_temp_var = get_temp_variable (key_array_type, true, expr);
- var key_name_cnode = get_variable_cexpression (key_temp_var.name);
+ var value_ce = new CCodeCommaExpression ();
+ int length = expr.get_keys ().size;
- temp_vars.insert (0, key_temp_var);
+ if (length == 0) {
+ key_ce.append_expression (new CCodeConstant ("NULL"));
+ value_ce.append_expression (new CCodeConstant ("NULL"));
+ } else {
+ var key_array_type = new ArrayType (expr.map_key_type, 1, expr.source_reference);
+ key_array_type.inline_allocated = true;
+ key_array_type.fixed_length = true;
+ key_array_type.length = length;
- var value_array_type = new ArrayType (expr.map_value_type, 1, expr.source_reference);
- value_array_type.inline_allocated = true;
- value_array_type.fixed_length = true;
- value_array_type.length = expr.get_values ().size;
+ var key_temp_var = get_temp_variable (key_array_type, true, expr);
+ var key_name_cnode = get_variable_cexpression (key_temp_var.name);
- var value_ce = new CCodeCommaExpression ();
- var value_temp_var = get_temp_variable (value_array_type, true, expr);
- var value_name_cnode = get_variable_cexpression (value_temp_var.name);
+ temp_vars.insert (0, key_temp_var);
- temp_vars.insert (0, value_temp_var);
+ var value_array_type = new ArrayType (expr.map_value_type, 1, expr.source_reference);
+ value_array_type.inline_allocated = true;
+ value_array_type.fixed_length = true;
+ value_array_type.length = length;
- for (int i = 0; i < expr.get_keys ().size; i++) {
- key_ce.append_expression (new CCodeAssignment (new CCodeElementAccess (key_name_cnode, new CCodeConstant (i.to_string ())), (CCodeExpression) expr.get_keys ().get (i).ccodenode));
- value_ce.append_expression (new CCodeAssignment (new CCodeElementAccess (value_name_cnode, new CCodeConstant (i.to_string ())), (CCodeExpression) expr.get_values ().get (i).ccodenode));
- }
+ var value_temp_var = get_temp_variable (value_array_type, true, expr);
+ var value_name_cnode = get_variable_cexpression (value_temp_var.name);
- key_ce.append_expression (key_name_cnode);
- value_ce.append_expression (value_name_cnode);
+ temp_vars.insert (0, value_temp_var);
+
+ for (int i = 0; i < length; i++) {
+ key_ce.append_expression (new CCodeAssignment (new CCodeElementAccess (key_name_cnode, new CCodeConstant (i.to_string ())), (CCodeExpression) expr.get_keys ().get (i).ccodenode));
+ value_ce.append_expression (new CCodeAssignment (new CCodeElementAccess (value_name_cnode, new CCodeConstant (i.to_string ())), (CCodeExpression) expr.get_values ().get (i).ccodenode));
+ }
+
+ key_ce.append_expression (key_name_cnode);
+ value_ce.append_expression (value_name_cnode);
+ }
var map_creation = new CCodeFunctionCall (new CCodeIdentifier ("dova_map_new"));
map_creation.add_argument (get_type_id_expression (expr.map_key_type));
map_creation.add_argument (get_type_id_expression (expr.map_value_type));
- map_creation.add_argument (new CCodeConstant (key_array_type.length.to_string ()));
+ map_creation.add_argument (new CCodeConstant (length.to_string ()));
map_creation.add_argument (key_ce);
map_creation.add_argument (value_ce);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]