in SyntheticTypes/SynTypes.js [433:524]
function __defineSyntheticType(typeTable, typeDefinition)
{
var typeDescriptor = typeDefinition.__typeEntry;
var typeName = typeDefinition.Name;
__preprocessTypeDescriptor(typeDescriptor);
class typeClass
{
constructor(addr, contextInheritorModule)
{
var curBit = 0;
var fieldSize = 0;
var addr64 = host.Int64(addr);
this.targetLocation = addr64;
this.targetSize = __getSyntheticTypeSize(typeName, contextInheritorModule);
for (var field of typeDescriptor)
{
var fldSize = __getSyntheticFieldSize(field, contextInheritorModule);
var fldAlign = __getSyntheticFieldAlign(field, contextInheritorModule);
//
// Align the field if it has alignment requirements.
//
if (fldAlign > 1)
{
//
// Int64 is missing bitwiseNot in many releases of JsProvider. The field alignment is never
// going to be over 32 bits. Adjust using that.
//
// When the support for .bitwiseNot is in enough releases, remove this workaround.
//
var low32AlignMask = 0xFFFFFFFF - (fldAlign - 1);
var alignMask = host.Int64(low32AlignMask, 0xFFFFFFFF);
addr64 = addr64.add(fldAlign - 1).bitwiseAnd(alignMask);
}
var isBitField = !(field.bitLength === undefined);
if (isBitField)
{
if (fieldSize == 0)
{
curBit = 0;
fieldSize = fldSize;
}
field.startingBit = curBit;
}
var fldValue = __getSyntheticFieldValue(field, addr64, contextInheritorModule);
var fldName = field.fieldName;
if (fldName === undefined)
{
__embedType(this, fldValue, contextInheritorModule);
}
else
{
this[field.fieldName] = fldValue;
}
if (isBitField)
{
curBit += field.bitLength;
if (curBit >= fieldSize * 8)
{
curBit = 0;
fieldSize = 0;
addr64 = addr64.add(fldSize);
}
}
else
{
addr64 = addr64.add(fldSize);
}
}
}
};
__syntheticTypes[typeName] =
{
classObject: typeClass,
descriptor: typeDescriptor,
isUnion: false,
containingTable: typeTable
}
typeDefinition.__make = function(addrObj)
{
return new typeClass(addrObj, typeTable.Module);
};
typeTable.__addType(typeDefinition);
}