Mercurial > vim
comparison src/vim9compile.c @ 26680:1b288eb2fcdc v8.2.3869
patch 8.2.3869: Vim9: type checking for "any" is inconsistent
Commit: https://github.com/vim/vim/commit/fa46ead31abe66494da775921feefece02ce6d95
Author: Bram Moolenaar <Bram@vim.org>
Date: Wed Dec 22 13:18:39 2021 +0000
patch 8.2.3869: Vim9: type checking for "any" is inconsistent
Problem: Vim9: type checking for "any" is inconsistent.
Solution: Always use a runtime type check for using "any" for a more
specific type.
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Wed, 22 Dec 2021 14:30:05 +0100 |
parents | 4b23672d1f0e |
children | b969fdb8cd46 |
comparison
equal
deleted
inserted
replaced
26679:2f3b13eae139 | 26680:1b288eb2fcdc |
---|---|
364 if (actual->tt_type == VAR_ANY | 364 if (actual->tt_type == VAR_ANY |
365 || actual->tt_type == VAR_UNKNOWN | 365 || actual->tt_type == VAR_UNKNOWN |
366 || (actual->tt_type == VAR_FUNC | 366 || (actual->tt_type == VAR_FUNC |
367 && (expected->tt_type == VAR_FUNC | 367 && (expected->tt_type == VAR_FUNC |
368 || expected->tt_type == VAR_PARTIAL) | 368 || expected->tt_type == VAR_PARTIAL) |
369 && (actual->tt_member == &t_any || actual->tt_argcount < 0) | 369 && (actual->tt_member == &t_any |
370 && ((actual->tt_member == &t_void) | 370 || actual->tt_member == &t_unknown |
371 || actual->tt_argcount < 0) | |
372 && (actual->tt_member == &t_unknown || | |
373 (actual->tt_member == &t_void) | |
371 == (expected->tt_member == &t_void)))) | 374 == (expected->tt_member == &t_void)))) |
372 return TRUE; | 375 return TRUE; |
373 if ((actual->tt_type == VAR_LIST || actual->tt_type == VAR_DICT) | 376 if ((actual->tt_type == VAR_LIST || actual->tt_type == VAR_DICT) |
374 && actual->tt_type == expected->tt_type) | 377 && actual->tt_type == expected->tt_type) |
375 // This takes care of a nested list or dict. | 378 // This takes care of a nested list or dict. |
410 if (ret == OK) | 413 if (ret == OK) |
411 return OK; | 414 return OK; |
412 | 415 |
413 // If the actual type can be the expected type add a runtime check. | 416 // If the actual type can be the expected type add a runtime check. |
414 // If it's a constant a runtime check makes no sense. | 417 // If it's a constant a runtime check makes no sense. |
415 if (ret == MAYBE || ((!actual_is_const || actual == &t_any) | 418 if (!actual_is_const && ret == MAYBE && use_typecheck(actual, expected)) |
416 && use_typecheck(actual, expected))) | |
417 { | 419 { |
418 generate_TYPECHECK(cctx, expected, offset, where.wt_index); | 420 generate_TYPECHECK(cctx, expected, offset, where.wt_index); |
419 return OK; | 421 return OK; |
420 } | 422 } |
421 | 423 |
2545 if (ufunc->uf_arg_types[arg_idx] == &t_unknown) | 2547 if (ufunc->uf_arg_types[arg_idx] == &t_unknown) |
2546 { | 2548 { |
2547 did_set_arg_type = TRUE; | 2549 did_set_arg_type = TRUE; |
2548 ufunc->uf_arg_types[arg_idx] = val_type; | 2550 ufunc->uf_arg_types[arg_idx] = val_type; |
2549 } | 2551 } |
2550 else if (check_type(ufunc->uf_arg_types[arg_idx], val_type, | 2552 else if (need_type_where(val_type, ufunc->uf_arg_types[arg_idx], |
2551 TRUE, where) == FAIL) | 2553 -1, where, &cctx, FALSE, FALSE) == FAIL) |
2552 goto erret; | 2554 goto erret; |
2553 | 2555 |
2554 if (generate_STORE(&cctx, ISN_STORE, i - count - off, NULL) == FAIL) | 2556 if (generate_STORE(&cctx, ISN_STORE, i - count - off, NULL) == FAIL) |
2555 goto erret; | 2557 goto erret; |
2556 | 2558 |