| 89 | }; |
| 90 | |
| 91 | bool AreMembersAligned(ExternTypeInfo *lType, Linker *exLinker) |
| 92 | { |
| 93 | bool aligned = 1; |
| 94 | unsigned int pos = 0; |
| 95 | //printf("checking class %s: ", exLinker->exSymbols.data + lType->offsetToName); |
| 96 | for(unsigned m = 0; m < lType->memberCount; m++) |
| 97 | { |
| 98 | ExternTypeInfo &memberType = exLinker->exTypes[exLinker->exTypeExtra[lType->memberOffset + m]]; |
| 99 | unsigned int alignment = memberType.defaultAlign > 4 ? 4 : memberType.defaultAlign; |
| 100 | if(alignment && pos % alignment != 0) |
| 101 | pos += alignment - (pos % alignment); |
| 102 | //printf("member %s; ", exLinker->exSymbols.data + memberType.offsetToName); |
| 103 | switch(memberType.type) |
| 104 | { |
| 105 | case ExternTypeInfo::TYPE_CHAR: |
| 106 | break; |
| 107 | case ExternTypeInfo::TYPE_SHORT: |
| 108 | if(pos % 2 != 0) |
| 109 | aligned = 0; |
| 110 | break; |
| 111 | case ExternTypeInfo::TYPE_INT: |
| 112 | if(pos % 4 != 0) |
| 113 | aligned = 0; |
| 114 | break; |
| 115 | case ExternTypeInfo::TYPE_LONG: |
| 116 | if(pos % 8 != 0) |
| 117 | aligned = 0; |
| 118 | break; |
| 119 | } |
| 120 | pos += memberType.size; |
| 121 | } |
| 122 | //printf("%s\n", aligned ? "aligned" : "unaligned"); |
| 123 | return aligned; |
| 124 | } |
| 125 | |
| 126 | unsigned int Executor::CreateFunctionGateway(FastVector<unsigned char>& code, unsigned int funcID) |
| 127 | { |