Skip to content

Commit 8023286

Browse files
committed
ReferencedTypeInfo does not store size anymore
1 parent a099a52 commit 8023286

File tree

4 files changed

+69
-68
lines changed

4 files changed

+69
-68
lines changed

gen/instruction_test.go

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,6 @@ func (AddInstructionDefinition) InferTargetTypes(
5151
return []gen.ReferencedTypeInfo{
5252
{
5353
Base: arguments[0].Base,
54-
Size: arguments[0].Size,
5554
Descriptors: arguments[0].Descriptors,
5655
},
5756
}, core.ResultList{}
@@ -87,7 +86,6 @@ func TestInstructionCreateTarget(t *testing.T) {
8786

8887
intTypeRef := gen.ReferencedTypeInfo{
8988
Base: intType,
90-
Size: intType.Size,
9189
}
9290

9391
registers := RegisterMap{

gen/target_test.go

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@ func TestTargetRegisterAlreadyDefined(t *testing.T) {
2626

2727
intTypeRef := gen.ReferencedTypeInfo{
2828
Base: intType,
29-
Size: intType.Size,
3029
}
3130

3231
registers := RegisterMap{

gen/type.go

Lines changed: 44 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,6 @@ type TypeDescriptorInfo struct {
4343
type ReferencedTypeInfo struct {
4444
// A pointer to the base, named type that this type reference refers to.
4545
Base *NamedTypeInfo
46-
Size core.UsmUint
4746
Descriptors []TypeDescriptorInfo
4847
}
4948

@@ -52,10 +51,6 @@ func (info ReferencedTypeInfo) Equals(other ReferencedTypeInfo) bool {
5251
return false
5352
}
5453

55-
if info.Size != other.Size {
56-
return false
57-
}
58-
5954
if len(info.Descriptors) != len(other.Descriptors) {
6055
return false
6156
}
@@ -197,43 +192,6 @@ func NewReferencedTypeGenerator[InstT BaseInstruction]() FileContextGenerator[In
197192
)
198193
}
199194

200-
func (g *ReferencedTypeGenerator[InstT]) calculateTypeSize(
201-
ctx *FileGenerationContext[InstT],
202-
node parse.TypeNode,
203-
baseType *NamedTypeInfo,
204-
descriptors []TypeDescriptorInfo,
205-
) (core.UsmUint, core.ResultList) {
206-
size := core.UsmUint(baseType.Size)
207-
208-
for _, descriptor := range descriptors {
209-
switch descriptor.Type {
210-
case PointerTypeDescriptor:
211-
size = ctx.PointerSize
212-
case RepeatTypeDescriptor:
213-
var ok bool
214-
size, ok = core.Mul(size, descriptor.Amount)
215-
if !ok {
216-
v := node.View()
217-
return 0, list.FromSingle(core.Result{{
218-
Type: core.ErrorResult,
219-
Message: "Type size overflow",
220-
Location: &v,
221-
}})
222-
}
223-
default:
224-
// notest
225-
v := node.View()
226-
return 0, list.FromSingle(core.Result{{
227-
Type: core.InternalErrorResult,
228-
Message: "Unknown type descriptor",
229-
Location: &v,
230-
}})
231-
}
232-
}
233-
234-
return size, core.ResultList{}
235-
}
236-
237195
func (g *ReferencedTypeGenerator[InstT]) Generate(
238196
ctx *FileGenerationContext[InstT],
239197
node parse.TypeNode,
@@ -262,14 +220,8 @@ func (g *ReferencedTypeGenerator[InstT]) Generate(
262220
descriptors = append(descriptors, descriptorInfo)
263221
}
264222

265-
size, results := g.calculateTypeSize(ctx, node, baseType, descriptors)
266-
if !results.IsEmpty() {
267-
return ReferencedTypeInfo{}, results
268-
}
269-
270223
typeInfo := ReferencedTypeInfo{
271224
Base: baseType,
272-
Size: size,
273225
Descriptors: descriptors,
274226
}
275227

@@ -290,6 +242,42 @@ func NewNamedTypeGenerator[InstT BaseInstruction]() FileContextGenerator[InstT,
290242
)
291243
}
292244

245+
func (g *NamedTypeGenerator[InstT]) calculateTypeSize(
246+
ctx *FileGenerationContext[InstT],
247+
node parse.TypeNode,
248+
typeInfo ReferencedTypeInfo,
249+
) (core.UsmUint, core.ResultList) {
250+
size := core.UsmUint(typeInfo.Base.Size)
251+
252+
for _, descriptor := range typeInfo.Descriptors {
253+
switch descriptor.Type {
254+
case PointerTypeDescriptor:
255+
size = ctx.PointerSize
256+
case RepeatTypeDescriptor:
257+
var ok bool
258+
size, ok = core.Mul(size, descriptor.Amount)
259+
if !ok {
260+
v := node.View()
261+
return 0, list.FromSingle(core.Result{{
262+
Type: core.ErrorResult,
263+
Message: "Type size overflow",
264+
Location: &v,
265+
}})
266+
}
267+
default:
268+
// notest
269+
v := node.View()
270+
return 0, list.FromSingle(core.Result{{
271+
Type: core.InternalErrorResult,
272+
Message: "Unknown type descriptor",
273+
Location: &v,
274+
}})
275+
}
276+
}
277+
278+
return size, core.ResultList{}
279+
}
280+
293281
func (g *NamedTypeGenerator[InstT]) Generate(
294282
ctx *FileGenerationContext[InstT],
295283
node parse.TypeDeclarationNode,
@@ -323,15 +311,20 @@ func (g *NamedTypeGenerator[InstT]) Generate(
323311
})
324312
}
325313

326-
referencedType := node.Fields.Nodes[0].Type
327-
referencedTypeInfo, results := g.ReferencedTypeGenerator.Generate(ctx, referencedType)
314+
referencedTypeNode := node.Fields.Nodes[0].Type
315+
referencedTypeInfo, results := g.ReferencedTypeGenerator.Generate(ctx, referencedTypeNode)
316+
if !results.IsEmpty() {
317+
return nil, results
318+
}
319+
320+
size, results := g.calculateTypeSize(ctx, referencedTypeNode, referencedTypeInfo)
328321
if !results.IsEmpty() {
329322
return nil, results
330323
}
331324

332325
typeInfo = &NamedTypeInfo{
333326
Name: identifier,
334-
Size: referencedTypeInfo.Size,
327+
Size: size,
335328
Declaration: &declaration,
336329
}
337330

gen/type_test.go

Lines changed: 25 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -199,30 +199,41 @@ func TestRepeatTypeTooLarge(t *testing.T) {
199199
typeManager := make(TypeMap)
200200
typeManager.newBuiltinType("$32", 4)
201201

202-
v := core.NewSourceView("$32 ^1_000_000 ^1_000_000")
202+
v := core.NewSourceView("type $tooLarge { $32 ^1_000_000 ^1_000_000 }")
203203
unmanaged := v.Unmanaged()
204204

205-
node := parse.TypeNode{
206-
Identifier: unmanaged.Subview(0, 3),
207-
Decorators: []parse.TypeDecoratorNode{
208-
{
209-
UnmanagedSourceView: unmanaged.Subview(4, 14),
210-
Type: parse.RepeatTypeDecorator,
211-
},
212-
{
213-
UnmanagedSourceView: unmanaged.Subview(15, 25),
214-
Type: parse.RepeatTypeDecorator,
205+
node := parse.TypeDeclarationNode{
206+
UnmanagedSourceView: unmanaged,
207+
Identifier: unmanaged.Subview(5, 14),
208+
Fields: parse.BlockNode[parse.TypeFieldNode]{
209+
UnmanagedSourceView: unmanaged.Subview(15, 44),
210+
Nodes: []parse.TypeFieldNode{
211+
{
212+
Type: parse.TypeNode{
213+
Identifier: unmanaged.Subview(17, 20),
214+
Decorators: []parse.TypeDecoratorNode{
215+
{
216+
UnmanagedSourceView: unmanaged.Subview(21, 31),
217+
Type: parse.RepeatTypeDecorator,
218+
},
219+
{
220+
UnmanagedSourceView: unmanaged.Subview(32, 42),
221+
Type: parse.RepeatTypeDecorator,
222+
},
223+
},
224+
},
225+
},
215226
},
216227
},
217228
}
218229

219-
genCtx := gen.FileGenerationContext[Instruction]{
230+
ctx := &gen.FileGenerationContext[Instruction]{
220231
GenerationContext: &testGenerationContext,
221232
SourceContext: v.Ctx(),
222233
Types: &typeManager,
223234
}
224235

225-
generator := gen.NewReferencedTypeGenerator[Instruction]()
226-
_, results := generator.Generate(&genCtx, node)
236+
generator := gen.NewNamedTypeGenerator[Instruction]()
237+
_, results := generator.Generate(ctx, node)
227238
assert.False(t, results.IsEmpty())
228239
}

0 commit comments

Comments
 (0)