Expression objects 'is_a' method now considers derivation

This commit is contained in:
Matthias Koefferlein 2026-02-02 23:17:15 +01:00
parent f0f2ffd714
commit 73b078003d
3 changed files with 82 additions and 62 deletions

View File

@ -553,8 +553,12 @@ VariantUserClassImpl::execute (const tl::ExpressionParserContext &context, tl::V
bool ret = false;
if (args [0].is_user ()) {
const tl::VariantUserClassBase *ub = args [0].user_cls ();
if (ub && ub->gsi_cls () == mp_cls) {
ret = true;
if (ub) {
const gsi::ClassBase *ub_gsi = ub->gsi_cls ();
const gsi::ClassBase *cls = mp_cls;
while (cls && ! (ret = (ub_gsi == cls))) {
cls = cls->base ();
}
}
}

View File

@ -898,3 +898,19 @@ TEST(17)
"it.add_value(17.5)").execute ();
}
// is_a
TEST(18)
{
tl::Eval e;
tl::Variant v;
v = e.parse ("var b=B.new(); b.is_a(C)").execute ();
EXPECT_EQ (v.to_string (), std::string ("false"));
v = e.parse ("var x=X.new(); x.is_a(X)").execute ();
EXPECT_EQ (v.to_string (), std::string ("true"));
// Y is not a base class of X
v = e.parse ("var x=X.new(); x.is_a(Y)").execute ();
EXPECT_EQ (v.to_string (), std::string ("false"));
// X is a base class of Y
v = e.parse ("var y=Y.new(); y.is_a(X)").execute ();
EXPECT_EQ (v.to_string (), std::string ("true"));
}

View File

@ -3002,68 +3002,68 @@ std::map <std::string, EvalFunction *> EvalStaticFunction::ms_functions;
// ----------------------------------------------------------------------------
// Implementation of the function table
static EvalStaticFunction f1 ("sin", &sin_f);
static EvalStaticFunction f2 ("sinh", &sinh_f);
static EvalStaticFunction f3 ("cos", &cos_f);
static EvalStaticFunction f4 ("cosh", &cosh_f);
static EvalStaticFunction f5 ("tan", &tan_f);
static EvalStaticFunction f6 ("tanh", &tanh_f);
static EvalStaticFunction f7 ("log", &log_f);
static EvalStaticFunction f8 ("log10", &log10_f);
static EvalStaticFunction f9 ("exp", &exp_f);
static EvalStaticFunction f10 ("floor", &floor_f);
static EvalStaticFunction f11 ("ceil", &ceil_f);
static EvalStaticFunction f12 ("round", &round_f);
static EvalStaticFunction f13 ("sqrt", &sqrt_f);
static EvalStaticFunction f14 ("max", &max_f);
static EvalStaticFunction f15 ("min", &min_f);
static EvalStaticFunction f16 ("pow", &pow_f);
static EvalStaticFunction f17 ("acos", &acos_f);
static EvalStaticFunction f_sin ("sin", &sin_f);
static EvalStaticFunction f_sinh ("sinh", &sinh_f);
static EvalStaticFunction f_cos ("cos", &cos_f);
static EvalStaticFunction f_cosh ("cosh", &cosh_f);
static EvalStaticFunction f_tan ("tan", &tan_f);
static EvalStaticFunction f_tanh ("tanh", &tanh_f);
static EvalStaticFunction f_log ("log", &log_f);
static EvalStaticFunction f_log10 ("log10", &log10_f);
static EvalStaticFunction f_exp ("exp", &exp_f);
static EvalStaticFunction f_floor ("floor", &floor_f);
static EvalStaticFunction f_ceil ("ceil", &ceil_f);
static EvalStaticFunction f_round ("round", &round_f);
static EvalStaticFunction f_sqrt ("sqrt", &sqrt_f);
static EvalStaticFunction f_max ("max", &max_f);
static EvalStaticFunction f_min ("min", &min_f);
static EvalStaticFunction f_pow ("pow", &pow_f);
static EvalStaticFunction f_acos ("acos", &acos_f);
#ifndef _MSC_VER // not available on MS VC++
static EvalStaticFunction f18 ("acosh", &acosh_f);
static EvalStaticFunction f19 ("asinh", &asinh_f);
static EvalStaticFunction f20 ("atanh", &atanh_f);
static EvalStaticFunction f_acosh ("acosh", &acosh_f);
static EvalStaticFunction f_asinh ("asinh", &asinh_f);
static EvalStaticFunction f_atanh ("atanh", &atanh_f);
#endif
static EvalStaticFunction f21 ("asin", &asin_f);
static EvalStaticFunction f22 ("atan", &atan_f);
static EvalStaticFunction f23 ("atan2", &atan2_f);
static EvalStaticFunction f24 ("to_f", &to_f_f);
static EvalStaticFunction f25 ("to_s", &to_s_f);
static EvalStaticFunction f26 ("to_i", &to_i_f);
static EvalStaticFunction f27 ("to_ui", &to_ui_f);
static EvalStaticFunction f28 ("to_l", &to_l_f);
static EvalStaticFunction f29 ("to_ul", &to_ul_f);
static EvalStaticFunction f30 ("is_string", &is_string_f);
static EvalStaticFunction f31 ("is_numeric", &is_numeric_f);
static EvalStaticFunction f32 ("is_array", &is_array_f);
static EvalStaticFunction f33 ("is_nil", &is_nil_f);
static EvalStaticFunction f34 ("join", &join_f);
static EvalStaticFunction f35 ("split", &split_f);
static EvalStaticFunction f36 ("item", &item_f);
static EvalStaticFunction f37 ("sub", &sub_f);
static EvalStaticFunction f38 ("gsub", &gsub_f);
static EvalStaticFunction f39 ("find", &find_f);
static EvalStaticFunction f40 ("rfind", &rfind_f);
static EvalStaticFunction f41 ("len", &len_f);
static EvalStaticFunction f42 ("substr", &substr_f);
static EvalStaticFunction f43 ("env", &env_f);
static EvalStaticFunction f44 ("error", &error_f);
static EvalStaticFunction f45 ("sprintf", &sprintf_f);
static EvalStaticFunction f46 ("printf", &printf_f);
static EvalStaticFunction f47 ("false", &false_f);
static EvalStaticFunction f48 ("true", &true_f);
static EvalStaticFunction f49 ("nil", &nil_f);
static EvalStaticFunction f50 ("absolute_file_path", &absolute_file_path_f);
static EvalStaticFunction f51 ("absolute_path", &absolute_path_f);
static EvalStaticFunction f52 ("path", &path_f);
static EvalStaticFunction f53 ("basename", &basename_f);
static EvalStaticFunction f54 ("extension", &extension_f);
static EvalStaticFunction f55 ("file_exists", &file_exists_f);
static EvalStaticFunction f56 ("is_dir", &is_dir_f);
static EvalStaticFunction f57 ("combine", &combine_f);
static EvalStaticFunction f58 ("abs", &abs_f);
static EvalStaticFunction f59 ("upcase", &upcase_f);
static EvalStaticFunction f60 ("downcase", &downcase_f);
static EvalStaticFunction f_asin ("asin", &asin_f);
static EvalStaticFunction f_atan ("atan", &atan_f);
static EvalStaticFunction f_atan2 ("atan2", &atan2_f);
static EvalStaticFunction f_to_f ("to_f", &to_f_f);
static EvalStaticFunction f_to_s ("to_s", &to_s_f);
static EvalStaticFunction f_to_i ("to_i", &to_i_f);
static EvalStaticFunction f_to_ui ("to_ui", &to_ui_f);
static EvalStaticFunction f_to_l ("to_l", &to_l_f);
static EvalStaticFunction f_to_ul ("to_ul", &to_ul_f);
static EvalStaticFunction f_is_string ("is_string", &is_string_f);
static EvalStaticFunction f_is_numeric ("is_numeric", &is_numeric_f);
static EvalStaticFunction f_is_array ("is_array", &is_array_f);
static EvalStaticFunction f_is_nil ("is_nil", &is_nil_f);
static EvalStaticFunction f_join ("join", &join_f);
static EvalStaticFunction f_split ("split", &split_f);
static EvalStaticFunction f_item ("item", &item_f);
static EvalStaticFunction f_sub ("sub", &sub_f);
static EvalStaticFunction f_gsub ("gsub", &gsub_f);
static EvalStaticFunction f_find ("find", &find_f);
static EvalStaticFunction f_rfind ("rfind", &rfind_f);
static EvalStaticFunction f_len ("len", &len_f);
static EvalStaticFunction f_substr ("substr", &substr_f);
static EvalStaticFunction f_env ("env", &env_f);
static EvalStaticFunction f_error ("error", &error_f);
static EvalStaticFunction f_sprintf ("sprintf", &sprintf_f);
static EvalStaticFunction f_printf ("printf", &printf_f);
static EvalStaticFunction f_false ("false", &false_f);
static EvalStaticFunction f_true ("true", &true_f);
static EvalStaticFunction f_nil ("nil", &nil_f);
static EvalStaticFunction f_absolute_file_path ("absolute_file_path", &absolute_file_path_f);
static EvalStaticFunction f_absolute_path ("absolute_path", &absolute_path_f);
static EvalStaticFunction f_path ("path", &path_f);
static EvalStaticFunction f_basename ("basename", &basename_f);
static EvalStaticFunction f_extension ("extension", &extension_f);
static EvalStaticFunction f_file_exists ("file_exists", &file_exists_f);
static EvalStaticFunction f_is_dir ("is_dir", &is_dir_f);
static EvalStaticFunction f_combine ("combine", &combine_f);
static EvalStaticFunction f_abs ("abs", &abs_f);
static EvalStaticFunction f_upcase ("upcase", &upcase_f);
static EvalStaticFunction f_downcase ("downcase", &downcase_f);
// ----------------------------------------------------------------------------
// Implementation of a constant wrapper