diff options
author | Christoph M. Becker <cmbecker69@gmx.de> | 2019-08-26 15:22:33 +0200 |
---|---|---|
committer | Christoph M. Becker <cmbecker69@gmx.de> | 2019-08-26 15:25:27 +0200 |
commit | e047e9d8939d77484a5d9eac5611622597a3d189 (patch) | |
tree | 51b6bbf1252fc1b8c2e35975b2f00d7ea9889640 | |
parent | 0c2d4d698c9743f75cb1adb6d485154192536242 (diff) | |
download | php-git-e047e9d8939d77484a5d9eac5611622597a3d189.tar.gz |
Add ext/ffi stubs
-rw-r--r-- | ext/ffi/ffi.c | 109 | ||||
-rw-r--r-- | ext/ffi/ffi.stub.php | 91 | ||||
-rw-r--r-- | ext/ffi/ffi_arginfo.h | 71 |
3 files changed, 179 insertions, 92 deletions
diff --git a/ext/ffi/ffi.c b/ext/ffi/ffi.c index 9812811244..7d38281b03 100644 --- a/ext/ffi/ffi.c +++ b/ext/ffi/ffi.c @@ -28,6 +28,7 @@ #include "zend_interfaces.h" #include "zend_closures.h" #include "main/SAPI.h" +#include "ffi_arginfo.h" #include <ffi.h> @@ -4323,99 +4324,23 @@ ZEND_METHOD(FFI, string) /* {{{ */ } /* }}} */ -ZEND_BEGIN_ARG_INFO_EX(arginfo_func_cdef, 0, 0, 0) - ZEND_ARG_INFO(0, code) - ZEND_ARG_INFO(0, lib) -ZEND_END_ARG_INFO() - -ZEND_BEGIN_ARG_INFO_EX(arginfo_func_load, 0, 0, 1) - ZEND_ARG_INFO(0, filename) -ZEND_END_ARG_INFO() - -ZEND_BEGIN_ARG_INFO_EX(arginfo_func_scope, 0, 0, 1) - ZEND_ARG_INFO(0, scope_name) -ZEND_END_ARG_INFO() - -ZEND_BEGIN_ARG_INFO_EX(arginfo_func_new, 0, 0, 1) - ZEND_ARG_INFO(0, type) - ZEND_ARG_INFO(0, owned) - ZEND_ARG_INFO(0, persistent) -ZEND_END_ARG_INFO() - -ZEND_BEGIN_ARG_INFO_EX(arginfo_func_free, 0, 0, 1) - ZEND_ARG_INFO(ZEND_SEND_PREFER_REF, ptr) -ZEND_END_ARG_INFO() - -ZEND_BEGIN_ARG_INFO_EX(arginfo_func_cast, 0, 0, 2) - ZEND_ARG_INFO(0, type) - ZEND_ARG_INFO(ZEND_SEND_PREFER_REF, ptr) -ZEND_END_ARG_INFO() - -ZEND_BEGIN_ARG_INFO_EX(arginfo_func_type, 0, 0, 1) - ZEND_ARG_INFO(0, type) -ZEND_END_ARG_INFO() - -ZEND_BEGIN_ARG_INFO_EX(arginfo_func_typeof, 0, 0, 1) - ZEND_ARG_INFO(ZEND_SEND_PREFER_REF, ptr) -ZEND_END_ARG_INFO() - -ZEND_BEGIN_ARG_INFO_EX(arginfo_func_array, 0, 0, 2) - ZEND_ARG_INFO(0, type) - ZEND_ARG_INFO(0, dims) -ZEND_END_ARG_INFO() - -ZEND_BEGIN_ARG_INFO_EX(arginfo_func_addr, 0, 0, 1) - ZEND_ARG_INFO(ZEND_SEND_PREFER_REF, ptr) -ZEND_END_ARG_INFO() - -ZEND_BEGIN_ARG_INFO_EX(arginfo_func_sizeof, 0, 0, 1) - ZEND_ARG_INFO(ZEND_SEND_PREFER_REF, ptr) -ZEND_END_ARG_INFO() - -ZEND_BEGIN_ARG_INFO_EX(arginfo_func_alignof, 0, 0, 1) - ZEND_ARG_INFO(ZEND_SEND_PREFER_REF, ptr) -ZEND_END_ARG_INFO() - -ZEND_BEGIN_ARG_INFO_EX(arginfo_func_memcpy, 0, 0, 3) - ZEND_ARG_INFO(ZEND_SEND_PREFER_REF, dst) - ZEND_ARG_INFO(ZEND_SEND_PREFER_REF, src) - ZEND_ARG_INFO(0, size) -ZEND_END_ARG_INFO() - -ZEND_BEGIN_ARG_INFO_EX(arginfo_func_memcmp, 0, 0, 3) - ZEND_ARG_INFO(ZEND_SEND_PREFER_REF, ptr1) - ZEND_ARG_INFO(ZEND_SEND_PREFER_REF, ptr2) - ZEND_ARG_INFO(0, size) -ZEND_END_ARG_INFO() - -ZEND_BEGIN_ARG_INFO_EX(arginfo_func_memset, 0, 0, 3) - ZEND_ARG_INFO(ZEND_SEND_PREFER_REF, ptr) - ZEND_ARG_INFO(0, ch) - ZEND_ARG_INFO(0, size) -ZEND_END_ARG_INFO() - -ZEND_BEGIN_ARG_INFO_EX(arginfo_func_string, 0, 0, 1) - ZEND_ARG_INFO(ZEND_SEND_PREFER_REF, ptr) - ZEND_ARG_INFO(0, size) -ZEND_END_ARG_INFO() - static const zend_function_entry zend_ffi_functions[] = { - ZEND_ME(FFI, cdef, arginfo_func_cdef, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC) - ZEND_ME(FFI, load, arginfo_func_load, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC) - ZEND_ME(FFI, scope, arginfo_func_scope, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC) - ZEND_ME(FFI, new, arginfo_func_new, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC) - ZEND_ME(FFI, free, arginfo_func_free, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC) - ZEND_ME(FFI, cast, arginfo_func_cast, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC) - ZEND_ME(FFI, type, arginfo_func_type, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC) - ZEND_ME(FFI, typeof, arginfo_func_typeof, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC) - ZEND_ME(FFI, arrayType, arginfo_func_array, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC) - ZEND_ME(FFI, addr, arginfo_func_addr, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC) - ZEND_ME(FFI, sizeof, arginfo_func_sizeof, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC) - ZEND_ME(FFI, alignof, arginfo_func_alignof, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC) - ZEND_ME(FFI, memcpy, arginfo_func_memcpy, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC) - ZEND_ME(FFI, memcmp, arginfo_func_memcmp, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC) - ZEND_ME(FFI, memset, arginfo_func_memset, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC) - ZEND_ME(FFI, string, arginfo_func_string, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC) + ZEND_ME(FFI, cdef, arginfo_class_FFI_cdef, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC) + ZEND_ME(FFI, load, arginfo_class_FFI_load, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC) + ZEND_ME(FFI, scope, arginfo_class_FFI_scope, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC) + ZEND_ME(FFI, new, arginfo_class_FFI_new, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC) + ZEND_ME(FFI, free, arginfo_class_FFI_free, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC) + ZEND_ME(FFI, cast, arginfo_class_FFI_cast, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC) + ZEND_ME(FFI, type, arginfo_class_FFI_type, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC) + ZEND_ME(FFI, typeof, arginfo_class_FFI_typeof, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC) + ZEND_ME(FFI, arrayType, arginfo_class_FFI_arrayType, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC) + ZEND_ME(FFI, addr, arginfo_class_FFI_addr, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC) + ZEND_ME(FFI, sizeof, arginfo_class_FFI_sizeof, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC) + ZEND_ME(FFI, alignof, arginfo_class_FFI_alignof, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC) + ZEND_ME(FFI, memcpy, arginfo_class_FFI_memcpy, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC) + ZEND_ME(FFI, memcmp, arginfo_class_FFI_memcmp, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC) + ZEND_ME(FFI, memset, arginfo_class_FFI_memset, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC) + ZEND_ME(FFI, string, arginfo_class_FFI_string, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC) ZEND_FE_END }; diff --git a/ext/ffi/ffi.stub.php b/ext/ffi/ffi.stub.php new file mode 100644 index 0000000000..c315c55a1c --- /dev/null +++ b/ext/ffi/ffi.stub.php @@ -0,0 +1,91 @@ +<?php + +class FFI +{ + /** @return ?FFI */ + static function cdef(string $code = UNKNOWN, string $lib = UNKNOWN) {} + + /** @return ?FFI */ + static function load(string $filename) {} + + /** @return ?FFI */ + static function scope(string $scope_name) {} + + /** + * @param FFI\CType|string $type + * @return ?FFI\CData + */ + static function new($type, bool $owned = true, bool $persistent = false) {} + + /** + * @prefer-ref $ptr + * @return void + */ + static function free(FFI\CData $ptr) {} + + /** + * @param FFI\CType|string $type + * @prefer-ref $ptr + * @return ?FFI\CData + */ + static function cast($type, $ptr) {} + + /** @return ?FFI\CType */ + static function type(string $type) {} + + /** + * @prefer-ref $ptr + * @return FFI\CType + */ + static function typeof(FFI\CData $ptr) {} + + /** @return ?FFI\CType */ + static function arrayType(FFI\CType $type, array $dims) {} + + /** + * @prefer-ref $ptr + * @return FFI\CData + */ + static function addr(FFI\CData $ptr) {} + + /** + * @prefer-ref $ptr + * @return ?int + */ + static function sizeof(object $ptr) {} + + /** + * @prefer-ref $ptr + * @return ?int + */ + static function alignof(object $ptr) {} + + /** + * @prefer-ref $dst + * @prefer-ref $src + * @param string|FFI\CData $dst + * @return void + */ + static function memcpy(FFI\CData $dst, $src, int $size) {} + + /** + * @prefer-ref $ptr1 + * @param string|FFI\CData $ptr1 + * @prefer-ref $ptr2 + * @param string|FFI\CData $ptr2 + * @return ?int + */ + static function memcmp($ptr1, $ptr2, int $size) {} + + /** + * @prefer-ref $ptr + * @return void + */ + static function memset(FFI\CData $ptr, int $ch, int $size) {} + + /** + * @prefer-ref $ptr + * @return ?string + */ + static function string(FFI\CData $ptr, int $size = UNKNOWN) {} +} diff --git a/ext/ffi/ffi_arginfo.h b/ext/ffi/ffi_arginfo.h new file mode 100644 index 0000000000..6eea95841a --- /dev/null +++ b/ext/ffi/ffi_arginfo.h @@ -0,0 +1,71 @@ +/* This is a generated file, edit the .stub.php file instead. */ + +ZEND_BEGIN_ARG_INFO_EX(arginfo_class_FFI_cdef, 0, 0, 0) + ZEND_ARG_TYPE_INFO(0, code, IS_STRING, 0) + ZEND_ARG_TYPE_INFO(0, lib, IS_STRING, 0) +ZEND_END_ARG_INFO() + +ZEND_BEGIN_ARG_INFO_EX(arginfo_class_FFI_load, 0, 0, 1) + ZEND_ARG_TYPE_INFO(0, filename, IS_STRING, 0) +ZEND_END_ARG_INFO() + +ZEND_BEGIN_ARG_INFO_EX(arginfo_class_FFI_scope, 0, 0, 1) + ZEND_ARG_TYPE_INFO(0, scope_name, IS_STRING, 0) +ZEND_END_ARG_INFO() + +ZEND_BEGIN_ARG_INFO_EX(arginfo_class_FFI_new, 0, 0, 1) + ZEND_ARG_INFO(0, type) + ZEND_ARG_TYPE_INFO(0, owned, _IS_BOOL, 0) + ZEND_ARG_TYPE_INFO(0, persistent, _IS_BOOL, 0) +ZEND_END_ARG_INFO() + +ZEND_BEGIN_ARG_INFO_EX(arginfo_class_FFI_free, 0, 0, 1) + ZEND_ARG_OBJ_INFO(2, ptr, FFI\\CData, 0) +ZEND_END_ARG_INFO() + +ZEND_BEGIN_ARG_INFO_EX(arginfo_class_FFI_cast, 0, 0, 2) + ZEND_ARG_INFO(0, type) + ZEND_ARG_INFO(2, ptr) +ZEND_END_ARG_INFO() + +ZEND_BEGIN_ARG_INFO_EX(arginfo_class_FFI_type, 0, 0, 1) + ZEND_ARG_TYPE_INFO(0, type, IS_STRING, 0) +ZEND_END_ARG_INFO() + +#define arginfo_class_FFI_typeof arginfo_class_FFI_free + +ZEND_BEGIN_ARG_INFO_EX(arginfo_class_FFI_arrayType, 0, 0, 2) + ZEND_ARG_OBJ_INFO(0, type, FFI\\CType, 0) + ZEND_ARG_TYPE_INFO(0, dims, IS_ARRAY, 0) +ZEND_END_ARG_INFO() + +#define arginfo_class_FFI_addr arginfo_class_FFI_free + +ZEND_BEGIN_ARG_INFO_EX(arginfo_class_FFI_sizeof, 0, 0, 1) + ZEND_ARG_TYPE_INFO(2, ptr, IS_OBJECT, 0) +ZEND_END_ARG_INFO() + +#define arginfo_class_FFI_alignof arginfo_class_FFI_sizeof + +ZEND_BEGIN_ARG_INFO_EX(arginfo_class_FFI_memcpy, 0, 0, 3) + ZEND_ARG_OBJ_INFO(2, dst, FFI\\CData, 0) + ZEND_ARG_INFO(2, src) + ZEND_ARG_TYPE_INFO(0, size, IS_LONG, 0) +ZEND_END_ARG_INFO() + +ZEND_BEGIN_ARG_INFO_EX(arginfo_class_FFI_memcmp, 0, 0, 3) + ZEND_ARG_INFO(2, ptr1) + ZEND_ARG_INFO(2, ptr2) + ZEND_ARG_TYPE_INFO(0, size, IS_LONG, 0) +ZEND_END_ARG_INFO() + +ZEND_BEGIN_ARG_INFO_EX(arginfo_class_FFI_memset, 0, 0, 3) + ZEND_ARG_OBJ_INFO(2, ptr, FFI\\CData, 0) + ZEND_ARG_TYPE_INFO(0, ch, IS_LONG, 0) + ZEND_ARG_TYPE_INFO(0, size, IS_LONG, 0) +ZEND_END_ARG_INFO() + +ZEND_BEGIN_ARG_INFO_EX(arginfo_class_FFI_string, 0, 0, 1) + ZEND_ARG_OBJ_INFO(2, ptr, FFI\\CData, 0) + ZEND_ARG_TYPE_INFO(0, size, IS_LONG, 0) +ZEND_END_ARG_INFO() |