|
|
|
@ -972,6 +972,17 @@ trait NativeClassSupportTrait |
|
|
|
return false; |
|
|
|
return false; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** Whether this class declares or overrides a Native virtual method slot. */ |
|
|
|
|
|
|
|
protected function nativeObjectHasVirtualMethods(ClassDef $class): bool |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
foreach ([...$class->methods, ...$class->abstractMethodDefs] as $method) { |
|
|
|
|
|
|
|
if ($this->getNativeVirtualMethodSlots($class, $method) !== []) { |
|
|
|
|
|
|
|
return true; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
return false; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
protected function getNativeObjectArgumentType(ArgInfo $argument): ?string |
|
|
|
protected function getNativeObjectArgumentType(ArgInfo $argument): ?string |
|
|
|
{ |
|
|
|
{ |
|
|
|
$class = $argument->declaredClass ?: $argument->class; |
|
|
|
$class = $argument->declaredClass ?: $argument->class; |
|
|
|
@ -2010,6 +2021,8 @@ trait NativeClassSupportTrait |
|
|
|
|
|
|
|
|
|
|
|
foreach ($classes as $class) { |
|
|
|
foreach ($classes as $class) { |
|
|
|
$name = $this->getNativeObjectCppName($class); |
|
|
|
$name = $this->getNativeObjectCppName($class); |
|
|
|
|
|
|
|
$usesVirtualClone = $this->nativeObjectUsesVirtualClone($class); |
|
|
|
|
|
|
|
$usesVtable = $usesVirtualClone || $this->nativeObjectHasVirtualMethods($class); |
|
|
|
$hasNativeDestructor = $this->findNativeObjectMethod( |
|
|
|
$hasNativeDestructor = $this->findNativeObjectMethod( |
|
|
|
$class->getNamespacedName(false), |
|
|
|
$class->getNamespacedName(false), |
|
|
|
'__destruct', |
|
|
|
'__destruct', |
|
|
|
@ -2026,9 +2039,13 @@ trait NativeClassSupportTrait |
|
|
|
$code .= $this->getNativeMethodParameterDeclarations($constructor->functionDef); |
|
|
|
$code .= $this->getNativeMethodParameterDeclarations($constructor->functionDef); |
|
|
|
} |
|
|
|
} |
|
|
|
$code .= ');' . PHP_EOL; |
|
|
|
$code .= ');' . PHP_EOL; |
|
|
|
$code .= ' virtual ~' . $name . '() ' |
|
|
|
// The concrete type descriptor invokes the exact destructor, so |
|
|
|
|
|
|
|
// destruction alone must not add a vptr to an otherwise flat class. |
|
|
|
|
|
|
|
$code .= ' ' . ($usesVtable ? 'virtual ' : '') . '~' . $name . '() ' |
|
|
|
. ($hasNativeDestructor ? 'noexcept(false)' : 'noexcept') |
|
|
|
. ($hasNativeDestructor ? 'noexcept(false)' : 'noexcept') |
|
|
|
. ($class->extends !== '' && $this->isNativeObjectClass($class->extends) ? ' override' : '') |
|
|
|
. ($usesVtable |
|
|
|
|
|
|
|
&& $class->extends !== '' |
|
|
|
|
|
|
|
&& $this->isNativeObjectClass($class->extends) ? ' override' : '') |
|
|
|
. ';' . PHP_EOL; |
|
|
|
. ';' . PHP_EOL; |
|
|
|
if ($class->hasMethod('__destruct')) { |
|
|
|
if ($class->hasMethod('__destruct')) { |
|
|
|
$code .= ' void __typephp_finalize_destructor();' . PHP_EOL; |
|
|
|
$code .= ' void __typephp_finalize_destructor();' . PHP_EOL; |
|
|
|
@ -2087,7 +2104,7 @@ trait NativeClassSupportTrait |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
if ($this->nativeObjectUsesVirtualClone($class)) { |
|
|
|
if ($usesVirtualClone) { |
|
|
|
$code .= ' virtual ' . $name . ' *' . self::NATIVE_VIRTUAL_CLONE_METHOD . '() const'; |
|
|
|
$code .= ' virtual ' . $name . ' *' . self::NATIVE_VIRTUAL_CLONE_METHOD . '() const'; |
|
|
|
if ($class->extends !== '' && $this->isNativeObjectClass($class->extends)) { |
|
|
|
if ($class->extends !== '' && $this->isNativeObjectClass($class->extends)) { |
|
|
|
$code .= ' override'; |
|
|
|
$code .= ' override'; |
|
|
|
|