Ability to pick PHP value by reference in FFI.
Nadie ha tomado este issue todavía.
- Lenguaje dominante
- C
- Estrellas
- 40.4k
- Forks
- 8.2k
- Merge medio
- 2 d 13 h
- PR fusionados (30 d)
- 96
Descripción
Description
HI!
Currently the only way convert php value to FFI value is memcpy (or other ways with memory copying involved).
It could be wasting if we for example received large chunk from socket and need to deal with it through FFI.
For example,
/* Initial */
echo memory_get_usage(); // 348504
/* Got chunk of data */
$data = str_repeat('1', 512 << 10);
echo memory_get_usage(); // 876992
/* Defining the FFI type */
$type = FFI::arrayType(FFI::type('char'), [512 << 10]);
echo memory_get_usage(); // 877184
/* Allocating memory for type */
$ffiValue = FFI::new($type);
echo memory_get_usage(); // 1401984
/* And memcpy */
FFI::memcpy($ffiValue, $data, 512 << 10);
echo memory_get_usage(); 1402048
It would be great to have ability to reflect value from PHP to FFI using it by reference like so:
$data = str_repeat('1', 512 << 10);
/* @var FFI\CData $ffiValue */
$ffiValueCharArray = FFI::represent('char[]', &$data, size: 512 << 10); // No additional memory allocations for $data content
$ffiValueCharArray [1] = 5;
var_dump($data[1]); // $data changed by reference
$ffiValueInt32 = FFI::represent('int32_t', &$data, size: 4, offset: 12);
var_dump($ffiValueInt32->cdata); // substr($data, 12, 4) === "1111", we will get here 825307441
$ffiValueInt32->cdata = 10;
var_dump(bin2hex(substr($data, 12, 4))); // "0a000000"
Also could work not only with strings:
$int = 10;
$ffiValueInt64 = FFI::represent('int64_t', &$int); // length argument could be omitted if cast performed to fixed size type
var_dump($ffiValueInt64->cdata); // 10;
$ffiValueInt64->cdata = 20;
var_dump($int); // 20;
$readOverBoundary = FFI::represent('char[]', &$int, 10); // Exception: attempt to read over boundary
Guía de contribución
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Línea de trabajo
Comienza con los puntos de entrada FFI::type, FFI::arrayType, FFI::new y FFI::memcpy mostrados en los ejemplos; después, determina si la semántica de referencias propuesta encaja con el modelo de valores y memoria de PHP. Se considera terminado cuando se haya alcanzado un diseño aprobado por los maintainers para el comportamiento propuesto de FFI::represent.
Escrito por el modelo de indexación a partir del texto del issue.
Evaluación
- Stack tecnológico
- c, php
- Área
- backend
- Tipo de issue
- Nueva funcionalidad
- Dificultad
- 5/5
- Tiempo estimado
- Más de una semana
- Estado de actividad
- Estancado
- Claridad
- Necesita aclaración
- Aptitud para principiantes
- 25/100