Mercurial > hg > octave-lyh
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 |