Skip to content

Commit

Permalink
Fields generate in metadata
Browse files Browse the repository at this point in the history
  • Loading branch information
LPeter1997 committed Dec 19, 2023
1 parent 8210aed commit 3ee9908
Show file tree
Hide file tree
Showing 4 changed files with 57 additions and 18 deletions.
60 changes: 45 additions & 15 deletions src/Draco.Compiler/Internal/Codegen/MetadataCodegen.cs
Original file line number Diff line number Diff line change
Expand Up @@ -464,7 +464,18 @@ private TypeDefinitionHandle EncodeClass(
var startFieldIndex = fieldIndex;
var startProcIndex = procIndex;

foreach (var proc in @class.Procedures.Values) this.EncodeProcedure(proc);
foreach (var proc in @class.Procedures.Values)
{
this.EncodeProcedure(proc);
++procIndex;
}

foreach (var field in @class.Fields)
{

this.EncodeField(field);
++fieldIndex;
}

// TODO: Go through the rest of the members

Expand All @@ -490,13 +501,7 @@ private TypeDefinitionHandle EncodeClass(

private FieldDefinitionHandle EncodeGlobal(GlobalSymbol global)
{
var visibility = global.Visibility switch
{
Api.Semantics.Visibility.Public => FieldAttributes.Public,
Api.Semantics.Visibility.Internal => FieldAttributes.Assembly,
Api.Semantics.Visibility.Private => FieldAttributes.Private,
_ => throw new ArgumentOutOfRangeException(nameof(global.Visibility)),
};
var visibility = GetFieldVisibility(global.Visibility);

// Definition
return this.AddFieldDefinition(
Expand All @@ -505,15 +510,21 @@ private FieldDefinitionHandle EncodeGlobal(GlobalSymbol global)
signature: this.EncodeGlobalSignature(global));
}

private FieldDefinitionHandle EncodeField(FieldSymbol field)
{
var visibility = GetFieldVisibility(field.Visibility);
var mutability = field.IsMutable ? default : FieldAttributes.InitOnly;

// Definition
return this.AddFieldDefinition(
attributes: visibility | mutability,
name: field.Name,
signature: this.EncodeFieldSignature(field));
}

private MethodDefinitionHandle EncodeProcedure(IProcedure procedure)
{
var visibility = procedure.Symbol.Visibility switch
{
Api.Semantics.Visibility.Public => MethodAttributes.Public,
Api.Semantics.Visibility.Internal => MethodAttributes.Assembly,
Api.Semantics.Visibility.Private => MethodAttributes.Private,
_ => throw new ArgumentOutOfRangeException(nameof(procedure.Symbol.Visibility)),
};
var visibility = GetMethodVisibility(procedure.Symbol.Visibility);

// Encode instructions
var cilCodegen = new CilCodegen(this, procedure);
Expand Down Expand Up @@ -580,6 +591,9 @@ private MethodDefinitionHandle EncodeProcedure(IProcedure procedure)
private BlobHandle EncodeGlobalSignature(GlobalSymbol global) =>
this.EncodeBlob(e => this.EncodeSignatureType(e.Field().Type(), global.Type));

private BlobHandle EncodeFieldSignature(FieldSymbol field) =>
this.EncodeBlob(e => this.EncodeSignatureType(e.Field().Type(), field.Type));

private BlobHandle EncodeProcedureSignature(IProcedure procedure) => this.EncodeBlob(e =>
{
e
Expand Down Expand Up @@ -756,4 +770,20 @@ private void WritePe(Stream peStream)
var contentId = peBuilder.Serialize(peBlob);
peBlob.WriteContentTo(peStream);
}

private static FieldAttributes GetFieldVisibility(Api.Semantics.Visibility visibility) => visibility switch
{
Api.Semantics.Visibility.Public => FieldAttributes.Public,
Api.Semantics.Visibility.Internal => FieldAttributes.Assembly,
Api.Semantics.Visibility.Private => FieldAttributes.Private,
_ => throw new ArgumentOutOfRangeException(nameof(visibility)),
};

private static MethodAttributes GetMethodVisibility(Api.Semantics.Visibility visibility) => visibility switch
{
Api.Semantics.Visibility.Public => MethodAttributes.Public,
Api.Semantics.Visibility.Internal => MethodAttributes.Assembly,
Api.Semantics.Visibility.Private => MethodAttributes.Private,
_ => throw new ArgumentOutOfRangeException(nameof(visibility)),
};
}
3 changes: 1 addition & 2 deletions src/Draco.Compiler/Internal/OptimizingIr/ClassCodegen.cs
Original file line number Diff line number Diff line change
Expand Up @@ -50,8 +50,7 @@ public override void VisitFunction(FunctionSymbol functionSymbol)

public override void VisitField(FieldSymbol fieldSymbol)
{
// TODO
throw new NotImplementedException();
// No-op, the Class model reads it up from the symbol
}

// TODO: Copypasta from ModuleCodegen
Expand Down
6 changes: 6 additions & 0 deletions src/Draco.Compiler/Internal/OptimizingIr/Model/Class.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
using System.Collections.Immutable;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
Expand All @@ -24,6 +25,11 @@ internal sealed class Class : IClass

public IReadOnlyList<TypeParameterSymbol> Generics => this.Symbol.GenericParameters;

public IReadOnlyList<FieldSymbol> Fields => InterlockedUtils.InitializeDefault(
ref this.fields,
() => this.Symbol.DefinedMembers.OfType<FieldSymbol>().ToImmutableArray());
private ImmutableArray<FieldSymbol> fields;

public IReadOnlyDictionary<FunctionSymbol, IProcedure> Procedures => this.procedures;

private readonly Dictionary<FunctionSymbol, IProcedure> procedures = new();
Expand Down
6 changes: 5 additions & 1 deletion src/Draco.Compiler/Internal/OptimizingIr/Model/IClass.cs
Original file line number Diff line number Diff line change
Expand Up @@ -45,9 +45,13 @@ internal interface IClass
// TODO: Base class
// TODO: Interfaces? (we might wanna keep them external)
// TODO: Nested classes
// TODO: fields
// TODO: properties

/// <summary>
/// The fields defined on this class.
/// </summary>
public IReadOnlyList<FieldSymbol> Fields { get; }

/// <summary>
/// The procedures defined on this class.
/// </summary>
Expand Down

0 comments on commit 3ee9908

Please sign in to comment.