MCPcopy Create free account
hub / github.com/alliedmodders/sourcemod / ClassifyObject

Function ClassifyObject

extensions/bintools/jit_call_x64.cpp:667–717  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

665}
666
667inline int ClassifyObject(const PassInfo *info, ObjectClass *classes)
668{
669 ObjectField *fields = info->fields;
670 unsigned int numFields = info->numFields;
671 int numWords = 1;
672
673 if (info->size > 16 || info->flags & PASSFLAG_OUNALIGN)
674 classes[0] = ObjectClass::Memory;
675 else if (info->flags & (PASSFLAG_ODTOR|PASSFLAG_OCOPYCTOR))
676 classes[0] = ObjectClass::Pointer;
677 else if (info->size > 8)
678 classes[0] = ObjectClass::None;
679 else if (numFields == 1 || numFields == 2)
680 classes[0] = ClassifyType(fields[0]);
681 else
682 classes[0] = ObjectClass::Integer;
683
684 if (classes[0] == ObjectClass::None)
685 {
686 numWords = int((info->size + 7) / 8);
687
688 unsigned int j = 0;
689 for (int i = 0; i < numWords; i++)
690 {
691 classes[i] = ObjectClass::None;
692 size_t sizeSoFar = 0;
693 for (int k = 0; j < numFields; j++, k++)
694 {
695 size_t sz = TypeSize(fields[j]);
696 if (sizeSoFar + sz > 8)
697 break;
698 else
699 sizeSoFar += sz;
700
701 if (k == 0 && sizeSoFar == 8) {
702 classes[i] = ClassifyType(fields[j++]);
703 break;
704 } else if (j + 1 >= numFields) {
705 break;
706 }
707
708 const ObjectField &field1 = fields[j];
709 const ObjectField &field2 = fields[j + 1];
710
711 classes[i] = MergeClasses(ClassifyType(field1), ClassifyType(field2));
712 }
713 }
714 }
715
716 return numWords;
717}
718
719inline void Write_PushObject(JitWriter *jit, const SourceHook::PassInfo *info, unsigned int offset,
720 const PassInfo *smInfo)

Callers 2

Write_PushObjectFunction · 0.85
JIT_CallCompileFunction · 0.85

Calls 3

ClassifyTypeFunction · 0.85
TypeSizeFunction · 0.85
MergeClassesFunction · 0.85

Tested by

no test coverage detected