Skip to content

Best match issue #3

@jazzvaz

Description

@jazzvaz

Привет, баг в функции match_arg в call.hpp.

Если зарегестрировать класс как приведено ниже и в луа создать обьект этого класса передав на констуктор Class1 то match_arg вернет score 100 при проверке constructor Class1, и score 99 при проверке constructor Class2. Дальше по коду 99 < 100 а значит будет вызов констуктора с Class2 что есть баг.

Она скорее всего должна возвращать no_match если результат converter.match отрицательный. Так же было бы хорошо если функция прекращала проверку следуюших индексов если уже получен no_match.

module(L)[class_<TestClass>("TestClass") .def(constructor<Class1*>()) .def(constructor<Class2*>()) ];

В оригинальном луабинде match описан как

template< typename StackIndexList, typename SignatureList, unsigned int End = meta::size<SignatureList>::value, unsigned int Index = 1 >
		struct match_struct {
			template< typename TupleType >
			static int match(lua_State* L, TupleType& tuple)
			{
				const int this_match = std::get<Index - 1>(tuple).match(L, decorate_type_t<typename SignatureList::template at<Index>>(), meta::get<StackIndexList, Index - 1>::value);
				return this_match >= 0 ?	// could also sum them up unconditionally
					this_match + match_struct<StackIndexList, SignatureList, End, Index + 1>::match(L, tuple)
					: no_match;
			}
		};

		template< typename StackIndexList, typename SignatureList, unsigned int Index >
		struct match_struct< StackIndexList, SignatureList, Index, Index >
		{
			template< typename TupleType >
			static int match(lua_State* /*L*/, TupleType&) {
				return 0;
			}
		};

Metadata

Metadata

Assignees

Labels

No labels
No labels

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions