Some additional observations -

On Mon, Dec 28, 2015 at 10:03 AM, Elijah Johnson <ejrx7...@gmail.com> wrote:

> Thanks,
>
> On Mon, Dec 28, 2015 at 6:34 AM, François Laupretre <franc...@php.net>
> wrote:
>
>> Hi,
>>
>> Le 26/12/2015 21:35, Elijah Johnson a écrit :
>>
>>> Can you explain your statement that this would be a huge and complex
>>> work? You must mean that there would be multiple places in the php source
>>> code where variables are assigned? I'm not yet discussing performance, but
>>> only the aspect of adding the feature.
>>>
>>
>> There may other options I don't know but, AFAIK, this implies adding an
>> optional type hint at the zval level. This type hint should be verified at
>> least before each conversion.  Copy-on-write is an other issue, as it is
>> currently not compatible with zval type hints. Seeing only variables with
>> well-defined names, and focusing on arrays, only scratches the surface.
>> Everything happens at the zval level. So, IMO, attaching type hints to
>> variables and properties is a huge and complex work.
>>
>> Regards
>>
>> François
>>
>
> I think I see what you are saying. Copy on write takes a reference to the
> entire z-val in two local variables, so a type-hint at the z-val level
> would be shared.
>
> This returns us to the insight of the original mailer who suggested that
> an object or array variable should be typed by its first-assigned object.
> This would simply need to be a global mode - stack-mode-legacy,
> stack-mode-static-object-types, and stack-mode-super-strict for those who
> want basic types also.
>
> I'm not saying that this is ideal, just that we need to compromise a bit
> to accommodate our existing code base and performance issues.
>
> The proposal for an additional z-val which stores the class name in the
> zval.value member and is counted as null could accommodate the case where
> the user wants to assign the type before he has an object.
>
> I think this is the best option. Another theory I had was to store the
> types at the context level in some kind of array, but its really too much.
>
> The idea just now proposed of 3 global modes will eliminate the issue of
> storing at the z-val level. The mode "stack-mode-static-object-types" is
> even already compatible with every line of code that I have properly
> written in PHP.
>

The mode "stack-mode-static-object-types" would ideally also prevent
assignment of an object with a current string value, or string placeholder
value. What I mean by placeholder value - an additional z-val type "t"
returning true for IS_NULL, where the class name id is stored in value
union. This would be declared by type hint ex. MyObject $object; If the
variable is assigned, MyObject $object = ...; then potentially the same.

On assignment would look something like this (pseudo-code):

bool checkType(zVal, newZVal)
{
      bool throw_error = false;
     if (MODE_STACK_TYPE_OBJECT)
     {
           if (isObjectType(zVal))
           {
                 int class_id= GET_PLACEHOLDER_CLASS(zVal);// ie.
zVal.value or value of current object
                 if (class_id !== GET_CLASS(newZVal))
                 {
                       throw_error = true;
                }
           } else if (IS_OBJECT(newZVal) && !IS_NULL(zVal){
                  throw_error = true; // assigning an object to a non-null,
non-object
           }
     }
     if (throw_error)
     {
          // assign to null, generate TypeError
         //  ie. Warning: assign of type to type, assigned null value
         return false; // prevent assignment by caller
     }
     return true
}

Some additional checks would likely be necessary to prevent placeholders
from being assigned and returned, and if strict mode was implemented, there
would need to be a second placeholder type (or some other means of
identification such as a constant).

Implementing placeholders isn't a necessary step, but it would make for
very readable code.

Reply via email to