| 66 | return ret; |
| 67 | } |
| 68 | NULLCRef MemberByIndex(NULLCRef obj, int member) |
| 69 | { |
| 70 | assert(linker); |
| 71 | NULLCRef ret; |
| 72 | ret.ptr = NULL; |
| 73 | ret.typeID = 0; |
| 74 | |
| 75 | ExternTypeInfo &exType = linker->exTypes[obj.typeID]; |
| 76 | if((exType.subCat != ExternTypeInfo::CAT_CLASS) || ((unsigned)member >= exType.memberCount)) |
| 77 | return ret; |
| 78 | |
| 79 | unsigned int *memberList = &linker->exTypeExtra[exType.memberOffset]; |
| 80 | ret.typeID = memberList[member]; |
| 81 | ret.ptr = obj.ptr; |
| 82 | unsigned int pos = 0; |
| 83 | for(unsigned m = 0; m <= (unsigned)member; m++) |
| 84 | { |
| 85 | ExternTypeInfo &memberType = linker->exTypes[memberList[m]]; |
| 86 | unsigned int alignment = memberType.defaultAlign > 4 ? 4 : memberType.defaultAlign; |
| 87 | if(alignment && pos % alignment != 0) |
| 88 | pos += alignment - (pos % alignment); |
| 89 | if(m != (unsigned)member) |
| 90 | pos += memberType.size; |
| 91 | } |
| 92 | ret.ptr += pos; |
| 93 | return ret; |
| 94 | } |
| 95 | NULLCRef MemberByName(NULLCRef obj, NULLCArray member) |
| 96 | { |
| 97 | assert(linker); |
no test coverage detected