blob: e654db3779a5f6b8dd6920087fcb2d15415be7c7 [file] [log] [blame] [edit]
// Copyright (c) 2023, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
import '../serialize/serialize.dart';
import '../serialize/printer.dart';
import 'ir.dart';
/// An (imported or defined) global variable.
abstract class Global with Indexable, Exportable {
@override
final FinalizableIndex finalizableIndex;
final GlobalType type;
@override
final Module enclosingModule;
/// Name of the global in the names section.
String? globalName;
Global(this.enclosingModule, this.finalizableIndex, this.type,
[this.globalName]);
@override
String toString() => globalName ?? "$finalizableIndex";
@override
Export buildExport(String name) {
return GlobalExport(name, this);
}
void printTo(IrPrinter p, {bool includeInitializer = true}) =>
throw 'not implemented';
}
/// A global variable defined in a module.
class DefinedGlobal extends Global implements Serializable {
final Instructions initializer;
DefinedGlobal(super.enclosingModule, this.initializer, super.finalizableIndex,
super.type,
[super.globalName]);
@override
void serialize(Serializer s) {
s.write(type);
s.write(initializer);
}
@override
void printTo(IrPrinter p, {bool includeInitializer = true}) {
// This may generate globals this one refers to.
final ip = p.dup();
if (includeInitializer) {
initializer.printInitializerTo(ip);
}
p.write('(global ');
p.writeGlobalReference(this);
p.write(' ');
type.printTo(p);
if (includeInitializer) {
if (p.preferMultiline) {
p.indent();
p.writeln();
} else {
p.write(' ');
}
p.write(ip.getText().trim());
if (p.preferMultiline) {
p.deindent();
}
} else {
p.write(' <...>');
}
p.write(')');
}
}
/// An imported global variable.
class ImportedGlobal extends Global implements Import {
@override
final String module;
@override
final String name;
ImportedGlobal(super.enclosingModule, this.module, this.name,
super.finalizableIndex, super.type,
[super.globalName]);
@override
void serialize(Serializer s) {
s.writeName(module);
s.writeName(name);
s.writeByte(0x03);
s.write(type);
}
@override
void printTo(IrPrinter p, {bool includeInitializer = true}) {
p.write('(global ');
p.writeGlobalReference(this);
p.write(' ');
p.writeImport(module, name);
p.write(' ');
p.writeValueType(type.type);
p.write(')');
}
}
class GlobalExport extends Export {
final Global global;
GlobalExport(super.name, this.global);
@override
void serialize(Serializer s) {
s.writeName(name);
s.writeByte(0x03);
s.writeUnsigned(global.index);
}
}