return (CCodeExpression) get_ccodenode (length_expr);
} else if (array_expr is MethodCall || array_expr is CastExpression || array_expr is SliceExpression) {
List<CCodeExpression> size = array_expr.get_array_sizes ();
- if (size.size >= dim) {
+ if (size != null && size.size >= dim) {
return size[dim - 1];
}
} else if (array_expr.symbol_reference != null) {
var prop = (Property) array_expr.symbol_reference;
if (!prop.no_array_length) {
List<CCodeExpression> size = array_expr.get_array_sizes ();
- if (size.size >= dim) {
+ if (size != null && size.size >= dim) {
return size[dim - 1];
}
}
* expr.temp_vars = temp_vars;
* when deep list copying works
*/
- expr.temp_vars.clear ();
- foreach (LocalVariable local in temp_vars) {
- expr.temp_vars.add (local);
+ if (temp_vars.size > 0) {
+ if (expr.temp_vars == null) {
+ expr.temp_vars = new ArrayList<LocalVariable> ();
+ } else {
+ expr.temp_vars.clear ();
+ }
+ foreach (LocalVariable local in temp_vars) {
+ expr.add_temp_var (local);
+ }
+ temp_vars.clear ();
}
- temp_vars.clear ();
if (((List<LocalVariable>) temp_ref_vars).size == 0) {
/* nothing to do without temporary variables */
}
full_expr_var = get_temp_variable (expr_type, true, expr, false);
- expr.temp_vars.add (full_expr_var);
+ expr.add_temp_var (full_expr_var);
expr_list.append_expression (new CCodeAssignment (get_variable_cexpression (full_expr_var.name), (CCodeExpression) expr.ccodenode));
}
temp_ref_vars.clear ();
}
- public void append_temp_decl (CCodeFragment cfrag, List<LocalVariable> temp_vars) {
+ public void append_temp_decl (CCodeFragment cfrag, List<LocalVariable>? temp_vars) {
+ if (temp_vars == null) {
+ return;
+ }
foreach (LocalVariable local in temp_vars) {
var cdecl = new CCodeDeclaration (local.variable_type.get_cname ());
temp_ref_vars.clear ();
}
- public void create_temp_decl (Statement stmt, List<LocalVariable> temp_vars) {
+ public void create_temp_decl (Statement stmt, List<LocalVariable>? temp_vars) {
/* declare temporary variables */
- if (temp_vars.size == 0) {
+ if (temp_vars == null || temp_vars.size == 0) {
/* nothing to do without temporary variables */
return;
}
ccomma.append_expression (get_variable_cexpression (return_expr_decl.name));
stmt.return_expression.ccodenode = ccomma;
- stmt.return_expression.temp_vars.add (return_expr_decl);
+ stmt.return_expression.add_temp_var (return_expr_decl);
} else if ((current_method != null || current_property_accessor != null) && current_return_type is DelegateType) {
var delegate_type = (DelegateType) current_return_type;
if (delegate_type.delegate_symbol.has_target) {
ccomma.append_expression (get_variable_cexpression (return_expr_decl.name));
stmt.return_expression.ccodenode = ccomma;
- stmt.return_expression.temp_vars.add (return_expr_decl);
+ stmt.return_expression.add_temp_var (return_expr_decl);
}
}
}
var regex_var = get_temp_variable (regex_type, true, expr, false);
- expr.temp_vars.add (regex_var);
+ expr.add_temp_var (regex_var);
var cdecl = new CCodeDeclaration ("GRegex*");
void visit_string_switch_statement (SwitchStatement stmt) {
// we need a temporary variable to save the property value
var temp_var = get_temp_variable (stmt.expression.value_type, stmt.expression.value_type.value_owned, stmt, false);
- stmt.expression.temp_vars.add (temp_var);
+ stmt.expression.add_temp_var (temp_var);
var ctemp = get_variable_cexpression (temp_var.name);
var cinit = new CCodeAssignment (ctemp, (CCodeExpression) stmt.expression.ccodenode);
var ccond = new CCodeConditionalExpression (cisnull, new CCodeConstant ("0"), cquark);
temp_var = get_temp_variable (gquark_type);
- stmt.expression.temp_vars.add (temp_var);
+ stmt.expression.add_temp_var (temp_var);
int label_count = 0;
* expr.temp_vars = temp_vars;
* when deep list copying works
*/
- expr.temp_vars.clear ();
- foreach (LocalVariable local in temp_vars) {
- expr.temp_vars.add (local);
+ if (temp_vars.size > 0) {
+ if (expr.temp_vars == null) {
+ expr.temp_vars = new ArrayList<LocalVariable> ();
+ } else {
+ expr.temp_vars.clear ();
+ }
+ foreach (LocalVariable local in temp_vars) {
+ expr.temp_vars.add (local);
+ }
+ temp_vars.clear ();
}
- temp_vars.clear ();
if (((List<LocalVariable>) temp_ref_vars).size == 0) {
/* nothing to do without temporary variables */
}
var full_expr_var = get_temp_variable (expr_type, true, expr);
- expr.temp_vars.add (full_expr_var);
+ expr.add_temp_var (full_expr_var);
var expr_list = new CCodeCommaExpression ();
expr_list.append_expression (new CCodeAssignment (get_variable_cexpression (full_expr_var.name), (CCodeExpression) expr.ccodenode));
temp_ref_vars.clear ();
}
- public void append_temp_decl (CCodeFragment cfrag, List<LocalVariable> temp_vars) {
+ public void append_temp_decl (CCodeFragment cfrag, List<LocalVariable>? temp_vars) {
+ if (temp_vars == null) {
+ return;
+ }
foreach (LocalVariable local in temp_vars) {
var cdecl = new CCodeDeclaration (local.variable_type.get_cname ());
temp_ref_vars.clear ();
}
- public void create_temp_decl (Statement stmt, List<LocalVariable> temp_vars) {
+ public void create_temp_decl (Statement stmt, List<LocalVariable>? temp_vars) {
/* declare temporary variables */
- if (temp_vars.size == 0) {
+ if (temp_vars == null || temp_vars.size == 0) {
/* nothing to do without temporary variables */
return;
}
*
* The code generator sets and uses them for memory management.
*/
- public ArrayList<LocalVariable> temp_vars = new ArrayList<LocalVariable> ();
+ public ArrayList<LocalVariable> temp_vars;
- private List<CCodeExpression> array_sizes = new ArrayList<CCodeExpression> ();
+ private List<CCodeExpression> array_sizes;
public CCodeExpression? delegate_target { get; set; }
public CCodeExpression? delegate_target_destroy_notify { get; set; }
return false;
}
+ public void add_temp_var (LocalVariable local) {
+ if (temp_vars == null) {
+ temp_vars = new ArrayList<LocalVariable> ();
+ }
+ temp_vars.add (local);
+ }
+
/**
* Add an array size C code expression.
*/
public void append_array_size (CCodeExpression size) {
+ if (array_sizes == null) {
+ array_sizes = new ArrayList<CCodeExpression> ();
+ }
array_sizes.add (size);
}
* Get the C code expression for array sizes for all dimensions
* ascending from left to right.
*/
- public List<CCodeExpression> get_array_sizes () {
+ public List<CCodeExpression>? get_array_sizes () {
return array_sizes;
}
public Comment? comment { get; set; }
- private List<string> cheader_filenames = new ArrayList<string> ();
+ private List<string> cheader_filenames;
/**
* Specifies whether this method explicitly hides a member of a base
return "";
}
+ static List<string> _empty_string_list;
+
/**
* Returns a list of C header filenames users of this symbol must
* include.
* @return list of C header filenames for this symbol
*/
public virtual List<string> get_cheader_filenames () {
- // parent_symbol can be null on incremental parsing
- if (cheader_filenames.size == 0 && parent_symbol != null) {
- /* default to header filenames of the namespace */
- foreach (string filename in parent_symbol.get_cheader_filenames ()) {
- add_cheader_filename (filename);
- }
+ if (cheader_filenames == null || cheader_filenames.size == 0) {
+ // parent_symbol can be null on incremental parsing
+ if (parent_symbol != null) {
+ /* default to header filenames of the namespace */
+ var parent_header_filenames = parent_symbol.get_cheader_filenames ();
+ if (parent_header_filenames.size > 0) {
+ return parent_header_filenames;
+ }
- if (cheader_filenames.size == 0 && source_reference != null && !external_package) {
- // don't add default include directives for VAPI files
- cheader_filenames.add (source_reference.file.get_cinclude_filename ());
+ if (source_reference != null && !external_package) {
+ // don't add default include directives for VAPI files
+ add_cheader_filename (source_reference.file.get_cinclude_filename ());
+ }
+ } else {
+ if (_empty_string_list == null) {
+ _empty_string_list = new ArrayList<string> ();
+ }
+ return _empty_string_list;
}
}
return cheader_filenames;
* @param filename a C header filename
*/
public void add_cheader_filename (string filename) {
+ if (cheader_filenames == null) {
+ cheader_filenames = new ArrayList<string> ();
+ }
cheader_filenames.add (filename);
}