blob: 785d083778d92870a8f7083dcabc3f43fdfe6a01 [file] [log] [blame]
// Copyright 2021 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package fidlgen_cpp
import (
"fmt"
"go.fuchsia.dev/fuchsia/tools/fidl/lib/fidlgen"
)
type TableFrameItem *TableMember
type Table struct {
Attributes
fidlgen.Resourceness
nameVariants
CodingTableType string
Members []TableMember
InlineSize int
BiggestOrdinal int
MaxHandles int
MaxOutOfLine int
ByteBufferType string
HasPointer bool
// FrameItems stores the members in ordinal order; "null" for reserved.
FrameItems []TableFrameItem
}
func (Table) Kind() declKind {
return Kinds.Table
}
var _ Kinded = (*Table)(nil)
var _ namespaced = (*Table)(nil)
type TableMember struct {
Attributes
Type Type
Name string
DefaultValue ConstantValue
Ordinal int
FieldPresenceIsSet string
FieldPresenceSet string
FieldPresenceClear string
FieldDataName string
MethodHasName string
MethodClearName string
ValueUnionName string
HandleInformation *HandleInformation
}
func (tm TableMember) NameAndType() (string, Type) {
return tm.Name, tm.Type
}
func (c *compiler) compileTableMember(val fidlgen.TableMember, index int) TableMember {
t := c.compileType(val.Type)
defaultValue := ConstantValue{}
if val.MaybeDefaultValue != nil {
defaultValue = c.compileConstant(*val.MaybeDefaultValue, &t, val.Type)
}
return TableMember{
Attributes: Attributes{val.Attributes},
Type: t,
Name: changeIfReserved(val.Name),
DefaultValue: defaultValue,
Ordinal: val.Ordinal,
FieldPresenceIsSet: fmt.Sprintf("field_presence_.IsSet<%d>()", val.Ordinal-1),
FieldPresenceSet: fmt.Sprintf("field_presence_.Set<%d>()", val.Ordinal-1),
FieldPresenceClear: fmt.Sprintf("field_presence_.Clear<%d>()", val.Ordinal-1),
FieldDataName: fmt.Sprintf("%s_value_", val.Name),
MethodHasName: fmt.Sprintf("has_%s", val.Name),
MethodClearName: fmt.Sprintf("clear_%s", val.Name),
ValueUnionName: fmt.Sprintf("ValueUnion_%s", val.Name),
HandleInformation: c.fieldHandleInformation(&val.Type),
}
}
func (c *compiler) compileTable(val fidlgen.Table) Table {
name := c.compileNameVariants(val.Name)
codingTableType := c.compileCodingTableType(val.Name)
r := Table{
Attributes: Attributes{val.Attributes},
Resourceness: val.Resourceness,
nameVariants: name,
CodingTableType: codingTableType,
Members: nil,
InlineSize: val.TypeShapeV1.InlineSize,
BiggestOrdinal: 0,
MaxHandles: val.TypeShapeV1.MaxHandles,
MaxOutOfLine: val.TypeShapeV1.MaxOutOfLine,
ByteBufferType: computeAllocation(
val.TypeShapeV1.InlineSize, val.TypeShapeV1.MaxOutOfLine, boundednessBounded).
ByteBufferType(),
HasPointer: val.TypeShapeV1.Depth > 0,
}
for i, v := range val.SortedMembersNoReserved() {
m := c.compileTableMember(v, i)
if m.Ordinal > r.BiggestOrdinal {
r.BiggestOrdinal = m.Ordinal
}
r.Members = append(r.Members, m)
}
r.FrameItems = make([]TableFrameItem, r.BiggestOrdinal)
for index, member := range r.Members {
r.FrameItems[member.Ordinal-1] = &r.Members[index]
}
return r
}