1--TEST-- 2FFI 020: read-only 3--EXTENSIONS-- 4ffi 5--INI-- 6ffi.enable=1 7--FILE-- 8<?php 9$ffi = FFI::cdef(); 10 11try { 12 $p = $ffi->new("struct {int x; const int y;}"); 13 $p->x = 1; 14 $p->y = 1; 15 echo "ok\n"; 16} catch (Throwable $e) { 17 echo get_class($e) . ": " . $e->getMessage()."\n"; 18} 19try { 20 $p = $ffi->new("struct {const int x; int y;}"); 21 $p->y = 1; 22 $p->x = 1; 23 echo "ok\n"; 24} catch (Throwable $e) { 25 echo get_class($e) . ": " . $e->getMessage()."\n"; 26} 27try { 28 $p = $ffi->new("const struct {int x; int y;}"); 29 $p->x = 1; 30 echo "ok\n"; 31} catch (Throwable $e) { 32 echo get_class($e) . ": " . $e->getMessage()."\n"; 33} 34try { 35 $p = $ffi->new("const int[10]"); 36 $p[1] = 1; 37 echo "ok\n"; 38} catch (Throwable $e) { 39 echo get_class($e) . ": " . $e->getMessage()."\n"; 40} 41try { 42 $p = $ffi->new("const int * [1]"); 43 $p[0] = null; 44 echo "ok\n"; 45} catch (Throwable $e) { 46 echo get_class($e) . ": " . $e->getMessage()."\n"; 47} 48try { 49 $p = $ffi->new("int * const [1]"); 50 $p[0] = null; 51 echo "ok\n"; 52} catch (Throwable $e) { 53 echo get_class($e) . ": " . $e->getMessage()."\n"; 54} 55try { 56 $f = FFI::cdef("typedef int * const t[1];"); 57 $p = $f->new("t"); 58 $p[0] = null; 59 echo "ok\n"; 60} catch (Throwable $e) { 61 echo get_class($e) . ": " . $e->getMessage()."\n"; 62} 63?> 64ok 65--EXPECT-- 66FFI\Exception: Attempt to assign read-only field 'y' 67FFI\Exception: Attempt to assign read-only field 'x' 68FFI\Exception: Attempt to assign read-only location 69FFI\Exception: Attempt to assign read-only location 70ok 71FFI\Exception: Attempt to assign read-only location 72FFI\Exception: Attempt to assign read-only location 73ok 74