vala r1124 - in trunk: . gobject vala
- From: juergbi svn gnome org
- To: svn-commits-list gnome org
- Subject: vala r1124 - in trunk: . gobject vala
- Date: Fri, 14 Mar 2008 02:11:02 +0000 (GMT)
Author: juergbi
Date: Fri Mar 14 02:11:02 2008
New Revision: 1124
URL: http://svn.gnome.org/viewvc/vala?rev=1124&view=rev
Log:
2008-03-14 Juerg Billeter <j bitron ch>
* vala/Makefile.am, vala/valaarraytype.vala, vala/valadatatype.vala,
vala/valamember.vala, vala/valasemanticanalyzer.vala,
vala/valasymbolresolver.vala, vala/valatypeparameter.vala,
vala/valatypesymbol.vala, gobject/valaccodegenerator.vala,
gobject/valaccodegeneratorinvocationexpression.vala,
gobject/valaccodegeneratormethod.vala: remove Array class, arrays
are not type symbols
Removed:
trunk/vala/valaarray.vala
Modified:
trunk/ChangeLog
trunk/gobject/valaccodegenerator.vala
trunk/gobject/valaccodegeneratorinvocationexpression.vala
trunk/gobject/valaccodegeneratormethod.vala
trunk/vala/Makefile.am
trunk/vala/valaarraytype.vala
trunk/vala/valadatatype.vala
trunk/vala/valamember.vala
trunk/vala/valasemanticanalyzer.vala
trunk/vala/valasymbolresolver.vala
trunk/vala/valatypeparameter.vala
trunk/vala/valatypesymbol.vala
Modified: trunk/gobject/valaccodegenerator.vala
==============================================================================
--- trunk/gobject/valaccodegenerator.vala (original)
+++ trunk/gobject/valaccodegenerator.vala Fri Mar 14 02:11:02 2008
@@ -1125,6 +1125,9 @@
} else if (type.type_parameter != null && current_type_symbol is Class) {
string func_name = "%s_dup_func".printf (type.type_parameter.name.down ());
return new CCodeMemberAccess.pointer (new CCodeMemberAccess.pointer (new CCodeIdentifier ("self"), "priv"), func_name);
+ } else if (type is ArrayType) {
+ Report.error (type.source_reference, "internal error: duplicating %s instances not yet supported".printf (type.to_string ()));
+ return null;
} else {
return new CCodeConstant ("NULL");
}
@@ -1146,6 +1149,8 @@
} else if (type.type_parameter != null && current_type_symbol is Class) {
string func_name = "%s_destroy_func".printf (type.type_parameter.name.down ());
return new CCodeMemberAccess.pointer (new CCodeMemberAccess.pointer (new CCodeIdentifier ("self"), "priv"), func_name);
+ } else if (type is ArrayType) {
+ return new CCodeIdentifier ("g_free");
} else if (type is PointerType) {
return new CCodeIdentifier ("g_free");
} else {
@@ -1162,7 +1167,7 @@
*/
var cisnull = new CCodeBinaryExpression (CCodeBinaryOperator.EQUALITY, cvar, new CCodeConstant ("NULL"));
- if (type.data_type == null) {
+ if (type.type_parameter != null) {
if (!(current_type_symbol is Class) || !current_class.is_subtype_of (gobject_type)) {
return new CCodeConstant ("NULL");
}
@@ -1231,7 +1236,9 @@
var cassign = new CCodeAssignment (cvar, ccomma);
// g_free (NULL) is allowed
- if ((context.non_null && !type.requires_null_check) || (type.data_type != null && !type.data_type.is_reference_counting () && type.data_type.get_free_function () == "g_free")) {
+ bool uses_gfree = (type.data_type != null && !type.data_type.is_reference_counting () && type.data_type.get_free_function () == "g_free");
+ uses_gfree = uses_gfree || type is ArrayType;
+ if ((context.non_null && !type.requires_null_check) || uses_gfree) {
return new CCodeParenthesizedExpression (cassign);
}
@@ -1294,7 +1301,7 @@
var st = decl.type_reference.data_type as Struct;
- if (decl.type_reference.data_type != null && decl.type_reference.data_type.is_reference_type ()) {
+ if (decl.type_reference.is_reference_type_or_type_parameter ()) {
vardecl.initializer = new CCodeConstant ("NULL");
} else if (st != null && !st.is_simple_type ()) {
// 0-initialize struct with struct initializer { 0 }
@@ -1919,7 +1926,7 @@
var local_vars = b.get_local_variables ();
foreach (VariableDeclarator decl in local_vars) {
- if (decl.active && decl.type_reference.data_type != null && decl.type_reference.data_type.is_reference_type () && decl.type_reference.takes_ownership) {
+ if (decl.active && decl.type_reference.is_reference_type_or_type_parameter () && decl.type_reference.takes_ownership) {
var ma = new MemberAccess.simple (decl.name);
ma.symbol_reference = decl;
cfrag.append (new CCodeExpressionStatement (get_unref_expression (new CCodeIdentifier (get_variable_cname (decl.name)), decl.type_reference, ma)));
@@ -1967,7 +1974,7 @@
var local_vars = b.get_local_variables ();
foreach (VariableDeclarator decl in local_vars) {
- if (decl.active && decl.type_reference.data_type != null && decl.type_reference.data_type.is_reference_type () && decl.type_reference.takes_ownership) {
+ if (decl.active && decl.type_reference.is_reference_type_or_type_parameter () && decl.type_reference.takes_ownership) {
found = true;
var ma = new MemberAccess.simple (decl.name);
ma.symbol_reference = decl;
Modified: trunk/gobject/valaccodegeneratorinvocationexpression.vala
==============================================================================
--- trunk/gobject/valaccodegeneratorinvocationexpression.vala (original)
+++ trunk/gobject/valaccodegeneratorinvocationexpression.vala Fri Mar 14 02:11:02 2008
@@ -57,8 +57,8 @@
var carg_map = new HashMap<int,CCodeExpression> (direct_hash, direct_equal);
if (m is ArrayResizeMethod) {
- var array = (Array) m.parent_symbol;
- carg_map.set (get_param_pos (0), new CCodeIdentifier (array.get_cname ()));
+ var array_type = (ArrayType) ma.inner.static_type;
+ carg_map.set (get_param_pos (0), new CCodeIdentifier (array_type.element_type.get_cname ()));
} else if (m is ArrayMoveMethod) {
requires_array_move = true;
}
@@ -96,9 +96,9 @@
}
if (m is ArrayMoveMethod) {
- var array = (Array) m.parent_symbol;
+ var array_type = (ArrayType) ma.inner.static_type;
var csizeof = new CCodeFunctionCall (new CCodeIdentifier ("sizeof"));
- csizeof.add_argument (new CCodeIdentifier (array.get_cname ()));
+ csizeof.add_argument (new CCodeIdentifier (array_type.element_type.get_cname ()));
carg_map.set (get_param_pos (0.1), csizeof);
} else if (m is DBusMethod) {
bool found_out = false;
@@ -458,7 +458,8 @@
var clen = get_array_length_cexpression (ma.inner, 1);
var celems = (CCodeExpression) ma.inner.ccodenode;
- var csizeof = new CCodeIdentifier ("sizeof (%s)".printf (ma.inner.static_type.data_type.get_cname ()));
+ var array_type = (ArrayType) ma.inner.static_type;
+ var csizeof = new CCodeIdentifier ("sizeof (%s)".printf (array_type.element_type.get_cname ()));
var cdelta = new CCodeParenthesizedExpression (new CCodeBinaryExpression (CCodeBinaryOperator.MINUS, temp_ref, clen));
var ccheck = new CCodeBinaryExpression (CCodeBinaryOperator.GREATER_THAN, temp_ref, clen);
Modified: trunk/gobject/valaccodegeneratormethod.vala
==============================================================================
--- trunk/gobject/valaccodegeneratormethod.vala (original)
+++ trunk/gobject/valaccodegeneratormethod.vala Fri Mar 14 02:11:02 2008
@@ -727,7 +727,7 @@
}
private CCodeExpression default_value_for_type (DataType! type) {
- if ((type.data_type != null && type.data_type.is_reference_type ()) || type is PointerType) {
+ if ((type.data_type != null && type.data_type.is_reference_type ()) || type is PointerType || type is ArrayType) {
return new CCodeConstant ("NULL");
} else if (type.data_type != null && type.data_type.get_default_value () != null) {
return new CCodeConstant (type.data_type.get_default_value ());
Modified: trunk/vala/Makefile.am
==============================================================================
--- trunk/vala/Makefile.am (original)
+++ trunk/vala/Makefile.am Fri Mar 14 02:11:02 2008
@@ -16,7 +16,6 @@
libvalacore_la_VALASOURCES = \
valaaddressofexpression.vala \
- valaarray.vala \
valaarraycreationexpression.vala \
valaarraylengthfield.vala \
valaarraymovemethod.vala \
Modified: trunk/vala/valaarraytype.vala
==============================================================================
--- trunk/vala/valaarraytype.vala (original)
+++ trunk/vala/valaarraytype.vala Fri Mar 14 02:11:02 2008
@@ -35,21 +35,88 @@
* The rank of this array.
*/
public int rank { get; construct set; }
+
+ private ArrayLengthField length_field;
+ private ArrayResizeMethod resize_method;
+ private ArrayMoveMethod move_method;
- public ArrayType (construct DataType! element_type, construct int rank) {
+ public ArrayType (DataType! element_type, int rank, SourceReference source_reference) {
+ this.element_type = element_type;
+ this.rank = rank;
+ this.source_reference = source_reference;
}
- construct {
- if (element_type.data_type != null) {
- data_type = element_type.data_type.get_array (rank);
- } else {
- data_type = element_type.type_parameter.get_array (rank);
+ public override Symbol? get_member (string member_name) {
+ if (member_name == "length") {
+ return get_length_field ();
+ } else if (member_name == "move") {
+ return get_move_method ();
+ } else if (member_name == "resize") {
+ return get_resize_method ();
}
+ return null;
+ }
+
+ private ArrayLengthField get_length_field () {
+ if (length_field == null) {
+ length_field = new ArrayLengthField (source_reference);
+
+ length_field.access = SymbolAccessibility.PUBLIC;
+
+ var root_symbol = source_reference.file.context.root;
+ if (rank > 1) {
+ // length is an int[] containing the dimensions of the array, starting at 0
+ ValueType integer = new ValueType((Typesymbol) root_symbol.scope.lookup("int"));
+ length_field.type_reference = new ArrayType (integer, 1, source_reference);
+ length_field.type_reference.add_type_argument (integer);
+ } else {
+ length_field.type_reference = new ValueType ((Typesymbol) root_symbol.scope.lookup ("int"));
+ }
+
+ }
+ return length_field;
+ }
+
+ private ArrayResizeMethod get_resize_method () {
+ if (resize_method == null) {
+ resize_method = new ArrayResizeMethod (source_reference);
+
+ resize_method.return_type = new VoidType ();
+ resize_method.access = SymbolAccessibility.PUBLIC;
+
+ resize_method.set_cname ("g_renew");
+
+ var root_symbol = source_reference.file.context.root;
+ var int_type = new ValueType ((Typesymbol) root_symbol.scope.lookup ("int"));
+
+ resize_method.add_parameter (new FormalParameter ("length", int_type));
+
+ resize_method.returns_modified_pointer = true;
+ }
+ return resize_method;
+ }
+
+ private ArrayMoveMethod get_move_method () {
+ if (move_method == null) {
+ move_method = new ArrayMoveMethod (source_reference);
+
+ move_method.return_type = new VoidType ();
+ move_method.access = SymbolAccessibility.PUBLIC;
+
+ move_method.set_cname ("_vala_array_move");
+
+ var root_symbol = source_reference.file.context.root;
+ var int_type = new ValueType ((Typesymbol) root_symbol.scope.lookup ("int"));
+
+ move_method.add_parameter (new FormalParameter ("src", int_type));
+ move_method.add_parameter (new FormalParameter ("dest", int_type));
+ move_method.add_parameter (new FormalParameter ("length", int_type));
+ }
+ return move_method;
}
public override DataType! copy () {
- var result = new ArrayType (element_type, rank);
- result.source_reference = source_reference;
+ var result = new ArrayType (element_type, rank, source_reference);
result.transfers_ownership = transfers_ownership;
result.takes_ownership = takes_ownership;
result.is_out = is_out;
@@ -65,7 +132,47 @@
return result;
}
+ public override string get_cname (bool var_type, bool const_type) {
+ return element_type.get_cname () + "*";
+ }
+
public override bool is_array () {
return true;
}
+
+ public override string! to_string () {
+ return element_type.to_string () + "[]";
+ }
+
+ public override bool compatible (DataType! target_type, bool enable_non_null) {
+ if (target_type is PointerType || (target_type.data_type != null && target_type.data_type.get_attribute ("PointerType") != null)) {
+ /* any array type can be cast to a generic pointer */
+ return true;
+ }
+
+ /* temporarily ignore type parameters */
+ if (target_type.type_parameter != null) {
+ return true;
+ }
+
+ var target_array_type = target_type as ArrayType;
+ if (target_array_type == null) {
+ return false;
+ }
+
+ if (element_type.compatible (target_array_type.element_type)
+ && target_array_type.element_type.compatible (element_type)) {
+ if (requires_null_check && !target_type.nullable) {
+ // incompatibility between null and non-null types
+ return !enable_non_null;
+ }
+ return true;
+ }
+
+ return false;
+ }
+
+ public override bool is_reference_type_or_type_parameter () {
+ return true;
+ }
}
Modified: trunk/vala/valadatatype.vala
==============================================================================
--- trunk/vala/valadatatype.vala (original)
+++ trunk/vala/valadatatype.vala Fri Mar 14 02:11:02 2008
@@ -339,7 +339,6 @@
if (type_parameter != null ||
(data_type != null && (
data_type.is_reference_type () ||
- this is ArrayType ||
this is DelegateType ||
data_type.get_attribute ("PointerType") != null))) {
return true;
@@ -447,6 +446,13 @@
return symbols;
}
+ public virtual Symbol? get_member (string member_name) {
+ if (data_type != null) {
+ return SemanticAnalyzer.symbol_lookup_inherited (data_type, member_name);
+ }
+ return null;
+ }
+
public virtual Symbol get_pointer_member (string member_name) {
return null;
}
Modified: trunk/vala/valamember.vala
==============================================================================
--- trunk/vala/valamember.vala (original)
+++ trunk/vala/valamember.vala Fri Mar 14 02:11:02 2008
@@ -1,6 +1,6 @@
/* valamember.vala
*
- * Copyright (C) 2006-2007 Raffaele Sandrini, JÃrg Billeter
+ * Copyright (C) 2006-2008 Raffaele Sandrini, 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
@@ -34,7 +34,7 @@
}
public override Collection<string> get_cheader_filenames () {
- if (cheader_filenames.size == 0) {
+ 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);
Modified: trunk/vala/valasemanticanalyzer.vala
==============================================================================
--- trunk/vala/valasemanticanalyzer.vala (original)
+++ trunk/vala/valasemanticanalyzer.vala Fri Mar 14 02:11:02 2008
@@ -1180,7 +1180,7 @@
var calc_sizes = new ArrayList<LiteralExpression> ();
if (initlist != null) {
- initlist.expected_type = new ArrayType (expr.element_type, expr.rank);
+ initlist.expected_type = new ArrayType (expr.element_type, expr.rank, expr.source_reference);
initlist.expected_type.add_type_argument (expr.element_type);
initlist.accept (this);
@@ -1237,7 +1237,7 @@
expr.element_type.takes_ownership = true;
}
- expr.static_type = new ArrayType (expr.element_type, expr.rank);
+ expr.static_type = new ArrayType (expr.element_type, expr.rank, expr.source_reference);
expr.static_type.transfers_ownership = true;
expr.static_type.takes_ownership = true;
@@ -1456,9 +1456,11 @@
if (expr.symbol_reference == null && expr.inner.static_type != null) {
if (expr.pointer_member_access) {
expr.symbol_reference = expr.inner.static_type.get_pointer_member (expr.member_name);
- } else if (expr.inner.static_type.data_type != null) {
- base_symbol = expr.inner.static_type.data_type;
- expr.symbol_reference = symbol_lookup_inherited (base_symbol, expr.member_name);
+ } else {
+ if (expr.inner.static_type.data_type != null) {
+ base_symbol = expr.inner.static_type.data_type;
+ }
+ expr.symbol_reference = expr.inner.static_type.get_member (expr.member_name);
}
if (expr.symbol_reference != null) {
// inner expression is variable, field, or parameter
Modified: trunk/vala/valasymbolresolver.vala
==============================================================================
--- trunk/vala/valasymbolresolver.vala (original)
+++ trunk/vala/valasymbolresolver.vala Fri Mar 14 02:11:02 2008
@@ -300,10 +300,9 @@
element_type.is_ref = false;
element_type.is_out = false;
- type = new ArrayType (element_type, unresolved_type.array_rank);
+ type = new ArrayType (element_type, unresolved_type.array_rank, unresolved_type.source_reference);
type.add_type_argument (element_type);
- type.source_reference = unresolved_type.source_reference;
type.takes_ownership = unresolved_type.takes_ownership;
type.transfers_ownership = unresolved_type.transfers_ownership;
type.is_ref = unresolved_type.is_ref;
Modified: trunk/vala/valatypeparameter.vala
==============================================================================
--- trunk/vala/valatypeparameter.vala (original)
+++ trunk/vala/valatypeparameter.vala Fri Mar 14 02:11:02 2008
@@ -1,6 +1,6 @@
/* valatypeparameter.vala
*
- * Copyright (C) 2006-2007 JÃrg Billeter
+ * Copyright (C) 2006-2008 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
@@ -50,45 +50,6 @@
public override void accept (CodeVisitor! visitor) {
visitor.visit_type_parameter (this);
}
-
- /**
- * Returns the array type for elements of this type parameter.
- *
- * @param rank the rank the array should be of
- * @return array type for this type parameter
- */
- public Array! get_array (int rank) {
- Array array_type = null;
-
- if (array_types != null) {
- array_type = array_types[rank];
- }
-
- if (array_type == null) {
- if (array_types == null) {
- array_types = new HashMap<int,Array> ();
- }
-
- var new_array_type = new Array.with_type_parameter (this, rank, source_reference);
- parent_symbol.scope.add (new_array_type.name, new_array_type);
-
- /* add internal length field */
- new_array_type.scope.add (new_array_type.get_length_field ().name, new_array_type.get_length_field ());
- /* add internal resize method */
- new_array_type.scope.add (new_array_type.get_resize_method ().name, new_array_type.get_resize_method ());
- /* add internal move method */
- new_array_type.scope.add (new_array_type.get_move_method ().name, new_array_type.get_move_method ());
-
- /* link the array type to the same source as the container type */
- new_array_type.source_reference = this.source_reference;
-
- array_types[rank] = new_array_type;
-
- array_type = new_array_type;
- }
-
- return array_type;
- }
/**
* Checks two type parameters for equality.
Modified: trunk/vala/valatypesymbol.vala
==============================================================================
--- trunk/vala/valatypesymbol.vala (original)
+++ trunk/vala/valatypesymbol.vala Fri Mar 14 02:11:02 2008
@@ -195,45 +195,6 @@
}
/**
- * Returns the array type for elements of this data type.
- *
- * @param rank the rank the array should be of
- * @return array type for this data type
- */
- public Array! get_array (int rank) {
- Array array_type = null;
-
- if (array_types != null) {
- array_type = array_types[rank];
- }
-
- if (array_type == null) {
- if (array_types == null) {
- array_types = new HashMap<int,Array> ();
- }
-
- var new_array_type = new Array (this, rank, source_reference);
- parent_symbol.scope.add (new_array_type.name, new_array_type);
-
- /* add internal length field */
- new_array_type.scope.add (new_array_type.get_length_field ().name, new_array_type.get_length_field ());
- /* add internal resize method */
- new_array_type.scope.add (new_array_type.get_resize_method ().name, new_array_type.get_resize_method ());
- /* add internal move method */
- new_array_type.scope.add (new_array_type.get_move_method ().name, new_array_type.get_move_method ());
-
- /* link the array type to the same source as the container type */
- new_array_type.source_reference = this.source_reference;
-
- array_types[rank] = new_array_type;
-
- array_type = new_array_type;
- }
-
- return array_type;
- }
-
- /**
* Checks whether this data type is equal to or a subtype of the
* specified data type.
*
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]