Re: [Concept] Flip relative function lookup order (global, then local)

From: Date: Fri, 02 Aug 2024 17:19:41 +0000
Subject: Re: [Concept] Flip relative function lookup order (global, then local)
References: 1  Groups: php.internals 
Request: Send a blank email to internals+get-124721@lists.php.net to get a copy of this message
On Fri, 2024-08-02 at 18:51 +0200, Ilija Tovilo wrote: > Hi everyone > > As you probably know, a common performance optimization in PHP is to > prefix global function calls in namespaced code with a \. In > namespaced code, relative function calls (meaning, not prefixed with > \, not imported and not containing multiple namespace > components) > will be looked up in the current namespace before falling back to the > global namespace. Prefixing the function name with \ > disambiguates > the called function by always picking the global function. > > Not knowing exactly which function is called at compile time has a > couple of downsides to this: > > * It leads to the aforementioned double-lookup. > * It prevents compile-time-evaluation of pure internal functions. > * It prevents compiling to specialized  opcodes for specialized > internal functions (e.g. strlen()). > * It requires branching for frameless functions [1]. > * It prevents an optimization that looks up internal functions by > offset rather than by name [2]. > * It prevents compiling to more specialized argument sending opcodes > because of unknown by-value/by-reference passing. > > All of these are enabled by disambiguating the call. Unfortunately, > prefixing all calls with \, or adding a use > function at the top > of > every file is annoying and noisy. We recently got a feature request > to > change how functions are looked up [3]. I think there should be some way to use globals first at compile time. I had suggested a per-file directive in a post to this list a while back. Something like: namespace foo; use global functions; class MyClass { // do stuff. } Where use global functions would be a special token that the compiler uses to skip the ns lookup and use dedicated opcodes when available.

« previous php.internals (#124721) next »