bug80847.phpt 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. --TEST--
  2. Bug #80847 (Nested structs)
  3. --EXTENSIONS--
  4. ffi
  5. zend_test
  6. --SKIPIF--
  7. <?php
  8. if (PHP_OS_FAMILY == 'Windows' && ((1 << 31) > 0)) die('xfail libffi doesn\'t properly support passing big structures by value on Windows/64');
  9. ?>
  10. --FILE--
  11. <?php
  12. require_once('utils.inc');
  13. $header = <<<HEADER
  14. typedef struct bug80847_01 {
  15. uint64_t b;
  16. double c;
  17. } bug80847_01;
  18. typedef struct bug80847_02 {
  19. bug80847_01 a;
  20. } bug80847_02;
  21. bug80847_02 ffi_bug80847(bug80847_02 s);
  22. HEADER;
  23. if (PHP_OS_FAMILY !== 'Windows') {
  24. $ffi = FFI::cdef($header);
  25. } else {
  26. try {
  27. $ffi = FFI::cdef($header, 'php_zend_test.dll');
  28. } catch (FFI\Exception $ex) {
  29. $ffi = FFI::cdef($header, ffi_get_php_dll_name());
  30. }
  31. }
  32. $x = $ffi->new('bug80847_02');
  33. $x->a->b = 42;
  34. $x->a->c = 42.5;
  35. var_dump($x);
  36. $y = $ffi->ffi_bug80847($x);
  37. var_dump($x, $y);
  38. ?>
  39. --EXPECTF--
  40. object(FFI\CData:struct bug80847_02)#%d (1) {
  41. ["a"]=>
  42. object(FFI\CData:struct bug80847_01)#%d (2) {
  43. ["b"]=>
  44. int(42)
  45. ["c"]=>
  46. float(42.5)
  47. }
  48. }
  49. object(FFI\CData:struct bug80847_02)#%d (1) {
  50. ["a"]=>
  51. object(FFI\CData:struct bug80847_01)#%d (2) {
  52. ["b"]=>
  53. int(42)
  54. ["c"]=>
  55. float(42.5)
  56. }
  57. }
  58. object(FFI\CData:struct bug80847_02)#%d (1) {
  59. ["a"]=>
  60. object(FFI\CData:struct bug80847_01)#%d (2) {
  61. ["b"]=>
  62. int(52)
  63. ["c"]=>
  64. float(32.5)
  65. }
  66. }