MCPcopy Create free account
hub / github.com/WheretIB/nullc / nullcGetArgumentVector

Function nullcGetArgumentVector

NULLC/nullc.cpp:396–494  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

394
395#ifndef NULLC_NO_EXECUTOR
396const 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]];

Callers 2

nullcRunFunctionFunction · 0.85
nullcCallFunctionFunction · 0.85

Calls 1

GetStringHashFunction · 0.70

Tested by

no test coverage detected