comparison src/channel.c @ 25384:e8e2c4d33b9b v8.2.3229

patch 8.2.3229: Vim9: runtime and compile time type checks are not the same Commit: https://github.com/vim/vim/commit/4490ec4e839e45a2e6923c265c7e9e64c240b805 Author: Yegappan Lakshmanan <yegappan@yahoo.com> Date: Tue Jul 27 22:00:44 2021 +0200 patch 8.2.3229: Vim9: runtime and compile time type checks are not the same Problem: Vim9: runtime and compile time type checks are not the same. Solution: Add more runtime type checks for builtin functions. (Yegappan Lakshmanan, closes #8646)
author Bram Moolenaar <Bram@vim.org>
date Tue, 27 Jul 2021 22:15:06 +0200
parents 75031a22be39
children 038eb6d9003a
comparison
equal deleted inserted replaced
25383:510e4fcb5363 25384:e8e2c4d33b9b
3863 3863
3864 // return an empty string by default 3864 // return an empty string by default
3865 rettv->v_type = VAR_STRING; 3865 rettv->v_type = VAR_STRING;
3866 rettv->vval.v_string = NULL; 3866 rettv->vval.v_string = NULL;
3867 3867
3868 if (in_vim9script()
3869 && (check_for_chan_or_job_arg(argvars, 0) == FAIL
3870 || check_for_opt_dict_arg(argvars, 1) == FAIL))
3871 return;
3872
3868 clear_job_options(&opt); 3873 clear_job_options(&opt);
3869 if (get_job_options(&argvars[1], &opt, JO_TIMEOUT + JO_PART + JO_ID, 0) 3874 if (get_job_options(&argvars[1], &opt, JO_TIMEOUT + JO_PART + JO_ID, 0)
3870 == FAIL) 3875 == FAIL)
3871 goto theend; 3876 goto theend;
3872 3877
4782 * "ch_canread()" function 4787 * "ch_canread()" function
4783 */ 4788 */
4784 void 4789 void
4785 f_ch_canread(typval_T *argvars, typval_T *rettv) 4790 f_ch_canread(typval_T *argvars, typval_T *rettv)
4786 { 4791 {
4787 channel_T *channel = get_channel_arg(&argvars[0], FALSE, FALSE, 0); 4792 channel_T *channel;
4788 4793
4789 rettv->vval.v_number = 0; 4794 rettv->vval.v_number = 0;
4795 if (in_vim9script() && check_for_chan_or_job_arg(argvars, 0) == FAIL)
4796 return;
4797
4798 channel = get_channel_arg(&argvars[0], FALSE, FALSE, 0);
4790 if (channel != NULL) 4799 if (channel != NULL)
4791 rettv->vval.v_number = channel_has_readahead(channel, PART_SOCK) 4800 rettv->vval.v_number = channel_has_readahead(channel, PART_SOCK)
4792 || channel_has_readahead(channel, PART_OUT) 4801 || channel_has_readahead(channel, PART_OUT)
4793 || channel_has_readahead(channel, PART_ERR); 4802 || channel_has_readahead(channel, PART_ERR);
4794 } 4803 }
4797 * "ch_close()" function 4806 * "ch_close()" function
4798 */ 4807 */
4799 void 4808 void
4800 f_ch_close(typval_T *argvars, typval_T *rettv UNUSED) 4809 f_ch_close(typval_T *argvars, typval_T *rettv UNUSED)
4801 { 4810 {
4802 channel_T *channel = get_channel_arg(&argvars[0], TRUE, FALSE, 0); 4811 channel_T *channel;
4803 4812
4813 if (in_vim9script() && check_for_chan_or_job_arg(argvars, 0) == FAIL)
4814 return;
4815
4816 channel = get_channel_arg(&argvars[0], TRUE, FALSE, 0);
4804 if (channel != NULL) 4817 if (channel != NULL)
4805 { 4818 {
4806 channel_close(channel, FALSE); 4819 channel_close(channel, FALSE);
4807 channel_clear(channel); 4820 channel_clear(channel);
4808 } 4821 }
4812 * "ch_close()" function 4825 * "ch_close()" function
4813 */ 4826 */
4814 void 4827 void
4815 f_ch_close_in(typval_T *argvars, typval_T *rettv UNUSED) 4828 f_ch_close_in(typval_T *argvars, typval_T *rettv UNUSED)
4816 { 4829 {
4817 channel_T *channel = get_channel_arg(&argvars[0], TRUE, FALSE, 0); 4830 channel_T *channel;
4818 4831
4832 if (in_vim9script() && check_for_chan_or_job_arg(argvars, 0) == FAIL)
4833 return;
4834
4835 channel = get_channel_arg(&argvars[0], TRUE, FALSE, 0);
4819 if (channel != NULL) 4836 if (channel != NULL)
4820 channel_close_in(channel); 4837 channel_close_in(channel);
4821 } 4838 }
4822 4839
4823 /* 4840 /*
4859 * "ch_getjob()" function 4876 * "ch_getjob()" function
4860 */ 4877 */
4861 void 4878 void
4862 f_ch_getjob(typval_T *argvars, typval_T *rettv) 4879 f_ch_getjob(typval_T *argvars, typval_T *rettv)
4863 { 4880 {
4864 channel_T *channel = get_channel_arg(&argvars[0], FALSE, FALSE, 0); 4881 channel_T *channel;
4865 4882
4883 if (in_vim9script() && check_for_chan_or_job_arg(argvars, 0) == FAIL)
4884 return;
4885
4886 channel = get_channel_arg(&argvars[0], FALSE, FALSE, 0);
4866 if (channel != NULL) 4887 if (channel != NULL)
4867 { 4888 {
4868 rettv->v_type = VAR_JOB; 4889 rettv->v_type = VAR_JOB;
4869 rettv->vval.v_job = channel->ch_job; 4890 rettv->vval.v_job = channel->ch_job;
4870 if (channel->ch_job != NULL) 4891 if (channel->ch_job != NULL)
4876 * "ch_info()" function 4897 * "ch_info()" function
4877 */ 4898 */
4878 void 4899 void
4879 f_ch_info(typval_T *argvars, typval_T *rettv UNUSED) 4900 f_ch_info(typval_T *argvars, typval_T *rettv UNUSED)
4880 { 4901 {
4881 channel_T *channel = get_channel_arg(&argvars[0], FALSE, FALSE, 0); 4902 channel_T *channel;
4882 4903
4904 if (in_vim9script() && check_for_chan_or_job_arg(argvars, 0) == FAIL)
4905 return;
4906
4907 channel = get_channel_arg(&argvars[0], FALSE, FALSE, 0);
4883 if (channel != NULL && rettv_dict_alloc(rettv) != FAIL) 4908 if (channel != NULL && rettv_dict_alloc(rettv) != FAIL)
4884 channel_info(channel, rettv->vval.v_dict); 4909 channel_info(channel, rettv->vval.v_dict);
4885 } 4910 }
4886 4911
4887 /* 4912 /*
4919 if (check_restricted() || check_secure()) 4944 if (check_restricted() || check_secure())
4920 return; 4945 return;
4921 4946
4922 if (in_vim9script() 4947 if (in_vim9script()
4923 && (check_for_string_arg(argvars, 0) == FAIL 4948 && (check_for_string_arg(argvars, 0) == FAIL
4924 || check_for_string_arg(argvars, 1) == FAIL)) 4949 || check_for_opt_string_arg(argvars, 1) == FAIL))
4925 return; 4950 return;
4926 4951
4927 fname = tv_get_string(&argvars[0]); 4952 fname = tv_get_string(&argvars[0]);
4928 if (argvars[1].v_type == VAR_STRING) 4953 if (argvars[1].v_type == VAR_STRING)
4929 opt = tv_get_string_buf(&argvars[1], buf); 4954 opt = tv_get_string_buf(&argvars[1], buf);
5011 void 5036 void
5012 f_ch_setoptions(typval_T *argvars, typval_T *rettv UNUSED) 5037 f_ch_setoptions(typval_T *argvars, typval_T *rettv UNUSED)
5013 { 5038 {
5014 channel_T *channel; 5039 channel_T *channel;
5015 jobopt_T opt; 5040 jobopt_T opt;
5041
5042 if (in_vim9script()
5043 && (check_for_chan_or_job_arg(argvars, 0) == FAIL
5044 || check_for_dict_arg(argvars, 1) == FAIL))
5045 return;
5016 5046
5017 channel = get_channel_arg(&argvars[0], FALSE, FALSE, 0); 5047 channel = get_channel_arg(&argvars[0], FALSE, FALSE, 0);
5018 if (channel == NULL) 5048 if (channel == NULL)
5019 return; 5049 return;
5020 clear_job_options(&opt); 5050 clear_job_options(&opt);
5036 5066
5037 // return an empty string by default 5067 // return an empty string by default
5038 rettv->v_type = VAR_STRING; 5068 rettv->v_type = VAR_STRING;
5039 rettv->vval.v_string = NULL; 5069 rettv->vval.v_string = NULL;
5040 5070
5071 if (in_vim9script()
5072 && (check_for_chan_or_job_arg(argvars, 0) == FAIL
5073 || check_for_opt_dict_arg(argvars, 1) == FAIL))
5074 return;
5075
5041 channel = get_channel_arg(&argvars[0], FALSE, FALSE, 0); 5076 channel = get_channel_arg(&argvars[0], FALSE, FALSE, 0);
5042 5077
5043 if (argvars[1].v_type != VAR_UNKNOWN) 5078 if (argvars[1].v_type != VAR_UNKNOWN)
5044 { 5079 {
5045 clear_job_options(&opt); 5080 clear_job_options(&opt);