vala r2108 - in trunk: . gobject
- From: juergbi svn gnome org
- To: svn-commits-list gnome org
- Subject: vala r2108 - in trunk: . gobject
- Date: Mon, 1 Dec 2008 07:57:39 +0000 (UTC)
Author: juergbi
Date: Mon Dec 1 07:57:39 2008
New Revision: 2108
URL: http://svn.gnome.org/viewvc/vala?rev=2108&view=rev
Log:
2008-12-01 JÃrg Billeter <j bitron ch>
* gobject/valagobjectmodule.vala:
* gobject/valagsignalmodule.vala:
Support signals in non-GObject classes, patch by Yu Feng,
fixes bug 561989
Modified:
trunk/ChangeLog
trunk/gobject/valagobjectmodule.vala
trunk/gobject/valagsignalmodule.vala
Modified: trunk/gobject/valagobjectmodule.vala
==============================================================================
--- trunk/gobject/valagobjectmodule.vala (original)
+++ trunk/gobject/valagobjectmodule.vala Mon Dec 1 07:57:39 2008
@@ -400,25 +400,32 @@
function.add_parameter (new CCodeFormalParameter ("collect_flags", "guint"));
function.modifiers = CCodeModifiers.STATIC;
- var vpointer = new CCodeMemberAccess(new CCodeMemberAccess.pointer (new CCodeIdentifier ("value"), "data[0]"),"v_pointer");
+ var vpointer = new CCodeMemberAccess (new CCodeMemberAccess.pointer (new CCodeIdentifier ("value"), "data[0]"), "v_pointer");
var object_p_ptr = new CCodeIdentifier ("*object_p");
- var null_ = new CCodeConstant("NULL");
+ var null_ = new CCodeConstant ("NULL");
var init_block = new CCodeBlock ();
- var ctypedecl = new CCodeDeclaration (cl.get_cname()+"**");
- ctypedecl.add_declarator ( new CCodeVariableDeclarator.with_initializer("object_p", new CCodeMemberAccess(new CCodeIdentifier ("collect_values[0]"),"v_pointer")));
+ var ctypedecl = new CCodeDeclaration (cl.get_cname () + "**");
+ ctypedecl.add_declarator (new CCodeVariableDeclarator.with_initializer ("object_p", new CCodeMemberAccess (new CCodeIdentifier ("collect_values[0]"),"v_pointer")));
init_block.add_statement (ctypedecl);
+ var value_type_name_fct = new CCodeFunctionCall (new CCodeIdentifier ("G_VALUE_TYPE_NAME"));
+ value_type_name_fct.add_argument (new CCodeConstant ("value"));
+
var assert_condition = new CCodeUnaryExpression (CCodeUnaryOperator.LOGICAL_NEGATION, new CCodeIdentifier ("object_p"));
function.block = init_block;
var assert_true = new CCodeBlock ();
+ var assert_printf = new CCodeFunctionCall (new CCodeIdentifier ("g_strdup_printf"));
+ assert_printf.add_argument (new CCodeConstant ("\"value location for `%s' passed as NULL\""));
+ assert_printf.add_argument (value_type_name_fct);
+ assert_true.add_statement (new CCodeReturnStatement (assert_printf));
var if_assert = new CCodeIfStatement (assert_condition, assert_true);
init_block.add_statement (if_assert);
var main_else_true = new CCodeBlock ();
var main_else_if_true = new CCodeBlock ();
- var main_else_if_condition = new CCodeBinaryExpression ( CCodeBinaryOperator.AND, new CCodeIdentifier ("collect_flags"), new CCodeIdentifier ("G_VALUE_NOCOPY_CONTENTS"));
+ var main_else_if_condition = new CCodeBinaryExpression (CCodeBinaryOperator.AND, new CCodeIdentifier ("collect_flags"), new CCodeIdentifier ("G_VALUE_NOCOPY_CONTENTS"));
var main_else_if = new CCodeIfStatement (main_else_if_condition, main_else_if_true, main_else_true);
var main_true = new CCodeBlock ();
@@ -429,11 +436,11 @@
var ref_fct = new CCodeFunctionCall (new CCodeIdentifier (cl.get_ref_function()));
ref_fct.add_argument (vpointer);
- main_true.add_statement (new CCodeExpressionStatement( new CCodeAssignment (object_p_ptr, null_, CCodeAssignmentOperator.SIMPLE)));
- main_else_if_true.add_statement (new CCodeExpressionStatement( new CCodeAssignment (object_p_ptr, vpointer, CCodeAssignmentOperator.SIMPLE)));
- main_else_true.add_statement (new CCodeExpressionStatement( new CCodeAssignment (object_p_ptr, ref_fct, CCodeAssignmentOperator.SIMPLE)));
+ main_true.add_statement (new CCodeExpressionStatement (new CCodeAssignment (object_p_ptr, null_, CCodeAssignmentOperator.SIMPLE)));
+ main_else_if_true.add_statement (new CCodeExpressionStatement (new CCodeAssignment (object_p_ptr, vpointer, CCodeAssignmentOperator.SIMPLE)));
+ main_else_true.add_statement (new CCodeExpressionStatement (new CCodeAssignment (object_p_ptr, ref_fct, CCodeAssignmentOperator.SIMPLE)));
- init_block.add_statement ( new CCodeReturnStatement ( null_ ));
+ init_block.add_statement (new CCodeReturnStatement (null_));
source_type_member_definition.append (function);
}
@@ -450,60 +457,70 @@
var init_block = new CCodeBlock ();
function.block = init_block;
- var condition = new CCodeMemberAccess (new CCodeIdentifier ("collect_values[0]"), "v_pointer");
+ var collect_vpointer = new CCodeMemberAccess (new CCodeIdentifier ("collect_values[0]"), "v_pointer");
+
var true_stmt = new CCodeBlock ();
var false_stmt = new CCodeBlock ();
- var if_statement = new CCodeIfStatement (condition, true_stmt, false_stmt);
+ var if_statement = new CCodeIfStatement (collect_vpointer, true_stmt, false_stmt);
init_block.add_statement (if_statement);
var obj_identifier = new CCodeIdentifier ("object");
- var ctypedecl = new CCodeDeclaration (cl.get_cname()+"*");
- ctypedecl.add_declarator ( new CCodeVariableDeclarator.with_initializer("object", vpointer ) );
- true_stmt.add_statement ( ctypedecl );
+ var ctypedecl = new CCodeDeclaration (cl.get_cname () + "*");
+ ctypedecl.add_declarator (new CCodeVariableDeclarator.with_initializer ("object", collect_vpointer));
+ true_stmt.add_statement (ctypedecl);
- var l_expression = new CCodeMemberAccess(new CCodeMemberAccess.pointer (obj_identifier, "parent_instance"),"g_class");
- var sub_condition = new CCodeBinaryExpression ( CCodeBinaryOperator.EQUALITY, l_expression, new CCodeConstant("NULL"));
+ var l_expression = new CCodeMemberAccess (new CCodeMemberAccess.pointer (obj_identifier, "parent_instance"), "g_class");
+ var sub_condition = new CCodeBinaryExpression (CCodeBinaryOperator.EQUALITY, l_expression, new CCodeConstant ("NULL"));
var sub_true_stmt = new CCodeBlock ();
var sub_false_stmt = new CCodeBlock ();
var reg_call = new CCodeFunctionCall (new CCodeIdentifier ("g_value_type_compatible"));
- var type_check = new CCodeFunctionCall (new CCodeIdentifier ("G_OBJECT_TYPE"));
- type_check.add_argument ( new CCodeIdentifier ("object") );
- reg_call.add_argument ( type_check );
+ var type_check = new CCodeFunctionCall (new CCodeIdentifier ("G_TYPE_FROM_INSTANCE"));
+ type_check.add_argument (new CCodeIdentifier ("object"));
+ reg_call.add_argument (type_check);
+
+ var type_name_fct = new CCodeFunctionCall (new CCodeIdentifier ("g_type_name"));
+ type_name_fct.add_argument (type_check);
var stored_type = new CCodeFunctionCall (new CCodeIdentifier ("G_VALUE_TYPE"));
- stored_type.add_argument ( new CCodeIdentifier ("value") );
- reg_call.add_argument ( stored_type );
+ stored_type.add_argument (new CCodeIdentifier ("value"));
+ reg_call.add_argument (stored_type);
- var type_name_fct = new CCodeFunctionCall (new CCodeIdentifier ("G_VALUE_TYPE_NAME"));
- type_name_fct.add_argument (new CCodeConstant("value"));
+ var value_type_name_fct = new CCodeFunctionCall (new CCodeIdentifier ("G_VALUE_TYPE_NAME"));
+ value_type_name_fct.add_argument (new CCodeConstant ("value"));
var true_return = new CCodeFunctionCall (new CCodeIdentifier ("g_strconcat"));
- true_return.add_argument (new CCodeConstant("\"invalid unclassed object pointer for value type `\""));
- true_return.add_argument ( type_name_fct );
- true_return.add_argument (new CCodeConstant("\"'\""));
- true_return.add_argument (new CCodeConstant("NULL"));
- sub_true_stmt.add_statement (new CCodeReturnStatement ( true_return ));
+ true_return.add_argument (new CCodeConstant ("\"invalid unclassed object pointer for value type `\""));
+ true_return.add_argument (value_type_name_fct);
+ true_return.add_argument (new CCodeConstant ("\"'\""));
+ true_return.add_argument (new CCodeConstant ("NULL"));
+ sub_true_stmt.add_statement (new CCodeReturnStatement (true_return));
var false_return = new CCodeFunctionCall (new CCodeIdentifier ("g_strconcat"));
- false_return.add_argument (new CCodeConstant("\"invalid object type `\""));
- false_return.add_argument ( type_check );
- false_return.add_argument (new CCodeConstant("\"' for value type `\""));
- false_return.add_argument ( type_name_fct );
- false_return.add_argument (new CCodeConstant("\"'\""));
- false_return.add_argument (new CCodeConstant("NULL"));
- sub_false_stmt.add_statement (new CCodeReturnStatement ( false_return ));
+ false_return.add_argument (new CCodeConstant ("\"invalid object type `\""));
+ false_return.add_argument (type_name_fct);
+ false_return.add_argument (new CCodeConstant ("\"' for value type `\""));
+ false_return.add_argument (value_type_name_fct);
+ false_return.add_argument (new CCodeConstant ("\"'\""));
+ false_return.add_argument (new CCodeConstant ("NULL"));
+ sub_false_stmt.add_statement (new CCodeReturnStatement (false_return));
var sub_else_if_statement = new CCodeIfStatement (new CCodeUnaryExpression (CCodeUnaryOperator.LOGICAL_NEGATION, reg_call), sub_false_stmt );
sub_else_if_statement.else_if = true;
- var sub_if_statement = new CCodeIfStatement (sub_condition, sub_true_stmt, sub_else_if_statement );
- true_stmt.add_statement ( sub_if_statement );
+ var sub_if_statement = new CCodeIfStatement (sub_condition, sub_true_stmt, sub_else_if_statement);
+ true_stmt.add_statement (sub_if_statement);
- var else_assigment = new CCodeExpressionStatement( new CCodeAssignment (vpointer, new CCodeConstant ("NULL"), CCodeAssignmentOperator.SIMPLE));
- false_stmt.add_statement ( else_assigment );
+ var ref_call = new CCodeFunctionCall (new CCodeIdentifier (cl.get_ref_function ()));
+ ref_call.add_argument (new CCodeIdentifier ("object"));
- init_block.add_statement ( new CCodeReturnStatement ( new CCodeConstant("NULL") ));
+ var true_assignment = new CCodeExpressionStatement (new CCodeAssignment (vpointer, ref_call, CCodeAssignmentOperator.SIMPLE));
+ true_stmt.add_statement (true_assignment);
+
+ var else_assigment = new CCodeExpressionStatement (new CCodeAssignment (vpointer, new CCodeConstant ("NULL"), CCodeAssignmentOperator.SIMPLE));
+ false_stmt.add_statement (else_assigment);
+
+ init_block.add_statement (new CCodeReturnStatement (new CCodeConstant ("NULL")));
source_type_member_definition.append (function);
}
@@ -870,11 +887,6 @@
init_block.add_statement (new CCodeExpressionStatement (cinst));
}
}
-
- /* create signals */
- foreach (Signal sig in cl.get_signals ()) {
- init_block.add_statement (new CCodeExpressionStatement (head.get_signal_creation (sig, cl)));
- }
} else if (!cl.is_compact) {
/* create type, dup_func, and destroy_func fields for generic types */
foreach (TypeParameter type_param in cl.get_type_parameters ()) {
@@ -891,6 +903,13 @@
}
}
+ if (!cl.is_compact) {
+ /* create signals */
+ foreach (Signal sig in cl.get_signals ()) {
+ init_block.add_statement (new CCodeExpressionStatement (head.get_signal_creation (sig, cl)));
+ }
+ }
+
init_block.add_statement (head.register_dbus_info (cl));
init_block.add_statement (class_init_fragment);
Modified: trunk/gobject/valagsignalmodule.vala
==============================================================================
--- trunk/gobject/valagsignalmodule.vala (original)
+++ trunk/gobject/valagsignalmodule.vala Mon Dec 1 07:57:39 2008
@@ -153,14 +153,13 @@
}
public override void visit_signal (Signal sig) {
- // parent_symbol may be null for late bound signals
- if (sig.parent_symbol != null) {
- var dt = sig.parent_symbol as TypeSymbol;
- if (!dt.is_subtype_of (gobject_type)) {
- sig.error = true;
- Report.error (sig.source_reference, "Only classes and interfaces deriving from GLib.Object support signals. `%s' does not derive from GLib.Object.".printf (dt.get_full_name ()));
- return;
- }
+ // parent_symbol may be null for dynamic signals
+
+ var cl = sig.parent_symbol as Class;
+ if (cl != null && cl.is_compact) {
+ sig.error = true;
+ Report.error (sig.source_reference, "Signals are not supported in compact classes");
+ return;
}
sig.accept_children (codegen);
@@ -409,19 +408,13 @@
// detailed signal emission
var sig = (Signal) expr.symbol_reference;
var ma = (MemberAccess) expr.container;
-
expr.accept_children (codegen);
var detail_expr = expr.get_indices ().get (0) as StringLiteral;
string signal_detail = detail_expr.eval ();
var ccall = new CCodeFunctionCall (new CCodeIdentifier ("g_signal_emit_by_name"));
-
- // FIXME: use C cast if debugging disabled
- var ccast = new CCodeFunctionCall (new CCodeIdentifier ("G_OBJECT"));
- ccast.add_argument ((CCodeExpression) ma.inner.ccodenode);
- ccall.add_argument (ccast);
-
+ ccall.add_argument ((CCodeExpression) ma.inner.ccodenode);
ccall.add_argument (sig.get_canonical_cconstant (signal_detail));
expr.ccodenode = ccall;
@@ -614,11 +607,7 @@
expr.ccodenode = ccall;
} else {
var ccall = new CCodeFunctionCall (new CCodeIdentifier ("g_signal_emit_by_name"));
-
- // FIXME: use C cast if debugging disabled
- var ccast = new CCodeFunctionCall (new CCodeIdentifier ("G_OBJECT"));
- ccast.add_argument (pub_inst);
- ccall.add_argument (ccast);
+ ccall.add_argument (pub_inst);
ccall.add_argument (sig.get_canonical_cconstant ());
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]