Re: [PHP-DEV] Reflection, Traits, Aliasing

2011-08-09 Thread Joey Smith
On Mon, Aug 08, 2011 at 03:52:37PM +0100, Keloran wrote:
 There seems to be a bug in traits that if you use any of the GLOBAL vars it
 segfaults

snip

I'm not sure it's clear from Keloran's code example here, so I thought I'd point
out that the problem only seems to happen if you include the trait definition
from an external file.

-- 
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php



Re: [PHP-DEV] Reflection, Traits, Aliasing

2011-08-08 Thread Keloran
There seems to be a bug in traits that if you use any of the GLOBAL vars it
segfaults

e.g.
?php
trait tester {
  function getStuff($a = null) {
if ($a) {
  if (isset($_COOKIE[$a])) {
 return $_COOKIE[$a];
  }
}
return false;
  }
}

?php
include tester.php;
class beep {
  use tester;

  function beeper() {
return $this-getStuff(tester);
  }
}

that causes a segfault

change the trait to
?php
trait tester {
  function getStuff($a) {
if ($a) {
  if (isset($_COOKIE[$a])) {
 return $_COOKIE[$a];
  }
}
return false;
  }
}

and now you get a zend_mm_corrupted,

this is in 5.4.0-beta1 compiled at 23:59 on 7th

On Mon, Jul 25, 2011 at 11:50 PM, Rasmus Lerdorf ras...@lerdorf.com wrote:

 On 07/25/2011 02:05 PM, Stefan Marr wrote:
  Hi Johannes:
 
  2011/7/25 Johannes Schlüter johan...@schlueters.de:
 
  Now I use reflection on this:
 
  $rc = new ReflectionClass('C');
  print_r($rc-getTraitAliases());
 
  Array
  (
 [tc] = T1::t1
  )
 
  Great, that is nice.
 
 
  So far so nice but I'm missing the information where C::t1() is coming
  from. In the reflection code I'm currently iterating over
  ce-trait_aliases and can't find where I can get the information from.
  Actually I'd be even interested in getting all important methods and
  their origin. Stefan, do you know where I can find the information or
  would we have to store it additionally?
  The functions do not store that information, so there are basically
  only two approaches, I see:
 
  Either, factoring out the code which is doing the flattening, conflict
  resolution, and class composition into something which could be easily
  shared by both the reflection and the engine, and then re-doing it on
  demand in the reflection,
  or we extend zend_function by an origin pointer.
 
  Not sure what the better tradeoff is general memory overhead vs.
  cache-able pay-as-you-go overhead.

 Is it really worth any overhead here at all? This information is still
 there, you just have to work at it a bit. You know which traits are
 being used for class C. T1 and T2. You can look at T1 and T2 and see
 they both provide t1 methods, but you see from the list of aliases on C
 that T1::t1 was aliased to tc, therefore C::t1 must come from T2 since
 the trait is used in C and it isn't aliased. I don't think we need
 anything else here.

 -Rasmus



 --
 PHP Internals - PHP Runtime Development Mailing List
 To unsubscribe, visit: http://www.php.net/unsub.php




[PHP-DEV] Reflection, Traits, Aliasing

2011-07-25 Thread Johannes Schlüter
Stefan,

I recently tried to finalize reflection support for traits. Given code
like

?php
trait T1 {
public function t1() {}
public function ta() {}
}


trait T2 {
public function t1() {}
public function tb() {}
}

class C {
use T1, T2 {
T2::t1 insteadof T1;
T1::t1 as tc;
}
}
?

Now I use reflection on this:

$rc = new ReflectionClass('C');
print_r($rc-getTraitAliases());

Array
(
[tc] = T1::t1
)

So far so nice but I'm missing the information where C::t1() is coming
from. In the reflection code I'm currently iterating over
ce-trait_aliases and can't find where I can get the information from.
Actually I'd be even interested in getting all important methods and
their origin. Stefan, do you know where I can find the information or
would we have to store it additionally?

johannes



-- 
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php



Re: [PHP-DEV] Reflection, Traits, Aliasing

2011-07-25 Thread Stefan Marr
Hi Johannes:

2011/7/25 Johannes Schlüter johan...@schlueters.de:

 Now I use reflection on this:

 $rc = new ReflectionClass('C');
 print_r($rc-getTraitAliases());

 Array
 (
    [tc] = T1::t1
 )

Great, that is nice.


 So far so nice but I'm missing the information where C::t1() is coming
 from. In the reflection code I'm currently iterating over
 ce-trait_aliases and can't find where I can get the information from.
 Actually I'd be even interested in getting all important methods and
 their origin. Stefan, do you know where I can find the information or
 would we have to store it additionally?
The functions do not store that information, so there are basically
only two approaches, I see:

Either, factoring out the code which is doing the flattening, conflict
resolution, and class composition into something which could be easily
shared by both the reflection and the engine, and then re-doing it on
demand in the reflection,
or we extend zend_function by an origin pointer.

Not sure what the better tradeoff is general memory overhead vs.
cache-able pay-as-you-go overhead.

Best regards
Stefan

--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php



Re: [PHP-DEV] Reflection, Traits, Aliasing

2011-07-25 Thread Rasmus Lerdorf
On 07/25/2011 02:05 PM, Stefan Marr wrote:
 Hi Johannes:
 
 2011/7/25 Johannes Schlüter johan...@schlueters.de:
 
 Now I use reflection on this:

 $rc = new ReflectionClass('C');
 print_r($rc-getTraitAliases());

 Array
 (
[tc] = T1::t1
 )
 
 Great, that is nice.
 
 
 So far so nice but I'm missing the information where C::t1() is coming
 from. In the reflection code I'm currently iterating over
 ce-trait_aliases and can't find where I can get the information from.
 Actually I'd be even interested in getting all important methods and
 their origin. Stefan, do you know where I can find the information or
 would we have to store it additionally?
 The functions do not store that information, so there are basically
 only two approaches, I see:
 
 Either, factoring out the code which is doing the flattening, conflict
 resolution, and class composition into something which could be easily
 shared by both the reflection and the engine, and then re-doing it on
 demand in the reflection,
 or we extend zend_function by an origin pointer.
 
 Not sure what the better tradeoff is general memory overhead vs.
 cache-able pay-as-you-go overhead.

Is it really worth any overhead here at all? This information is still
there, you just have to work at it a bit. You know which traits are
being used for class C. T1 and T2. You can look at T1 and T2 and see
they both provide t1 methods, but you see from the list of aliases on C
that T1::t1 was aliased to tc, therefore C::t1 must come from T2 since
the trait is used in C and it isn't aliased. I don't think we need
anything else here.

-Rasmus



-- 
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php