Slice operations now load the data pointer

This commit is contained in:
Sasha Koshka 2023-12-05 15:35:17 -05:00
parent 8085da442b
commit ead5ed3222
2 changed files with 33 additions and 11 deletions

View File

@ -10,18 +10,18 @@ testString (test,
[puts string: *Byte]: Index
[write file:I32 buffer:*Byte count:Index]: Index
[firstByte str:String]: *Byte = [@[.str 0]]
[print string: String] = loop {
if [< [#string] 1] then {break}
byte: Byte = [. string 0]
[write 1 [@byte] 1]
string = [\string 1:]
[printDigit digit:Byte] = {
digit = [+ digit '0']
[write 1 [@digit] 1]
}
[main] = {
str:String = 'xx'
[print str]
[puts 'printing']
[printDigit 0]
[printDigit 1]
[printDigit 2]
[printDigit 3]
[puts '\nprinted']
}
`)
}
@ -89,3 +89,19 @@ testString (test,
// [puts first]
// }
// [puts string: *Byte]: Index
// [write file:I32 buffer:*Byte count:Index]: Index
//
// [firstByte str:String]: *Byte = [@[.str 0]]
//
// [print string: String] = loop {
// if [< [#string] 1] then {break}
// byte: Byte = [. string 0]
// [write 1 [@byte] 1]
// string = [\string 1:]
// }
//
// [main] = {
// str:String = 'xx'
// [print str]
// }

View File

@ -37,11 +37,14 @@ func (this *generator) generateSliceLoc (slice *entity.Slice) (llvm.Value, error
if err != nil { return nil, err }
elementType, err = this.generateType(sourceType.Element)
if err != nil { return nil, err }
dataAddress = this.blockManager.NewGetElementPtr (
dataAddressFieldAddress := this.blockManager.NewGetElementPtr (
irSourceType,
source,
llvm.NewConstInt(llvm.I32, 0),
llvm.NewConstInt(llvm.I32, 0))
dataAddress = this.blockManager.NewLoad (
new(llvm.TypePointer),
dataAddressFieldAddress)
lengthAddress := this.blockManager.NewGetElementPtr (
irSourceType,
source,
@ -116,11 +119,14 @@ func (this *generator) generateSubscriptLoc (subscript *entity.Subscript) (llvm.
// get slice element
elementType = sourceType.Element
dataAddress = this.blockManager.NewGetElementPtr (
dataAddressFieldAddress := this.blockManager.NewGetElementPtr (
irSourceType,
source,
llvm.NewConstInt(llvm.I32, 0),
llvm.NewConstInt(llvm.I32, 0))
dataAddress = this.blockManager.NewLoad (
new(llvm.TypePointer),
dataAddressFieldAddress)
case *entity.TypeArray:
elementType = sourceType.Element