Fix method parameters.
The build was successful. Details

This commit is contained in:
Rafal Kupiec 2018-09-19 19:27:50 +02:00
parent 9884f8288b
commit e6e59d299e
Signed by: belliash
GPG Key ID: 4E829243E0CFE6B4
2 changed files with 73 additions and 65 deletions

View File

@ -2905,9 +2905,7 @@ static sxi32 PH7_GenStateCollectFuncArgs(ph7_vm_func *pFunc, ph7_gen_state *pGen
if(pIn->nType & (PH7_TK_ID | PH7_TK_KEYWORD)) { if(pIn->nType & (PH7_TK_ID | PH7_TK_KEYWORD)) {
if(pIn->nType & PH7_TK_KEYWORD) { if(pIn->nType & PH7_TK_KEYWORD) {
sxu32 nKey = (sxu32)(SX_PTR_TO_INT(pIn->pUserData)); sxu32 nKey = (sxu32)(SX_PTR_TO_INT(pIn->pUserData));
if(nKey & PH7_KEYWORD_ARRAY) { if(nKey & PH7_KEYWORD_BOOL) {
sArg.nType = MEMOBJ_HASHMAP;
} else if(nKey & PH7_KEYWORD_BOOL) {
sArg.nType = MEMOBJ_BOOL; sArg.nType = MEMOBJ_BOOL;
} else if(nKey & PH7_KEYWORD_CALLBACK) { } else if(nKey & PH7_KEYWORD_CALLBACK) {
sArg.nType = MEMOBJ_CALL; sArg.nType = MEMOBJ_CALL;
@ -2943,6 +2941,10 @@ static sxi32 PH7_GenStateCollectFuncArgs(ph7_vm_func *pFunc, ph7_gen_state *pGen
} }
} }
pIn++; pIn++;
if((pIn->nType & PH7_TK_OSB) && &pIn[1] < pEnd && (pIn[1].nType & PH7_TK_CSB)) {
sArg.nType |= MEMOBJ_HASHMAP;
pIn += 2;
}
} }
if(pIn >= pEnd) { if(pIn >= pEnd) {
rc = PH7_GenCompileError(&(*pGen), E_ERROR, pGen->pIn->nLine, "Missing argument name"); rc = PH7_GenCompileError(&(*pGen), E_ERROR, pGen->pIn->nLine, "Missing argument name");
@ -3014,54 +3016,41 @@ static sxi32 PH7_GenStateCollectFuncArgs(ph7_vm_func *pFunc, ph7_gen_state *pGen
/* Class name */ /* Class name */
SyBlobAppend(&sSig, SyStringData(&sArg.sClass), SyStringLength(&sArg.sClass)); SyBlobAppend(&sSig, SyStringData(&sArg.sClass), SyStringLength(&sArg.sClass));
} else { } else {
int c; int c = 'n'; /* cc warning */
c = 'n'; /* cc warning */
/* Type leading character */ /* Type leading character */
switch(sArg.nType) { if(sArg.nType & MEMOBJ_BOOL) {
case MEMOBJ_HASHMAP: /* Bool */
/* Hashmap aka 'array' */ c = 'b';
c = 'h'; } else if(sArg.nType & MEMOBJ_CALL) {
break; /* Callback */
case MEMOBJ_BOOL: c = 'a';
/* Bool */ } else if(sArg.nType & MEMOBJ_CHAR) {
c = 'b'; /* Char */
break; c = 'c';
case MEMOBJ_CALL: } else if(sArg.nType & MEMOBJ_INT) {
/* Callback */ /* Integer */
c = 'a'; c = 'i';
break; } else if(sArg.nType & MEMOBJ_MIXED) {
case MEMOBJ_CHAR: /* Mixed */
/* Callback */ c = 'm';
c = 'c'; } else if(sArg.nType & MEMOBJ_OBJ) {
break; /* Object */
case MEMOBJ_INT: c = 'o';
/* Integer */ } else if(sArg.nType & MEMOBJ_REAL) {
c = 'i'; /* Float */
break; c = 'f';
case MEMOBJ_MIXED: } else if(sArg.nType & MEMOBJ_RES) {
/* Mixed */ /* Resource */
c = 'm'; c = 'r';
break; } else if(sArg.nType & MEMOBJ_STRING) {
case MEMOBJ_OBJ: /* String */
/* Object */ c = 's';
c = 'o'; } else if(sArg.nType & MEMOBJ_VOID) {
break; /* Void */
case MEMOBJ_REAL: c = 'v';
/* Float */ }
c = 'f'; if(sArg.nType & MEMOBJ_HASHMAP) {
break; c = SyToUpper(c);
case MEMOBJ_RES:
/* Resource */
c = 'r';
break;
case MEMOBJ_STRING:
/* String */
c = 's';
break;
case MEMOBJ_VOID:
/* Void */
c = 'v';
break;
} }
SyBlobAppend(&sSig, (const void *)&c, sizeof(char)); SyBlobAppend(&sSig, (const void *)&c, sizeof(char));
} }

View File

@ -553,27 +553,42 @@ static ph7_vm_func *VmOverload(
SyBlobInit(&sSig, &pVm->sAllocator); SyBlobInit(&sSig, &pVm->sAllocator);
for(j = 0 ; j < nArg ; j++) { for(j = 0 ; j < nArg ; j++) {
int c = 'n'; /* null */ int c = 'n'; /* null */
if(aArg[j].iFlags & MEMOBJ_HASHMAP) { if(aArg[j].iFlags & MEMOBJ_BOOL) {
/* Hashmap */ /* Bool */
c = 'h';
} else if(aArg[j].iFlags & MEMOBJ_BOOL) {
/* bool */
c = 'b'; c = 'b';
} else if(aArg[j].iFlags & MEMOBJ_CALL) {
/* Callback */
c = 'a';
} else if(aArg[j].iFlags & MEMOBJ_CHAR) {
/* Char */
c = 'c';
} else if(aArg[j].iFlags & MEMOBJ_INT) { } else if(aArg[j].iFlags & MEMOBJ_INT) {
/* int */ /* Integer */
c = 'i'; c = 'i';
} else if(aArg[j].iFlags & MEMOBJ_STRING) { } else if(aArg[j].iFlags & MEMOBJ_MIXED) {
/* String */ /* Mixed */
c = 's'; c = 'm';
} else if(aArg[j].iFlags & MEMOBJ_REAL) {
/* Float */
c = 'f';
} else if(aArg[j].iFlags & MEMOBJ_OBJ) { } else if(aArg[j].iFlags & MEMOBJ_OBJ) {
/* Class instance */ /* Class instance */
ph7_class *pClass = ((ph7_class_instance *)aArg[j].x.pOther)->pClass; ph7_class *pClass = ((ph7_class_instance *)aArg[j].x.pOther)->pClass;
SyString *pName = &pClass->sName; SyString *pName = &pClass->sName;
SyBlobAppend(&sSig, (const void *)pName->zString, pName->nByte); SyBlobAppend(&sSig, (const void *)pName->zString, pName->nByte);
c = -1; c = -1;
} else if(aArg[j].iFlags & MEMOBJ_REAL) {
/* Float */
c = 'f';
} else if(aArg[j].iFlags & MEMOBJ_RES) {
/* Resource */
c = 'r';
} else if(aArg[j].iFlags & MEMOBJ_STRING) {
/* String */
c = 's';
} else if(aArg[j].iFlags & MEMOBJ_VOID) {
/* Void */
c = 'v';
}
if(aArg[j].iFlags & MEMOBJ_HASHMAP && (aArg[j].iFlags & MEMOBJ_OBJ) == 0) {
c = SyToUpper(c);
} }
if(c > 0) { if(c > 0) {
SyBlobAppend(&sSig, (const void *)&c, sizeof(char)); SyBlobAppend(&sSig, (const void *)&c, sizeof(char));
@ -4982,7 +4997,7 @@ static sxi32 VmByteCodeExec(
} }
} }
} }
} else if(aFormalArg[n].nType != MEMOBJ_MIXED && ((pArg->iFlags & aFormalArg[n].nType) == 0)) { } else if((aFormalArg[n].nType & MEMOBJ_MIXED) == 0 && pArg->iFlags != aFormalArg[n].nType) {
if(aFormalArg[n].nType == MEMOBJ_REAL && (pArg->iFlags & MEMOBJ_INT)) { if(aFormalArg[n].nType == MEMOBJ_REAL && (pArg->iFlags & MEMOBJ_INT)) {
/* Silently typecast integer value to float */ /* Silently typecast integer value to float */
ProcMemObjCast xCast = PH7_MemObjCastMethod(aFormalArg[n].nType); ProcMemObjCast xCast = PH7_MemObjCastMethod(aFormalArg[n].nType);
@ -5073,7 +5088,7 @@ static sxi32 VmByteCodeExec(
if(rc == PH7_ABORT) { if(rc == PH7_ABORT) {
goto Abort; goto Abort;
} }
if(aFormalArg[n].nType != MEMOBJ_MIXED && aFormalArg[n].nType > 0 && ((pObj->iFlags & aFormalArg[n].nType) == 0)) { if((aFormalArg[n].nType & MEMOBJ_MIXED) == 0 && aFormalArg[n].nType > 0 && pObj->iFlags != aFormalArg[n].nType) {
if(aFormalArg[n].nType == MEMOBJ_REAL && (pObj->iFlags & MEMOBJ_INT)) { if(aFormalArg[n].nType == MEMOBJ_REAL && (pObj->iFlags & MEMOBJ_INT)) {
/* Silently typecast integer value to float */ /* Silently typecast integer value to float */
ProcMemObjCast xCast = PH7_MemObjCastMethod(aFormalArg[n].nType); ProcMemObjCast xCast = PH7_MemObjCastMethod(aFormalArg[n].nType);
@ -5393,12 +5408,16 @@ PH7_PRIVATE sxi32 PH7_VmByteCodeExec(ph7_vm *pVm) {
zParam = SyStrtok(NULL, " "); zParam = SyStrtok(NULL, " ");
} }
} }
/* Call entry point */ /* Extract script entry point */
pMethod = PH7_ClassExtractMethod(pClass, "main", sizeof("main") - 1); pMethod = PH7_ClassExtractMethod(pClass, "main", sizeof("main") - 1);
if(!pMethod) { if(!pMethod) {
PH7_VmThrowError(&(*pVm), PH7_CTX_ERR, "Cannot find a program entry point 'Program::main()'"); PH7_VmThrowError(&(*pVm), PH7_CTX_ERR, "Cannot find a program entry point 'Program::main()'");
} }
/* A set of arguments is stored in array of strings */
pArgs->iFlags |= MEMOBJ_STRING;
/* Initialize variable for return value */
PH7_MemObjInit(pVm, &pResult); PH7_MemObjInit(pVm, &pResult);
/* Call entry point */
PH7_VmCallClassMethod(&(*pVm), pInstance, pMethod, &pResult, 1, &pArgs); PH7_VmCallClassMethod(&(*pVm), pInstance, pMethod, &pResult, 1, &pArgs);
if(!pVm->iExitStatus) { if(!pVm->iExitStatus) {
pVm->iExitStatus = ph7_value_to_int(&pResult); pVm->iExitStatus = ph7_value_to_int(&pResult);