summaryrefslogtreecommitdiff
path: root/Zend/zend_inheritance.c
Commit message (Collapse)AuthorAgeFilesLines
...
| * Fixed bug #78989Nikita Popov2020-01-281-8/+10
| | | | | | | | | | | | | | | | Always operate on copies of the functions, so we don't reference temporary trait methods that have gone out of scope. This could be more efficient, but doing an allocated copy only when strictly necessary turned out to be somewhat tricky.
* | Allow variadic arguments to replace non-variadic onesNikita Popov2020-01-231-27/+28
| | | | | | | | | | | | | | | | | | | | | | | | | | | | Any number of arguments can be replaced by a variadic one, so long as the variadic argument is compatible (in the sense of contravariance) with the subsumed arguments. In particular this means that function(...$args) becomes a near-universal signature: It is compatible with any function signature that does not accept parameters by-reference. This also fixes bug #70839, which describes a special case. Closes GH-5059.
* | Prefer using declaring class rather than direct parent in errorNikita Popov2020-01-211-4/+4
| | | | | | | | | | Point to the class that actually declares the property, which is not necessarily the same as the direct parent class.
* | Fix #78880 Another roundMáté Kocsis2020-01-191-1/+1
| |
* | Use zend_type inside type listsNikita Popov2020-01-171-47/+27
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Instead of having a completely independent encoding for type list entries. This is going to use more memory, but I'm not particularly concerned about that, as type unions that contain multiple classes should be uncommon. On the other hand, this allows us to treat top-level types and types inside lists mostly the same. A new ZEND_TYPE_FOREACH macros allows to transparently treat list and non-list types the same way. I'm not using it everywhere it could be used for now, just the places that seemed most obvious. Of course, this will make any future type system changes much simpler, as it will not be necessary to duplicate all logic two times.
* | Merge branch 'PHP-7.4'Nikita Popov2019-12-181-8/+6
|\ \ | |/ | | | | | | * PHP-7.4: Fixed bug #78776
| * Fixed bug #78776Nikita Popov2019-12-181-9/+6
| | | | | | | | | | By using the normal inheritance check if the parent is abstract as well.
* | Merge branch 'PHP-7.4'Nikita Popov2019-12-091-1/+1
|\ \ | |/ | | | | | | * PHP-7.4: Use unmangled named in property type inheritance error
| * Use unmangled named in property type inheritance errorNikita Popov2019-12-091-1/+1
| |
* | Fix incorrect assertion in property type variance checkNikita Popov2019-12-041-1/+1
| | | | | | | | | | | | | | Only one of the status has to be UNRESOLVED, the other could also be SUCCESS. Fixes oss-fuzz #19108 and oss-fuzz #19111.
* | Implement union typesNikita Popov2019-11-081-118/+202
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | According to RFC: https://wiki.php.net/rfc/union_types_v2 The type representation now makes use of both the pointer payload and the type mask at the same time. Additionall, zend_type_list is introduced as a new kind of pointer payload, which is used to store multiple class types. Each of the class types is a tagged pointer, which may be either a class name or class entry. The latter is only used for typed properties, while arguments/returns will instead use cache slots. A type list can contain a mix of both names and CEs at the same time, as not all classes may be resolvable. One thing this is missing is support for union types in arginfo and stubs, which I want to handle separately. I've also dropped the special object code from the JIT implementation for now -- I plan to add this back in a different form at a later time. For now I did not want to include non-trivial JIT changes together with large functional changes. Another possible piece of follow-up work is to implement "iterable" as an internal alias for "array|Traversable". I believe this will eliminate quite a few special-cases that had to be implemented. Closes GH-4838.
* | Make zend_type a 2-field structNikita Popov2019-11-081-11/+12
| | | | | | | | | | | | | | | | | | | | | | | | | | We now store the pointer payload and the type mask separately. This is in preparation for union types, where we will be using both at the same time. To avoid increasing the size of arginfo structures, the pass_by_reference and is_variadic fields are now stored as part of the type_mask (8-bit are reserved for custom use). Different types of pointer payloads are distinguished based on bits in the type_mask.
* | Merge branch 'PHP-7.4'Nikita Popov2019-10-251-3/+3
|\ \ | |/ | | | | | | * PHP-7.4: Fix bug #78226: Don't call __set() on uninitialized typed properties
| * Fix bug #78226: Don't call __set() on uninitialized typed propertiesNikita Popov2019-10-251-3/+3
| | | | | | | | | | | | | | | | | | | | | | | | | | Assigning to an uninitialized typed property will no longer trigger a call to __set(). However, calls to __set() are still triggered if the property is explicitly unset(). This gives us both the behavior people generally expect, and still allows ORMs to do lazy initialization by unsetting properties. For PHP 8, we should fine a way to forbid unsetting of declared properties entirely, and provide a different way to achieve lazy initialization.
* | Merge branch 'PHP-7.4'Nikita Popov2019-10-251-8/+17
|\ \ | |/ | | | | | | * PHP-7.4: Remove recursive check from instanceof_interface
| * Remove recursive check from instanceof_interfaceNikita Popov2019-10-251-8/+17
| | | | | | | | | | | | | | | | | | | | | | Parent interfaces are copied into the interface list during inheritance, so there's no need to perform a recursive check. Only exception are instanceof checks performed during inheritance itself. However, we already have unlinked_instanceof for this purpose, it just needs to be taught to handle this case. Closes GH-4857.
* | Merge branch 'PHP-7.4'Nikita Popov2019-10-171-66/+117
|\ \ | |/ | | | | | | * PHP-7.4: Integrate property types with variance system
| * Integrate property types with variance systemNikita Popov2019-10-171-68/+124
| | | | | | | | | | | | | | | | | | | | | | Property types are invariant, but may still have to load classes in order to check for class aliases. This class loading should follow the same rules as all other variance checks, rather than just loading unconditionally. This change integrates property type invariance checks into the variance system as a new obligation type, and prevent early binding if the type check cannot be performed.
* | Merge branch 'PHP-7.4'Nikita Popov2019-10-011-9/+0
|\ \ | |/
| * Remove func copy optimization for private method with static varsNikita Popov2019-10-011-9/+0
| | | | | | | | | | | | | | | | | | | | Not NULLing the static_variables pointer for shadow methods during static var shutdown would be a way to avoid this leak, but unless there's evidence that inherited private methods with static vars are actually a common use-case, I don't think we should keep this kind of fragile edge-case optimization. Fixes OSS-Fuzz #17875.
* | Change representation of zend_type from type code to MAY_BE_* maskNikita Popov2019-09-231-37/+14
| | | | | | | | | | | | | | | | | | | | | | | | | | This switches zend_type from storing a single IS_* type code to storing a MAY_BE_* type mask. Right now most code still assumes that there is only a single type in the mask (or two together with MAY_BE_NULL). But this will make it a lot simpler to introduce union types. An additional advantage (and why I'm doing this separately), is that a number of special cases no longer need to be handled separately: We can do a single mask & (1 << type) check to handle all simple types, booleans (true|false) and null.
* | Merge branch 'PHP-7.4'Nikita Popov2019-09-121-21/+70
|\ \ | |/
| * Allow throwing exception while loading parent classNikita Popov2019-09-121-21/+70
| | | | | | | | | | | | | | | | | | | | | | | | | | | | This is a fix for symfony/symfony#32995. The behavior is: * Throwing exception when loading parent/interface is allowed (and we will also throw one if the class is simply not found). * If this happens, the bucket key for the class is reset, so it's possibly to try registering the same class again. * However, if the class has already been used due to a variance obligation, the exception is upgraded to a fatal error, as we cannot safely unregister the class stub anymore.
* | Merge branch 'PHP-7.4'Nikita Popov2019-09-111-1/+1
|\ \ | |/
| * Fix typo in unlinked_instanceof assertionNikita Popov2019-09-111-1/+1
| |
* | Merge branch 'PHP-7.4'Nikita Popov2019-09-111-5/+5
|\ \ | |/
| * Only allow "nearly linked" classes for parent/interfaceNikita Popov2019-09-111-5/+5
| | | | | | | | | | | | | | | | | | | | | | The requirements for parent/interface are difference than for the variance checks in type declarations. The latter can work on fully unlinked classes, but the former need inheritance to be essentially finished, only variance checks may still be outstanding. Adding a new flag for this because we have lots of space, but we could also represent these "inheritance states" more compactly in the future.
* | Merge branch 'PHP-7.4'Nikita Popov2019-08-291-2/+10
|\ \ | |/
| * Addref static vars when not copying private methodNikita Popov2019-08-291-2/+10
| | | | | | | | | | | | While we don't need to give this method separate static vars, we do still need to perform an addref, as there will be a corresponding delref in the dtor.
* | Merge branch 'PHP-7.4'Dmitry Stogov2019-06-271-76/+48
|\ \ | |/ | | | | | | * PHP-7.4: Separate common code abd eliminate useless checks
| * Separate common code abd eliminate useless checksDmitry Stogov2019-06-271-76/+48
| |
* | Merge branch 'PHP-7.4'Dmitry Stogov2019-06-271-23/+38
|\ \ | |/ | | | | | | * PHP-7.4: Inline hot path
| * Inline hot pathDmitry Stogov2019-06-271-23/+38
| |
* | Merge branch 'PHP-7.4'Dmitry Stogov2019-06-271-41/+108
|\ \ | |/ | | | | | | * PHP-7.4: Avoid double checks on early binding
| * Avoid double checks on early bindingDmitry Stogov2019-06-271-42/+114
| |
* | Merge branch 'PHP-7.4'Dmitry Stogov2019-06-261-1/+2
|\ \ | |/ | | | | | | * PHP-7.4: Private methods don't have to be duplicated
| * Private methods don't have to be duplicatedDmitry Stogov2019-06-261-1/+2
| |
* | Merge branch 'PHP-7.4'Dmitry Stogov2019-06-261-16/+29
|\ \ | |/ | | | | | | * PHP-7.4: Reorder conditions to minimize number of checks on fast path
| * Reorder conditions to minimize number of checks on fast pathDmitry Stogov2019-06-261-16/+30
| |
* | Merge branch 'PHP-7.4'Dmitry Stogov2019-06-261-46/+41
|\ \ | |/ | | | | | | * PHP-7.4: Remove always true/false conditions, remove dead conde and simplify code.
| * Remove always true/false conditions, remove dead conde and simplify code.Dmitry Stogov2019-06-261-47/+42
| |
* | Merge branch 'PHP-7.4'Dmitry Stogov2019-06-251-7/+3
|\ \ | |/ | | | | | | * PHP-7.4: Replace previosly checked conditions by ZEND_ASSERT()
| * Replace previosly checked conditions by ZEND_ASSERT()Dmitry Stogov2019-06-251-7/+3
| |
* | Merge branch 'PHP-7.4'Dmitry Stogov2019-06-251-2/+12
|\ \ | |/ | | | | | | * PHP-7.4: Fixed variance check for abstract constructor during erlay binding
| * Fixed variance check for abstract constructor during erlay bindingDmitry Stogov2019-06-251-2/+12
| |
* | Merge branch 'PHP-7.4'Dmitry Stogov2019-06-251-38/+23
|\ \ | |/ | | | | | | * PHP-7.4: Cleanup
| * CleanupDmitry Stogov2019-06-251-45/+33
| |
* | Merge branch 'PHP-7.4'Dmitry Stogov2019-06-251-5/+8
|\ \ | |/ | | | | | | | | | | * PHP-7.4: Prevent useless hash lookups Update NEWS for 7.4.0alpha3 Update NEWS for PHP 7.4.0alpha2
| * Prevent useless hash lookupsDmitry Stogov2019-06-251-5/+8
| |
* | Merge branch 'PHP-7.4'Dmitry Stogov2019-06-251-2/+2
|\ \ | |/ | | | | | | * PHP-7.4: Keep lowercased parent class name as second argument of DECLARE_CLASS to avoid extra work at run-time