188 lines
3.0 KiB
Go
188 lines
3.0 KiB
Go
package generator
|
|
|
|
import "testing"
|
|
|
|
func TestFunctionExternal (test *testing.T) {
|
|
testString (test,
|
|
`declare void @exit(i64 %status)
|
|
define void @main() {
|
|
0:
|
|
call void @exit(i64 1)
|
|
ret void
|
|
}
|
|
`,
|
|
`
|
|
[exit status:Int]
|
|
[main] = [exit 1]
|
|
`)
|
|
}
|
|
|
|
func TestFunctionCall (test *testing.T) {
|
|
testString (test,
|
|
`define i64 @f() {
|
|
0:
|
|
%1 = call i64 @g(i64 5)
|
|
ret i64 %1
|
|
}
|
|
define i64 @g(i64 %x) {
|
|
0:
|
|
%1 = alloca i64
|
|
store i64 %x, ptr %1
|
|
%2 = load i64, ptr %1
|
|
%3 = call i64 @h(i64 %2)
|
|
ret i64 %3
|
|
}
|
|
define i64 @h(i64 %x) {
|
|
0:
|
|
%1 = alloca i64
|
|
store i64 %x, ptr %1
|
|
%2 = load i64, ptr %1
|
|
ret i64 %2
|
|
}
|
|
`,
|
|
`
|
|
[f ]:Int = [g 5]
|
|
[g x:Int]:Int = [h x]
|
|
[h x:Int]:Int = x
|
|
`)
|
|
}
|
|
|
|
func TestFunctionCallVoid (test *testing.T) {
|
|
testString (test,
|
|
`define void @f() {
|
|
0:
|
|
%1 = call i64 @g(i64 5)
|
|
call void @h()
|
|
%2 = call i64 @g(i64 6)
|
|
ret void
|
|
}
|
|
define i64 @g(i64 %x) {
|
|
0:
|
|
%1 = alloca i64
|
|
store i64 %x, ptr %1
|
|
%2 = load i64, ptr %1
|
|
ret i64 %2
|
|
}
|
|
define void @h() {
|
|
0:
|
|
ret void
|
|
}
|
|
`,
|
|
`
|
|
[f] = { [g 5] [h] [g 6] }
|
|
[g x:Int]:Int = x
|
|
[h] = { }
|
|
`)
|
|
}
|
|
|
|
func TestMethod (test *testing.T) {
|
|
testString (test,
|
|
`%Number = type i64
|
|
define i64 @main() {
|
|
0:
|
|
%1 = alloca %Number
|
|
store i64 5, ptr %1
|
|
%2 = call i64 @Number.number(ptr %1)
|
|
ret i64 %2
|
|
}
|
|
define i64 @Number.number(ptr %this) {
|
|
0:
|
|
%1 = alloca ptr
|
|
store ptr %this, ptr %1
|
|
%2 = load ptr, ptr %1
|
|
%3 = load i64, ptr %2
|
|
ret i64 %3
|
|
}
|
|
`,
|
|
`
|
|
Number: Int
|
|
Number.[number]: Int = [.this]
|
|
|
|
[main]: Int = {
|
|
num:Number = 5
|
|
num.[number]
|
|
}
|
|
`)
|
|
}
|
|
|
|
// [write 1 (* 72 101 108 108 111 114 108 100 0) 7]
|
|
|
|
// [puts string:*Byte]:I32
|
|
// [main argc:I32 argv:**Byte] = {
|
|
// loop {
|
|
// [puts (* 100 100 0)]
|
|
// }
|
|
// }
|
|
|
|
|
|
// [puts string:*Byte]:I32
|
|
// [read fd:Int buf:*Byte count:Index]:Index
|
|
//
|
|
// [itoa value:Int buffer:String base:Int]:String = {
|
|
// if [== base 0] then { base = 10 }
|
|
// index:Index = 0
|
|
//
|
|
// loop {
|
|
// digit:Int = [% value base]
|
|
// [.buffer index] = [~Byte [+ digit '0']]
|
|
// value = [/ value base]
|
|
// index = [++index]
|
|
// }
|
|
//
|
|
// buffer
|
|
// }
|
|
//
|
|
// [main argc:I32 argv:**Byte] = {
|
|
// [itoa 5 string:16:Byte 10]
|
|
// [.string 15] = 0
|
|
// [puts [.[@string]]]
|
|
// }
|
|
|
|
// [puts string: *Byte]: Index
|
|
//
|
|
// Greeter: (message: String)
|
|
// Greeter.[greet] = [puts [@[.this.message 0]]]
|
|
//
|
|
// [main] = {
|
|
// greeter: Greeter = (
|
|
// message: 'hello\0'
|
|
// )
|
|
// greeter.[doNothing]
|
|
// }
|
|
//
|
|
// Greeter.[doNothing] = { }
|
|
//
|
|
// Greeter.[getMessage]: String = {
|
|
// [puts 'getting']
|
|
// this.message
|
|
// [puts 'got']
|
|
// this.message
|
|
// }
|
|
|
|
// [puts string: *Byte]: Index
|
|
// [firstByte str:String]: *Byte = [@[.str 0]]
|
|
// [main] = {
|
|
// str:String = 'xx'
|
|
// [.str 2] = 0
|
|
// if [= [.str 2] 0] then [puts 'zero'] else [puts 'nonzero']
|
|
// first:*Byte = [firstByte str]
|
|
// [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]
|
|
// }
|