var length_expr = size[dim - 1];
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 ();
+ List<CCodeExpression> size = get_array_sizes (array_expr);
if (size != null && size.size >= dim) {
return size[dim - 1];
}
} else if (array_expr.symbol_reference is Property) {
var prop = (Property) array_expr.symbol_reference;
if (!prop.no_array_length) {
- List<CCodeExpression> size = array_expr.get_array_sizes ();
+ List<CCodeExpression> size = get_array_sizes (array_expr);
if (size != null && size.size >= dim) {
return size[dim - 1];
}
ccomma.append_expression (get_variable_cexpression (slice_var.name));
set_cvalue (expr, ccomma);
- expr.append_array_size (get_variable_cexpression (len_var.name));
+ append_array_size (expr, get_variable_cexpression (len_var.name));
}
private CCodeForStatement get_struct_array_free_loop (Struct st) {
}
}
- public override void generate_parameter (FormalParameter param, CCodeFile decl_space, Map<int,CCodeFormalParameter> cparam_map, Map<int,CCodeExpression>? carg_map) {
+ public override CCodeFormalParameter generate_parameter (FormalParameter param, CCodeFile decl_space, Map<int,CCodeFormalParameter> cparam_map, Map<int,CCodeExpression>? carg_map) {
if (!(param.variable_type is ArrayType)) {
- base.generate_parameter (param, decl_space, cparam_map, carg_map);
- return;
+ return base.generate_parameter (param, decl_space, cparam_map, carg_map);
}
string ctypename = param.variable_type.get_cname ();
ctypename += "*";
}
- param.ccodenode = new CCodeFormalParameter (get_variable_cname (param.name), ctypename);
+ var main_cparam = new CCodeFormalParameter (get_variable_cname (param.name), ctypename);
var array_type = (ArrayType) param.variable_type;
generate_type_declaration (array_type.element_type, decl_space);
- cparam_map.set (get_param_pos (param.cparameter_position), (CCodeFormalParameter) param.ccodenode);
+ cparam_map.set (get_param_pos (param.cparameter_position), main_cparam);
if (carg_map != null) {
carg_map.set (get_param_pos (param.cparameter_position), get_variable_cexpression (param.name));
}
}
}
}
+
+ return main_cparam;
}
}
public void emit_temp_var (LocalVariable local) {
var vardecl = new CCodeVariableDeclarator (local.name, null, local.variable_type.get_cdeclarator_suffix ());
- // sets #line
- local.ccodenode = vardecl;
var st = local.variable_type.data_type as Struct;
var array_type = local.variable_type as ArrayType;
// null-terminated string array
var len_call = new CCodeFunctionCall (new CCodeIdentifier ("g_strv_length"));
len_call.add_argument (rv);
- expr.append_array_size (len_call);
+ append_array_size (expr, len_call);
} else if (to is StructValueType) {
var temp_decl = get_temp_variable (to, true, null, true);
emit_temp_var (temp_decl);
ccall.add_argument (new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, get_variable_cexpression (temp_decl.name)));
cfunc.add_parameter (new CCodeFormalParameter (get_array_length_cname ("result", dim), "int*"));
- expr.append_array_size (get_variable_cexpression (temp_decl.name));
+ append_array_size (expr, get_variable_cexpression (temp_decl.name));
}
}
var array_type = expr.type_reference as ArrayType;
if (array_type != null && expr.inner.value_type is ArrayType) {
for (int dim = 1; dim <= array_type.rank; dim++) {
- expr.append_array_size (get_array_length_cexpression (expr.inner, dim));
+ append_array_size (expr, get_array_length_cexpression (expr.inner, dim));
}
}
}
}
- public CCodeExpression? get_cvalue (Expression expr) {
- return (CCodeExpression) expr.ccodenode;
- }
-
- public void set_cvalue (Expression expr, CCodeExpression? cvalue) {
- expr.ccodenode = cvalue;
- }
-
- public CCodeNode? get_ccodenode (CodeNode node) {
- if (node.ccodenode == null) {
+ public CCodeExpression? get_ccodenode (Expression node) {
+ if (get_cvalue (node) == null) {
node.emit (this);
}
- return node.ccodenode;
+ return get_cvalue (node);
}
public override void visit_class (Class cl) {
public virtual void add_simple_check (CodeNode node, bool always_fails = false) {
}
+
+ public CCodeExpression? get_cvalue (Expression expr) {
+ if (expr.target_value == null) {
+ return null;
+ }
+ var glib_value = (GLibValue) expr.target_value;
+ return glib_value.ccodenode;
+ }
+
+ public void set_cvalue (Expression expr, CCodeExpression cvalue) {
+ var glib_value = (GLibValue) expr.target_value;
+ if (glib_value == null) {
+ glib_value = new GLibValue ();
+ expr.target_value = glib_value;
+ }
+ glib_value.ccodenode = cvalue;
+ }
+
+ public CCodeExpression? get_delegate_target (Expression expr) {
+ if (expr.target_value == null) {
+ return null;
+ }
+ var glib_value = (GLibValue) expr.target_value;
+ return glib_value.delegate_target;
+ }
+
+ public void set_delegate_target (Expression expr, CCodeExpression delegate_target) {
+ var glib_value = (GLibValue) expr.target_value;
+ if (glib_value == null) {
+ glib_value = new GLibValue ();
+ expr.target_value = glib_value;
+ }
+ glib_value.delegate_target = delegate_target;
+ }
+
+ public CCodeExpression? get_delegate_target_destroy_notify (Expression expr) {
+ if (expr.target_value == null) {
+ return null;
+ }
+ var glib_value = (GLibValue) expr.target_value;
+ return glib_value.delegate_target_destroy_notify;
+ }
+
+ public void set_delegate_target_destroy_notify (Expression expr, CCodeExpression destroy_notify) {
+ var glib_value = (GLibValue) expr.target_value;
+ if (glib_value == null) {
+ glib_value = new GLibValue ();
+ expr.target_value = glib_value;
+ }
+ glib_value.delegate_target_destroy_notify = destroy_notify;
+ }
+
+ public void append_array_size (Expression expr, CCodeExpression size) {
+ var glib_value = (GLibValue) expr.target_value;
+ if (glib_value == null) {
+ glib_value = new GLibValue ();
+ expr.target_value = glib_value;
+ }
+ if (glib_value.array_sizes == null) {
+ glib_value.array_sizes = new ArrayList<CCodeExpression> ();
+ }
+ glib_value.array_sizes.add (size);
+ }
+
+ public List<CCodeExpression>? get_array_sizes (Expression expr) {
+ var glib_value = (GLibValue) expr.target_value;
+ if (glib_value == null) {
+ glib_value = new GLibValue ();
+ expr.target_value = glib_value;
+ }
+ return glib_value.array_sizes;
+ }
}
-// vim:sw=8 noet
+public class Vala.GLibValue : TargetValue {
+ public CCodeExpression ccodenode;
+
+ public List<CCodeExpression> array_sizes;
+
+ public CCodeExpression? delegate_target;
+ public CCodeExpression? delegate_target_destroy_notify;
+}
var cfundecl = new CCodeFunctionDeclarator (d.get_cname ());
foreach (FormalParameter param in d.get_parameters ()) {
- generate_parameter (param, decl_space, new HashMap<int,CCodeFormalParameter> (), null);
+ var cparam = generate_parameter (param, decl_space, new HashMap<int,CCodeFormalParameter> (), null);
- cfundecl.add_parameter ((CCodeFormalParameter) param.ccodenode);
+ cfundecl.add_parameter (cparam);
// handle array parameters
if (!param.no_array_length && param.variable_type is ArrayType) {
}
for (int dim = 1; dim <= array_type.rank; dim++) {
- var cparam = new CCodeFormalParameter (get_parameter_array_length_cname (param, dim), length_ctype);
+ cparam = new CCodeFormalParameter (get_parameter_array_length_cname (param, dim), length_ctype);
cfundecl.add_parameter (cparam);
}
}
var deleg_type = (DelegateType) param.variable_type;
var param_d = deleg_type.delegate_symbol;
if (param_d.has_target) {
- var cparam = new CCodeFormalParameter (get_delegate_target_cname (get_variable_cname (param.name)), "void*");
+ cparam = new CCodeFormalParameter (get_delegate_target_cname (get_variable_cname (param.name)), "void*");
cfundecl.add_parameter (cparam);
}
}
if (delegate_expr is MethodCall) {
var invocation_expr = (MethodCall) delegate_expr;
- if (invocation_expr.delegate_target_destroy_notify != null) {
- delegate_target_destroy_notify = invocation_expr.delegate_target_destroy_notify;
+ if (get_delegate_target_destroy_notify (invocation_expr) != null) {
+ delegate_target_destroy_notify = get_delegate_target_destroy_notify (invocation_expr);
}
- return invocation_expr.delegate_target;
+ return get_delegate_target (invocation_expr);
} else if (delegate_expr is LambdaExpression) {
var lambda = (LambdaExpression) delegate_expr;
var delegate_type = (DelegateType) delegate_expr.target_type;
return delegate_target;
}
} else if (delegate_expr.symbol_reference is Property) {
- return delegate_expr.delegate_target;
+ return get_delegate_target (delegate_expr);
}
}
var function = new CCodeFunction (wrapper_name, return_type_cname);
function.modifiers = CCodeModifiers.STATIC;
- m.ccodenode = function;
var cparam_map = new HashMap<int,CCodeFormalParameter> (direct_hash, direct_equal);
Report.error (expr != null ? expr.source_reference : null, "Cannot create delegate without target for instance method or closure");
arg = new CCodeConstant ("NULL");
} else {
- arg = new CCodeIdentifier ((d_params.get (0).ccodenode as CCodeFormalParameter).name);
+ arg = new CCodeIdentifier (d_params.get (0).name);
i = 1;
}
}
}
CCodeExpression arg;
- arg = new CCodeIdentifier ((d_params.get (i).ccodenode as CCodeFormalParameter).name);
+ arg = new CCodeIdentifier (d_params.get (i).name);
carg_map.set (get_param_pos (param.cparameter_position), arg);
// handle array arguments
return wrapper_name;
}
- public override void generate_parameter (FormalParameter param, CCodeFile decl_space, Map<int,CCodeFormalParameter> cparam_map, Map<int,CCodeExpression>? carg_map) {
+ public override CCodeFormalParameter generate_parameter (FormalParameter param, CCodeFile decl_space, Map<int,CCodeFormalParameter> cparam_map, Map<int,CCodeExpression>? carg_map) {
if (!(param.variable_type is DelegateType || param.variable_type is MethodType)) {
- base.generate_parameter (param, decl_space, cparam_map, carg_map);
- return;
+ return base.generate_parameter (param, decl_space, cparam_map, carg_map);
}
string ctypename = param.variable_type.get_cname ();
target_destroy_notify_ctypename += "*";
}
- param.ccodenode = new CCodeFormalParameter (get_variable_cname (param.name), ctypename);
+ var main_cparam = new CCodeFormalParameter (get_variable_cname (param.name), ctypename);
- cparam_map.set (get_param_pos (param.cparameter_position), (CCodeFormalParameter) param.ccodenode);
+ cparam_map.set (get_param_pos (param.cparameter_position), main_cparam);
if (carg_map != null) {
carg_map.set (get_param_pos (param.cparameter_position), get_variable_cexpression (param.name));
}
carg_map.set (get_param_pos (param.cdelegate_target_parameter_position), get_variable_cexpression (cparam.name));
}
}
+
+ return main_cparam;
}
}
var ctemp = get_variable_cexpression (temp_var.name);
emit_temp_var (temp_var);
ccall.add_argument (new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, ctemp));
- expr.append_array_size (ctemp);
+ append_array_size (expr, ctemp);
}
} else {
var delegate_type = base_property.property_type as DelegateType;
var ctemp = get_variable_cexpression (temp_var.name);
emit_temp_var (temp_var);
ccall.add_argument (new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, ctemp));
- expr.delegate_target = ctemp;
+ set_delegate_target (expr, ctemp);
}
}
var len_call = new CCodeFunctionCall (new CCodeIdentifier ("_vala_array_length"));
len_call.add_argument (temp_ref);
- expr.append_array_size (len_call);
+ append_array_size (expr, len_call);
} else if (!m.no_array_length) {
LocalVariable temp_var;
out_arg_map.set (get_param_pos (m.carray_length_parameter_position + 0.01 * dim), new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, temp_ref));
- expr.append_array_size (temp_ref);
+ append_array_size (expr, temp_ref);
} else {
- expr.append_array_size (new CCodeConstant ("-1"));
+ append_array_size (expr, new CCodeConstant ("-1"));
}
}
} else if (m != null && m.return_type is DelegateType && async_call != ccall) {
out_arg_map.set (get_param_pos (m.cdelegate_target_parameter_position), new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, temp_ref));
- expr.delegate_target = temp_ref;
+ set_delegate_target (expr, temp_ref);
if (deleg_type.value_owned) {
temp_var = get_temp_variable (new DelegateType ((Delegate) context.root.scope.lookup ("GLib").scope.lookup ("DestroyNotify")));
out_arg_map.set (get_param_pos (m.cdelegate_target_parameter_position + 0.01), new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, temp_ref));
- expr.delegate_target_destroy_notify = temp_ref;
+ set_delegate_target_destroy_notify (expr, temp_ref);
}
}
}
var len_call = new CCodeFunctionCall (new CCodeIdentifier ("_vala_array_length"));
len_call.add_argument (temp_ref);
- expr.append_array_size (len_call);
+ append_array_size (expr, len_call);
} else if (!deleg.no_array_length) {
var temp_var = get_temp_variable (int_type);
var temp_ref = get_variable_cexpression (temp_var.name);
out_arg_map.set (get_param_pos (deleg.carray_length_parameter_position + 0.01 * dim), new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, temp_ref));
- expr.append_array_size (temp_ref);
+ append_array_size (expr, temp_ref);
} else {
- expr.append_array_size (new CCodeConstant ("-1"));
+ append_array_size (expr, new CCodeConstant ("-1"));
}
}
} else if (deleg != null && deleg.return_type is DelegateType) {
out_arg_map.set (get_param_pos (deleg.cdelegate_target_parameter_position), new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, temp_ref));
- expr.delegate_target = temp_ref;
+ set_delegate_target (expr, temp_ref);
}
}
}
}
- public virtual void generate_parameter (FormalParameter param, CCodeFile decl_space, Map<int,CCodeFormalParameter> cparam_map, Map<int,CCodeExpression>? carg_map) {
+ public virtual CCodeFormalParameter generate_parameter (FormalParameter param, CCodeFile decl_space, Map<int,CCodeFormalParameter> cparam_map, Map<int,CCodeExpression>? carg_map) {
+ CCodeFormalParameter cparam;
if (!param.ellipsis) {
string ctypename = param.variable_type.get_cname ();
ctypename += "*";
}
- param.ccodenode = new CCodeFormalParameter (get_variable_cname (param.name), ctypename);
+ cparam = new CCodeFormalParameter (get_variable_cname (param.name), ctypename);
} else {
- param.ccodenode = new CCodeFormalParameter.with_ellipsis ();
+ cparam = new CCodeFormalParameter.with_ellipsis ();
}
- cparam_map.set (get_param_pos (param.cparameter_position, param.ellipsis), (CCodeFormalParameter) param.ccodenode);
+ cparam_map.set (get_param_pos (param.cparameter_position, param.ellipsis), cparam);
if (carg_map != null && !param.ellipsis) {
carg_map.set (get_param_pos (param.cparameter_position, param.ellipsis), get_variable_cexpression (param.name));
}
+
+ return cparam;
}
public override void generate_cparameters (Method m, CCodeFile decl_space, Map<int,CCodeFormalParameter> cparam_map, CCodeFunction func, CCodeFunctionDeclarator? vdeclarator = null, Map<int,CCodeExpression>? carg_map = null, CCodeFunctionCall? vcall = null, int direction = 3) {
foreach (var param in sig.get_parameters ()) {
// ensure ccodenode of parameter is set
- generate_parameter (param, cfile, new HashMap<int,CCodeFormalParameter> (), null);
+ var cparam = generate_parameter (param, cfile, new HashMap<int,CCodeFormalParameter> (), null);
- function.add_parameter ((CCodeFormalParameter) get_ccodenode (param));
+ function.add_parameter (cparam);
if (param.variable_type is ArrayType) {
var array_type = (ArrayType) param.variable_type;
for (int dim = 1; dim <= array_type.rank; dim++) {
var cdecl = new CCodeDeclaration (local.variable_type.get_cname ());
var vardecl = new CCodeVariableDeclarator (local.name, null, local.variable_type.get_cdeclarator_suffix ());
- // sets #line
- local.ccodenode = vardecl;
cdecl.add_declarator (vardecl);
var st = local.variable_type.data_type as Struct;
return null;
}
- public CCodeExpression? get_cvalue (Expression expr) {
- return (CCodeExpression) expr.ccodenode;
- }
-
- public void set_cvalue (Expression expr, CCodeExpression? cvalue) {
- expr.ccodenode = cvalue;
- }
-
- public CCodeNode? get_ccodenode (CodeNode node) {
- if (node.ccodenode == null) {
+ public CCodeExpression? get_ccodenode (Expression node) {
+ if (get_cvalue (node) == null) {
node.emit (this);
}
- return node.ccodenode;
+ return get_cvalue (node);
}
public DataType? get_this_type () {
public virtual void add_simple_check (CodeNode node, bool always_fails = false) {
}
+
+ public CCodeExpression? get_cvalue (Expression expr) {
+ if (expr.target_value == null) {
+ return null;
+ }
+ var dova_value = (DovaValue) expr.target_value;
+ return dova_value.ccodenode;
+ }
+
+ public void set_cvalue (Expression expr, CCodeExpression cvalue) {
+ var dova_value = (DovaValue) expr.target_value;
+ if (dova_value == null) {
+ dova_value = new DovaValue ();
+ expr.target_value = dova_value;
+ }
+ dova_value.ccodenode = cvalue;
+ }
+}
+
+public class Vala.DovaValue : TargetValue {
+ public CCodeExpression ccodenode;
}
foreach (var param in sig.get_parameters ()) {
// ensure ccodenode of parameter is set
- generate_parameter (param, cfile, new HashMap<int,CCodeFormalParameter> (), null);
+ var cparam = generate_parameter (param, cfile, new HashMap<int,CCodeFormalParameter> (), null);
- function.add_parameter ((CCodeFormalParameter) get_ccodenode (param));
+ function.add_parameter (cparam);
if (param.variable_type is ArrayType) {
var array_type = (ArrayType) param.variable_type;
for (int dim = 1; dim <= array_type.rank; dim++) {
public class Vala.GTypeModule : GErrorModule {
- public override void generate_parameter (FormalParameter param, CCodeFile decl_space, Map<int,CCodeFormalParameter> cparam_map, Map<int,CCodeExpression>? carg_map) {
+ public override CCodeFormalParameter generate_parameter (FormalParameter param, CCodeFile decl_space, Map<int,CCodeFormalParameter> cparam_map, Map<int,CCodeExpression>? carg_map) {
if (!(param.variable_type is ObjectType)) {
- base.generate_parameter (param, decl_space, cparam_map, carg_map);
- return;
+ return base.generate_parameter (param, decl_space, cparam_map, carg_map);
}
generate_type_declaration (param.variable_type, decl_space);
ctypename += "*";
}
- param.ccodenode = new CCodeFormalParameter (get_variable_cname (param.name), ctypename);
+ var cparam = new CCodeFormalParameter (get_variable_cname (param.name), ctypename);
- cparam_map.set (get_param_pos (param.cparameter_position), (CCodeFormalParameter) param.ccodenode);
+ cparam_map.set (get_param_pos (param.cparameter_position), cparam);
if (carg_map != null) {
carg_map.set (get_param_pos (param.cparameter_position), get_variable_cexpression (param.name));
}
+
+ return cparam;
}
public override void generate_class_declaration (Class cl, CCodeFile decl_space) {
valaswitchstatement.vala \
valasymbol.vala \
valasymbolresolver.vala \
+ valatargetvalue.vala \
valatemplate.vala \
valathrowstatement.vala \
valatokentype.vala \
public string type_name {
get { return Type.from_instance (this).name (); }
}
-
- /**
- * Generated CCodeNode that corresponds to this code node.
- */
- public CCodeNode? ccodenode {
- get {
- return _ccodenode;
- }
- set {
- if (value != null && source_reference != null && CodeContext.get ().debug) {
- value.line = new CCodeLineDirective (
- Path.get_basename (source_reference.file.filename),
- source_reference.first_line);
- }
-
- _ccodenode = value;
- }
- }
public bool checked { get; set; }
private List<DataType> _error_types;
private static List<DataType> _empty_type_list;
- private CCodeNode? _ccodenode;
-
static int last_temp_nr = 0;
/**
*/
public bool lvalue { get; set; }
- private List<CCodeExpression> array_sizes;
-
- public CCodeExpression? delegate_target { get; set; }
- public CCodeExpression? delegate_target_destroy_notify { get; set; }
+ public TargetValue? target_value { get; set; }
/**
* Returns whether this expression is constant, i.e. whether this
return false;
}
- /**
- * 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 () {
- return array_sizes;
- }
-
public Statement? parent_statement {
get {
var expr = parent_node as Expression;
--- /dev/null
+/* valatargetvalue.vala
+ *
+ * Copyright (C) 2010 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 abstract class Vala.TargetValue {
+ public DataType value_type { get; set; }
+}