summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristoph M. Becker <cmbecker69@gmx.de>2019-08-26 15:22:33 +0200
committerChristoph M. Becker <cmbecker69@gmx.de>2019-08-26 15:25:27 +0200
commite047e9d8939d77484a5d9eac5611622597a3d189 (patch)
tree51b6bbf1252fc1b8c2e35975b2f00d7ea9889640
parent0c2d4d698c9743f75cb1adb6d485154192536242 (diff)
downloadphp-git-e047e9d8939d77484a5d9eac5611622597a3d189.tar.gz
Add ext/ffi stubs
-rw-r--r--ext/ffi/ffi.c109
-rw-r--r--ext/ffi/ffi.stub.php91
-rw-r--r--ext/ffi/ffi_arginfo.h71
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()