diff --git a/src/gsi/gsi/gsiExpression.cc b/src/gsi/gsi/gsiExpression.cc index 1727c2bc6..cebf55ba4 100644 --- a/src/gsi/gsi/gsiExpression.cc +++ b/src/gsi/gsi/gsiExpression.cc @@ -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 (); + } } } diff --git a/src/gsi/unit_tests/gsiExpressionTests.cc b/src/gsi/unit_tests/gsiExpressionTests.cc index a395a73d9..f5448ce61 100644 --- a/src/gsi/unit_tests/gsiExpressionTests.cc +++ b/src/gsi/unit_tests/gsiExpressionTests.cc @@ -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")); +} diff --git a/src/tl/tl/tlExpression.cc b/src/tl/tl/tlExpression.cc index bb42ad65b..091ddd23d 100644 --- a/src/tl/tl/tlExpression.cc +++ b/src/tl/tl/tlExpression.cc @@ -3002,68 +3002,68 @@ std::map 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