Оглавление

Общее соглашение о вызовах

Общие вызовы доступны для платформ, которые не поддерживаю родные вызовы. Определить доступность родных вызовов вы можете с помощью asGetLibraryOptions проверив наличие в возвращаемой строке AS_MAX_PORTABILITY.

Осуществление общего вызова доступно для глобальных функций (или статических методов класса), которые принимают в качестве параметра указатель на интерфейс asIScriptGeneric и возвращают void.

void MyGenericFunction(asIScriptGeneric *gen)
{
  // Извлекаем аргументы из общего интерфейса и запускаем реальную функцию 
  ...
}

Функции, использующие общий вызов, могут быть зарегистрированы в любом месте движка.

Написание функции общего вызова предполагает извлечение каждого аргумента из стека AngelScript, а затем предоставление возврата. По этой причине рекомендуется использовать автоматический враппер вместо написания функции самостоятельно.

Извлечение аргументов

Чтобы извлечь аргументы из общего интерфейса вы должны вызвать один из методов GetArg (возвращает значение аргумента) или GetAddressOfArg (возвращает указатель). Если функция является методом класса, указатель на экземпляр объекта можно получить с помощью вызова GetObject.

Обратите внимание, что asIScriptGeneric является собственником возвращаемых ссылок, поэтому вы не должны освобождать эти ссылки вручную. Если вы хотите сохранить ссылку на объект, полученной от общего интерфейса, вам необходимо вызвать AddRef, чтобы избежать невалидных ссылок.

Возвращаемые значения

Для возврата значения из функции используйте SetReturn. Обычные значения могут возвращаться напрямую, но стоит позаботиться о возвращении типов объектов по значению, ссылке, хендлу. В зависимости от типа и функции могут быть необходимы увеличение счетчика ссылок, или даже создании копии объекта.

Внимательно ознакомьтесь с инструкциями по SetReturnAddress и SetReturnObject чтобы определить, что необходимо сделать для получения ожидаемого результата. Возможно также использование метода GetAddressOfReturnLocation для получения адреса памяти, по которому содержиться возвращаемое значение.


Перевод - arroy.one@gmail.com. При копировании материалов указывайте ссылку на источник.