comparison src/vim9compile.c @ 32960:d5c05e15cf81 v9.0.1780

patch 9.0.1780: Vim9 type not defined during object creation Commit: https://github.com/vim/vim/commit/618e47d1cd93954bad26d47e5353b4f1432daa5e Author: Yegappan Lakshmanan <yegappan@yahoo.com> Date: Tue Aug 22 21:29:28 2023 +0200 patch 9.0.1780: Vim9 type not defined during object creation Problem: Vim9 type not defined during object creation Solution: Define type during object creation and not during class definition, parse mulit-line member initializers, fix lock initialization If type is not specified for a member, set it during object creation instead of during class definition. Add a runtime type check for the object member initialization expression Also, while at it, when copying an object or class, make sure the lock is correctly initialized. And finally, parse multi-line member initializers correctly. closes: #11957 closes: #12868 closes: #12869 closes: #12881 Signed-off-by: Christian Brabandt <cb@256bit.org> Co-authored-by: Yegappan Lakshmanan <yegappan@yahoo.com> Co-authored-by: LemonBoy <thatlemon@gmail.com>
author Christian Brabandt <cb@256bit.org>
date Tue, 22 Aug 2023 21:45:02 +0200
parents a39314fa9495
children 29b2193466e0
comparison
equal deleted inserted replaced
32959:a0266fbc89f5 32960:d5c05e15cf81
3148 if (!ends_excmd2(m->ocm_init, expr)) 3148 if (!ends_excmd2(m->ocm_init, expr))
3149 { 3149 {
3150 semsg(_(e_trailing_characters_str), expr); 3150 semsg(_(e_trailing_characters_str), expr);
3151 goto erret; 3151 goto erret;
3152 } 3152 }
3153
3154 type_T *type = get_type_on_stack(&cctx, 0);
3155 if (m->ocm_type->tt_type != type->tt_type)
3156 {
3157 // The type of the member initialization expression is
3158 // determined at run time. Add a runtime type check.
3159 where_T where = WHERE_INIT;
3160 where.wt_kind = WT_MEMBER;
3161 where.wt_func_name = (char *)m->ocm_name;
3162 if (need_type_where(type, m->ocm_type, FALSE, -1,
3163 where, &cctx, FALSE, FALSE) == FAIL)
3164 goto erret;
3165 }
3153 } 3166 }
3154 else 3167 else
3155 push_default_value(&cctx, m->ocm_type->tt_type, 3168 push_default_value(&cctx, m->ocm_type->tt_type,
3156 FALSE, NULL); 3169 FALSE, NULL);
3157 generate_STORE_THIS(&cctx, i); 3170 generate_STORE_THIS(&cctx, i);