Enforce modularity boundaries for classes
[hiphop-php.git] / hphp / test / slow / dynamic-cls-meth.php
blob5fef60335b90cf3ea53856c1435fa83a73816097
1 <?hh
3 function wrap($f) {
4 try {
5 $f()();
6 } catch (InvalidArgumentException $e) {
7 echo "EX: ".$e->getMessage()."\n";
11 trait T {
12 private function point($v) {
13 wrap(() ==>
14 HH\dynamic_class_meth(C::class, __hhvm_intrinsics\launder_value($v))
18 function go() {
19 parent::go();
20 echo "In ".self::class."\n";
21 foreach (varray['f', 'g', 'h', 'i'] as $f) self::point($f);
25 class R { function go() {} }
26 class B extends R { use T; }
28 class C extends B {
29 use T;
31 <<__DynamicallyCallable>> function f() { echo __FUNCTION__."\n"; }
32 <<__DynamicallyCallable>> private static function g() { echo __FUNCTION__."\n"; }
33 <<__DynamicallyCallable>> protected static function h() { echo __FUNCTION__."\n"; }
34 <<__DynamicallyCallable>> public static function i() { echo __FUNCTION__."\n"; }
37 class H extends C { use T; }
39 class W extends B { use T; }
41 abstract class A extends C {
42 abstract static function j();
45 <<__EntryPoint>>
46 function main() {
47 (new H)->go();
48 (new W)->go();
50 echo "In main\n";
51 foreach (varray['f', 'g', 'h', 'i'] as $f) {
52 wrap(() ==>
53 HH\dynamic_class_meth(C::class, __hhvm_intrinsics\launder_value($f))
56 foreach (varray['f', 'g', 'h', 'i', 'j'] as $f) {
57 wrap(() ==>
58 HH\dynamic_class_meth(A::class, __hhvm_intrinsics\launder_value($f))