Skip to content

Commit e047e9d

Browse files
committed
Add ext/ffi stubs
1 parent 0c2d4d6 commit e047e9d

File tree

3 files changed

+179
-92
lines changed

3 files changed

+179
-92
lines changed

ext/ffi/ffi.c

Lines changed: 17 additions & 92 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
#include "zend_interfaces.h"
2929
#include "zend_closures.h"
3030
#include "main/SAPI.h"
31+
#include "ffi_arginfo.h"
3132

3233
#include <ffi.h>
3334

@@ -4323,99 +4324,23 @@ ZEND_METHOD(FFI, string) /* {{{ */
43234324
}
43244325
/* }}} */
43254326

4326-
ZEND_BEGIN_ARG_INFO_EX(arginfo_func_cdef, 0, 0, 0)
4327-
ZEND_ARG_INFO(0, code)
4328-
ZEND_ARG_INFO(0, lib)
4329-
ZEND_END_ARG_INFO()
4330-
4331-
ZEND_BEGIN_ARG_INFO_EX(arginfo_func_load, 0, 0, 1)
4332-
ZEND_ARG_INFO(0, filename)
4333-
ZEND_END_ARG_INFO()
4334-
4335-
ZEND_BEGIN_ARG_INFO_EX(arginfo_func_scope, 0, 0, 1)
4336-
ZEND_ARG_INFO(0, scope_name)
4337-
ZEND_END_ARG_INFO()
4338-
4339-
ZEND_BEGIN_ARG_INFO_EX(arginfo_func_new, 0, 0, 1)
4340-
ZEND_ARG_INFO(0, type)
4341-
ZEND_ARG_INFO(0, owned)
4342-
ZEND_ARG_INFO(0, persistent)
4343-
ZEND_END_ARG_INFO()
4344-
4345-
ZEND_BEGIN_ARG_INFO_EX(arginfo_func_free, 0, 0, 1)
4346-
ZEND_ARG_INFO(ZEND_SEND_PREFER_REF, ptr)
4347-
ZEND_END_ARG_INFO()
4348-
4349-
ZEND_BEGIN_ARG_INFO_EX(arginfo_func_cast, 0, 0, 2)
4350-
ZEND_ARG_INFO(0, type)
4351-
ZEND_ARG_INFO(ZEND_SEND_PREFER_REF, ptr)
4352-
ZEND_END_ARG_INFO()
4353-
4354-
ZEND_BEGIN_ARG_INFO_EX(arginfo_func_type, 0, 0, 1)
4355-
ZEND_ARG_INFO(0, type)
4356-
ZEND_END_ARG_INFO()
4357-
4358-
ZEND_BEGIN_ARG_INFO_EX(arginfo_func_typeof, 0, 0, 1)
4359-
ZEND_ARG_INFO(ZEND_SEND_PREFER_REF, ptr)
4360-
ZEND_END_ARG_INFO()
4361-
4362-
ZEND_BEGIN_ARG_INFO_EX(arginfo_func_array, 0, 0, 2)
4363-
ZEND_ARG_INFO(0, type)
4364-
ZEND_ARG_INFO(0, dims)
4365-
ZEND_END_ARG_INFO()
4366-
4367-
ZEND_BEGIN_ARG_INFO_EX(arginfo_func_addr, 0, 0, 1)
4368-
ZEND_ARG_INFO(ZEND_SEND_PREFER_REF, ptr)
4369-
ZEND_END_ARG_INFO()
4370-
4371-
ZEND_BEGIN_ARG_INFO_EX(arginfo_func_sizeof, 0, 0, 1)
4372-
ZEND_ARG_INFO(ZEND_SEND_PREFER_REF, ptr)
4373-
ZEND_END_ARG_INFO()
4374-
4375-
ZEND_BEGIN_ARG_INFO_EX(arginfo_func_alignof, 0, 0, 1)
4376-
ZEND_ARG_INFO(ZEND_SEND_PREFER_REF, ptr)
4377-
ZEND_END_ARG_INFO()
4378-
4379-
ZEND_BEGIN_ARG_INFO_EX(arginfo_func_memcpy, 0, 0, 3)
4380-
ZEND_ARG_INFO(ZEND_SEND_PREFER_REF, dst)
4381-
ZEND_ARG_INFO(ZEND_SEND_PREFER_REF, src)
4382-
ZEND_ARG_INFO(0, size)
4383-
ZEND_END_ARG_INFO()
4384-
4385-
ZEND_BEGIN_ARG_INFO_EX(arginfo_func_memcmp, 0, 0, 3)
4386-
ZEND_ARG_INFO(ZEND_SEND_PREFER_REF, ptr1)
4387-
ZEND_ARG_INFO(ZEND_SEND_PREFER_REF, ptr2)
4388-
ZEND_ARG_INFO(0, size)
4389-
ZEND_END_ARG_INFO()
4390-
4391-
ZEND_BEGIN_ARG_INFO_EX(arginfo_func_memset, 0, 0, 3)
4392-
ZEND_ARG_INFO(ZEND_SEND_PREFER_REF, ptr)
4393-
ZEND_ARG_INFO(0, ch)
4394-
ZEND_ARG_INFO(0, size)
4395-
ZEND_END_ARG_INFO()
4396-
4397-
ZEND_BEGIN_ARG_INFO_EX(arginfo_func_string, 0, 0, 1)
4398-
ZEND_ARG_INFO(ZEND_SEND_PREFER_REF, ptr)
4399-
ZEND_ARG_INFO(0, size)
4400-
ZEND_END_ARG_INFO()
4401-
44024327
static const zend_function_entry zend_ffi_functions[] = {
4403-
ZEND_ME(FFI, cdef, arginfo_func_cdef, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC)
4404-
ZEND_ME(FFI, load, arginfo_func_load, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC)
4405-
ZEND_ME(FFI, scope, arginfo_func_scope, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC)
4406-
ZEND_ME(FFI, new, arginfo_func_new, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC)
4407-
ZEND_ME(FFI, free, arginfo_func_free, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC)
4408-
ZEND_ME(FFI, cast, arginfo_func_cast, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC)
4409-
ZEND_ME(FFI, type, arginfo_func_type, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC)
4410-
ZEND_ME(FFI, typeof, arginfo_func_typeof, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC)
4411-
ZEND_ME(FFI, arrayType, arginfo_func_array, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC)
4412-
ZEND_ME(FFI, addr, arginfo_func_addr, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC)
4413-
ZEND_ME(FFI, sizeof, arginfo_func_sizeof, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC)
4414-
ZEND_ME(FFI, alignof, arginfo_func_alignof, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC)
4415-
ZEND_ME(FFI, memcpy, arginfo_func_memcpy, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC)
4416-
ZEND_ME(FFI, memcmp, arginfo_func_memcmp, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC)
4417-
ZEND_ME(FFI, memset, arginfo_func_memset, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC)
4418-
ZEND_ME(FFI, string, arginfo_func_string, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC)
4328+
ZEND_ME(FFI, cdef, arginfo_class_FFI_cdef, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC)
4329+
ZEND_ME(FFI, load, arginfo_class_FFI_load, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC)
4330+
ZEND_ME(FFI, scope, arginfo_class_FFI_scope, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC)
4331+
ZEND_ME(FFI, new, arginfo_class_FFI_new, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC)
4332+
ZEND_ME(FFI, free, arginfo_class_FFI_free, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC)
4333+
ZEND_ME(FFI, cast, arginfo_class_FFI_cast, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC)
4334+
ZEND_ME(FFI, type, arginfo_class_FFI_type, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC)
4335+
ZEND_ME(FFI, typeof, arginfo_class_FFI_typeof, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC)
4336+
ZEND_ME(FFI, arrayType, arginfo_class_FFI_arrayType, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC)
4337+
ZEND_ME(FFI, addr, arginfo_class_FFI_addr, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC)
4338+
ZEND_ME(FFI, sizeof, arginfo_class_FFI_sizeof, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC)
4339+
ZEND_ME(FFI, alignof, arginfo_class_FFI_alignof, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC)
4340+
ZEND_ME(FFI, memcpy, arginfo_class_FFI_memcpy, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC)
4341+
ZEND_ME(FFI, memcmp, arginfo_class_FFI_memcmp, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC)
4342+
ZEND_ME(FFI, memset, arginfo_class_FFI_memset, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC)
4343+
ZEND_ME(FFI, string, arginfo_class_FFI_string, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC)
44194344
ZEND_FE_END
44204345
};
44214346

ext/ffi/ffi.stub.php

Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
<?php
2+
3+
class FFI
4+
{
5+
/** @return ?FFI */
6+
static function cdef(string $code = UNKNOWN, string $lib = UNKNOWN) {}
7+
8+
/** @return ?FFI */
9+
static function load(string $filename) {}
10+
11+
/** @return ?FFI */
12+
static function scope(string $scope_name) {}
13+
14+
/**
15+
* @param FFI\CType|string $type
16+
* @return ?FFI\CData
17+
*/
18+
static function new($type, bool $owned = true, bool $persistent = false) {}
19+
20+
/**
21+
* @prefer-ref $ptr
22+
* @return void
23+
*/
24+
static function free(FFI\CData $ptr) {}
25+
26+
/**
27+
* @param FFI\CType|string $type
28+
* @prefer-ref $ptr
29+
* @return ?FFI\CData
30+
*/
31+
static function cast($type, $ptr) {}
32+
33+
/** @return ?FFI\CType */
34+
static function type(string $type) {}
35+
36+
/**
37+
* @prefer-ref $ptr
38+
* @return FFI\CType
39+
*/
40+
static function typeof(FFI\CData $ptr) {}
41+
42+
/** @return ?FFI\CType */
43+
static function arrayType(FFI\CType $type, array $dims) {}
44+
45+
/**
46+
* @prefer-ref $ptr
47+
* @return FFI\CData
48+
*/
49+
static function addr(FFI\CData $ptr) {}
50+
51+
/**
52+
* @prefer-ref $ptr
53+
* @return ?int
54+
*/
55+
static function sizeof(object $ptr) {}
56+
57+
/**
58+
* @prefer-ref $ptr
59+
* @return ?int
60+
*/
61+
static function alignof(object $ptr) {}
62+
63+
/**
64+
* @prefer-ref $dst
65+
* @prefer-ref $src
66+
* @param string|FFI\CData $dst
67+
* @return void
68+
*/
69+
static function memcpy(FFI\CData $dst, $src, int $size) {}
70+
71+
/**
72+
* @prefer-ref $ptr1
73+
* @param string|FFI\CData $ptr1
74+
* @prefer-ref $ptr2
75+
* @param string|FFI\CData $ptr2
76+
* @return ?int
77+
*/
78+
static function memcmp($ptr1, $ptr2, int $size) {}
79+
80+
/**
81+
* @prefer-ref $ptr
82+
* @return void
83+
*/
84+
static function memset(FFI\CData $ptr, int $ch, int $size) {}
85+
86+
/**
87+
* @prefer-ref $ptr
88+
* @return ?string
89+
*/
90+
static function string(FFI\CData $ptr, int $size = UNKNOWN) {}
91+
}

ext/ffi/ffi_arginfo.h

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
/* This is a generated file, edit the .stub.php file instead. */
2+
3+
ZEND_BEGIN_ARG_INFO_EX(arginfo_class_FFI_cdef, 0, 0, 0)
4+
ZEND_ARG_TYPE_INFO(0, code, IS_STRING, 0)
5+
ZEND_ARG_TYPE_INFO(0, lib, IS_STRING, 0)
6+
ZEND_END_ARG_INFO()
7+
8+
ZEND_BEGIN_ARG_INFO_EX(arginfo_class_FFI_load, 0, 0, 1)
9+
ZEND_ARG_TYPE_INFO(0, filename, IS_STRING, 0)
10+
ZEND_END_ARG_INFO()
11+
12+
ZEND_BEGIN_ARG_INFO_EX(arginfo_class_FFI_scope, 0, 0, 1)
13+
ZEND_ARG_TYPE_INFO(0, scope_name, IS_STRING, 0)
14+
ZEND_END_ARG_INFO()
15+
16+
ZEND_BEGIN_ARG_INFO_EX(arginfo_class_FFI_new, 0, 0, 1)
17+
ZEND_ARG_INFO(0, type)
18+
ZEND_ARG_TYPE_INFO(0, owned, _IS_BOOL, 0)
19+
ZEND_ARG_TYPE_INFO(0, persistent, _IS_BOOL, 0)
20+
ZEND_END_ARG_INFO()
21+
22+
ZEND_BEGIN_ARG_INFO_EX(arginfo_class_FFI_free, 0, 0, 1)
23+
ZEND_ARG_OBJ_INFO(2, ptr, FFI\\CData, 0)
24+
ZEND_END_ARG_INFO()
25+
26+
ZEND_BEGIN_ARG_INFO_EX(arginfo_class_FFI_cast, 0, 0, 2)
27+
ZEND_ARG_INFO(0, type)
28+
ZEND_ARG_INFO(2, ptr)
29+
ZEND_END_ARG_INFO()
30+
31+
ZEND_BEGIN_ARG_INFO_EX(arginfo_class_FFI_type, 0, 0, 1)
32+
ZEND_ARG_TYPE_INFO(0, type, IS_STRING, 0)
33+
ZEND_END_ARG_INFO()
34+
35+
#define arginfo_class_FFI_typeof arginfo_class_FFI_free
36+
37+
ZEND_BEGIN_ARG_INFO_EX(arginfo_class_FFI_arrayType, 0, 0, 2)
38+
ZEND_ARG_OBJ_INFO(0, type, FFI\\CType, 0)
39+
ZEND_ARG_TYPE_INFO(0, dims, IS_ARRAY, 0)
40+
ZEND_END_ARG_INFO()
41+
42+
#define arginfo_class_FFI_addr arginfo_class_FFI_free
43+
44+
ZEND_BEGIN_ARG_INFO_EX(arginfo_class_FFI_sizeof, 0, 0, 1)
45+
ZEND_ARG_TYPE_INFO(2, ptr, IS_OBJECT, 0)
46+
ZEND_END_ARG_INFO()
47+
48+
#define arginfo_class_FFI_alignof arginfo_class_FFI_sizeof
49+
50+
ZEND_BEGIN_ARG_INFO_EX(arginfo_class_FFI_memcpy, 0, 0, 3)
51+
ZEND_ARG_OBJ_INFO(2, dst, FFI\\CData, 0)
52+
ZEND_ARG_INFO(2, src)
53+
ZEND_ARG_TYPE_INFO(0, size, IS_LONG, 0)
54+
ZEND_END_ARG_INFO()
55+
56+
ZEND_BEGIN_ARG_INFO_EX(arginfo_class_FFI_memcmp, 0, 0, 3)
57+
ZEND_ARG_INFO(2, ptr1)
58+
ZEND_ARG_INFO(2, ptr2)
59+
ZEND_ARG_TYPE_INFO(0, size, IS_LONG, 0)
60+
ZEND_END_ARG_INFO()
61+
62+
ZEND_BEGIN_ARG_INFO_EX(arginfo_class_FFI_memset, 0, 0, 3)
63+
ZEND_ARG_OBJ_INFO(2, ptr, FFI\\CData, 0)
64+
ZEND_ARG_TYPE_INFO(0, ch, IS_LONG, 0)
65+
ZEND_ARG_TYPE_INFO(0, size, IS_LONG, 0)
66+
ZEND_END_ARG_INFO()
67+
68+
ZEND_BEGIN_ARG_INFO_EX(arginfo_class_FFI_string, 0, 0, 1)
69+
ZEND_ARG_OBJ_INFO(2, ptr, FFI\\CData, 0)
70+
ZEND_ARG_TYPE_INFO(0, size, IS_LONG, 0)
71+
ZEND_END_ARG_INFO()

0 commit comments

Comments
 (0)