]> granicus.if.org Git - php/commitdiff
Add ext/ffi stubs
authorChristoph M. Becker <cmbecker69@gmx.de>
Mon, 26 Aug 2019 13:22:33 +0000 (15:22 +0200)
committerChristoph M. Becker <cmbecker69@gmx.de>
Mon, 26 Aug 2019 13:25:27 +0000 (15:25 +0200)
ext/ffi/ffi.c
ext/ffi/ffi.stub.php [new file with mode: 0644]
ext/ffi/ffi_arginfo.h [new file with mode: 0644]

index 9812811244b837b51e64b560c2d0313985d5bf33..7d38281b03a5137a3aabd56ccb17fccc9200639e 100644 (file)
@@ -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 (file)
index 0000000..c315c55
--- /dev/null
@@ -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 (file)
index 0000000..6eea958
--- /dev/null
@@ -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()