Как написать центральный диспетчер функций для дуктапе?
Ситуация такова: я хочу использовать одну функцию duktape/C для всех функций, которые я определяю для своих объектов + прототипов. Для этого у меня есть карта функций, которая принимает имя функции и обратный вызов (std::function
на самом деле) и может легко выполнять некоторую обычную обработку и иметь более простые обратные вызовы (для этого даже могут использоваться лямбды на месте).
Это уже хорошо работает, с одной проблемой: функции с одинаковыми именами на разных объектах. Чтобы устранить неоднозначность, я теперь использую указатель кучи объекта (или прототипа, который также является объектом) в качестве дополнительного квалификатора. Следовательно, когда вызывается моя центральная функция duktape/C, я сначала проверяю, является ли она глобальной (то есть определена ли она в глобальном объекте). Если это не удается, я получаю this
связывание и поиск с указателем кучи. Если это также не помогает, я прохожу цепочку прототипов и вижу, могу ли я найти функцию на одном из прототипов.
Это хорошо работает до 99%, за исключением случаев, когда у меня нет this
обязательный (или неправильный, как для Function.prototype.apply()
).
Мой вопрос для этого: как я могу получить оригинальный прототип для функции в моем центральном обратном вызове duktape/C?
1 ответ
Ответ проще, чем я думал. Для этой центральной карты функций вам нужно иметь имя функции. Это должно быть установлено как свойство для объекта функции, который вы создаете, когда определяете новую функцию для объекта или прототипа.
Тот же подход может быть использован для исходного объекта / прототипа. Просто добавьте обратную ссылку к этому объекту вашей функции как другое свойство (скажем, "ptr"). При этом вы можете легко получить не только имя функции, но и контекст для ее выполнения. И никакой обход цепочки наследования не требуется, поскольку у нас уже есть правильный объект / прототип.