Mercurial > vim
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); |