032.phpt 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. --TEST--
  2. FFI 032: bit-fields access
  3. --EXTENSIONS--
  4. ffi
  5. --INI--
  6. ffi.enable=1
  7. --FILE--
  8. <?php
  9. $p = FFI::new("
  10. union {
  11. struct __attribute__((packed)) {
  12. int a:2;
  13. unsigned long long b:64;
  14. int c:3;
  15. unsigned int d:3;
  16. } s;
  17. uint8_t i[9];
  18. }");
  19. var_dump(FFI::sizeof($p));
  20. for ($i = -5; $i < 9; $i++) {
  21. $p->s->c = $i;
  22. $p->s->d = $i;
  23. echo "$i => 3-bit int {$p->s->c}, 3-bit uint {$p->s->d}\n";
  24. }
  25. $p->s->a = 0;
  26. $p->s->c = 0;
  27. $p->s->d = 0;
  28. $p->s->b = 0x7fffffff;
  29. echo "0x";
  30. for ($i = 9; $i > 0;) {
  31. printf("%02x", $p->i[--$i]);
  32. }
  33. echo "\n";
  34. ?>
  35. ok
  36. --EXPECT--
  37. int(9)
  38. -5 => 3-bit int 3, 3-bit uint 3
  39. -4 => 3-bit int -4, 3-bit uint 4
  40. -3 => 3-bit int -3, 3-bit uint 5
  41. -2 => 3-bit int -2, 3-bit uint 6
  42. -1 => 3-bit int -1, 3-bit uint 7
  43. 0 => 3-bit int 0, 3-bit uint 0
  44. 1 => 3-bit int 1, 3-bit uint 1
  45. 2 => 3-bit int 2, 3-bit uint 2
  46. 3 => 3-bit int 3, 3-bit uint 3
  47. 4 => 3-bit int -4, 3-bit uint 4
  48. 5 => 3-bit int -3, 3-bit uint 5
  49. 6 => 3-bit int -2, 3-bit uint 6
  50. 7 => 3-bit int -1, 3-bit uint 7
  51. 8 => 3-bit int 0, 3-bit uint 0
  52. 0x0000000001fffffffc
  53. ok