visitCompilation method
Implementation
@override
Uint8List visitCompilation(ASTCompilation compilation) {
_currentConstantTable = HTGlobalConstantTable();
final mainBytesBuilder = BytesBuilder();
// hetu bytecode signature
mainBytesBuilder.add(hetuSignatureData);
// hetu bytecode version
mainBytesBuilder.addByte(kHetuVersion.major);
mainBytesBuilder.addByte(kHetuVersion.minor);
mainBytesBuilder.add(_uint16(kHetuVersion.patch));
// pre-release id length
mainBytesBuilder.addByte(kHetuVersion.preRelease.length);
for (final item in kHetuVersion.preRelease) {
mainBytesBuilder.add(_utf8String(item.toString()));
}
// build id length
mainBytesBuilder.addByte(kHetuVersion.build.length);
for (final item in kHetuVersion.build) {
mainBytesBuilder.add(_utf8String(item.toString()));
}
final compiledAt = DateTime.now();
final DateFormat formatter = DateFormat('yyyy-MM-dd HH:mm:ss');
mainBytesBuilder.add(_utf8String(formatter.format(compiledAt)));
// entry file name
mainBytesBuilder.add(_utf8String(compilation.entryFullname));
// index: ResourceType
mainBytesBuilder.addByte(compilation.entryResourceType.index);
final sourceBytesBuilder = BytesBuilder();
for (final value in compilation.values.values) {
final bytes = value.accept(this);
sourceBytesBuilder.add(bytes);
}
for (final value in compilation.sources.values) {
final bytes = value.accept(this);
sourceBytesBuilder.add(bytes);
}
final code = sourceBytesBuilder.toBytes();
// const tables
for (final type in _currentConstantTable.constants.keys) {
final table = _currentConstantTable.constants[type]!;
if (type == int) {
mainBytesBuilder.addByte(HTOpCode.constIntTable);
mainBytesBuilder.add(_uint16(table.length));
for (final value in table) {
mainBytesBuilder.add(_int64(value));
}
} else if (type == double) {
mainBytesBuilder.addByte(HTOpCode.constFloatTable);
mainBytesBuilder.add(_uint16(table.length));
for (final value in table) {
mainBytesBuilder.add(_float64(value));
}
} else if (type == String) {
mainBytesBuilder.addByte(HTOpCode.constStringTable);
mainBytesBuilder.add(_uint16(table.length));
for (final value in table) {
mainBytesBuilder.add(_utf8String(value));
}
} else {
continue;
}
}
mainBytesBuilder.add(code);
return mainBytesBuilder.toBytes();
}