comparison src/variables.cc @ 10637:9cd5aa83fa62

implement 'local' parameter to pseudo-variables
author Jaroslav Hajek <highegg@gmail.com>
date Mon, 17 May 2010 13:46:57 +0200
parents 4d1fc073fbb7
children e1559a8a60b4
comparison
equal deleted inserted replaced
10636:c170eb1c067f 10637:9cd5aa83fa62
636 symbol_table::top_level_varref (nm) = val; 636 symbol_table::top_level_varref (nm) = val;
637 } 637 }
638 638
639 // Variable values. 639 // Variable values.
640 640
641 static bool
642 wants_local_change (const octave_value_list& args, int& nargin)
643 {
644 bool retval = false;
645
646 if (nargin == 2)
647 {
648 if (args(1).is_string () && args(1).string_value () == "local")
649 {
650 nargin = 1;
651 retval = true;
652 }
653 else
654 {
655 error_with_cfn ("expecting second argument to be \"local\"");
656 nargin = 0;
657 }
658 }
659
660 return retval;
661 }
662
663 template <class T>
664 bool try_local_protect (T& var)
665 {
666 octave_user_code *curr_usr_code = octave_call_stack::caller_user_code ();
667 octave_user_function *curr_usr_fcn = 0;
668 if (curr_usr_code && curr_usr_code->is_user_function ())
669 curr_usr_fcn = dynamic_cast<octave_user_function *> (curr_usr_code);
670
671 if (curr_usr_fcn && curr_usr_fcn->local_protect (var))
672 return true;
673 else
674 return false;
675 }
676
641 octave_value 677 octave_value
642 set_internal_variable (bool& var, const octave_value_list& args, 678 set_internal_variable (bool& var, const octave_value_list& args,
643 int nargout, const char *nm) 679 int nargout, const char *nm)
644 { 680 {
645 octave_value retval; 681 octave_value retval;
647 int nargin = args.length (); 683 int nargin = args.length ();
648 684
649 if (nargout > 0 || nargin == 0) 685 if (nargout > 0 || nargin == 0)
650 retval = var; 686 retval = var;
651 687
688 if (wants_local_change (args, nargin))
689 {
690 if (! try_local_protect (var))
691 warning ("\"local\" has no effect outside a function");
692 }
693
652 if (nargin == 1) 694 if (nargin == 1)
653 { 695 {
654 bool bval = args(0).bool_value (); 696 bool bval = args(0).bool_value ();
655 697
656 if (! error_state) 698 if (! error_state)
672 714
673 int nargin = args.length (); 715 int nargin = args.length ();
674 716
675 if (nargout > 0 || nargin == 0) 717 if (nargout > 0 || nargin == 0)
676 retval = var; 718 retval = var;
719
720 if (wants_local_change (args, nargin))
721 {
722 if (! try_local_protect (var))
723 warning ("\"local\" has no effect outside a function");
724 }
677 725
678 if (nargin == 1) 726 if (nargin == 1)
679 { 727 {
680 std::string sval = args(0).string_value (); 728 std::string sval = args(0).string_value ();
681 729
714 762
715 int nargin = args.length (); 763 int nargin = args.length ();
716 764
717 if (nargout > 0 || nargin == 0) 765 if (nargout > 0 || nargin == 0)
718 retval = var; 766 retval = var;
767
768 if (wants_local_change (args, nargin))
769 {
770 if (! try_local_protect (var))
771 warning ("\"local\" has no effect outside a function");
772 }
719 773
720 if (nargin == 1) 774 if (nargin == 1)
721 { 775 {
722 int ival = args(0).int_value (); 776 int ival = args(0).int_value ();
723 777
750 int nargin = args.length (); 804 int nargin = args.length ();
751 805
752 if (nargout > 0 || nargin == 0) 806 if (nargout > 0 || nargin == 0)
753 retval = var; 807 retval = var;
754 808
809 if (wants_local_change (args, nargin))
810 {
811 if (! try_local_protect (var))
812 warning ("\"local\" has no effect outside a function");
813 }
814
755 if (nargin == 1) 815 if (nargin == 1)
756 { 816 {
757 double dval = args(0).scalar_value (); 817 double dval = args(0).scalar_value ();
758 818
759 if (! error_state) 819 if (! error_state)
782 842
783 int nargin = args.length (); 843 int nargin = args.length ();
784 844
785 if (nargout > 0 || nargin == 0) 845 if (nargout > 0 || nargin == 0)
786 retval = var; 846 retval = var;
847
848 if (wants_local_change (args, nargin))
849 {
850 if (! try_local_protect (var))
851 warning ("\"local\" has no effect outside a function");
852 }
787 853
788 if (nargin == 1) 854 if (nargin == 1)
789 { 855 {
790 std::string sval = args(0).string_value (); 856 std::string sval = args(0).string_value ();
791 857