77 lines
2.0 KiB
Go
77 lines
2.0 KiB
Go
package generator
|
|
|
|
import "git.tebibyte.media/sashakoshka/fspl/llvm"
|
|
import "git.tebibyte.media/sashakoshka/fspl/entity"
|
|
|
|
func (this *generator) generateSlice (ty entity.Type, data llvm.Value, length int64) (llvm.Value, error) {
|
|
irType, err := this.generateType(ty)
|
|
if err != nil { return nil, err }
|
|
|
|
slice := this.blockManager.newAllocaFront(irType)
|
|
dataField := this.blockManager.NewGetElementPtr (
|
|
irType, slice,
|
|
llvm.NewConstInt(llvm.I32, 0),
|
|
llvm.NewConstInt(llvm.I32, 0))
|
|
this.blockManager.NewStore(data, dataField)
|
|
lengthField := this.blockManager.NewGetElementPtr (
|
|
irType, slice,
|
|
llvm.NewConstInt(llvm.I32, 0),
|
|
llvm.NewConstInt(llvm.I32, 1))
|
|
sizeType, err := this.typedef("Index")
|
|
if err != nil { return nil, err }
|
|
this.blockManager.NewStore (
|
|
llvm.NewConstInt(sizeType.(*llvm.TypeInt), length),
|
|
lengthField)
|
|
return slice, nil
|
|
}
|
|
|
|
func (this *generator) getInterfaceData (iface llvm.Value, irType llvm.Type) llvm.Value {
|
|
return this.blockManager.NewGetElementPtr (
|
|
irType, iface,
|
|
llvm.NewConstInt(llvm.I32, 0),
|
|
llvm.NewConstInt(llvm.I32, 0))
|
|
}
|
|
|
|
func (this *generator) getInterfaceBehavior (
|
|
ty *entity.TypeInterface,
|
|
iface llvm.Value,
|
|
irType llvm.Type,
|
|
name string,
|
|
) llvm.Value {
|
|
offset := this.getInterfaceBehaviorIndex(ty, name)
|
|
if offset > -1 {
|
|
return this.blockManager.NewGetElementPtr (
|
|
irType, iface,
|
|
llvm.NewConstInt(llvm.I32, 0),
|
|
llvm.NewConstInt(llvm.I32, int64(offset + 1)))
|
|
} else {
|
|
return nil
|
|
}
|
|
}
|
|
|
|
func (this *generator) getInterfaceBehaviorSignature (ty *entity.TypeInterface, name string) (llvm.Type, error) {
|
|
return this.generateTypeFunction(ty.BehaviorMap[name])
|
|
}
|
|
|
|
func (this *generator) getInterfaceBehaviorIndex (ty *entity.TypeInterface, name string) int {
|
|
offset := -1
|
|
for index, nm := range ty.BehaviorOrder {
|
|
if nm == name {
|
|
offset = index
|
|
break
|
|
}
|
|
}
|
|
return offset
|
|
}
|
|
|
|
func (this *generator) getStructMemberIndex (ty *entity.TypeStruct, name string) int {
|
|
offset := -1
|
|
for index, nm := range ty.MemberOrder {
|
|
if nm == name {
|
|
offset = index
|
|
break
|
|
}
|
|
}
|
|
return offset
|
|
}
|