Fix instance-call diagnostics and declaring scope for static methods
Build / AerScript (push) Successful in 38s

This commit is contained in:
2026-10-28 17:29:24 +01:00
parent d85154ac58
commit a0dd23e63e
+12 -3
View File
@@ -1111,7 +1111,7 @@ static ph7_vm_func *VmOverload(
sxi32 bInternal /* VM-invoked methods already have an access context */
) {
sxu32 iTarget, j, k, iArgs, nCandidates, nCompatible, nCols, nPassed;
sxi32 bDominated;
sxi32 bDominated, bInstanceOnly = 0;
ph7_vm_func **apSet;
ph7_vm_func *pLink;
ph7_vm_func_arg *pFuncArg;
@@ -1160,10 +1160,13 @@ static ph7_vm_func *VmOverload(
for(pLink = pEntry ? (ph7_vm_func *)pEntry->pUserData : 0; pLink; pLink = pLink->pNextName) {
pMeth = (ph7_class_method *)pLink;
if((pMeth->iFlags & PH7_CLASS_ATTR_VIRTUAL) ||
(bStatic && !(pMeth->iFlags & PH7_CLASS_ATTR_STATIC)) ||
(!bInternal && !VmClassMemberAccess(pVm, pLink->pClass, pMeth->iProtection))) {
continue;
}
if(bStatic && !(pMeth->iFlags & PH7_CLASS_ATTR_STATIC)) {
bInstanceOnly = 1;
continue;
}
for(k = 0; k < SySetUsed(&sMethods); k++) {
if(PH7_VmSameSignature(pLink, *(ph7_vm_func **)SySetAt(&sMethods, k))) {
break;
@@ -1181,6 +1184,11 @@ static ph7_vm_func *VmOverload(
}
}
}
if(bInstanceOnly && SySetUsed(&sMethods) < 1) {
SySetRelease(&sMethods);
SySetRelease(&sSet);
PH7_VmThrowError(pVm, PH7_CTX_ERR, "Instance method '%z()' requires an object", &pList->sName);
}
/* Put functions whose arguments are compatible with the current call */
for(iMethod = 0; iMethod < SySetUsed(&sMethods); iMethod++) {
pLink = *(ph7_vm_func **)SySetAt(&sMethods, iMethod);
@@ -5743,7 +5751,8 @@ Resume:
} else {
pVmFunc = (ph7_vm_func *)pInstr->p3;
}
if(pThis && (pVmFunc->iFlags & VM_FUNC_CLASS_METHOD)) {
/* The selected declaration owns the scope, even without a receiver. */
if(pVmFunc->iFlags & VM_FUNC_CLASS_METHOD) {
pSelf = pVmFunc->pClass;
}
if(pVmFunc->iFlags & VM_FUNC_CLOSURE) {