visitCompilation method
Implementation
@override
Uint8List visitCompilation(ASTCompilation compilation) {
_currentConstantTable = HTGlobalConstantTable();
final mainBytesBuilder = BytesBuilder();
// hetu bytecode signature
mainBytesBuilder.add(hetuSignatureData);
mainBytesBuilder.add(_compileVersionString(kHetuVersion));
if (compilation.version != null) {
mainBytesBuilder.addByte(1); // bool: hasVersion
mainBytesBuilder.add(_compileVersionString(compilation.version!));
} else {
mainBytesBuilder.addByte(0); // bool: hasVersion
}
final compiledAt = DateTime.now().toUtc();
// final DateFormat formatter = DateFormat('yyyy-MM-dd HH:mm:ss');
// final compiledAtString = formatter.format(compiledAt);
final compiledAtString = compiledAt.toIso8601String();
mainBytesBuilder.add(_utf8String(compiledAtString));
// entry file name
mainBytesBuilder.add(_utf8String(compilation.entryFullname));
// index: ResourceType
mainBytesBuilder.addByte(compilation.entryResourceType.index);
// we have to compile source beforehand to get all the constants.
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(OpCode.constIntTable);
} else if (type == double) {
mainBytesBuilder.addByte(OpCode.constFloatTable);
} else if (type == String) {
mainBytesBuilder.addByte(OpCode.constStringTable);
} else {
continue;
}
mainBytesBuilder.add(_uint16(table.length));
for (final value in table) {
mainBytesBuilder.add(_utf8String(value));
}
}
// add source code after the constant table
mainBytesBuilder.add(code);
mainBytesBuilder.addByte(OpCode.endOfModule);
return mainBytesBuilder.toBytes();
}