~ubuntu-branches/ubuntu/maverick/vala/maverick

« back to all changes in this revision

Viewing changes to codegen/valagsignalmodule.vala

  • Committer: Bazaar Package Importer
  • Author(s): Didier Roche
  • Date: 2010-04-02 10:10:55 UTC
  • mfrom: (1.4.7 upstream)
  • Revision ID: james.westby@ubuntu.com-20100402101055-qbx3okzv0tnp3wpp
Tags: 0.8.0-0ubuntu1
* New upstream release:
  - Infer type arguments when calling generic methods.
  - Support `in' operator for arrays.
  - Add experimental support for regular expression literals.
  - Add experimental support for chained relational expressions.
  - Add va_list support.
  - Add clutter-gtk-0.10 bindings (Gordon Allott).
  - Add gdl-1.0 bindings (Nicolas Joseph).
  - Add gstreamer-app-0.10 bindings (Sebastian Dröge).
  - Add gstreamer-cdda-0.10 bindings (Sebastian Dröge).
  - Add gudev-1.0 bindings (Jim Nelson).
  - Add libgda-report-4.0 bindings (Shawn Ferris).
  - Add libgvc (graphviz) bindings (Martin Olsson).
  - Add purple bindings (Adrien Bustany).
  - Many bug fixes and binding updates.
* debian/patches/99_ltmain_as-needed.patch: refreshed

Show diffs side-by-side

added added

removed removed

Lines of Context:
367
367
                var cl = sig.parent_symbol as Class;
368
368
                csignew.add_argument (new CCodeConstant ("\"%s\"".printf (sig.get_cname ())));
369
369
                csignew.add_argument (new CCodeIdentifier (type.get_type_id ()));
370
 
                csignew.add_argument (new CCodeConstant ("G_SIGNAL_RUN_LAST"));
 
370
                string[] flags = new string[0];
 
371
                if (sig.run_type == "first") {
 
372
                        flags += "G_SIGNAL_RUN_FIRST";
 
373
                } else if (sig.run_type == "cleanup") {
 
374
                        flags += "G_SIGNAL_RUN_CLEANUP";
 
375
                } else {
 
376
                        flags += "G_SIGNAL_RUN_LAST";
 
377
                }
 
378
                if (sig.is_detailed) {
 
379
                        flags += "G_SIGNAL_DETAILED";
 
380
                }
 
381
 
 
382
                if (sig.no_recurse) {
 
383
                        flags += "G_SIGNAL_NO_RECURSE";
 
384
                }
 
385
 
 
386
                if (sig.is_action) {
 
387
                        flags += "G_SIGNAL_ACTION";
 
388
                }
 
389
 
 
390
                if (sig.no_hooks) {
 
391
                        flags += "G_SIGNAL_NO_HOOKS";
 
392
                }
 
393
 
 
394
                csignew.add_argument (new CCodeConstant (string.joinv (" | ", flags)));
 
395
 
371
396
                if (sig.default_handler == null) {
372
397
                        csignew.add_argument (new CCodeConstant ("0"));
373
398
                } else {
474
499
                        return null;
475
500
                }
476
501
 
477
 
                return connect_signal (sig, assignment.left, assignment.right, disconnect, assignment);
 
502
                return connect_signal (sig, assignment.left, assignment.right, disconnect, false, assignment);
478
503
        }
479
504
 
480
505
        public override void visit_assignment (Assignment assignment) {
550
575
                handler.accept (codegen);
551
576
 
552
577
                bool disconnect = (method_type.method_symbol.name == "disconnect");
 
578
                bool after = (method_type.method_symbol.name == "connect_after");
553
579
 
554
 
                expr.ccodenode = connect_signal (sig, signal_access, handler, disconnect, expr);
 
580
                expr.ccodenode = connect_signal (sig, signal_access, handler, disconnect, after, expr);
555
581
        }
556
582
 
557
 
        CCodeExpression? connect_signal (Signal sig, Expression signal_access, Expression handler, bool disconnect, CodeNode expr) {
 
583
        CCodeExpression? connect_signal (Signal sig, Expression signal_access, Expression handler, bool disconnect, bool after, CodeNode expr) {
558
584
                string connect_func;
559
585
 
560
586
                var m = (Method) handler.symbol_reference;
562
588
                if (!disconnect) {
563
589
                        // connect
564
590
                        if (sig is DynamicSignal) {
565
 
                                connect_func = head.get_dynamic_signal_connect_wrapper_name ((DynamicSignal) sig);
 
591
                                if (!after)
 
592
                                        connect_func = head.get_dynamic_signal_connect_wrapper_name ((DynamicSignal) sig);
 
593
                                else
 
594
                                        connect_func = head.get_dynamic_signal_connect_after_wrapper_name ((DynamicSignal) sig);
566
595
                        } else {
567
596
                                if (m.closure) {
568
597
                                        connect_func = "g_signal_connect_data";
569
598
                                } else if (in_gobject_instance (m)) {
570
599
                                        connect_func = "g_signal_connect_object";
571
 
                                } else {
 
600
                                } else if (!after) {
572
601
                                        connect_func = "g_signal_connect";
573
 
                                }
 
602
                                } else
 
603
                                        connect_func = "g_signal_connect_after";
574
604
                        }
575
605
                } else {
576
606
                        // disconnect
606
636
                        ccall.add_argument (get_result_cexpression ("self"));
607
637
                }
608
638
 
 
639
                CCodeCommaExpression? ccomma = null;
 
640
 
609
641
                if (sig is DynamicSignal) {
610
642
                        // dynamic_signal_connect or dynamic_signal_disconnect
611
643
 
627
659
                        }
628
660
 
629
661
                        // get signal id
630
 
                        var ccomma = new CCodeCommaExpression ();
 
662
                        ccomma = new CCodeCommaExpression ();
631
663
                        var temp_decl = get_temp_variable (uint_type);
632
664
                        temp_vars.insert (0, temp_decl);
633
665
                        var parse_call = new CCodeFunctionCall (new CCodeIdentifier ("g_signal_parse_name"));
635
667
                        var decl_type = (TypeSymbol) sig.parent_symbol;
636
668
                        parse_call.add_argument (new CCodeIdentifier (decl_type.get_type_id ()));
637
669
                        parse_call.add_argument (new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, get_variable_cexpression (temp_decl.name)));
 
670
                        LocalVariable? detail_temp_decl = null;
638
671
                        if (signal_detail == null) {
639
672
                                parse_call.add_argument (new CCodeConstant ("NULL"));
 
673
                                parse_call.add_argument (new CCodeConstant ("FALSE"));
640
674
                        } else {
641
 
                                var detail_temp_decl = get_temp_variable (gquark_type);
 
675
                                detail_temp_decl = get_temp_variable (gquark_type);
642
676
                                temp_vars.insert (0, detail_temp_decl);
643
677
                                parse_call.add_argument (new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, new CCodeIdentifier (detail_temp_decl.name)));
 
678
                                parse_call.add_argument (new CCodeConstant ("TRUE"));
644
679
                        }
645
 
                        parse_call.add_argument (new CCodeConstant ("FALSE"));
646
680
                        ccomma.append_expression (parse_call);
647
 
                        ccomma.append_expression (get_variable_cexpression (temp_decl.name));
648
681
 
649
682
                        // third argument: signal_id
650
 
                        ccall.add_argument (ccomma);
 
683
                        ccall.add_argument (get_variable_cexpression (temp_decl.name));
651
684
 
652
685
                        // fourth argument: detail
653
 
                        ccall.add_argument (new CCodeConstant ("0"));
 
686
                        if (detail_temp_decl == null) {
 
687
                                ccall.add_argument (new CCodeConstant ("0"));
 
688
                        } else {
 
689
                                ccall.add_argument (get_variable_cexpression (detail_temp_decl.name));
 
690
                        }
654
691
                        // fifth argument: closure
655
692
                        ccall.add_argument (new CCodeConstant ("NULL"));
656
693
                }
669
706
                        ccall.add_argument (new CCodeCastExpression (handler_destroy_notify, "GClosureNotify"));
670
707
 
671
708
                        // sixth argument: connect_flags
672
 
                        ccall.add_argument (new CCodeConstant ("0"));
 
709
                        if (!after)
 
710
                                ccall.add_argument (new CCodeConstant ("0"));
 
711
                        else
 
712
                                ccall.add_argument (new CCodeConstant ("G_CONNECT_AFTER"));
673
713
                } else if (m.binding == MemberBinding.INSTANCE) {
674
714
                        // g_signal_connect_object or g_signal_handlers_disconnect_matched
675
715
                        // or dynamic_signal_connect or dynamic_signal_disconnect
690
730
                                // g_signal_connect_object
691
731
 
692
732
                                // fifth argument: connect_flags
693
 
                                ccall.add_argument (new CCodeConstant ("0"));
 
733
                                if (!after)
 
734
                                        ccall.add_argument (new CCodeConstant ("0"));
 
735
                                else
 
736
                                        ccall.add_argument (new CCodeConstant ("G_CONNECT_AFTER"));
694
737
                        }
695
738
                } else {
696
 
                        // g_signal_connect or g_signal_handlers_disconnect_matched
 
739
                        // g_signal_connect or g_signal_connect_after or g_signal_handlers_disconnect_matched
697
740
                        // or dynamic_signal_connect or dynamic_signal_disconnect
698
741
 
699
742
                        // fourth resp. seventh argument: user_data
700
743
                        ccall.add_argument (new CCodeConstant ("NULL"));
701
744
                }
702
745
 
703
 
                return ccall;
 
746
                if (ccomma != null) {
 
747
                        ccomma.append_expression (ccall);
 
748
                        return ccomma;
 
749
                } else {
 
750
                        return ccall;
 
751
                }
704
752
        }
705
753
}
706
754