| 394 | |
| 395 | #ifndef NULLC_NO_EXECUTOR |
| 396 | const char* nullcGetArgumentVector(unsigned int functionID, uintptr_t extra, va_list args) |
| 397 | { |
| 398 | using namespace NULLC; |
| 399 | |
| 400 | // Copy arguments in argument buffer |
| 401 | ExternFuncInfo &func = linker->exFunctions[functionID]; |
| 402 | char *argPos = argBuf; |
| 403 | for(unsigned int i = 0; i < func.paramCount; i++) |
| 404 | { |
| 405 | ExternLocalInfo &lInfo = linker->exLocals[func.offsetToFirstLocal + i]; |
| 406 | ExternTypeInfo &tInfo = linker->exTypes[lInfo.type]; |
| 407 | switch(tInfo.type) |
| 408 | { |
| 409 | case ExternTypeInfo::TYPE_CHAR: |
| 410 | case ExternTypeInfo::TYPE_SHORT: |
| 411 | case ExternTypeInfo::TYPE_INT: |
| 412 | *(int*)argPos = va_arg(args, int); |
| 413 | argPos += 4; |
| 414 | break; |
| 415 | case ExternTypeInfo::TYPE_LONG: |
| 416 | *(long long*)argPos = va_arg(args, long long); |
| 417 | argPos += 8; |
| 418 | break; |
| 419 | case ExternTypeInfo::TYPE_FLOAT: |
| 420 | *(float*)argPos = (float)va_arg(args, double); |
| 421 | argPos += 4; |
| 422 | break; |
| 423 | case ExternTypeInfo::TYPE_DOUBLE: |
| 424 | *(double*)argPos = va_arg(args, double); |
| 425 | argPos += 8; |
| 426 | break; |
| 427 | case ExternTypeInfo::TYPE_COMPLEX: |
| 428 | static unsigned int autoRefHash = GetStringHash("auto ref"); |
| 429 | static unsigned int autoArrayHash = GetStringHash("auto[]"); |
| 430 | #ifdef _WIN64 |
| 431 | if(tInfo.size <= 4) |
| 432 | *(int*)argPos = va_arg(args, int); |
| 433 | else if(tInfo.size <= 8) |
| 434 | *(long long*)argPos = va_arg(args, long long); |
| 435 | else |
| 436 | memcpy(argPos, va_arg(args, char*), tInfo.size); |
| 437 | argPos += tInfo.size; |
| 438 | #elif defined(__x86_64__) |
| 439 | if((tInfo.subCat == ExternTypeInfo::CAT_ARRAY && tInfo.arrSize == TypeInfo::UNSIZED_ARRAY) || tInfo.subCat == ExternTypeInfo::CAT_FUNCTION) |
| 440 | { |
| 441 | *(NULLCArray*)argPos = va_arg(args, NULLCArray); |
| 442 | argPos += 12; |
| 443 | }else if(tInfo.nameHash == autoRefHash){ |
| 444 | *(NULLCRef*)argPos = va_arg(args, NULLCRef); |
| 445 | argPos += 12; |
| 446 | }else if(tInfo.nameHash == autoArrayHash){ |
| 447 | *(NULLCAutoArray*)argPos = va_arg(args, NULLCAutoArray); |
| 448 | argPos += sizeof(NULLCAutoArray); |
| 449 | }else if(tInfo.subCat == ExternTypeInfo::CAT_CLASS){ |
| 450 | unsigned int *memberList = &linker->exTypeExtra[tInfo.memberOffset]; |
| 451 | for(unsigned int k = 0; k < tInfo.memberCount; k++) |
| 452 | { |
| 453 | const ExternTypeInfo &subType = linker->exTypes[memberList[k]]; |
no test coverage detected