170 lines
4.7 KiB
Go
170 lines
4.7 KiB
Go
package generator
|
|
|
|
import "testing"
|
|
|
|
func TestUnitTwo (test *testing.T) {
|
|
testUnits (test,
|
|
`%"E80Pxr3rNdulEDOmHs9Hsg==::X" = type i64
|
|
define %"E80Pxr3rNdulEDOmHs9Hsg==::X" @"0zNZN147MN2wzMAQ6NS2dQ==::main"() {
|
|
0:
|
|
ret i64 5
|
|
}
|
|
`,
|
|
`[main]:something::X = 5`,
|
|
|
|
"something.fspl",
|
|
`+ X:Int`,
|
|
)}
|
|
|
|
func TestUnitAssignRestricted (test *testing.T) {
|
|
testUnits (test,
|
|
`%"s0sfKEEPN2W0H9cNKD+OOg==::RestrictedInt" = type i64
|
|
define void @"0zNZN147MN2wzMAQ6NS2dQ==::main"() {
|
|
0:
|
|
%1 = alloca %"s0sfKEEPN2W0H9cNKD+OOg==::RestrictedInt"
|
|
%2 = alloca %"s0sfKEEPN2W0H9cNKD+OOg==::RestrictedInt"
|
|
%3 = load %"s0sfKEEPN2W0H9cNKD+OOg==::RestrictedInt", ptr %2
|
|
store %"s0sfKEEPN2W0H9cNKD+OOg==::RestrictedInt" %3, ptr %1
|
|
ret void
|
|
}
|
|
`,
|
|
`[main] = {
|
|
x:other::RestrictedInt
|
|
y:other::RestrictedInt
|
|
x = y
|
|
}`,
|
|
|
|
"other.fspl",
|
|
`# RestrictedInt:Int`,
|
|
)}
|
|
|
|
func TestNestedUnitTypedef (test *testing.T) {
|
|
testUnits (test,
|
|
`%"kOsrvvRIOh2nYGTmlfGyKQ==::X" = type i64
|
|
%"qnTuCId6O/ihTdVz5Ln6WQ==::X" = type %"kOsrvvRIOh2nYGTmlfGyKQ==::X"
|
|
define %"qnTuCId6O/ihTdVz5Ln6WQ==::X" @"0zNZN147MN2wzMAQ6NS2dQ==::main"() {
|
|
0:
|
|
ret i64 5
|
|
}
|
|
`,
|
|
`[main]:layer1::X = 5`,
|
|
|
|
"layer0.fspl",
|
|
`+ X:Int`,
|
|
|
|
"layer1.fspl",
|
|
`+ X:layer0::X`,
|
|
)}
|
|
|
|
func TestUnitInterfaceSatisfaction (test *testing.T) {
|
|
testUnits (test,
|
|
`%"AAAAAAAAAAAAAAAAAAAAAA==::Index" = type i64
|
|
%"qsUY87+PPGG/YPYMcnGU/g==::FileDescriptor" = type i64
|
|
%"1cqXRNyHN06gi9QQb4GCsg==::File" = type %"qsUY87+PPGG/YPYMcnGU/g==::FileDescriptor"
|
|
%"1cqXRNyHN06gi9QQb4GCsg==::Writer" = type { ptr, ptr }
|
|
%"AAAAAAAAAAAAAAAAAAAAAA==::Byte" = type i8
|
|
declare %"AAAAAAAAAAAAAAAAAAAAAA==::Index" @write(%"qsUY87+PPGG/YPYMcnGU/g==::FileDescriptor" %file, ptr %buffer, %"AAAAAAAAAAAAAAAAAAAAAA==::Index" %count)
|
|
define i32 @main() {
|
|
0:
|
|
%1 = alloca %"1cqXRNyHN06gi9QQb4GCsg==::File"
|
|
store i64 1, ptr %1
|
|
%2 = alloca %"1cqXRNyHN06gi9QQb4GCsg==::Writer"
|
|
%3 = getelementptr %"1cqXRNyHN06gi9QQb4GCsg==::Writer", ptr %2, i32 0, i32 0
|
|
store ptr %1, ptr %3
|
|
%4 = getelementptr %"1cqXRNyHN06gi9QQb4GCsg==::Writer", ptr %2, i32 0, i32 1
|
|
store ptr @"1cqXRNyHN06gi9QQb4GCsg==::File.write", ptr %4
|
|
%5 = load %"1cqXRNyHN06gi9QQb4GCsg==::Writer", ptr %2
|
|
call void @"0zNZN147MN2wzMAQ6NS2dQ==::sayHello"(%"1cqXRNyHN06gi9QQb4GCsg==::Writer" %5)
|
|
ret i32 0
|
|
}
|
|
define void @"0zNZN147MN2wzMAQ6NS2dQ==::sayHello"(%"1cqXRNyHN06gi9QQb4GCsg==::Writer" %writer) {
|
|
0:
|
|
%1 = alloca %"1cqXRNyHN06gi9QQb4GCsg==::Writer"
|
|
store %"1cqXRNyHN06gi9QQb4GCsg==::Writer" %writer, ptr %1
|
|
%2 = alloca { ptr, %"AAAAAAAAAAAAAAAAAAAAAA==::Index" }
|
|
%3 = alloca [3 x %"AAAAAAAAAAAAAAAAAAAAAA==::Byte"]
|
|
%4 = getelementptr [3 x %"AAAAAAAAAAAAAAAAAAAAAA==::Byte"], ptr %3, i32 0, i32 0
|
|
store i8 104, ptr %4
|
|
%5 = getelementptr [3 x %"AAAAAAAAAAAAAAAAAAAAAA==::Byte"], ptr %3, i32 0, i32 1
|
|
store i8 105, ptr %5
|
|
%6 = getelementptr [3 x %"AAAAAAAAAAAAAAAAAAAAAA==::Byte"], ptr %3, i32 0, i32 2
|
|
store i8 10, ptr %6
|
|
%7 = getelementptr { ptr, %"AAAAAAAAAAAAAAAAAAAAAA==::Index" }, ptr %2, i32 0, i32 0
|
|
store ptr %3, ptr %7
|
|
%8 = getelementptr { ptr, %"AAAAAAAAAAAAAAAAAAAAAA==::Index" }, ptr %2, i32 0, i32 1
|
|
store %"AAAAAAAAAAAAAAAAAAAAAA==::Index" 3, ptr %8
|
|
%9 = load { ptr, %"AAAAAAAAAAAAAAAAAAAAAA==::Index" }, ptr %2
|
|
%10 = getelementptr %"1cqXRNyHN06gi9QQb4GCsg==::Writer", ptr %1, i32 0, i32 1
|
|
%11 = getelementptr %"1cqXRNyHN06gi9QQb4GCsg==::Writer", ptr %1, i32 0, i32 0
|
|
%12 = load ptr, ptr %11
|
|
%13 = load ptr, ptr %10
|
|
%14 = call %"AAAAAAAAAAAAAAAAAAAAAA==::Index" %13(ptr %12, { ptr, %"AAAAAAAAAAAAAAAAAAAAAA==::Index" } %9)
|
|
ret void
|
|
}
|
|
declare %"AAAAAAAAAAAAAAAAAAAAAA==::Index" @"1cqXRNyHN06gi9QQb4GCsg==::File.write"(ptr %this, { ptr, %"AAAAAAAAAAAAAAAAAAAAAA==::Index" } %buffer)
|
|
`,
|
|
`[sayHello writer:io::Writer] = writer.[write 'hi\n']
|
|
|
|
[main]: I32 'main' = {
|
|
stdout:io::File = 1
|
|
[sayHello stdout]
|
|
0
|
|
}`,
|
|
|
|
"cstdio.fspl",
|
|
`+ FileDescriptor: Int
|
|
+ [write file:FileDescriptor buffer:*Byte count:Index]: Index 'write'`,
|
|
|
|
"io.fspl",
|
|
`+ Writer: (& [write buffer:*:Byte]: Index)
|
|
+ File: cstdio::FileDescriptor
|
|
+ File.[write buffer:*:Byte]:Index =
|
|
cstdio::[write
|
|
[~cstdio::FileDescriptor [.this]]
|
|
[~*Byte buffer] [#buffer]]`,
|
|
)}
|
|
|
|
func TestUnitMethod (test *testing.T) {
|
|
testUnits (test,
|
|
`%"9U3Q1r5tPJSXoVNdBSzCow==::T" = type i64
|
|
define void @main() {
|
|
0:
|
|
%1 = alloca %"9U3Q1r5tPJSXoVNdBSzCow==::T"
|
|
call void @"9U3Q1r5tPJSXoVNdBSzCow==::T.method"(ptr %1)
|
|
ret void
|
|
}
|
|
declare void @"9U3Q1r5tPJSXoVNdBSzCow==::T.method"(ptr %this)
|
|
`,
|
|
|
|
`[main] 'main' = {
|
|
x:def::T
|
|
x.[method]
|
|
}`,
|
|
|
|
"def.fspl",
|
|
`+ T:Int
|
|
+ T.[method] = { }`,
|
|
)}
|
|
|
|
func TestUnitMethodPtr (test *testing.T) {
|
|
testUnits (test,
|
|
`define void @main() {
|
|
0:
|
|
%1 = alloca ptr
|
|
%2 = load ptr, ptr %1
|
|
call void @"9U3Q1r5tPJSXoVNdBSzCow==::T.method"(ptr %2)
|
|
ret void
|
|
}
|
|
declare void @"9U3Q1r5tPJSXoVNdBSzCow==::T.method"(ptr %this)
|
|
`,
|
|
|
|
`[main] 'main' = {
|
|
x:*def::T
|
|
x.[method]
|
|
}`,
|
|
|
|
"def.fspl",
|
|
`+ T:Int
|
|
+ T.[method] = { }`,
|
|
)}
|