From b91ac1b610fd43dd5afd794a046d606bc0d4c63f Mon Sep 17 00:00:00 2001 From: Dmitry Boulytchev Date: Fri, 15 Nov 2024 23:22:30 +0300 Subject: [PATCH 01/64] opam changed --- Lama.opam | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Lama.opam b/Lama.opam index f0852421d..2de3a899a 100644 --- a/Lama.opam +++ b/Lama.opam @@ -8,7 +8,7 @@ license: "GPL-3.0-only" homepage: "https://github.com/PLTools/Lama" bug-reports: "https://github.com/PLTools/Lama/issues" depends: [ - "dune" {>= "3.3"} + "dune" {>= "3.11"} "posix-uname" "GT" "ostap" {>= "0.6"} From b8e5cfeb7ba9cb0408b5e27a79a18018ad6509d6 Mon Sep 17 00:00:00 2001 From: Roman Venediktov Date: Fri, 20 Dec 2024 13:59:50 +0100 Subject: [PATCH 02/64] Fixed \r escaping --- src/X86_64.ml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/X86_64.ml b/src/X86_64.ml index 9c5845c2e..d4574d465 100644 --- a/src/X86_64.ml +++ b/src/X86_64.ml @@ -1304,6 +1304,10 @@ class env prg mode = Buffer.add_char buf '\\'; Buffer.add_char buf 't'; iterate (i + 2) + | 'r' -> + Buffer.add_char buf '\\'; + Buffer.add_char buf 'r'; + iterate (i + 2) | _ -> Buffer.add_char buf '\\'; Buffer.add_char buf '\\'; From cec4ef252a9a705460afc8d2541af54c0637d577 Mon Sep 17 00:00:00 2001 From: Roman Venediktov Date: Fri, 20 Dec 2024 15:56:11 +0100 Subject: [PATCH 03/64] Fixed improper STA usage --- src/SM.ml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/SM.ml b/src/SM.ml index d43ea9b67..1784ffa91 100644 --- a/src/SM.ml +++ b/src/SM.ml @@ -1501,8 +1501,7 @@ let compile cmd ((imports, _), p) = add_code (compile_list false lassn env [ x; e ]) lassn false - [ (match x with Expr.Ref _ -> STI | _ -> STA) ] - (*Expr.ElemRef _ -> STA | _ -> STI]*) + [ (match x with Expr.ElemRef _ -> STA | _ -> STI) ] | Expr.Skip -> (env, false, []) | Expr.Seq (s1, s2) -> compile_list tail l env [ s1; s2 ] | Expr.If (c, s1, s2) -> From 6e5315646a505a536b05c99c213686a51dd534eb Mon Sep 17 00:00:00 2001 From: Roman Venediktov Date: Fri, 20 Dec 2024 15:57:11 +0100 Subject: [PATCH 04/64] Added fail in case of indirect assignment into register --- src/X86_64.ml | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/src/X86_64.ml b/src/X86_64.ml index d4574d465..d0c80e02e 100644 --- a/src/X86_64.ml +++ b/src/X86_64.ml @@ -697,10 +697,20 @@ let compile cmd env imports code = let l, env = env#allocate in let env, call = compile_call env ~fname:".string" 1 false in (env, mov addr l @ call) - | LDA x -> + | LDA x -> ( let s, env' = (env#variable x)#allocate in let s', env'' = env'#allocate in - (env'', [ Lea (env'#loc x, rax); Mov (rax, s); Mov (rax, s') ]) + let loc_x = env'#loc x in + match loc_x with + | R _ -> + failwith + "We are not able to take an address of a register. This \ + is the known limitation of 64-bit compiler. If you \ + encountered this issue, just do not use indirect \ + assignment :(" + | _ -> + (); + (env'', [ Lea (loc_x, rax); Mov (rax, s); Mov (rax, s') ])) | LD x -> ( let s, env' = (env#variable x)#allocate in ( env', From a4e297648ca16a0c0fbfe88056a941403af14c11 Mon Sep 17 00:00:00 2001 From: Roman Venediktov Date: Fri, 20 Dec 2024 15:57:44 +0100 Subject: [PATCH 05/64] Fixed placement of arguments for ".match_failure" call --- src/X86_64.ml | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/src/X86_64.ml b/src/X86_64.ml index d0c80e02e..627739a4b 100644 --- a/src/X86_64.ml +++ b/src/X86_64.ml @@ -982,23 +982,21 @@ let compile cmd env imports code = 1 false | LINE line -> env#gen_line line | FAIL ((line, col), value) -> - let v, env = if value then (env#peek, env) else env#pop in + let value, env = if value then (env#peek, env) else env#pop in let msg_addr, env = env#string cmd#get_infile in - let vr, env = env#allocate in - let sr, env = env#allocate in - let liner, env = env#allocate in - let colr, env = env#allocate in + let value_arg_addr, env = env#allocate in + let msg_arg_addr, env = env#allocate in + let line_arg_addr, env = env#allocate in + let col_arg_addr, env = env#allocate in let env, code = compile_call env ~fname:".match_failure" 4 false in let _, env = env#pop in ( env, - [ - Mov (L col, colr); - Mov (L line, liner); - Mov (msg_addr, sr); - Mov (v, vr); - ] + mov (L col) col_arg_addr + @ mov (L line) line_arg_addr + @ mov msg_addr msg_arg_addr + @ mov value value_arg_addr @ code ) | i -> invalid_arg From 4fdbb1884391168a2688816ef6ffa6f63ae0caf0 Mon Sep 17 00:00:00 2001 From: Roman Venediktov Date: Fri, 20 Dec 2024 15:58:09 +0100 Subject: [PATCH 06/64] Added failing if assembly compiler failed --- src/X86_64.ml | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/X86_64.ml b/src/X86_64.ml index 627739a4b..7a6a82af6 100644 --- a/src/X86_64.ml +++ b/src/X86_64.ml @@ -1505,11 +1505,17 @@ let build cmd prog = (Buffer.contents buf) cmd#get_runtime_path (match cmd#march with `X86_32 -> "runtime32" | `AMD64 -> "runtime") in - Sys.command gcc_cmdline + let result = Sys.command gcc_cmdline in + if result <> 0 then + failwith + (Printf.sprintf "Assembly compiler failed with exit code %d" result) | `Compile -> let cmd = Printf.sprintf "%s %s %s -c -g %s.s" compiler compiler_flags debug_flags cmd#basename in - Sys.command cmd + let result = Sys.command cmd in + if result <> 0 then + failwith + (Printf.sprintf "Assembly compiler failed with exit code %d" result) | _ -> invalid_arg "must not happen" From cfe325b121d1582e28f55cea757f6dca7d21030b Mon Sep 17 00:00:00 2001 From: Roman Venediktov Date: Fri, 20 Dec 2024 17:37:13 +0100 Subject: [PATCH 07/64] Fixed movement of large constants --- src/X86_64.ml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/X86_64.ml b/src/X86_64.ml index 7a6a82af6..cd3d48195 100644 --- a/src/X86_64.ml +++ b/src/X86_64.ml @@ -260,10 +260,10 @@ let show env instr = let in_memory = function M _ | S _ | I _ -> true | C _ | R _ | L _ -> false let mov x s = - (* Numeric literals with more than 32 bits cannot ne directly moved to memory location *) - let big_numeric_literal = function L num -> num > 0xFFFFFFFF | _ -> false in + (* Numeric literals with more than 32 bits cannot be directly moved to memory location *) + let big_numeric_literal = function L num -> (num > 0xFFFFFFFF || num < -0xFFFFFFFF) | _ -> false in if x = s then [] - else if (in_memory x && in_memory s) || big_numeric_literal x then + else if (in_memory x && in_memory s) || (big_numeric_literal x && (in_memory x || in_memory s)) then [ Mov (x, rax); Mov (rax, s) ] else [ Mov (x, s) ] @@ -691,7 +691,7 @@ let compile cmd env imports code = (env, push_closure_code @ mov address l @ call_code) | CONST n -> let s, env' = env#allocate in - (env', [ Mov (L (box n), s) ]) + (env', mov (L (box n)) s) | STRING s -> let addr, env = env#string s in let l, env = env#allocate in From 2dad84df221f834e2fba58a5a81e0f66412ddbfc Mon Sep 17 00:00:00 2001 From: Roman Venediktov Date: Fri, 20 Dec 2024 19:12:34 +0100 Subject: [PATCH 08/64] Prohibit indirect assignments --- src/SM.ml | 16 ++++++++-------- src/X86_64.ml | 10 ++++++---- 2 files changed, 14 insertions(+), 12 deletions(-) diff --git a/src/SM.ml b/src/SM.ml index 1784ffa91..223e4f39c 100644 --- a/src/SM.ml +++ b/src/SM.ml @@ -1427,7 +1427,7 @@ let compile cmd ((imports, _), p) = | Expr.Ignore s -> let ls, env = env#get_label in add_code (compile_expr tail ls env s) ls false [ DROP ] - | Expr.ElemRef (x, i) -> compile_list tail l env [ x; i ] + | Expr.ElemRef _ -> failwith "Should not happen. Indirect assignemts are temporarily prohibited." | Expr.Var x -> ( let env, line = env#gen_line x in let env, acc = env#lookup x in @@ -1438,10 +1438,7 @@ let compile cmd ((imports, _), p) = false, line @ [ PROTO (name, env#current_function) ] ) | _ -> (env, false, line @ [ LD acc ])) - | Expr.Ref x -> - let env, line = env#gen_line x in - let env, acc = env#lookup x in - (env, false, line @ [ LDA acc ]) + | Expr.Ref _ -> failwith "Should not happen. Indirect assignemts are temporarily prohibited." | Expr.Const n -> (env, false, [ CONST n ]) | Expr.String s -> (env, false, [ STRING s ]) | Expr.Binop (op, x, y) -> @@ -1496,12 +1493,15 @@ let compile cmd ((imports, _), p) = let env, line = env#gen_line x in let env, acc = env#lookup x in add_code (compile_expr false lassn env e) lassn false (line @ [ ST acc ]) - | Expr.Assign (x, e) -> + | Expr.Assign (Expr.ElemRef (x, i), e) -> let lassn, env = env#get_label in add_code - (compile_list false lassn env [ x; e ]) + (compile_list false lassn env [ x; i; e ]) lassn false - [ (match x with Expr.ElemRef _ -> STA | _ -> STI) ] + [ STA ] + | Expr.Assign (x, _) -> + failwith + (Printf.sprintf "Indirect assignment is not supported yet: %s" (show Expr.t x)) | Expr.Skip -> (env, false, []) | Expr.Seq (s1, s2) -> compile_list tail l env [ s1; s2 ] | Expr.If (c, s1, s2) -> diff --git a/src/X86_64.ml b/src/X86_64.ml index cd3d48195..85461e33e 100644 --- a/src/X86_64.ml +++ b/src/X86_64.ml @@ -697,7 +697,8 @@ let compile cmd env imports code = let l, env = env#allocate in let env, call = compile_call env ~fname:".string" 1 false in (env, mov addr l @ call) - | LDA x -> ( + | LDA _ -> failwith "Should not happen. Indirect assignemts are temporarily prohibited." + (* let s, env' = (env#variable x)#allocate in let s', env'' = env'#allocate in let loc_x = env'#loc x in @@ -710,7 +711,7 @@ let compile cmd env imports code = assignment :(" | _ -> (); - (env'', [ Lea (loc_x, rax); Mov (rax, s); Mov (rax, s') ])) + (env'', [ Lea (loc_x, rax); Mov (rax, s); Mov (rax, s') ])*) | LD x -> ( let s, env' = (env#variable x)#allocate in ( env', @@ -725,7 +726,8 @@ let compile cmd env imports code = | S _ | M _ -> [ Mov (s, rax); Mov (rax, env'#loc x) ] | _ -> [ Mov (s, env'#loc x) ] )) | STA -> compile_call env ~fname:".sta" 3 false - | STI -> ( + | STI -> failwith "Should not happen. Indirect assignemts are temporarily prohibited." + (* let v, env = env#pop in let x = env#peek in ( env, @@ -737,7 +739,7 @@ let compile cmd env imports code = Mov (rdx, I (0, rax)); Mov (rdx, x); ] - | _ -> [ Mov (v, rax); Mov (rax, I (0, x)); Mov (rax, x) ] )) + | _ -> [ Mov (v, rax); Mov (rax, I (0, x)); Mov (rax, x) ] )*) | BINOP op -> compile_binop env op | LABEL s | FLABEL s | SLABEL s -> (env, [ Label s ]) | JMP l -> ((env#set_stack l)#set_barrier, [ Jmp l ]) From bdd64b081be9f22571fd9c253fc6c0e10c28ae9f Mon Sep 17 00:00:00 2001 From: Roman Venediktov Date: Sun, 5 Jan 2025 10:51:40 +0100 Subject: [PATCH 09/64] Removed ld warning --- runtime/Makefile | 2 +- src/X86_64.ml | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/runtime/Makefile b/runtime/Makefile index 1d5fe82a1..f71efd909 100644 --- a/runtime/Makefile +++ b/runtime/Makefile @@ -24,7 +24,7 @@ runtime.o: runtime.c runtime.h $(CC) $(PROD_FLAGS) -c runtime.c -o runtime.o printf.o: printf.S - $(CC) $(PROD_FLAGS) -x assembler-with-cpp -c -g printf.S -o printf.o + $(CC) $(PROD_FLAGS) -Wa,--noexecstack -x assembler-with-cpp -c -g printf.S -o printf.o clean: $(RM) *.a *.o *~ negative_scenarios/*.err diff --git a/src/X86_64.ml b/src/X86_64.ml index 85461e33e..5b7482bbe 100644 --- a/src/X86_64.ml +++ b/src/X86_64.ml @@ -1488,8 +1488,8 @@ let build cmd prog = in let compiler_flags, linker_flags = match cmd#target_os with - | Darwin -> ("-arch x86_64", "-ld_classic") - | Linux -> ("", "") + | Darwin -> ("-arch x86_64 -Wa,--noexecstack", "-ld_classic") + | Linux -> ("-Wa,--noexecstack", "") in let debug_flags = if cmd#is_debug then "-g" else "" in match cmd#get_mode with From ae4d66df487c187bde2dacc0cab03b43a09b1005 Mon Sep 17 00:00:00 2001 From: Kakadu Date: Sun, 5 Jan 2025 21:19:26 +0300 Subject: [PATCH 10/64] [tests] Repair tests in stdlib/regression I was failing because leftover grep command that filters out a warning about '.note.GNU-stack' (No idea where it was fixed) Signed-off-by: Kakadu --- stdlib/regression/gen.ml | 2 +- stdlib/regression/test01.t | 3 +-- stdlib/regression/test02.t | 3 +-- stdlib/regression/test03.t | 3 +-- stdlib/regression/test04.t | 3 +-- stdlib/regression/test05.t | 3 +-- stdlib/regression/test06.t | 3 +-- stdlib/regression/test07.t | 3 +-- stdlib/regression/test08.t | 3 +-- stdlib/regression/test09.t | 3 +-- stdlib/regression/test10.t | 3 +-- stdlib/regression/test11.t | 3 +-- stdlib/regression/test12.t | 3 +-- stdlib/regression/test13.t | 3 +-- stdlib/regression/test14.t | 3 +-- stdlib/regression/test15.t | 3 +-- stdlib/regression/test16.t | 3 +-- stdlib/regression/test17.t | 3 +-- stdlib/regression/test18.t | 3 +-- stdlib/regression/test20.t | 3 +-- stdlib/regression/test21.t | 3 +-- stdlib/regression/test22.t | 3 +-- stdlib/regression/test23.t | 3 +-- stdlib/regression/test24.t | 3 +-- stdlib/regression/test25.t | 3 +-- stdlib/regression/test26.t | 3 +-- stdlib/regression/test27.t | 3 +-- stdlib/regression/test28.t | 3 +-- stdlib/regression/test29.t | 3 +-- stdlib/regression/test32.t | 3 +-- stdlib/regression/test33.t | 3 +-- stdlib/regression/test34.t | 5 ++--- 32 files changed, 33 insertions(+), 64 deletions(-) diff --git a/stdlib/regression/gen.ml b/stdlib/regression/gen.ml index 8d1caaac6..53a8cf3ef 100644 --- a/stdlib/regression/gen.ml +++ b/stdlib/regression/gen.ml @@ -36,7 +36,7 @@ let () = if Sys.file_exists !lama_file && i <> 30 then ( (* cram_printfn " $ ls ../x64"; *) cram_printfn - " $ ../../src/Driver.exe -runtime ../../runtime -I ../../runtime -I ../../stdlib/x64 -ds -dp test%02d.lama -o test 2>&1 | grep -v 'missing .note.GNU-stack'" i; + " $ ../../src/Driver.exe -runtime ../../runtime -I ../../runtime -I ../../stdlib/x64 -ds -dp test%02d.lama -o test" i; cram_printfn " $ ./test"; true) else false diff --git a/stdlib/regression/test01.t b/stdlib/regression/test01.t index 9410a9f0c..8c74ad30e 100644 --- a/stdlib/regression/test01.t +++ b/stdlib/regression/test01.t @@ -1,6 +1,5 @@ This file was autogenerated. - $ ../../src/Driver.exe -runtime ../../runtime -I ../../runtime -I ../../stdlib/x64 -ds -dp test01.lama -o test 2>&1 | grep -v 'missing .note.GNU-stack' - /usr/bin/ld: NOTE: This behaviour is deprecated and will be removed in a future version of the linker + $ ../../src/Driver.exe -runtime ../../runtime -I ../../runtime -I ../../stdlib/x64 -ds -dp test01.lama -o test $ ./test Set internal structure: MNode (63, 1, 0, MNode (31, 1, 0, MNode (15, 1, 0, MNode (7, 1, 0, MNode (3, 1, 0, MNode (1, 1, 0, MNode (0, 1, 0, 0, 0), MNode (2, 1, 0, 0, 0)), MNode (5, 1, 0, MNode (4, 1, 0, 0, 0), MNode (6, 1, 0, 0, 0))), MNode (11, 1, 0, MNode (9, 1, 0, MNode (8, 1, 0, 0, 0), MNode (10, 1, 0, 0, 0)), MNode (13, 1, 0, MNode (12, 1, 0, 0, 0), MNode (14, 1, 0, 0, 0)))), MNode (23, 1, 0, MNode (19, 1, 0, MNode (17, 1, 0, MNode (16, 1, 0, 0, 0), MNode (18, 1, 0, 0, 0)), MNode (21, 1, 0, MNode (20, 1, 0, 0, 0), MNode (22, 1, 0, 0, 0))), MNode (27, 1, 0, MNode (25, 1, 0, MNode (24, 1, 0, 0, 0), MNode (26, 1, 0, 0, 0)), MNode (29, 1, 0, MNode (28, 1, 0, 0, 0), MNode (30, 1, 0, 0, 0))))), MNode (47, 1, 0, MNode (39, 1, 0, MNode (35, 1, 0, MNode (33, 1, 0, MNode (32, 1, 0, 0, 0), MNode (34, 1, 0, 0, 0)), MNode (37, 1, 0, MNode (36, 1, 0, 0, 0), MNode (38, 1, 0, 0, 0))), MNode (43, 1, 0, MNode (41, 1, 0, MNode (40, 1, 0, 0, 0), MNode (42, 1, 0, 0, 0)), MNode (45, 1, 0, MNode (44, 1, 0, 0, 0), MNode (46, 1, 0, 0, 0)))), MNode (55, 1, 0, MNode (51, 1, 0, MNode (49, 1, 0, MNode (48, 1, 0, 0, 0), MNode (50, 1, 0, 0, 0)), MNode (53, 1, 0, MNode (52, 1, 0, 0, 0), MNode (54, 1, 0, 0, 0))), MNode (59, 1, 0, MNode (57, 1, 0, MNode (56, 1, 0, 0, 0), MNode (58, 1, 0, 0, 0)), MNode (61, 1, 0, MNode (60, 1, 0, 0, 0), MNode (62, 1, 0, 0, 0)))))), MNode (79, 1, -1, MNode (71, 1, 0, MNode (67, 1, 0, MNode (65, 1, 0, MNode (64, 1, 0, 0, 0), MNode (66, 1, 0, 0, 0)), MNode (69, 1, 0, MNode (68, 1, 0, 0, 0), MNode (70, 1, 0, 0, 0))), MNode (75, 1, 0, MNode (73, 1, 0, MNode (72, 1, 0, 0, 0), MNode (74, 1, 0, 0, 0)), MNode (77, 1, 0, MNode (76, 1, 0, 0, 0), MNode (78, 1, 0, 0, 0)))), MNode (87, 1, -1, MNode (83, 1, 0, MNode (81, 1, 0, MNode (80, 1, 0, 0, 0), MNode (82, 1, 0, 0, 0)), MNode (85, 1, 0, MNode (84, 1, 0, 0, 0), MNode (86, 1, 0, 0, 0))), MNode (95, 1, 0, MNode (91, 1, 0, MNode (89, 1, 0, MNode (88, 1, 0, 0, 0), MNode (90, 1, 0, 0, 0)), MNode (93, 1, 0, MNode (92, 1, 0, 0, 0), MNode (94, 1, 0, 0, 0))), MNode (97, 1, -1, MNode (96, 1, 0, 0, 0), MNode (98, 1, -1, 0, MNode (99, 1, 0, 0, 0))))))) Set elements: {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99} diff --git a/stdlib/regression/test02.t b/stdlib/regression/test02.t index 687ba8c4d..5b05c8d2c 100644 --- a/stdlib/regression/test02.t +++ b/stdlib/regression/test02.t @@ -1,5 +1,4 @@ This file was autogenerated. - $ ../../src/Driver.exe -runtime ../../runtime -I ../../runtime -I ../../stdlib/x64 -ds -dp test02.lama -o test 2>&1 | grep -v 'missing .note.GNU-stack' - /usr/bin/ld: NOTE: This behaviour is deprecated and will be removed in a future version of the linker + $ ../../src/Driver.exe -runtime ../../runtime -I ../../runtime -I ../../stdlib/x64 -ds -dp test02.lama -o test $ ./test Assn ("x", Dec ("3")) diff --git a/stdlib/regression/test03.t b/stdlib/regression/test03.t index 3a60e6a8e..4a0482855 100644 --- a/stdlib/regression/test03.t +++ b/stdlib/regression/test03.t @@ -1,6 +1,5 @@ This file was autogenerated. - $ ../../src/Driver.exe -runtime ../../runtime -I ../../runtime -I ../../stdlib/x64 -ds -dp test03.lama -o test 2>&1 | grep -v 'missing .note.GNU-stack' - /usr/bin/ld: NOTE: This behaviour is deprecated and will be removed in a future version of the linker + $ ../../src/Driver.exe -runtime ../../runtime -I ../../runtime -I ../../stdlib/x64 -ds -dp test03.lama -o test $ ./test -1 1 diff --git a/stdlib/regression/test04.t b/stdlib/regression/test04.t index dc4386546..49da03f89 100644 --- a/stdlib/regression/test04.t +++ b/stdlib/regression/test04.t @@ -1,6 +1,5 @@ This file was autogenerated. - $ ../../src/Driver.exe -runtime ../../runtime -I ../../runtime -I ../../stdlib/x64 -ds -dp test04.lama -o test 2>&1 | grep -v 'missing .note.GNU-stack' - /usr/bin/ld: NOTE: This behaviour is deprecated and will be removed in a future version of the linker + $ ../../src/Driver.exe -runtime ../../runtime -I ../../runtime -I ../../stdlib/x64 -ds -dp test04.lama -o test $ ./test Map internal structure: MNode (63, {630}, 0, MNode (31, {310}, 0, MNode (15, {150}, 0, MNode (7, {70}, 0, MNode (3, {30}, 0, MNode (1, {10}, 0, MNode (0, {0}, 0, 0, 0), MNode (2, {20}, 0, 0, 0)), MNode (5, {50}, 0, MNode (4, {40}, 0, 0, 0), MNode (6, {60}, 0, 0, 0))), MNode (11, {110}, 0, MNode (9, {90}, 0, MNode (8, {80}, 0, 0, 0), MNode (10, {100}, 0, 0, 0)), MNode (13, {130}, 0, MNode (12, {120}, 0, 0, 0), MNode (14, {140}, 0, 0, 0)))), MNode (23, {230}, 0, MNode (19, {190}, 0, MNode (17, {170}, 0, MNode (16, {160}, 0, 0, 0), MNode (18, {180}, 0, 0, 0)), MNode (21, {210}, 0, MNode (20, {200}, 0, 0, 0), MNode (22, {220}, 0, 0, 0))), MNode (27, {270}, 0, MNode (25, {250}, 0, MNode (24, {240}, 0, 0, 0), MNode (26, {260}, 0, 0, 0)), MNode (29, {290}, 0, MNode (28, {280}, 0, 0, 0), MNode (30, {300}, 0, 0, 0))))), MNode (47, {470}, 0, MNode (39, {390}, 0, MNode (35, {350}, 0, MNode (33, {330}, 0, MNode (32, {320}, 0, 0, 0), MNode (34, {340}, 0, 0, 0)), MNode (37, {370}, 0, MNode (36, {360}, 0, 0, 0), MNode (38, {380}, 0, 0, 0))), MNode (43, {430}, 0, MNode (41, {410}, 0, MNode (40, {400}, 0, 0, 0), MNode (42, {420}, 0, 0, 0)), MNode (45, {450}, 0, MNode (44, {440}, 0, 0, 0), MNode (46, {460}, 0, 0, 0)))), MNode (55, {550}, 0, MNode (51, {510}, 0, MNode (49, {490}, 0, MNode (48, {480}, 0, 0, 0), MNode (50, {500}, 0, 0, 0)), MNode (53, {530}, 0, MNode (52, {520}, 0, 0, 0), MNode (54, {540}, 0, 0, 0))), MNode (59, {590}, 0, MNode (57, {570}, 0, MNode (56, {560}, 0, 0, 0), MNode (58, {580}, 0, 0, 0)), MNode (61, {610}, 0, MNode (60, {600}, 0, 0, 0), MNode (62, {620}, 0, 0, 0)))))), MNode (79, {790}, -1, MNode (71, {710}, 0, MNode (67, {670}, 0, MNode (65, {650}, 0, MNode (64, {640}, 0, 0, 0), MNode (66, {660}, 0, 0, 0)), MNode (69, {690}, 0, MNode (68, {680}, 0, 0, 0), MNode (70, {700}, 0, 0, 0))), MNode (75, {750}, 0, MNode (73, {730}, 0, MNode (72, {720}, 0, 0, 0), MNode (74, {740}, 0, 0, 0)), MNode (77, {770}, 0, MNode (76, {760}, 0, 0, 0), MNode (78, {780}, 0, 0, 0)))), MNode (87, {870}, -1, MNode (83, {830}, 0, MNode (81, {810}, 0, MNode (80, {800}, 0, 0, 0), MNode (82, {820}, 0, 0, 0)), MNode (85, {850}, 0, MNode (84, {840}, 0, 0, 0), MNode (86, {860}, 0, 0, 0))), MNode (95, {950}, 0, MNode (91, {910}, 0, MNode (89, {890}, 0, MNode (88, {880}, 0, 0, 0), MNode (90, {900}, 0, 0, 0)), MNode (93, {930}, 0, MNode (92, {920}, 0, 0, 0), MNode (94, {940}, 0, 0, 0))), MNode (97, {970}, -1, MNode (96, {960}, 0, 0, 0), MNode (98, {980}, -1, 0, MNode (99, {990}, 0, 0, 0))))))) Map elements: {[0, 0], [1, 10], [2, 20], [3, 30], [4, 40], [5, 50], [6, 60], [7, 70], [8, 80], [9, 90], [10, 100], [11, 110], [12, 120], [13, 130], [14, 140], [15, 150], [16, 160], [17, 170], [18, 180], [19, 190], [20, 200], [21, 210], [22, 220], [23, 230], [24, 240], [25, 250], [26, 260], [27, 270], [28, 280], [29, 290], [30, 300], [31, 310], [32, 320], [33, 330], [34, 340], [35, 350], [36, 360], [37, 370], [38, 380], [39, 390], [40, 400], [41, 410], [42, 420], [43, 430], [44, 440], [45, 450], [46, 460], [47, 470], [48, 480], [49, 490], [50, 500], [51, 510], [52, 520], [53, 530], [54, 540], [55, 550], [56, 560], [57, 570], [58, 580], [59, 590], [60, 600], [61, 610], [62, 620], [63, 630], [64, 640], [65, 650], [66, 660], [67, 670], [68, 680], [69, 690], [70, 700], [71, 710], [72, 720], [73, 730], [74, 740], [75, 750], [76, 760], [77, 770], [78, 780], [79, 790], [80, 800], [81, 810], [82, 820], [83, 830], [84, 840], [85, 850], [86, 860], [87, 870], [88, 880], [89, 890], [90, 900], [91, 910], [92, 920], [93, 930], [94, 940], [95, 950], [96, 960], [97, 970], [98, 980], [99, 990]} diff --git a/stdlib/regression/test05.t b/stdlib/regression/test05.t index e097cb5bf..fd2e997ac 100644 --- a/stdlib/regression/test05.t +++ b/stdlib/regression/test05.t @@ -1,6 +1,5 @@ This file was autogenerated. - $ ../../src/Driver.exe -runtime ../../runtime -I ../../runtime -I ../../stdlib/x64 -ds -dp test05.lama -o test 2>&1 | grep -v 'missing .note.GNU-stack' - /usr/bin/ld: NOTE: This behaviour is deprecated and will be removed in a future version of the linker + $ ../../src/Driver.exe -runtime ../../runtime -I ../../runtime -I ../../stdlib/x64 -ds -dp test05.lama -o test $ ./test Cached: 1 Cached: 1 diff --git a/stdlib/regression/test06.t b/stdlib/regression/test06.t index 2397dcd6d..1bd844705 100644 --- a/stdlib/regression/test06.t +++ b/stdlib/regression/test06.t @@ -1,6 +1,5 @@ This file was autogenerated. - $ ../../src/Driver.exe -runtime ../../runtime -I ../../runtime -I ../../stdlib/x64 -ds -dp test06.lama -o test 2>&1 | grep -v 'missing .note.GNU-stack' - /usr/bin/ld: NOTE: This behaviour is deprecated and will be removed in a future version of the linker + $ ../../src/Driver.exe -runtime ../../runtime -I ../../runtime -I ../../stdlib/x64 -ds -dp test06.lama -o test $ ./test Flattening: 0 Flattening: {0, 0, 0, 0} diff --git a/stdlib/regression/test07.t b/stdlib/regression/test07.t index 176c7e006..7008dfa47 100644 --- a/stdlib/regression/test07.t +++ b/stdlib/regression/test07.t @@ -1,6 +1,5 @@ This file was autogenerated. - $ ../../src/Driver.exe -runtime ../../runtime -I ../../runtime -I ../../stdlib/x64 -ds -dp test07.lama -o test 2>&1 | grep -v 'missing .note.GNU-stack' - /usr/bin/ld: NOTE: This behaviour is deprecated and will be removed in a future version of the linker + $ ../../src/Driver.exe -runtime ../../runtime -I ../../runtime -I ../../stdlib/x64 -ds -dp test07.lama -o test $ ./test HashTab internal structure: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, {[{1, 2, 3}, 100]}, 0, 0, 0] HashTab internal structure: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, {[{1, 2, 3}, 200], [{1, 2, 3}, 100]}, 0, 0, 0] diff --git a/stdlib/regression/test08.t b/stdlib/regression/test08.t index 378b1d134..d8ea8e497 100644 --- a/stdlib/regression/test08.t +++ b/stdlib/regression/test08.t @@ -1,6 +1,5 @@ This file was autogenerated. - $ ../../src/Driver.exe -runtime ../../runtime -I ../../runtime -I ../../stdlib/x64 -ds -dp test08.lama -o test 2>&1 | grep -v 'missing .note.GNU-stack' - /usr/bin/ld: NOTE: This behaviour is deprecated and will be removed in a future version of the linker + $ ../../src/Driver.exe -runtime ../../runtime -I ../../runtime -I ../../stdlib/x64 -ds -dp test08.lama -o test $ ./test 6 120 diff --git a/stdlib/regression/test09.t b/stdlib/regression/test09.t index a12501b0c..64cff417a 100644 --- a/stdlib/regression/test09.t +++ b/stdlib/regression/test09.t @@ -1,6 +1,5 @@ This file was autogenerated. - $ ../../src/Driver.exe -runtime ../../runtime -I ../../runtime -I ../../stdlib/x64 -ds -dp test09.lama -o test 2>&1 | grep -v 'missing .note.GNU-stack' - /usr/bin/ld: NOTE: This behaviour is deprecated and will be removed in a future version of the linker + $ ../../src/Driver.exe -runtime ../../runtime -I ../../runtime -I ../../stdlib/x64 -ds -dp test09.lama -o test $ ./test Parsing a*| against "aa"... Succ ({"a", "a"}) Parsing a+| against "aa"... Succ ({"a", "a"}) diff --git a/stdlib/regression/test10.t b/stdlib/regression/test10.t index 75613f54f..fd21203a9 100644 --- a/stdlib/regression/test10.t +++ b/stdlib/regression/test10.t @@ -1,6 +1,5 @@ This file was autogenerated. - $ ../../src/Driver.exe -runtime ../../runtime -I ../../runtime -I ../../stdlib/x64 -ds -dp test10.lama -o test 2>&1 | grep -v 'missing .note.GNU-stack' - /usr/bin/ld: NOTE: This behaviour is deprecated and will be removed in a future version of the linker + $ ../../src/Driver.exe -runtime ../../runtime -I ../../runtime -I ../../stdlib/x64 -ds -dp test10.lama -o test $ ./test Parsing "aaa" with many ... Succ ({"a", "a", "a"}) Parsing "ab" with bad_alter ... Succ ("ab") diff --git a/stdlib/regression/test11.t b/stdlib/regression/test11.t index 7efd2e871..227782b28 100644 --- a/stdlib/regression/test11.t +++ b/stdlib/regression/test11.t @@ -1,6 +1,5 @@ This file was autogenerated. - $ ../../src/Driver.exe -runtime ../../runtime -I ../../runtime -I ../../stdlib/x64 -ds -dp test11.lama -o test 2>&1 | grep -v 'missing .note.GNU-stack' - /usr/bin/ld: NOTE: This behaviour is deprecated and will be removed in a future version of the linker + $ ../../src/Driver.exe -runtime ../../runtime -I ../../runtime -I ../../stdlib/x64 -ds -dp test11.lama -o test $ ./test Succ ("a") Succ (Add ("a", "a")) diff --git a/stdlib/regression/test12.t b/stdlib/regression/test12.t index ba857ec2b..04b3b742f 100644 --- a/stdlib/regression/test12.t +++ b/stdlib/regression/test12.t @@ -1,5 +1,4 @@ This file was autogenerated. - $ ../../src/Driver.exe -runtime ../../runtime -I ../../runtime -I ../../stdlib/x64 -ds -dp test12.lama -o test 2>&1 | grep -v 'missing .note.GNU-stack' - /usr/bin/ld: NOTE: This behaviour is deprecated and will be removed in a future version of the linker + $ ../../src/Driver.exe -runtime ../../runtime -I ../../runtime -I ../../stdlib/x64 -ds -dp test12.lama -o test $ ./test Succ (Mul (Mul (Mul (Mul (Mul (Mul (Mul (Mul (Mul (Mul (Mul (Mul (Mul (Mul (Mul (Mul (Mul (Mul (Mul (Mul (Mul (Mul (Mul (Mul (Mul (Mul (Mul (Mul (Mul (Mul (Mul ("a", "a"), "a"), "a"), "a"), "a"), "a"), "a"), "a"), "a"), "a"), "a"), "a"), "a"), "a"), "a"), "a"), "a"), "a"), "a"), "a"), "a"), "a"), "a"), "a"), "a"), "a"), "a"), "a"), "a"), "a"), "a")) diff --git a/stdlib/regression/test13.t b/stdlib/regression/test13.t index 873cf0c62..f69935f4a 100644 --- a/stdlib/regression/test13.t +++ b/stdlib/regression/test13.t @@ -1,6 +1,5 @@ This file was autogenerated. - $ ../../src/Driver.exe -runtime ../../runtime -I ../../runtime -I ../../stdlib/x64 -ds -dp test13.lama -o test 2>&1 | grep -v 'missing .note.GNU-stack' - /usr/bin/ld: NOTE: This behaviour is deprecated and will be removed in a future version of the linker + $ ../../src/Driver.exe -runtime ../../runtime -I ../../runtime -I ../../stdlib/x64 -ds -dp test13.lama -o test $ ./test Succ (Add ("a", Sub ("a", "a"))) Succ (Mul (Div (Mul ("a", "a"), "a"), "a")) diff --git a/stdlib/regression/test14.t b/stdlib/regression/test14.t index c6a2f32a7..09e8f8c18 100644 --- a/stdlib/regression/test14.t +++ b/stdlib/regression/test14.t @@ -1,6 +1,5 @@ This file was autogenerated. - $ ../../src/Driver.exe -runtime ../../runtime -I ../../runtime -I ../../stdlib/x64 -ds -dp test14.lama -o test 2>&1 | grep -v 'missing .note.GNU-stack' - /usr/bin/ld: NOTE: This behaviour is deprecated and will be removed in a future version of the linker + $ ../../src/Driver.exe -runtime ../../runtime -I ../../runtime -I ../../stdlib/x64 -ds -dp test14.lama -o test $ ./test Succ (Add ("a", Sub ("a", "a"))) Succ (Mul (Div (Mul ("a", "a"), "a"), "a")) diff --git a/stdlib/regression/test15.t b/stdlib/regression/test15.t index 86786f3db..f7830e133 100644 --- a/stdlib/regression/test15.t +++ b/stdlib/regression/test15.t @@ -1,6 +1,5 @@ This file was autogenerated. - $ ../../src/Driver.exe -runtime ../../runtime -I ../../runtime -I ../../stdlib/x64 -ds -dp test15.lama -o test 2>&1 | grep -v 'missing .note.GNU-stack' - /usr/bin/ld: NOTE: This behaviour is deprecated and will be removed in a future version of the linker + $ ../../src/Driver.exe -runtime ../../runtime -I ../../runtime -I ../../stdlib/x64 -ds -dp test15.lama -o test $ ./test Succ (Eq ("a", "a")) Succ (Eq (Mul ("a", "a"), Mul ("a", "a"))) diff --git a/stdlib/regression/test16.t b/stdlib/regression/test16.t index 6365c1431..ff411c4b5 100644 --- a/stdlib/regression/test16.t +++ b/stdlib/regression/test16.t @@ -1,6 +1,5 @@ This file was autogenerated. - $ ../../src/Driver.exe -runtime ../../runtime -I ../../runtime -I ../../stdlib/x64 -ds -dp test16.lama -o test 2>&1 | grep -v 'missing .note.GNU-stack' - /usr/bin/ld: NOTE: This behaviour is deprecated and will be removed in a future version of the linker + $ ../../src/Driver.exe -runtime ../../runtime -I ../../runtime -I ../../stdlib/x64 -ds -dp test16.lama -o test $ ./test Succ (Eq ("a", "a")) Succ (Eq ("b", "b")) diff --git a/stdlib/regression/test17.t b/stdlib/regression/test17.t index d38333431..d6f242b37 100644 --- a/stdlib/regression/test17.t +++ b/stdlib/regression/test17.t @@ -1,6 +1,5 @@ This file was autogenerated. - $ ../../src/Driver.exe -runtime ../../runtime -I ../../runtime -I ../../stdlib/x64 -ds -dp test17.lama -o test 2>&1 | grep -v 'missing .note.GNU-stack' - /usr/bin/ld: NOTE: This behaviour is deprecated and will be removed in a future version of the linker + $ ../../src/Driver.exe -runtime ../../runtime -I ../../runtime -I ../../stdlib/x64 -ds -dp test17.lama -o test $ ./test Lazy body: 0 Lazy body: 1 diff --git a/stdlib/regression/test18.t b/stdlib/regression/test18.t index 72a01879a..c10a41179 100644 --- a/stdlib/regression/test18.t +++ b/stdlib/regression/test18.t @@ -1,6 +1,5 @@ This file was autogenerated. - $ ../../src/Driver.exe -runtime ../../runtime -I ../../runtime -I ../../stdlib/x64 -ds -dp test18.lama -o test 2>&1 | grep -v 'missing .note.GNU-stack' - /usr/bin/ld: NOTE: This behaviour is deprecated and will be removed in a future version of the linker + $ ../../src/Driver.exe -runtime ../../runtime -I ../../runtime -I ../../stdlib/x64 -ds -dp test18.lama -o test $ ./test 1 =?= 1 = 0 symmetricity: ok diff --git a/stdlib/regression/test20.t b/stdlib/regression/test20.t index 7bff5b1e6..04ba202ab 100644 --- a/stdlib/regression/test20.t +++ b/stdlib/regression/test20.t @@ -1,6 +1,5 @@ This file was autogenerated. - $ ../../src/Driver.exe -runtime ../../runtime -I ../../runtime -I ../../stdlib/x64 -ds -dp test20.lama -o test 2>&1 | grep -v 'missing .note.GNU-stack' - /usr/bin/ld: NOTE: This behaviour is deprecated and will be removed in a future version of the linker + $ ../../src/Driver.exe -runtime ../../runtime -I ../../runtime -I ../../stdlib/x64 -ds -dp test20.lama -o test $ ./test Empty Node (0, Empty, Empty) diff --git a/stdlib/regression/test21.t b/stdlib/regression/test21.t index 4d97bd002..7435cc4ef 100644 --- a/stdlib/regression/test21.t +++ b/stdlib/regression/test21.t @@ -1,6 +1,5 @@ This file was autogenerated. - $ ../../src/Driver.exe -runtime ../../runtime -I ../../runtime -I ../../stdlib/x64 -ds -dp test21.lama -o test 2>&1 | grep -v 'missing .note.GNU-stack' - /usr/bin/ld: NOTE: This behaviour is deprecated and will be removed in a future version of the linker + $ ../../src/Driver.exe -runtime ../../runtime -I ../../runtime -I ../../stdlib/x64 -ds -dp test21.lama -o test $ ./test 1 1 diff --git a/stdlib/regression/test22.t b/stdlib/regression/test22.t index f926a76c9..9309f39d3 100644 --- a/stdlib/regression/test22.t +++ b/stdlib/regression/test22.t @@ -1,6 +1,5 @@ This file was autogenerated. - $ ../../src/Driver.exe -runtime ../../runtime -I ../../runtime -I ../../stdlib/x64 -ds -dp test22.lama -o test 2>&1 | grep -v 'missing .note.GNU-stack' - /usr/bin/ld: NOTE: This behaviour is deprecated and will be removed in a future version of the linker + $ ../../src/Driver.exe -runtime ../../runtime -I ../../runtime -I ../../stdlib/x64 -ds -dp test22.lama -o test $ ./test 0 {1, 2, 3, 4} diff --git a/stdlib/regression/test23.t b/stdlib/regression/test23.t index fa9a04daa..0306c0c36 100644 --- a/stdlib/regression/test23.t +++ b/stdlib/regression/test23.t @@ -1,6 +1,5 @@ This file was autogenerated. - $ ../../src/Driver.exe -runtime ../../runtime -I ../../runtime -I ../../stdlib/x64 -ds -dp test23.lama -o test 2>&1 | grep -v 'missing .note.GNU-stack' - /usr/bin/ld: NOTE: This behaviour is deprecated and will be removed in a future version of the linker + $ ../../src/Driver.exe -runtime ../../runtime -I ../../runtime -I ../../stdlib/x64 -ds -dp test23.lama -o test $ ./test 1 {2, 3, 4} diff --git a/stdlib/regression/test24.t b/stdlib/regression/test24.t index e48bb1d9e..0d8edd5e8 100644 --- a/stdlib/regression/test24.t +++ b/stdlib/regression/test24.t @@ -1,6 +1,5 @@ This file was autogenerated. - $ ../../src/Driver.exe -runtime ../../runtime -I ../../runtime -I ../../stdlib/x64 -ds -dp test24.lama -o test 2>&1 | grep -v 'missing .note.GNU-stack' - /usr/bin/ld: NOTE: This behaviour is deprecated and will be removed in a future version of the linker + $ ../../src/Driver.exe -runtime ../../runtime -I ../../runtime -I ../../stdlib/x64 -ds -dp test24.lama -o test $ ./test 3 {1} diff --git a/stdlib/regression/test25.t b/stdlib/regression/test25.t index 091f14033..b3079e9d7 100644 --- a/stdlib/regression/test25.t +++ b/stdlib/regression/test25.t @@ -1,6 +1,5 @@ This file was autogenerated. - $ ../../src/Driver.exe -runtime ../../runtime -I ../../runtime -I ../../stdlib/x64 -ds -dp test25.lama -o test 2>&1 | grep -v 'missing .note.GNU-stack' - /usr/bin/ld: NOTE: This behaviour is deprecated and will be removed in a future version of the linker + $ ../../src/Driver.exe -runtime ../../runtime -I ../../runtime -I ../../stdlib/x64 -ds -dp test25.lama -o test $ ./test Cloning int: 5 Cloning string: abc diff --git a/stdlib/regression/test26.t b/stdlib/regression/test26.t index 4319c15cf..7f5907b36 100644 --- a/stdlib/regression/test26.t +++ b/stdlib/regression/test26.t @@ -1,6 +1,5 @@ This file was autogenerated. - $ ../../src/Driver.exe -runtime ../../runtime -I ../../runtime -I ../../stdlib/x64 -ds -dp test26.lama -o test 2>&1 | grep -v 'missing .note.GNU-stack' - /usr/bin/ld: NOTE: This behaviour is deprecated and will be removed in a future version of the linker + $ ../../src/Driver.exe -runtime ../../runtime -I ../../runtime -I ../../stdlib/x64 -ds -dp test26.lama -o test $ ./test Number of commands-line arguments: 1 arg [0 ] = "./test" diff --git a/stdlib/regression/test27.t b/stdlib/regression/test27.t index 158b1e5a8..d2e743c03 100644 --- a/stdlib/regression/test27.t +++ b/stdlib/regression/test27.t @@ -1,5 +1,4 @@ This file was autogenerated. - $ ../../src/Driver.exe -runtime ../../runtime -I ../../runtime -I ../../stdlib/x64 -ds -dp test27.lama -o test 2>&1 | grep -v 'missing .note.GNU-stack' - /usr/bin/ld: NOTE: This behaviour is deprecated and will be removed in a future version of the linker + $ ../../src/Driver.exe -runtime ../../runtime -I ../../runtime -I ../../stdlib/x64 -ds -dp test27.lama -o test $ ./test Yes diff --git a/stdlib/regression/test28.t b/stdlib/regression/test28.t index 4afff951a..0972fd855 100644 --- a/stdlib/regression/test28.t +++ b/stdlib/regression/test28.t @@ -1,6 +1,5 @@ This file was autogenerated. - $ ../../src/Driver.exe -runtime ../../runtime -I ../../runtime -I ../../stdlib/x64 -ds -dp test28.lama -o test 2>&1 | grep -v 'missing .note.GNU-stack' - /usr/bin/ld: NOTE: This behaviour is deprecated and will be removed in a future version of the linker + $ ../../src/Driver.exe -runtime ../../runtime -I ../../runtime -I ../../stdlib/x64 -ds -dp test28.lama -o test $ ./test Succ (Seq ("a", "b")) Succ (Alt ("a")) diff --git a/stdlib/regression/test29.t b/stdlib/regression/test29.t index 507ffc622..a1edb8939 100644 --- a/stdlib/regression/test29.t +++ b/stdlib/regression/test29.t @@ -1,6 +1,5 @@ This file was autogenerated. - $ ../../src/Driver.exe -runtime ../../runtime -I ../../runtime -I ../../stdlib/x64 -ds -dp test29.lama -o test 2>&1 | grep -v 'missing .note.GNU-stack' - /usr/bin/ld: NOTE: This behaviour is deprecated and will be removed in a future version of the linker + $ ../../src/Driver.exe -runtime ../../runtime -I ../../runtime -I ../../stdlib/x64 -ds -dp test29.lama -o test $ ./test Succ (Seq ("a", "b")) Succ (Alt ("a")) diff --git a/stdlib/regression/test32.t b/stdlib/regression/test32.t index c1112dde3..c1c48950c 100644 --- a/stdlib/regression/test32.t +++ b/stdlib/regression/test32.t @@ -1,6 +1,5 @@ This file was autogenerated. - $ ../../src/Driver.exe -runtime ../../runtime -I ../../runtime -I ../../stdlib/x64 -ds -dp test32.lama -o test 2>&1 | grep -v 'missing .note.GNU-stack' - /usr/bin/ld: NOTE: This behaviour is deprecated and will be removed in a future version of the linker + $ ../../src/Driver.exe -runtime ../../runtime -I ../../runtime -I ../../stdlib/x64 -ds -dp test32.lama -o test $ ./test Flattening: 0 Flattening: {A, B, C, D} diff --git a/stdlib/regression/test33.t b/stdlib/regression/test33.t index 4d79e62c9..8681e6527 100644 --- a/stdlib/regression/test33.t +++ b/stdlib/regression/test33.t @@ -1,6 +1,5 @@ This file was autogenerated. - $ ../../src/Driver.exe -runtime ../../runtime -I ../../runtime -I ../../stdlib/x64 -ds -dp test33.lama -o test 2>&1 | grep -v 'missing .note.GNU-stack' - /usr/bin/ld: NOTE: This behaviour is deprecated and will be removed in a future version of the linker + $ ../../src/Driver.exe -runtime ../../runtime -I ../../runtime -I ../../stdlib/x64 -ds -dp test33.lama -o test $ ./test {}.string: 0 {}.stringcat: diff --git a/stdlib/regression/test34.t b/stdlib/regression/test34.t index f896fa062..5ac075f5b 100644 --- a/stdlib/regression/test34.t +++ b/stdlib/regression/test34.t @@ -1,6 +1,5 @@ This file was autogenerated. - $ ../../src/Driver.exe -runtime ../../runtime -I ../../runtime -I ../../stdlib/x64 -ds -dp test34.lama -o test 2>&1 | grep -v 'missing .note.GNU-stack' - /usr/bin/ld: NOTE: This behaviour is deprecated and will be removed in a future version of the linker + $ ../../src/Driver.exe -runtime ../../runtime -I ../../runtime -I ../../stdlib/x64 -ds -dp test34.lama -o test $ ./test - ' " ` % \ \r + ' " ` % \ \h @ $ # ; [ ] From ddb45a496ffcb0d7435e665f2ec2146f38bab6db Mon Sep 17 00:00:00 2001 From: Dmitry Boulytchev Date: Fri, 31 Jan 2025 00:02:40 +0300 Subject: [PATCH 11/64] Added queue to stdlib --- stdlib/Makefile | 2 ++ stdlib/Queue.lama | 26 ++++++++++++++++++++++++++ 2 files changed, 28 insertions(+) create mode 100644 stdlib/Queue.lama diff --git a/stdlib/Makefile b/stdlib/Makefile index 546f2af54..5d4766162 100644 --- a/stdlib/Makefile +++ b/stdlib/Makefile @@ -18,6 +18,8 @@ $(BDIR)/Fun.o: $(BDIR)/Ref.o $(BDIR)/Data.o: $(BDIR)/Ref.o $(BDIR)/Collection.o +$(BDIR)/Queue.o: $(BDIR)/List.o + $(BDIR)/Collection.o: $(BDIR)/List.o $(BDIR)/Ref.o $(BDIR)/Array.o: $(BDIR)/List.o diff --git a/stdlib/Queue.lama b/stdlib/Queue.lama new file mode 100644 index 000000000..f02d1fa7b --- /dev/null +++ b/stdlib/Queue.lama @@ -0,0 +1,26 @@ +import List; + +fun emptyQueue () { + [{}, {}] +} + +fun isEmptyQueue (q) { + case q of + [{}, {}] -> true + | _ -> false + esac +} + +fun enqueue ([pop, push], x) { + [pop, x : push] +} + +fun dequeue ([pop, push]) { + case pop of + x : pop -> [[pop, push], x] + | _ -> case push of + {} -> failure ("dequeueing from empty queue\n") + | _ -> dequeue ([reverse (push), {}]) + esac + esac +} From a3d77ad095e85b25993f3be8bd85d4c9f9630a14 Mon Sep 17 00:00:00 2001 From: Kakadu Date: Sun, 2 Feb 2025 00:16:04 +0300 Subject: [PATCH 12/64] [ci] Trying to add gcc multilib dependecies Signed-off-by: Kakadu --- .github/workflows/blank.yml | 4 ++++ Lama.opam | 1 + Lama.opam.template | 1 + 3 files changed, 6 insertions(+) create mode 100644 Lama.opam.template diff --git a/.github/workflows/blank.yml b/.github/workflows/blank.yml index ba8b3ef28..ef51c11b2 100644 --- a/.github/workflows/blank.yml +++ b/.github/workflows/blank.yml @@ -10,6 +10,8 @@ on: - "more-dune" permissions: read-all +env: + OPAMCONFIRMLEVEL: unsafe-yes jobs: build: @@ -33,6 +35,8 @@ jobs: with: ocaml-compiler: ${{ matrix.ocaml-compiler }} + - run: gcc --version + - run: opam pin add Lama.dev . --no-action - run: opam depext Lama.dev --yes --with-test - run: opam install . --deps-only --with-test diff --git a/Lama.opam b/Lama.opam index 2de3a899a..33dffba4e 100644 --- a/Lama.opam +++ b/Lama.opam @@ -28,3 +28,4 @@ build: [ "@doc" {with-doc} ] ] +depexts: [ [ "gcc-14-multilib" ] {os-distribution = "ubuntu"} ] \ No newline at end of file diff --git a/Lama.opam.template b/Lama.opam.template new file mode 100644 index 000000000..ca78f1b04 --- /dev/null +++ b/Lama.opam.template @@ -0,0 +1 @@ +depexts: [ [ "gcc-14-multilib" ] {os-distribution = "ubuntu"} ] \ No newline at end of file From a41c65413a6aeec773d9c5b176ff9d2fbe6fc775 Mon Sep 17 00:00:00 2001 From: Kakadu Date: Sun, 2 Feb 2025 00:34:20 +0300 Subject: [PATCH 13/64] Silence a few warnings in X86_32 Signed-off-by: Kakadu --- src/X86_32.ml | 12 +++++------- src/dune | 17 +++++++++++++++-- 2 files changed, 20 insertions(+), 9 deletions(-) diff --git a/src/X86_32.ml b/src/X86_32.ml index e6b20350e..0e95be2e6 100644 --- a/src/X86_32.ml +++ b/src/X86_32.ml @@ -22,8 +22,6 @@ let word_size = 4;; | I of int * opnd (* an indirect operand with offset *) with show -let show_opnd = show(opnd) - (* For convenience we define the following synonyms for the registers: *) let ebx = R 0 let ecx = R 1 @@ -150,7 +148,7 @@ let compile cmd env imports code = in let env , pushs = push_args env [] n in let closure, env = env#pop in - let y , env = env#allocate in + let _ , env = env#allocate in env, pushs @ [Mov (closure, edx); Mov (I(0, edx), eax); Mov (ebp, esp); @@ -197,7 +195,7 @@ let compile cmd env imports code = else push_args env ((mov x (env#loc (Value.Arg (n-1)))) @ acc) (n-1) in let env, pushs = push_args env [] n in - let y, env = env#allocate in + let _, env = env#allocate in env, pushs @ [Mov (ebp, esp); Pop (ebp)] @ (if env#has_closure then [Pop ebx] else []) @ [Jmp f] ) else ( @@ -563,8 +561,8 @@ module M = Map.Make (String) (* Environment implementation *) class env prg = let chars = "_abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'" in - let make_assoc l i = List.combine l (List.init (List.length l) (fun x -> x + i)) in - let rec assoc x = function [] -> raise Not_found | l :: ls -> try List.assoc x l with Not_found -> assoc x ls in + (* let make_assoc l i = List.combine l (List.init (List.length l) (fun x -> x + i)) in *) + (* let rec assoc x = function [] -> raise Not_found | l :: ls -> try List.assoc x l with Not_found -> assoc x ls in *) object (self) inherit SM.indexer prg val globals = S.empty (* a set of global variables *) @@ -663,7 +661,7 @@ class env prg = (* allocates a fresh position on a symbolic stack *) method allocate = let x, n = - let rec allocate' = function + let allocate' = function | [] -> ebx , 0 | (S n)::_ -> S (n+1) , n+2 | (R n)::_ when n < num_of_regs -> R (n+1) , stack_slots diff --git a/src/dune b/src/dune index ae7211707..30a6d0efd 100644 --- a/src/dune +++ b/src/dune @@ -61,7 +61,7 @@ SM X86_64) ((action - (run %{project_root}/src/pp5+gt+plugins+ostap+dump.byte %{input-file})) + (run %{project_root}/src/pp5+gt+plugins+ostap+dump.exe %{input-file})) Language Pprinter X86_32 @@ -69,7 +69,8 @@ version))) (preprocessor_deps (file %{project_root}/src/pp5+gt+plugins+ostap+dump.byte) - ;(file %{project_root}/src/pp5+gt+plugins+ostap+dump.exe) + (file %{project_root}/src/pp5+gt+plugins+ostap+dump.exe) + ; ) ;(inline_tests) ) @@ -106,5 +107,17 @@ -o %{targets}))) +(rule + (targets pp5+gt+plugins+ostap+dump.exe) + (deps + (package GT)) + (action + (run + mkcamlp5.opt + -package + camlp5,camlp5.pa_o,camlp5.pr_o,ostap.syntax,GT.syntax.all,GT.syntax + -o + %{targets}))) + (cram (deps ./Driver.exe)) From 63486f5f38197a252bf2480e92c2782c2b81fc93 Mon Sep 17 00:00:00 2001 From: Kakadu Date: Tue, 25 Feb 2025 17:19:54 +0300 Subject: [PATCH 14/64] stdlib/regression: disable 32bit test on non-linux Trying to fix Mac build.... Signed-off-by: Kakadu --- stdlib/regression/dune | 8 ++++++-- stdlib/regression/gen.ml | 10 ++++++++-- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/stdlib/regression/dune b/stdlib/regression/dune index cf12a75a0..0f6430d20 100644 --- a/stdlib/regression/dune +++ b/stdlib/regression/dune @@ -1,9 +1,13 @@ ; This file was autogenerated (cram (deps ../../src/Driver.exe)) -(cram (deps ../../runtime32/runtime.a ../../runtime32/Std.i)) +(cram + (enabled_if (= %{system} "linux")) + (deps ../../runtime32/runtime.a ../../runtime32/Std.i)) (cram (deps ../../runtime/runtime.a ../../runtime/Std.i)) -(cram (deps ../x32/Array.i ../x32/Array.o ../x32/Buffer.i ../x32/Buffer.o ../x32/Collection.i ../x32/Collection.o ../x32/Data.i ../x32/Data.o ../x32/Fun.i ../x32/Fun.o ../x32/Lazy.i ../x32/Lazy.o ../x32/List.i ../x32/List.o ../x32/Matcher.i ../x32/Matcher.o ../x32/Ostap.i ../x32/Ostap.o ../x32/Random.i ../x32/Random.o ../x32/Ref.i ../x32/Ref.o ../x32/STM.i ../x32/STM.o ../x32/Timer.i ../x32/Timer.o)) +(cram + (enabled_if (= %{system} "linux")) + (deps ../x32/Array.i ../x32/Array.o ../x32/Buffer.i ../x32/Buffer.o ../x32/Collection.i ../x32/Collection.o ../x32/Data.i ../x32/Data.o ../x32/Fun.i ../x32/Fun.o ../x32/Lazy.i ../x32/Lazy.o ../x32/List.i ../x32/List.o ../x32/Matcher.i ../x32/Matcher.o ../x32/Ostap.i ../x32/Ostap.o ../x32/Random.i ../x32/Random.o ../x32/Ref.i ../x32/Ref.o ../x32/STM.i ../x32/STM.o ../x32/Timer.i ../x32/Timer.o)) (cram (deps ../x64/Array.i ../x64/Array.o ../x64/Buffer.i ../x64/Buffer.o ../x64/Collection.i ../x64/Collection.o ../x64/Data.i ../x64/Data.o ../x64/Fun.i ../x64/Fun.o ../x64/Lazy.i ../x64/Lazy.o ../x64/List.i ../x64/List.o ../x64/Matcher.i ../x64/Matcher.o ../x64/Ostap.i ../x64/Ostap.o ../x64/Random.i ../x64/Random.o ../x64/Ref.i ../x64/Ref.o ../x64/STM.i ../x64/STM.o ../x64/Timer.i ../x64/Timer.o)) (cram (applies_to test01) (deps test01.lama)) diff --git a/stdlib/regression/gen.ml b/stdlib/regression/gen.ml index 8d1caaac6..97c5ed8bc 100644 --- a/stdlib/regression/gen.ml +++ b/stdlib/regression/gen.ml @@ -7,11 +7,17 @@ let sprintf = Printf.sprintf let () = Out_channel.with_open_text "dune" (fun dunech -> let dprintfn fmt = Format.kasprintf (Printf.fprintf dunech "%s\n") fmt in + let iflinux () = dprintfn " (enabled_if (= %%{system} \"linux\"))" in dprintfn "; This file was autogenerated\n"; dprintfn "(cram (deps ../../src/Driver.exe))"; - dprintfn "(cram (deps ../../runtime32/runtime.a ../../runtime32/Std.i))"; + dprintfn "(cram"; + iflinux (); + dprintfn " (deps ../../runtime32/runtime.a ../../runtime32/Std.i))"; dprintfn "(cram (deps ../../runtime/runtime.a ../../runtime/Std.i))"; - dprintfn "(cram (deps %s))" + + dprintfn "(cram"; + iflinux (); + dprintfn " (deps %s))" (String.concat " " (List.concat_map (fun s -> [sprintf "../x32/%s.i" s ;sprintf "../x32/%s.o" s From 2174be819e6a8fa4446c15bf52cf5b967ba73eb5 Mon Sep 17 00:00:00 2001 From: Kakadu Date: Tue, 25 Feb 2025 17:41:09 +0300 Subject: [PATCH 15/64] Debugging MacOS build Signed-off-by: Kakadu --- .github/workflows/blank.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/blank.yml b/.github/workflows/blank.yml index ef51c11b2..d2b8c4509 100644 --- a/.github/workflows/blank.yml +++ b/.github/workflows/blank.yml @@ -41,5 +41,7 @@ jobs: - run: opam depext Lama.dev --yes --with-test - run: opam install . --deps-only --with-test - run: eval $(opam env) + - run: opam exec -- dune b runtime32 -j1 + - run: opam exec -- dune test stdlib/regression -j1 - run: opam exec -- make install - run: opam exec -- make regression From 2362bd8f95c618b445c02bd3e26cf73bbbfecc0c Mon Sep 17 00:00:00 2001 From: Kakadu Date: Thu, 27 Feb 2025 22:34:04 +0300 Subject: [PATCH 16/64] Delete runtime32 on Mac Signed-off-by: Kakadu --- .github/workflows/blank.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/workflows/blank.yml b/.github/workflows/blank.yml index d2b8c4509..726dc435d 100644 --- a/.github/workflows/blank.yml +++ b/.github/workflows/blank.yml @@ -41,7 +41,10 @@ jobs: - run: opam depext Lama.dev --yes --with-test - run: opam install . --deps-only --with-test - run: eval $(opam env) - - run: opam exec -- dune b runtime32 -j1 + + - run: rm -fr runtime32 + if: ${{ matrix.os == 'macos-latest' }} + - run: opam exec -- dune test stdlib/regression -j1 - run: opam exec -- make install - run: opam exec -- make regression From 72b67ed632f26494c1664d485ff1d5820820d7c3 Mon Sep 17 00:00:00 2001 From: Kakadu Date: Thu, 27 Feb 2025 22:41:51 +0300 Subject: [PATCH 17/64] Fixup CI Signed-off-by: Kakadu --- .github/workflows/blank.yml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/.github/workflows/blank.yml b/.github/workflows/blank.yml index 726dc435d..6c20d9cc0 100644 --- a/.github/workflows/blank.yml +++ b/.github/workflows/blank.yml @@ -46,5 +46,7 @@ jobs: if: ${{ matrix.os == 'macos-latest' }} - run: opam exec -- dune test stdlib/regression -j1 - - run: opam exec -- make install - - run: opam exec -- make regression + - run: opam exec -- dune b + - run: opam exec -- dune b @install + - run: opam exec -- dune install + #- run: opam exec -- make regression From c9cd55d1732719896e796a1b1ae85d3877faa9ec Mon Sep 17 00:00:00 2001 From: Kakadu Date: Thu, 27 Feb 2025 22:52:02 +0300 Subject: [PATCH 18/64] Use malloc from Signed-off-by: Kakadu --- byterun/byterun.c | 80 +++++++++++++++++++++++------------------------ 1 file changed, 40 insertions(+), 40 deletions(-) diff --git a/byterun/byterun.c b/byterun/byterun.c index fea6e65c5..5269b313b 100644 --- a/byterun/byterun.c +++ b/byterun/byterun.c @@ -3,7 +3,7 @@ # include # include # include -# include +# include # include "../runtime/runtime.h" void *__start_custom_data; @@ -18,7 +18,7 @@ typedef struct { int stringtab_size; /* The size (in bytes) of the string table */ int global_area_size; /* The size (in words) of global area */ int public_symbols_number; /* The number of public symbols */ - char buffer[0]; + char buffer[0]; } bytefile; /* Gets a string from a string table by an index */ @@ -45,7 +45,7 @@ bytefile* read_file (char *fname) { if (f == 0) { failure ("%s\n", strerror (errno)); } - + if (fseek (f, 0, SEEK_END) == -1) { failure ("%s\n", strerror (errno)); } @@ -55,31 +55,31 @@ bytefile* read_file (char *fname) { if (file == 0) { failure ("*** FAILURE: unable to allocate memory.\n"); } - + rewind (f); if (size != fread (&file->stringtab_size, 1, size, f)) { failure ("%s\n", strerror (errno)); } - + fclose (f); - + file->string_ptr = &file->buffer [file->public_symbols_number * 2 * sizeof(int)]; file->public_ptr = (int*) file->buffer; file->code_ptr = &file->string_ptr [file->stringtab_size]; file->global_ptr = (int*) malloc (file->global_area_size * sizeof (int)); - + return file; } /* Disassembles the bytecode pool */ void disassemble (FILE *f, bytefile *bf) { - + # define INT (ip += sizeof (int), *(int*)(ip - sizeof (int))) # define BYTE *ip++ # define STRING get_string (bf, INT) # define FAIL failure ("ERROR: invalid opcode %d-%d\n", h, l) - + char *ip = bf->code_ptr; char *ops [] = {"+", "-", "*", "/", "%", "<", "<=", ">", ">=", "==", "!=", "&&", "!!"}; char *pats[] = {"=str", "#string", "#array", "#sexp", "#ref", "#val", "#fun"}; @@ -90,59 +90,59 @@ void disassemble (FILE *f, bytefile *bf) { l = x & 0x0F; fprintf (f, "0x%.8x:\t", ip-bf->code_ptr-1); - + switch (h) { case 15: goto stop; - + /* BINOP */ case 0: fprintf (f, "BINOP\t%s", ops[l-1]); break; - + case 1: switch (l) { case 0: fprintf (f, "CONST\t%d", INT); break; - + case 1: fprintf (f, "STRING\t%s", STRING); break; - + case 2: fprintf (f, "SEXP\t%s ", STRING); fprintf (f, "%d", INT); break; - + case 3: fprintf (f, "STI"); break; - + case 4: fprintf (f, "STA"); break; - + case 5: fprintf (f, "JMP\t0x%.8x", INT); break; - + case 6: fprintf (f, "END"); break; - + case 7: fprintf (f, "RET"); break; - + case 8: fprintf (f, "DROP"); break; - + case 9: fprintf (f, "DUP"); break; - + case 10: fprintf (f, "SWAP"); break; @@ -150,12 +150,12 @@ void disassemble (FILE *f, bytefile *bf) { case 11: fprintf (f, "ELEM"); break; - + default: FAIL; } break; - + case 2: case 3: case 4: @@ -168,27 +168,27 @@ void disassemble (FILE *f, bytefile *bf) { default: FAIL; } break; - + case 5: switch (l) { case 0: fprintf (f, "CJMPz\t0x%.8x", INT); break; - + case 1: fprintf (f, "CJMPnz\t0x%.8x", INT); break; - + case 2: fprintf (f, "BEGIN\t%d ", INT); fprintf (f, "%d", INT); break; - + case 3: fprintf (f, "CBEGIN\t%d ", INT); fprintf (f, "%d", INT); break; - + case 4: fprintf (f, "CLOSURE\t0x%.8x", INT); {int n = INT; @@ -203,30 +203,30 @@ void disassemble (FILE *f, bytefile *bf) { } }; break; - + case 5: fprintf (f, "CALLC\t%d", INT); break; - + case 6: fprintf (f, "CALL\t0x%.8x ", INT); fprintf (f, "%d", INT); break; - + case 7: fprintf (f, "TAG\t%s ", STRING); fprintf (f, "%d", INT); break; - + case 8: fprintf (f, "ARRAY\t%d", INT); break; - + case 9: fprintf (f, "FAIL\t%d", INT); fprintf (f, "%d", INT); break; - + case 10: fprintf (f, "LINE\t%d", INT); break; @@ -235,7 +235,7 @@ void disassemble (FILE *f, bytefile *bf) { FAIL; } break; - + case 6: fprintf (f, "PATT\t%s", pats[l]); break; @@ -245,7 +245,7 @@ void disassemble (FILE *f, bytefile *bf) { case 0: fprintf (f, "CALL\tLread"); break; - + case 1: fprintf (f, "CALL\tLwrite"); break; @@ -267,7 +267,7 @@ void disassemble (FILE *f, bytefile *bf) { } } break; - + default: FAIL; } @@ -281,13 +281,13 @@ void disassemble (FILE *f, bytefile *bf) { /* Dumps the contents of the file */ void dump_file (FILE *f, bytefile *bf) { int i; - + fprintf (f, "String table size : %d\n", bf->stringtab_size); fprintf (f, "Global area size : %d\n", bf->global_area_size); fprintf (f, "Number of public symbols: %d\n", bf->public_symbols_number); fprintf (f, "Public symbols :\n"); - for (i=0; i < bf->public_symbols_number; i++) + for (i=0; i < bf->public_symbols_number; i++) fprintf (f, " 0x%.8x: %s\n", get_public_offset (bf, i), get_public_name (bf, i)); fprintf (f, "Code:\n"); From b55a3c80b68c419aee689cd030bc350f1f15ddda Mon Sep 17 00:00:00 2001 From: Kakadu Date: Thu, 27 Feb 2025 22:52:14 +0300 Subject: [PATCH 19/64] Fix compilation in performance/ Signed-off-by: Kakadu --- performance/dune | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/performance/dune b/performance/dune index d0dc1ca8c..e3114f99d 100644 --- a/performance/dune +++ b/performance/dune @@ -11,7 +11,7 @@ "../runtime" (run %{project_root}/src/Driver.exe - -march=x86_64 + -64 %{lama} -I ../stdlib/x64 From 5814b3f90ad0a0809c5108edee1567fc71902512 Mon Sep 17 00:00:00 2001 From: Danya Berezun Date: Thu, 27 Feb 2025 20:59:10 +0100 Subject: [PATCH 20/64] lapce fix --- byterun/byterun.c | 320 ++++++++++++++++++++++++++-------------------- 1 file changed, 180 insertions(+), 140 deletions(-) diff --git a/byterun/byterun.c b/byterun/byterun.c index 5269b313b..24538672d 100644 --- a/byterun/byterun.c +++ b/byterun/byterun.c @@ -1,154 +1,167 @@ /* Lama SM Bytecode interpreter */ -# include -# include -# include -# include -# include "../runtime/runtime.h" +#include +#include +#include +#include +#include "../runtime/runtime.h" void *__start_custom_data; void *__stop_custom_data; /* The unpacked representation of bytecode file */ -typedef struct { - char *string_ptr; /* A pointer to the beginning of the string table */ - int *public_ptr; /* A pointer to the beginning of publics table */ - char *code_ptr; /* A pointer to the bytecode itself */ - int *global_ptr; /* A pointer to the global area */ - int stringtab_size; /* The size (in bytes) of the string table */ - int global_area_size; /* The size (in words) of global area */ - int public_symbols_number; /* The number of public symbols */ - char buffer[0]; +typedef struct +{ + char *string_ptr; /* A pointer to the beginning of the string table */ + int *public_ptr; /* A pointer to the beginning of publics table */ + char *code_ptr; /* A pointer to the bytecode itself */ + int *global_ptr; /* A pointer to the global area */ + int stringtab_size; /* The size (in bytes) of the string table */ + int global_area_size; /* The size (in words) of global area */ + int public_symbols_number; /* The number of public symbols */ + char buffer[0]; } bytefile; /* Gets a string from a string table by an index */ -char* get_string (bytefile *f, int pos) { +char *get_string(bytefile *f, int pos) +{ return &f->string_ptr[pos]; } /* Gets a name for a public symbol */ -char* get_public_name (bytefile *f, int i) { - return get_string (f, f->public_ptr[i*2]); +char *get_public_name(bytefile *f, int i) +{ + return get_string(f, f->public_ptr[i * 2]); } /* Gets an offset for a publie symbol */ -int get_public_offset (bytefile *f, int i) { - return f->public_ptr[i*2+1]; +int get_public_offset(bytefile *f, int i) +{ + return f->public_ptr[i * 2 + 1]; } /* Reads a binary bytecode file by name and unpacks it */ -bytefile* read_file (char *fname) { - FILE *f = fopen (fname, "rb"); +bytefile *read_file(char *fname) +{ + FILE *f = fopen(fname, "rb"); long size; bytefile *file; - if (f == 0) { - failure ("%s\n", strerror (errno)); + if (f == 0) + { + failure("%s\n", strerror(errno)); } - if (fseek (f, 0, SEEK_END) == -1) { - failure ("%s\n", strerror (errno)); + if (fseek(f, 0, SEEK_END) == -1) + { + failure("%s\n", strerror(errno)); } - file = (bytefile*) malloc (sizeof(int)*4 + (size = ftell (f))); + file = (bytefile *)malloc(sizeof(int) * 4 + (size = ftell(f))); - if (file == 0) { - failure ("*** FAILURE: unable to allocate memory.\n"); + if (file == 0) + { + failure("*** FAILURE: unable to allocate memory.\n"); } - rewind (f); + rewind(f); - if (size != fread (&file->stringtab_size, 1, size, f)) { - failure ("%s\n", strerror (errno)); + if (size != fread(&file->stringtab_size, 1, size, f)) + { + failure("%s\n", strerror(errno)); } - fclose (f); + fclose(f); - file->string_ptr = &file->buffer [file->public_symbols_number * 2 * sizeof(int)]; - file->public_ptr = (int*) file->buffer; - file->code_ptr = &file->string_ptr [file->stringtab_size]; - file->global_ptr = (int*) malloc (file->global_area_size * sizeof (int)); + file->string_ptr = &file->buffer[file->public_symbols_number * 2 * sizeof(int)]; + file->public_ptr = (int *)file->buffer; + file->code_ptr = &file->string_ptr[file->stringtab_size]; + file->global_ptr = (int *)malloc(file->global_area_size * sizeof(int)); return file; } /* Disassembles the bytecode pool */ -void disassemble (FILE *f, bytefile *bf) { +void disassemble(FILE *f, bytefile *bf) +{ -# define INT (ip += sizeof (int), *(int*)(ip - sizeof (int))) -# define BYTE *ip++ -# define STRING get_string (bf, INT) -# define FAIL failure ("ERROR: invalid opcode %d-%d\n", h, l) +#define INT (ip += sizeof(int), *(int *)(ip - sizeof(int))) +#define BYTE *ip++ +#define STRING get_string(bf, INT) +#define FAIL failure("ERROR: invalid opcode %d-%d\n", h, l) - char *ip = bf->code_ptr; - char *ops [] = {"+", "-", "*", "/", "%", "<", "<=", ">", ">=", "==", "!=", "&&", "!!"}; + char *ip = bf->code_ptr; + char *ops[] = {"+", "-", "*", "/", "%", "<", "<=", ">", ">=", "==", "!=", "&&", "!!"}; char *pats[] = {"=str", "#string", "#array", "#sexp", "#ref", "#val", "#fun"}; - char *lds [] = {"LD", "LDA", "ST"}; - do { + char *lds[] = {"LD", "LDA", "ST"}; + do + { char x = BYTE, h = (x & 0xF0) >> 4, l = x & 0x0F; - fprintf (f, "0x%.8x:\t", ip-bf->code_ptr-1); + fprintf(f, "0x%.8x:\t", ip - bf->code_ptr - 1); - switch (h) { + switch (h) + { case 15: goto stop; /* BINOP */ case 0: - fprintf (f, "BINOP\t%s", ops[l-1]); + fprintf(f, "BINOP\t%s", ops[l - 1]); break; case 1: - switch (l) { - case 0: - fprintf (f, "CONST\t%d", INT); + switch (l) + { + case 0: + fprintf(f, "CONST\t%d", INT); break; - case 1: - fprintf (f, "STRING\t%s", STRING); + case 1: + fprintf(f, "STRING\t%s", STRING); break; - case 2: - fprintf (f, "SEXP\t%s ", STRING); - fprintf (f, "%d", INT); + case 2: + fprintf(f, "SEXP\t%s ", STRING); + fprintf(f, "%d", INT); break; - case 3: - fprintf (f, "STI"); + case 3: + fprintf(f, "STI"); break; - case 4: - fprintf (f, "STA"); + case 4: + fprintf(f, "STA"); break; - case 5: - fprintf (f, "JMP\t0x%.8x", INT); + case 5: + fprintf(f, "JMP\t0x%.8x", INT); break; - case 6: - fprintf (f, "END"); + case 6: + fprintf(f, "END"); break; - case 7: - fprintf (f, "RET"); + case 7: + fprintf(f, "RET"); break; - case 8: - fprintf (f, "DROP"); + case 8: + fprintf(f, "DROP"); break; - case 9: - fprintf (f, "DUP"); + case 9: + fprintf(f, "DUP"); break; case 10: - fprintf (f, "SWAP"); + fprintf(f, "SWAP"); break; case 11: - fprintf (f, "ELEM"); + fprintf(f, "ELEM"); break; default: @@ -159,76 +172,99 @@ void disassemble (FILE *f, bytefile *bf) { case 2: case 3: case 4: - fprintf (f, "%s\t", lds[h-2]); - switch (l) { - case 0: fprintf (f, "G(%d)", INT); break; - case 1: fprintf (f, "L(%d)", INT); break; - case 2: fprintf (f, "A(%d)", INT); break; - case 3: fprintf (f, "C(%d)", INT); break; - default: FAIL; + fprintf(f, "%s\t", lds[h - 2]); + switch (l) + { + case 0: + fprintf(f, "G(%d)", INT); + break; + case 1: + fprintf(f, "L(%d)", INT); + break; + case 2: + fprintf(f, "A(%d)", INT); + break; + case 3: + fprintf(f, "C(%d)", INT); + break; + default: + FAIL; } break; case 5: - switch (l) { - case 0: - fprintf (f, "CJMPz\t0x%.8x", INT); + switch (l) + { + case 0: + fprintf(f, "CJMPz\t0x%.8x", INT); break; - case 1: - fprintf (f, "CJMPnz\t0x%.8x", INT); + case 1: + fprintf(f, "CJMPnz\t0x%.8x", INT); break; - case 2: - fprintf (f, "BEGIN\t%d ", INT); - fprintf (f, "%d", INT); + case 2: + fprintf(f, "BEGIN\t%d ", INT); + fprintf(f, "%d", INT); break; - case 3: - fprintf (f, "CBEGIN\t%d ", INT); - fprintf (f, "%d", INT); + case 3: + fprintf(f, "CBEGIN\t%d ", INT); + fprintf(f, "%d", INT); break; - case 4: - fprintf (f, "CLOSURE\t0x%.8x", INT); - {int n = INT; - for (int i = 0; i\n"); + fprintf(f, "\n"); + } while (1); +stop: + fprintf(f, "\n"); } /* Dumps the contents of the file */ -void dump_file (FILE *f, bytefile *bf) { +void dump_file(FILE *f, bytefile *bf) +{ int i; - fprintf (f, "String table size : %d\n", bf->stringtab_size); - fprintf (f, "Global area size : %d\n", bf->global_area_size); - fprintf (f, "Number of public symbols: %d\n", bf->public_symbols_number); - fprintf (f, "Public symbols :\n"); + fprintf(f, "String table size : %d\n", bf->stringtab_size); + fprintf(f, "Global area size : %d\n", bf->global_area_size); + fprintf(f, "Number of public symbols: %d\n", bf->public_symbols_number); + fprintf(f, "Public symbols :\n"); - for (i=0; i < bf->public_symbols_number; i++) - fprintf (f, " 0x%.8x: %s\n", get_public_offset (bf, i), get_public_name (bf, i)); + for (i = 0; i < bf->public_symbols_number; i++) + fprintf(f, " 0x%.8x: %s\n", get_public_offset(bf, i), get_public_name(bf, i)); - fprintf (f, "Code:\n"); - disassemble (f, bf); + fprintf(f, "Code:\n"); + disassemble(f, bf); } -int main (int argc, char* argv[]) { - bytefile *f = read_file (argv[1]); - dump_file (stdout, f); +int main(int argc, char *argv[]) +{ + bytefile *f = read_file(argv[1]); + dump_file(stdout, f); return 0; } From b8d59864f098d3c80232f7bf8779f8b853aed621 Mon Sep 17 00:00:00 2001 From: Kakadu Date: Thu, 27 Feb 2025 23:06:22 +0300 Subject: [PATCH 21/64] Fix linking with runtime in performance/ Signed-off-by: Kakadu --- performance/dune | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/performance/dune b/performance/dune index e3114f99d..02977d8eb 100644 --- a/performance/dune +++ b/performance/dune @@ -2,7 +2,7 @@ (targets Sort.x64.exe) (deps (:lama Sort.lama) - ../runtime/runtime.a) + ../runtime/x64/runtime.a) (mode (promote (until-clean))) (action From 57a4bafb9af1b499987b4f2ca945043cd26ec02a Mon Sep 17 00:00:00 2001 From: Kakadu Date: Thu, 27 Feb 2025 23:15:28 +0300 Subject: [PATCH 22/64] Fix compilation in performance/ Signed-off-by: Kakadu --- performance/dune | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/performance/dune b/performance/dune index 02977d8eb..7528c4db9 100644 --- a/performance/dune +++ b/performance/dune @@ -1,8 +1,9 @@ (rule - (targets Sort.x64.exe) + (targets Sort.exe) (deps (:lama Sort.lama) - ../runtime/x64/runtime.a) + ../runtime/runtime.a + ../stdlib/x64/Fun.i) (mode (promote (until-clean))) (action @@ -15,7 +16,7 @@ %{lama} -I ../stdlib/x64 - -I + -runtime ../runtime -o %{targets})))) From 259b52bb833cc45d118cb6cc361b9224553d23e4 Mon Sep 17 00:00:00 2001 From: Kakadu Date: Thu, 27 Feb 2025 23:35:42 +0300 Subject: [PATCH 23/64] Add mac-specific flags to compile byterun on Darwin Signed-off-by: Kakadu --- byterun/dune | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/byterun/dune b/byterun/dune index 21ba79084..f5977e598 100644 --- a/byterun/dune +++ b/byterun/dune @@ -6,4 +6,24 @@ (mode (promote (until-clean))) (action - (run gcc -g %{main} %{runtime} -o %{target}))) + (run gcc %{read:mac-specific-flags.txt} -g %{main} %{runtime} -o %{target}))) + +(rule + (target mac-specific-flags.txt) + (enabled_if + (= %{system} "linux")) + (action + (progn + (with-stdout-to + %{target} + (run printf "-g"))))) + +(rule + (target mac-specific-flags.txt) + (enabled_if + (= %{system} "darwin")) + (action + (progn + (with-stdout-to + %{target} + (run printf "-arch x86_64 -ld_classic"))))) From fa030b8bd3603c7bbcff2d44c0d34c095a188f7d Mon Sep 17 00:00:00 2001 From: Kakadu Date: Thu, 27 Feb 2025 23:42:19 +0300 Subject: [PATCH 24/64] Forgotten depdenecy Signed-off-by: Kakadu --- byterun/dune | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/byterun/dune b/byterun/dune index f5977e598..e7ffb26a9 100644 --- a/byterun/dune +++ b/byterun/dune @@ -2,7 +2,8 @@ (target byterun.exe) (deps (:main byterun.c) - (:runtime ../runtime/runtime.a)) + (:runtime ../runtime/runtime.a) + mac-specific-flags.txt) (mode (promote (until-clean))) (action From 0aba2a2a01577a726a4ca1d2c98419209a2fd396 Mon Sep 17 00:00:00 2001 From: Kakadu Date: Thu, 27 Feb 2025 23:55:37 +0300 Subject: [PATCH 25/64] Trying to detect mac right Signed-off-by: Kakadu --- byterun/dune | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/byterun/dune b/byterun/dune index e7ffb26a9..0b37bada4 100644 --- a/byterun/dune +++ b/byterun/dune @@ -21,8 +21,7 @@ (rule (target mac-specific-flags.txt) - (enabled_if - (= %{system} "darwin")) + (= %{ocaml-config:system} macosx) (action (progn (with-stdout-to From ba9c32f38affc292f60f4368490a3290227b936e Mon Sep 17 00:00:00 2001 From: Kakadu Date: Fri, 28 Feb 2025 00:00:54 +0300 Subject: [PATCH 26/64] Fixup Signed-off-by: Kakadu --- byterun/dune | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/byterun/dune b/byterun/dune index 0b37bada4..167df0697 100644 --- a/byterun/dune +++ b/byterun/dune @@ -21,7 +21,8 @@ (rule (target mac-specific-flags.txt) - (= %{ocaml-config:system} macosx) + (enabled_if + (= %{ocaml-config:system} macosx)) (action (progn (with-stdout-to From 46f5e43cee919ef9ca2ed9eae9425fa0ce62a562 Mon Sep 17 00:00:00 2001 From: Kakadu Date: Fri, 28 Feb 2025 00:17:43 +0300 Subject: [PATCH 27/64] Fixup Signed-off-by: Kakadu --- byterun/dune | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/byterun/dune b/byterun/dune index 167df0697..6b8730c28 100644 --- a/byterun/dune +++ b/byterun/dune @@ -7,24 +7,25 @@ (mode (promote (until-clean))) (action - (run gcc %{read:mac-specific-flags.txt} -g %{main} %{runtime} -o %{target}))) + (run + gcc + %{read-lines:mac-specific-flags.txt} + -g + %{main} + %{runtime} + -o + %{target}))) (rule (target mac-specific-flags.txt) (enabled_if (= %{system} "linux")) (action - (progn - (with-stdout-to - %{target} - (run printf "-g"))))) + (write-file %{target} ""))) (rule (target mac-specific-flags.txt) (enabled_if (= %{ocaml-config:system} macosx)) (action - (progn - (with-stdout-to - %{target} - (run printf "-arch x86_64 -ld_classic"))))) + (write-file %{target} "-arch\nx86_64\n-ld_classic"))) From c9222fa070ff9b574b07bb365c33dbd1bb7d46f1 Mon Sep 17 00:00:00 2001 From: Danya Berezun Date: Thu, 27 Feb 2025 22:33:35 +0100 Subject: [PATCH 28/64] return make regression --- .github/workflows/blank.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/blank.yml b/.github/workflows/blank.yml index 6c20d9cc0..b2e42b490 100644 --- a/.github/workflows/blank.yml +++ b/.github/workflows/blank.yml @@ -49,4 +49,4 @@ jobs: - run: opam exec -- dune b - run: opam exec -- dune b @install - run: opam exec -- dune install - #- run: opam exec -- make regression + - run: opam exec -- make regression From 915f7149fc19105106fa7743cd2021fbd1a77c1d Mon Sep 17 00:00:00 2001 From: Danya Berezun Date: Thu, 27 Feb 2025 22:48:08 +0100 Subject: [PATCH 29/64] run regressio tests --- .github/workflows/blank.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/blank.yml b/.github/workflows/blank.yml index b2e42b490..ff051db3a 100644 --- a/.github/workflows/blank.yml +++ b/.github/workflows/blank.yml @@ -49,4 +49,5 @@ jobs: - run: opam exec -- dune b - run: opam exec -- dune b @install - run: opam exec -- dune install - - run: opam exec -- make regression + #- run: opam exec -- make regression + - run: opam exec -- dune test regression From 9ee38a3263aceb980109d9c5f18b9498ed0906eb Mon Sep 17 00:00:00 2001 From: Danya Berezun Date: Thu, 27 Feb 2025 22:59:22 +0100 Subject: [PATCH 30/64] try fix dune regression --- regression/dune | 476 ++++++++++++++++++++++++++++++++---------------- 1 file changed, 317 insertions(+), 159 deletions(-) diff --git a/regression/dune b/regression/dune index 2ddf89fc4..62c794da0 100644 --- a/regression/dune +++ b/regression/dune @@ -1,162 +1,320 @@ ; This file was autogenerated -(cram (deps ../src/Driver.exe ../runtime/Std.i)) +(cram + (deps ../src/Driver.exe ../runtime/runtime.a ../runtime/Std.i)) -(cram (applies_to test001) - (deps test001.lama test001.input)) -(cram (applies_to test002) - (deps test002.lama test002.input)) -(cram (applies_to test003) - (deps test003.lama test003.input)) -(cram (applies_to test004) - (deps test004.lama test004.input)) -(cram (applies_to test005) - (deps test005.lama test005.input)) -(cram (applies_to test006) - (deps test006.lama test006.input)) -(cram (applies_to test007) - (deps test007.lama test007.input)) -(cram (applies_to test008) - (deps test008.lama test008.input)) -(cram (applies_to test009) - (deps test009.lama test009.input)) -(cram (applies_to test010) - (deps test010.lama test010.input)) -(cram (applies_to test011) - (deps test011.lama test011.input)) -(cram (applies_to test012) - (deps test012.lama test012.input)) -(cram (applies_to test013) - (deps test013.lama test013.input)) -(cram (applies_to test014) - (deps test014.lama test014.input)) -(cram (applies_to test015) - (deps test015.lama test015.input)) -(cram (applies_to test016) - (deps test016.lama test016.input)) -(cram (applies_to test017) - (deps test017.lama test017.input)) -(cram (applies_to test018) - (deps test018.lama test018.input)) -(cram (applies_to test019) - (deps test019.lama test019.input)) -(cram (applies_to test020) - (deps test020.lama test020.input)) -(cram (applies_to test021) - (deps test021.lama test021.input)) -(cram (applies_to test022) - (deps test022.lama test022.input)) -(cram (applies_to test023) - (deps test023.lama test023.input)) -(cram (applies_to test024) - (deps test024.lama test024.input)) -(cram (applies_to test025) - (deps test025.lama test025.input)) -(cram (applies_to test026) - (deps test026.lama test026.input)) -(cram (applies_to test027) - (deps test027.lama test027.input)) -(cram (applies_to test028) - (deps test028.lama test028.input)) -(cram (applies_to test029) - (deps test029.lama test029.input)) -(cram (applies_to test034) - (deps test034.lama test034.input)) -(cram (applies_to test036) - (deps test036.lama test036.input)) -(cram (applies_to test040) - (deps test040.lama test040.input)) -(cram (applies_to test041) - (deps test041.lama test041.input)) -(cram (applies_to test042) - (deps test042.lama test042.input)) -(cram (applies_to test045) - (deps test045.lama test045.input)) -(cram (applies_to test046) - (deps test046.lama test046.input)) -(cram (applies_to test050) - (deps test050.lama test050.input)) -(cram (applies_to test054) - (deps test054.lama test054.input)) -(cram (applies_to test059) - (deps test059.lama test059.input)) -(cram (applies_to test063) - (deps test063.lama test063.input)) -(cram (applies_to test072) - (deps test072.lama test072.input)) -(cram (applies_to test073) - (deps test073.lama test073.input)) -(cram (applies_to test074) - (deps test074.lama test074.input)) -(cram (applies_to test077) - (deps test077.lama test077.input)) -(cram (applies_to test078) - (deps test078.lama test078.input)) -(cram (applies_to test079) - (deps test079.lama test079.input)) -(cram (applies_to test080) - (deps test080.lama test080.input)) -(cram (applies_to test081) - (deps test081.lama test081.input)) -(cram (applies_to test082) - (deps test082.lama test082.input)) -(cram (applies_to test083) - (deps test083.lama test083.input)) -(cram (applies_to test084) - (deps test084.lama test084.input)) -(cram (applies_to test085) - (deps test085.lama test085.input)) -(cram (applies_to test086) - (deps test086.lama test086.input)) -(cram (applies_to test088) - (deps test088.lama test088.input)) -(cram (applies_to test089) - (deps test089.lama test089.input)) -(cram (applies_to test090) - (deps test090.lama test090.input)) -(cram (applies_to test091) - (deps test091.lama test091.input)) -(cram (applies_to test092) - (deps test092.lama test092.input)) -(cram (applies_to test093) - (deps test093.lama test093.input)) -(cram (applies_to test094) - (deps test094.lama test094.input)) -(cram (applies_to test095) - (deps test095.lama test095.input)) -(cram (applies_to test096) - (deps test096.lama test096.input)) -(cram (applies_to test097) - (deps test097.lama test097.input)) -(cram (applies_to test098) - (deps test098.lama test098.input)) -(cram (applies_to test099) - (deps test099.lama test099.input)) -(cram (applies_to test100) - (deps test100.lama test100.input)) -(cram (applies_to test101) - (deps test101.lama test101.input)) -(cram (applies_to test102) - (deps test102.lama test102.input)) -(cram (applies_to test103) - (deps test103.lama test103.input)) -(cram (applies_to test104) - (deps test104.lama test104.input)) -(cram (applies_to test105) - (deps test105.lama test105.input)) -(cram (applies_to test106) - (deps test106.lama test106.input)) -(cram (applies_to test107) - (deps test107.lama test107.input)) -(cram (applies_to test110) - (deps test110.lama test110.input)) -(cram (applies_to test111) - (deps test111.lama test111.input)) -(cram (applies_to test112) - (deps test112.lama test112.input)) -(cram (applies_to test801) - (deps test801.lama test801.input)) -(cram (applies_to test802) - (deps test802.lama test802.input)) -(cram (applies_to test803) - (deps test803.lama test803.input)) +(cram + (applies_to test001) + (deps test001.lama test001.input)) + +(cram + (applies_to test002) + (deps test002.lama test002.input)) + +(cram + (applies_to test003) + (deps test003.lama test003.input)) + +(cram + (applies_to test004) + (deps test004.lama test004.input)) + +(cram + (applies_to test005) + (deps test005.lama test005.input)) + +(cram + (applies_to test006) + (deps test006.lama test006.input)) + +(cram + (applies_to test007) + (deps test007.lama test007.input)) + +(cram + (applies_to test008) + (deps test008.lama test008.input)) + +(cram + (applies_to test009) + (deps test009.lama test009.input)) + +(cram + (applies_to test010) + (deps test010.lama test010.input)) + +(cram + (applies_to test011) + (deps test011.lama test011.input)) + +(cram + (applies_to test012) + (deps test012.lama test012.input)) + +(cram + (applies_to test013) + (deps test013.lama test013.input)) + +(cram + (applies_to test014) + (deps test014.lama test014.input)) + +(cram + (applies_to test015) + (deps test015.lama test015.input)) + +(cram + (applies_to test016) + (deps test016.lama test016.input)) + +(cram + (applies_to test017) + (deps test017.lama test017.input)) + +(cram + (applies_to test018) + (deps test018.lama test018.input)) + +(cram + (applies_to test019) + (deps test019.lama test019.input)) + +(cram + (applies_to test020) + (deps test020.lama test020.input)) + +(cram + (applies_to test021) + (deps test021.lama test021.input)) + +(cram + (applies_to test022) + (deps test022.lama test022.input)) + +(cram + (applies_to test023) + (deps test023.lama test023.input)) + +(cram + (applies_to test024) + (deps test024.lama test024.input)) + +(cram + (applies_to test025) + (deps test025.lama test025.input)) + +(cram + (applies_to test026) + (deps test026.lama test026.input)) + +(cram + (applies_to test027) + (deps test027.lama test027.input)) + +(cram + (applies_to test028) + (deps test028.lama test028.input)) + +(cram + (applies_to test029) + (deps test029.lama test029.input)) + +(cram + (applies_to test034) + (deps test034.lama test034.input)) + +(cram + (applies_to test036) + (deps test036.lama test036.input)) + +(cram + (applies_to test040) + (deps test040.lama test040.input)) + +(cram + (applies_to test041) + (deps test041.lama test041.input)) + +(cram + (applies_to test042) + (deps test042.lama test042.input)) + +(cram + (applies_to test045) + (deps test045.lama test045.input)) + +(cram + (applies_to test046) + (deps test046.lama test046.input)) + +(cram + (applies_to test050) + (deps test050.lama test050.input)) + +(cram + (applies_to test054) + (deps test054.lama test054.input)) + +(cram + (applies_to test059) + (deps test059.lama test059.input)) + +(cram + (applies_to test063) + (deps test063.lama test063.input)) + +(cram + (applies_to test072) + (deps test072.lama test072.input)) + +(cram + (applies_to test073) + (deps test073.lama test073.input)) + +(cram + (applies_to test074) + (deps test074.lama test074.input)) + +(cram + (applies_to test077) + (deps test077.lama test077.input)) + +(cram + (applies_to test078) + (deps test078.lama test078.input)) + +(cram + (applies_to test079) + (deps test079.lama test079.input)) + +(cram + (applies_to test080) + (deps test080.lama test080.input)) + +(cram + (applies_to test081) + (deps test081.lama test081.input)) + +(cram + (applies_to test082) + (deps test082.lama test082.input)) + +(cram + (applies_to test083) + (deps test083.lama test083.input)) + +(cram + (applies_to test084) + (deps test084.lama test084.input)) + +(cram + (applies_to test085) + (deps test085.lama test085.input)) + +(cram + (applies_to test086) + (deps test086.lama test086.input)) + +(cram + (applies_to test088) + (deps test088.lama test088.input)) + +(cram + (applies_to test089) + (deps test089.lama test089.input)) + +(cram + (applies_to test090) + (deps test090.lama test090.input)) + +(cram + (applies_to test091) + (deps test091.lama test091.input)) + +(cram + (applies_to test092) + (deps test092.lama test092.input)) + +(cram + (applies_to test093) + (deps test093.lama test093.input)) + +(cram + (applies_to test094) + (deps test094.lama test094.input)) + +(cram + (applies_to test095) + (deps test095.lama test095.input)) + +(cram + (applies_to test096) + (deps test096.lama test096.input)) + +(cram + (applies_to test097) + (deps test097.lama test097.input)) + +(cram + (applies_to test098) + (deps test098.lama test098.input)) + +(cram + (applies_to test099) + (deps test099.lama test099.input)) + +(cram + (applies_to test100) + (deps test100.lama test100.input)) + +(cram + (applies_to test101) + (deps test101.lama test101.input)) + +(cram + (applies_to test102) + (deps test102.lama test102.input)) + +(cram + (applies_to test103) + (deps test103.lama test103.input)) + +(cram + (applies_to test104) + (deps test104.lama test104.input)) + +(cram + (applies_to test105) + (deps test105.lama test105.input)) + +(cram + (applies_to test106) + (deps test106.lama test106.input)) + +(cram + (applies_to test107) + (deps test107.lama test107.input)) + +(cram + (applies_to test110) + (deps test110.lama test110.input)) + +(cram + (applies_to test111) + (deps test111.lama test111.input)) + +(cram + (applies_to test112) + (deps test112.lama test112.input)) + +(cram + (applies_to test801) + (deps test801.lama test801.input)) + +(cram + (applies_to test802) + (deps test802.lama test802.input)) + +(cram + (applies_to test803) + (deps test803.lama test803.input)) From 90ce8921250575ebc8e8025bf2049f8b3aaae114 Mon Sep 17 00:00:00 2001 From: Danya Berezun Date: Thu, 27 Feb 2025 23:39:06 +0100 Subject: [PATCH 31/64] fix deps --- regression/dune | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/regression/dune b/regression/dune index 62c794da0..255c948c1 100644 --- a/regression/dune +++ b/regression/dune @@ -1,7 +1,10 @@ ; This file was autogenerated (cram - (deps ../src/Driver.exe ../runtime/runtime.a ../runtime/Std.i)) + (deps ../src/Driver.exe)) + +(cram + (deps ../../runtime/runtime.a ../../runtime/Std.i)) (cram (applies_to test001) From 60dd8cfc8dcb7b5ab882c24afd28c49866c2685e Mon Sep 17 00:00:00 2001 From: Danya Berezun Date: Thu, 27 Feb 2025 23:44:30 +0100 Subject: [PATCH 32/64] fix deps --- regression/dune | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/regression/dune b/regression/dune index 255c948c1..fb700e642 100644 --- a/regression/dune +++ b/regression/dune @@ -4,7 +4,7 @@ (deps ../src/Driver.exe)) (cram - (deps ../../runtime/runtime.a ../../runtime/Std.i)) + (deps ../runtime/runtime.a ../runtime/Std.i)) (cram (applies_to test001) From 51d447ac87b0c2c7650d6f0a964fb7a7a6315dc3 Mon Sep 17 00:00:00 2001 From: Danya Berezun Date: Fri, 28 Feb 2025 11:40:25 +0100 Subject: [PATCH 33/64] upd --- .github/workflows/blank.yml | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/.github/workflows/blank.yml b/.github/workflows/blank.yml index ff051db3a..5d0a4cce1 100644 --- a/.github/workflows/blank.yml +++ b/.github/workflows/blank.yml @@ -44,10 +44,11 @@ jobs: - run: rm -fr runtime32 if: ${{ matrix.os == 'macos-latest' }} - - - run: opam exec -- dune test stdlib/regression -j1 - - run: opam exec -- dune b - - run: opam exec -- dune b @install - - run: opam exec -- dune install - #- run: opam exec -- make regression - - run: opam exec -- dune test regression + - run: opam exec -- make install + - run: opam exec -- make regression + # - run: opam exec -- dune test stdlib/regression -j1 + # - run: opam exec -- dune b + # - run: opam exec -- dune b @install + # - run: opam exec -- dune install + # - run: opam exec -- make regression + # - run: opam exec -- dune test regression From 3f3fe7c83b23c9929ff9e54c2b0c55ee6cb94989 Mon Sep 17 00:00:00 2001 From: Danya Berezun Date: Fri, 28 Feb 2025 11:51:56 +0100 Subject: [PATCH 34/64] upd --- .github/workflows/blank.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/blank.yml b/.github/workflows/blank.yml index 5d0a4cce1..d3be10735 100644 --- a/.github/workflows/blank.yml +++ b/.github/workflows/blank.yml @@ -44,7 +44,10 @@ jobs: - run: rm -fr runtime32 if: ${{ matrix.os == 'macos-latest' }} + - run: opam exec -- dune b src runtime stdlib tutorial + if: ${{ matrix.os == 'macos-latest' }} - run: opam exec -- make install + if: ${{ matrix.os != 'macos-latest' }} - run: opam exec -- make regression # - run: opam exec -- dune test stdlib/regression -j1 # - run: opam exec -- dune b From 8ff31222f32e6f868ffc1a00a67f32154f94822f Mon Sep 17 00:00:00 2001 From: Danya Berezun Date: Fri, 28 Feb 2025 12:34:47 +0100 Subject: [PATCH 35/64] run all regression tests --- .github/workflows/blank.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/blank.yml b/.github/workflows/blank.yml index d3be10735..ca9556395 100644 --- a/.github/workflows/blank.yml +++ b/.github/workflows/blank.yml @@ -48,7 +48,7 @@ jobs: if: ${{ matrix.os == 'macos-latest' }} - run: opam exec -- make install if: ${{ matrix.os != 'macos-latest' }} - - run: opam exec -- make regression + - run: opam exec -- make regression-all # - run: opam exec -- dune test stdlib/regression -j1 # - run: opam exec -- dune b # - run: opam exec -- dune b @install From 5249037ea1c96e3bda8b80e7f4a4b53360906c8e Mon Sep 17 00:00:00 2001 From: danyaberezun Date: Fri, 28 Feb 2025 14:43:20 +0100 Subject: [PATCH 36/64] upd --- .github/workflows/blank.yml | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/.github/workflows/blank.yml b/.github/workflows/blank.yml index ca9556395..e328b9ead 100644 --- a/.github/workflows/blank.yml +++ b/.github/workflows/blank.yml @@ -44,11 +44,19 @@ jobs: - run: rm -fr runtime32 if: ${{ matrix.os == 'macos-latest' }} - - run: opam exec -- dune b src runtime stdlib tutorial - if: ${{ matrix.os == 'macos-latest' }} - - run: opam exec -- make install - if: ${{ matrix.os != 'macos-latest' }} + - run: opam exec -- dune b + - run: opam exec -- dune install - run: opam exec -- make regression-all + + # works + # - run: rm -fr runtime32 + # if: ${{ matrix.os == 'macos-latest' }} + # - run: opam exec -- dune b src runtime stdlib tutorial + # if: ${{ matrix.os == 'macos-latest' }} + # - run: opam exec -- make install + # if: ${{ matrix.os != 'macos-latest' }} + # - run: opam exec -- make regression-all + # - run: opam exec -- dune test stdlib/regression -j1 # - run: opam exec -- dune b # - run: opam exec -- dune b @install From 1e60c4686b17dcfb21ccebd791ac80180c8e3851 Mon Sep 17 00:00:00 2001 From: danyaberezun Date: Fri, 28 Feb 2025 14:58:33 +0100 Subject: [PATCH 37/64] upd --- .github/workflows/blank.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/blank.yml b/.github/workflows/blank.yml index e328b9ead..bcc2a8648 100644 --- a/.github/workflows/blank.yml +++ b/.github/workflows/blank.yml @@ -45,6 +45,7 @@ jobs: - run: rm -fr runtime32 if: ${{ matrix.os == 'macos-latest' }} - run: opam exec -- dune b + - run: opam exec -- dune @install - run: opam exec -- dune install - run: opam exec -- make regression-all From 6efd9383ef2624ce88f3238172b946aa78872112 Mon Sep 17 00:00:00 2001 From: danyaberezun Date: Fri, 28 Feb 2025 15:03:16 +0100 Subject: [PATCH 38/64] fix missing b --- .github/workflows/blank.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/blank.yml b/.github/workflows/blank.yml index bcc2a8648..5b507d16b 100644 --- a/.github/workflows/blank.yml +++ b/.github/workflows/blank.yml @@ -45,7 +45,7 @@ jobs: - run: rm -fr runtime32 if: ${{ matrix.os == 'macos-latest' }} - run: opam exec -- dune b - - run: opam exec -- dune @install + - run: opam exec -- dune b @install - run: opam exec -- dune install - run: opam exec -- make regression-all From fc1ed3da7f616a515dba0a0cbd58c4b5bc64c6aa Mon Sep 17 00:00:00 2001 From: danyaberezun Date: Fri, 28 Feb 2025 15:12:02 +0100 Subject: [PATCH 39/64] try --- .github/workflows/blank.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/blank.yml b/.github/workflows/blank.yml index 5b507d16b..4e2ced1a9 100644 --- a/.github/workflows/blank.yml +++ b/.github/workflows/blank.yml @@ -45,8 +45,8 @@ jobs: - run: rm -fr runtime32 if: ${{ matrix.os == 'macos-latest' }} - run: opam exec -- dune b - - run: opam exec -- dune b @install - - run: opam exec -- dune install + - run: opam exec -- dune b @install --profile=release + - run: opam exec -- dune install --profile=release - run: opam exec -- make regression-all # works From 2c0f13fb1833693b29316af9db4a7f332a5b2a99 Mon Sep 17 00:00:00 2001 From: danyaberezun Date: Fri, 28 Feb 2025 15:20:46 +0100 Subject: [PATCH 40/64] try --- .github/workflows/blank.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/workflows/blank.yml b/.github/workflows/blank.yml index 4e2ced1a9..629bba6a9 100644 --- a/.github/workflows/blank.yml +++ b/.github/workflows/blank.yml @@ -45,6 +45,10 @@ jobs: - run: rm -fr runtime32 if: ${{ matrix.os == 'macos-latest' }} - run: opam exec -- dune b + - run: opam exec -- dune b src runtime runtime32 stdlib tutorial + if: ${{ matrix.os != 'macos-latest' }} + - run: opam exec -- dune b src runtime stdlib tutorial + if: ${{ matrix.os == 'macos-latest' }} - run: opam exec -- dune b @install --profile=release - run: opam exec -- dune install --profile=release - run: opam exec -- make regression-all From 68fbad70cf7704d71e2f5c435f9e2e3193f296b6 Mon Sep 17 00:00:00 2001 From: danyaberezun Date: Fri, 28 Feb 2025 15:32:56 +0100 Subject: [PATCH 41/64] try --- .github/workflows/blank.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/blank.yml b/.github/workflows/blank.yml index 629bba6a9..4d9b69854 100644 --- a/.github/workflows/blank.yml +++ b/.github/workflows/blank.yml @@ -44,14 +44,14 @@ jobs: - run: rm -fr runtime32 if: ${{ matrix.os == 'macos-latest' }} - - run: opam exec -- dune b - run: opam exec -- dune b src runtime runtime32 stdlib tutorial if: ${{ matrix.os != 'macos-latest' }} - run: opam exec -- dune b src runtime stdlib tutorial if: ${{ matrix.os == 'macos-latest' }} - run: opam exec -- dune b @install --profile=release - run: opam exec -- dune install --profile=release - - run: opam exec -- make regression-all + - run: opam exec -- dune test regression stdlib/regression regression_long + # - run: opam exec -- make regression-all # works # - run: rm -fr runtime32 From ab306abfd10a4e4e273059fdb39338aca1eb97b0 Mon Sep 17 00:00:00 2001 From: danyaberezun Date: Fri, 28 Feb 2025 15:44:54 +0100 Subject: [PATCH 42/64] try --- .github/workflows/blank.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/blank.yml b/.github/workflows/blank.yml index 4d9b69854..0783640ff 100644 --- a/.github/workflows/blank.yml +++ b/.github/workflows/blank.yml @@ -50,7 +50,9 @@ jobs: if: ${{ matrix.os == 'macos-latest' }} - run: opam exec -- dune b @install --profile=release - run: opam exec -- dune install --profile=release - - run: opam exec -- dune test regression stdlib/regression regression_long + - run: opam exec -- dune test stdlib/regression + - run: opam exec -- dune test regression_long + - run: opam exec -- dune test regression # - run: opam exec -- make regression-all # works From e88662bb52705930a57e99cc4707e82d74449119 Mon Sep 17 00:00:00 2001 From: danyaberezun Date: Fri, 28 Feb 2025 15:54:25 +0100 Subject: [PATCH 43/64] try to fix regression --- regression/dune | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/regression/dune b/regression/dune index fb700e642..3ae196aef 100644 --- a/regression/dune +++ b/regression/dune @@ -1,10 +1,6 @@ ; This file was autogenerated -(cram - (deps ../src/Driver.exe)) - -(cram - (deps ../runtime/runtime.a ../runtime/Std.i)) +(cram (deps ../src/Driver.exe ../runtime/Std.i)) (cram (applies_to test001) From 99a7b55fef9b5b65c6e700177b798020e14f8190 Mon Sep 17 00:00:00 2001 From: Kakadu Date: Fri, 28 Feb 2025 18:21:16 +0300 Subject: [PATCH 44/64] Add docker CI Signed-off-by: Kakadu --- .github/workflows/docker.yml | 39 ++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 .github/workflows/docker.yml diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml new file mode 100644 index 000000000..ba2be1ea1 --- /dev/null +++ b/.github/workflows/docker.yml @@ -0,0 +1,39 @@ +name: Build in docker +on: + push: + branches: + - '1.30' + - 'i686-cross' + +jobs: + build: + env: + #OCANREN_STATS: yes + # enabling stats required extra link library + OCANREN_DOCS: yes + OPAMROOT: /home/user/.opam + + runs-on: ubuntu-24.04 + container: + image: kakadu18/ocaml:lama + options: --user user + + steps: + - run: opam --version + - run: opam exec -- ocamlopt --version + + - name: Cancel Previous Runs + uses: styfle/cancel-workflow-action@0.11.0 + with: + access_token: ${{ github.token }} + + - name: Checkout code + uses: actions/checkout@v4 + + - run: opam install . --yes --deps-only --with-test --with-doc + + - name: List installed packages + run: opam list + + - run: opam exec -- dune build --profile=release + - run: opam exec -- dune test regression/ stdlib/regression From afe3e1eabed717150dbc1096a01dbcf45c59fec6 Mon Sep 17 00:00:00 2001 From: danyaberezun Date: Fri, 28 Feb 2025 16:25:11 +0100 Subject: [PATCH 45/64] uptd --- regression/dune | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/regression/dune b/regression/dune index 3ae196aef..f4cef0eb7 100644 --- a/regression/dune +++ b/regression/dune @@ -1,6 +1,7 @@ ; This file was autogenerated -(cram (deps ../src/Driver.exe ../runtime/Std.i)) +(cram (deps ../src/Driver.exe)) +(cram (deps ../runtime/runtime.a ../runtime/Std.i)) (cram (applies_to test001) From 69717c63853c958c1729e43893de6c656a6a1e6c Mon Sep 17 00:00:00 2001 From: Kakadu Date: Fri, 28 Feb 2025 18:28:50 +0300 Subject: [PATCH 46/64] debugging docker build Signed-off-by: Kakadu --- .github/workflows/docker.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml index ba2be1ea1..c8d0e1008 100644 --- a/.github/workflows/docker.yml +++ b/.github/workflows/docker.yml @@ -30,7 +30,10 @@ jobs: - name: Checkout code uses: actions/checkout@v4 - - run: opam install . --yes --deps-only --with-test --with-doc + - run: | + opam install . --depext-only --with-test --with-doc + opam install . --deps-only --with-test --with-doc + - name: List installed packages run: opam list From a3f2f67f7a2d881077b5884cbcba81ce3477ba1d Mon Sep 17 00:00:00 2001 From: Kakadu Date: Fri, 28 Feb 2025 18:32:37 +0300 Subject: [PATCH 47/64] Fixing docker Signed-off-by: Kakadu --- .github/workflows/docker.yml | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml index c8d0e1008..a7b8201c2 100644 --- a/.github/workflows/docker.yml +++ b/.github/workflows/docker.yml @@ -4,15 +4,13 @@ on: branches: - '1.30' - 'i686-cross' - + +env: + OPAMROOT: /home/opam/.opam + OPAMCONFIRMLEVEL: unsafe-yes + jobs: build: - env: - #OCANREN_STATS: yes - # enabling stats required extra link library - OCANREN_DOCS: yes - OPAMROOT: /home/user/.opam - runs-on: ubuntu-24.04 container: image: kakadu18/ocaml:lama From 94ae4b5d34ac409536b6488f68ae46ab9a1d15c4 Mon Sep 17 00:00:00 2001 From: Kakadu Date: Fri, 28 Feb 2025 18:34:21 +0300 Subject: [PATCH 48/64] FIx CI Docker Signed-off-by: Kakadu --- .github/workflows/docker.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml index a7b8201c2..8444096cf 100644 --- a/.github/workflows/docker.yml +++ b/.github/workflows/docker.yml @@ -6,7 +6,6 @@ on: - 'i686-cross' env: - OPAMROOT: /home/opam/.opam OPAMCONFIRMLEVEL: unsafe-yes jobs: From d8dc84cf2c973ee009fa0598d6f666d9e43d7ed9 Mon Sep 17 00:00:00 2001 From: Kakadu Date: Fri, 28 Feb 2025 18:37:02 +0300 Subject: [PATCH 49/64] FIx CI Docker Signed-off-by: Kakadu --- .github/workflows/docker.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml index 8444096cf..472a58e86 100644 --- a/.github/workflows/docker.yml +++ b/.github/workflows/docker.yml @@ -13,7 +13,7 @@ jobs: runs-on: ubuntu-24.04 container: image: kakadu18/ocaml:lama - options: --user user + #options: --user user steps: - run: opam --version From 739a59ebd87ab5ad74d739c87ad28f57f94c3191 Mon Sep 17 00:00:00 2001 From: danyaberezun Date: Fri, 28 Feb 2025 17:12:46 +0100 Subject: [PATCH 50/64] update regression tests --- regression/dune | 478 +++++++++++++++---------------------------- regression/gen.ml | 2 +- regression/test001.t | 5 +- regression/test002.t | 5 +- regression/test003.t | 7 +- regression/test004.t | 5 +- regression/test005.t | 5 +- regression/test006.t | 10 +- regression/test007.t | 5 +- regression/test008.t | 5 +- regression/test009.t | 5 +- regression/test010.t | 5 +- regression/test011.t | 5 +- regression/test012.t | 12 +- regression/test013.t | 12 +- regression/test014.t | 35 +++- regression/test015.t | 5 +- regression/test016.t | 5 +- regression/test017.t | 5 +- regression/test018.t | 18 +- regression/test019.t | 5 +- regression/test020.t | 5 +- regression/test021.t | 5 +- regression/test022.t | 5 +- regression/test023.t | 5 +- regression/test024.t | 6 +- regression/test025.t | 16 +- regression/test026.t | 25 ++- regression/test027.t | 39 +++- regression/test028.t | 18 +- regression/test029.t | 22 +- regression/test034.t | 20 +- regression/test036.t | 20 +- regression/test040.t | 8 +- regression/test041.t | 6 +- regression/test042.t | 14 +- regression/test045.t | 44 +++- regression/test046.t | 17 +- regression/test050.t | 5 +- regression/test054.t | 17 +- regression/test059.t | 7 +- regression/test063.t | 6 +- regression/test072.t | 22 +- regression/test073.t | 18 +- regression/test074.t | 40 +++- regression/test077.t | 10 +- regression/test078.t | 16 +- regression/test079.t | 10 +- regression/test080.t | 7 +- regression/test081.t | 10 +- regression/test082.t | 21 +- regression/test083.t | 7 +- regression/test084.t | 7 +- regression/test085.t | 12 +- regression/test086.t | 7 +- regression/test088.t | 6 +- regression/test089.t | 5 +- regression/test090.t | 7 +- regression/test091.t | 13 +- regression/test092.t | 9 +- regression/test093.t | 6 +- regression/test094.t | 8 +- regression/test095.t | 5 +- regression/test096.t | 6 +- regression/test097.t | 5 +- regression/test098.t | 5 +- regression/test099.t | 7 +- regression/test100.t | 5 +- regression/test101.t | 5 +- regression/test102.t | 5 +- regression/test103.t | 5 +- regression/test104.t | 14 +- regression/test105.t | 5 +- regression/test106.t | 6 +- regression/test107.t | 5 +- regression/test110.t | 10 +- regression/test111.t | 4 +- regression/test112.t | 15 +- regression/test801.t | 9 +- regression/test802.t | 14 +- regression/test803.t | 6 +- 81 files changed, 771 insertions(+), 555 deletions(-) diff --git a/regression/dune b/regression/dune index f4cef0eb7..2ddf89fc4 100644 --- a/regression/dune +++ b/regression/dune @@ -1,320 +1,162 @@ ; This file was autogenerated -(cram (deps ../src/Driver.exe)) -(cram (deps ../runtime/runtime.a ../runtime/Std.i)) - -(cram - (applies_to test001) - (deps test001.lama test001.input)) - -(cram - (applies_to test002) - (deps test002.lama test002.input)) - -(cram - (applies_to test003) - (deps test003.lama test003.input)) - -(cram - (applies_to test004) - (deps test004.lama test004.input)) - -(cram - (applies_to test005) - (deps test005.lama test005.input)) - -(cram - (applies_to test006) - (deps test006.lama test006.input)) - -(cram - (applies_to test007) - (deps test007.lama test007.input)) - -(cram - (applies_to test008) - (deps test008.lama test008.input)) - -(cram - (applies_to test009) - (deps test009.lama test009.input)) - -(cram - (applies_to test010) - (deps test010.lama test010.input)) - -(cram - (applies_to test011) - (deps test011.lama test011.input)) - -(cram - (applies_to test012) - (deps test012.lama test012.input)) - -(cram - (applies_to test013) - (deps test013.lama test013.input)) - -(cram - (applies_to test014) - (deps test014.lama test014.input)) - -(cram - (applies_to test015) - (deps test015.lama test015.input)) - -(cram - (applies_to test016) - (deps test016.lama test016.input)) - -(cram - (applies_to test017) - (deps test017.lama test017.input)) - -(cram - (applies_to test018) - (deps test018.lama test018.input)) - -(cram - (applies_to test019) - (deps test019.lama test019.input)) - -(cram - (applies_to test020) - (deps test020.lama test020.input)) - -(cram - (applies_to test021) - (deps test021.lama test021.input)) - -(cram - (applies_to test022) - (deps test022.lama test022.input)) - -(cram - (applies_to test023) - (deps test023.lama test023.input)) - -(cram - (applies_to test024) - (deps test024.lama test024.input)) - -(cram - (applies_to test025) - (deps test025.lama test025.input)) - -(cram - (applies_to test026) - (deps test026.lama test026.input)) - -(cram - (applies_to test027) - (deps test027.lama test027.input)) - -(cram - (applies_to test028) - (deps test028.lama test028.input)) - -(cram - (applies_to test029) - (deps test029.lama test029.input)) - -(cram - (applies_to test034) - (deps test034.lama test034.input)) - -(cram - (applies_to test036) - (deps test036.lama test036.input)) - -(cram - (applies_to test040) - (deps test040.lama test040.input)) - -(cram - (applies_to test041) - (deps test041.lama test041.input)) - -(cram - (applies_to test042) - (deps test042.lama test042.input)) - -(cram - (applies_to test045) - (deps test045.lama test045.input)) - -(cram - (applies_to test046) - (deps test046.lama test046.input)) - -(cram - (applies_to test050) - (deps test050.lama test050.input)) - -(cram - (applies_to test054) - (deps test054.lama test054.input)) - -(cram - (applies_to test059) - (deps test059.lama test059.input)) - -(cram - (applies_to test063) - (deps test063.lama test063.input)) - -(cram - (applies_to test072) - (deps test072.lama test072.input)) - -(cram - (applies_to test073) - (deps test073.lama test073.input)) - -(cram - (applies_to test074) - (deps test074.lama test074.input)) - -(cram - (applies_to test077) - (deps test077.lama test077.input)) - -(cram - (applies_to test078) - (deps test078.lama test078.input)) - -(cram - (applies_to test079) - (deps test079.lama test079.input)) - -(cram - (applies_to test080) - (deps test080.lama test080.input)) - -(cram - (applies_to test081) - (deps test081.lama test081.input)) - -(cram - (applies_to test082) - (deps test082.lama test082.input)) - -(cram - (applies_to test083) - (deps test083.lama test083.input)) - -(cram - (applies_to test084) - (deps test084.lama test084.input)) - -(cram - (applies_to test085) - (deps test085.lama test085.input)) - -(cram - (applies_to test086) - (deps test086.lama test086.input)) - -(cram - (applies_to test088) - (deps test088.lama test088.input)) - -(cram - (applies_to test089) - (deps test089.lama test089.input)) - -(cram - (applies_to test090) - (deps test090.lama test090.input)) - -(cram - (applies_to test091) - (deps test091.lama test091.input)) - -(cram - (applies_to test092) - (deps test092.lama test092.input)) - -(cram - (applies_to test093) - (deps test093.lama test093.input)) - -(cram - (applies_to test094) - (deps test094.lama test094.input)) - -(cram - (applies_to test095) - (deps test095.lama test095.input)) - -(cram - (applies_to test096) - (deps test096.lama test096.input)) - -(cram - (applies_to test097) - (deps test097.lama test097.input)) - -(cram - (applies_to test098) - (deps test098.lama test098.input)) - -(cram - (applies_to test099) - (deps test099.lama test099.input)) - -(cram - (applies_to test100) - (deps test100.lama test100.input)) - -(cram - (applies_to test101) - (deps test101.lama test101.input)) - -(cram - (applies_to test102) - (deps test102.lama test102.input)) - -(cram - (applies_to test103) - (deps test103.lama test103.input)) - -(cram - (applies_to test104) - (deps test104.lama test104.input)) - -(cram - (applies_to test105) - (deps test105.lama test105.input)) - -(cram - (applies_to test106) - (deps test106.lama test106.input)) - -(cram - (applies_to test107) - (deps test107.lama test107.input)) - -(cram - (applies_to test110) - (deps test110.lama test110.input)) - -(cram - (applies_to test111) - (deps test111.lama test111.input)) - -(cram - (applies_to test112) - (deps test112.lama test112.input)) - -(cram - (applies_to test801) - (deps test801.lama test801.input)) - -(cram - (applies_to test802) - (deps test802.lama test802.input)) - -(cram - (applies_to test803) - (deps test803.lama test803.input)) +(cram (deps ../src/Driver.exe ../runtime/Std.i)) + +(cram (applies_to test001) + (deps test001.lama test001.input)) +(cram (applies_to test002) + (deps test002.lama test002.input)) +(cram (applies_to test003) + (deps test003.lama test003.input)) +(cram (applies_to test004) + (deps test004.lama test004.input)) +(cram (applies_to test005) + (deps test005.lama test005.input)) +(cram (applies_to test006) + (deps test006.lama test006.input)) +(cram (applies_to test007) + (deps test007.lama test007.input)) +(cram (applies_to test008) + (deps test008.lama test008.input)) +(cram (applies_to test009) + (deps test009.lama test009.input)) +(cram (applies_to test010) + (deps test010.lama test010.input)) +(cram (applies_to test011) + (deps test011.lama test011.input)) +(cram (applies_to test012) + (deps test012.lama test012.input)) +(cram (applies_to test013) + (deps test013.lama test013.input)) +(cram (applies_to test014) + (deps test014.lama test014.input)) +(cram (applies_to test015) + (deps test015.lama test015.input)) +(cram (applies_to test016) + (deps test016.lama test016.input)) +(cram (applies_to test017) + (deps test017.lama test017.input)) +(cram (applies_to test018) + (deps test018.lama test018.input)) +(cram (applies_to test019) + (deps test019.lama test019.input)) +(cram (applies_to test020) + (deps test020.lama test020.input)) +(cram (applies_to test021) + (deps test021.lama test021.input)) +(cram (applies_to test022) + (deps test022.lama test022.input)) +(cram (applies_to test023) + (deps test023.lama test023.input)) +(cram (applies_to test024) + (deps test024.lama test024.input)) +(cram (applies_to test025) + (deps test025.lama test025.input)) +(cram (applies_to test026) + (deps test026.lama test026.input)) +(cram (applies_to test027) + (deps test027.lama test027.input)) +(cram (applies_to test028) + (deps test028.lama test028.input)) +(cram (applies_to test029) + (deps test029.lama test029.input)) +(cram (applies_to test034) + (deps test034.lama test034.input)) +(cram (applies_to test036) + (deps test036.lama test036.input)) +(cram (applies_to test040) + (deps test040.lama test040.input)) +(cram (applies_to test041) + (deps test041.lama test041.input)) +(cram (applies_to test042) + (deps test042.lama test042.input)) +(cram (applies_to test045) + (deps test045.lama test045.input)) +(cram (applies_to test046) + (deps test046.lama test046.input)) +(cram (applies_to test050) + (deps test050.lama test050.input)) +(cram (applies_to test054) + (deps test054.lama test054.input)) +(cram (applies_to test059) + (deps test059.lama test059.input)) +(cram (applies_to test063) + (deps test063.lama test063.input)) +(cram (applies_to test072) + (deps test072.lama test072.input)) +(cram (applies_to test073) + (deps test073.lama test073.input)) +(cram (applies_to test074) + (deps test074.lama test074.input)) +(cram (applies_to test077) + (deps test077.lama test077.input)) +(cram (applies_to test078) + (deps test078.lama test078.input)) +(cram (applies_to test079) + (deps test079.lama test079.input)) +(cram (applies_to test080) + (deps test080.lama test080.input)) +(cram (applies_to test081) + (deps test081.lama test081.input)) +(cram (applies_to test082) + (deps test082.lama test082.input)) +(cram (applies_to test083) + (deps test083.lama test083.input)) +(cram (applies_to test084) + (deps test084.lama test084.input)) +(cram (applies_to test085) + (deps test085.lama test085.input)) +(cram (applies_to test086) + (deps test086.lama test086.input)) +(cram (applies_to test088) + (deps test088.lama test088.input)) +(cram (applies_to test089) + (deps test089.lama test089.input)) +(cram (applies_to test090) + (deps test090.lama test090.input)) +(cram (applies_to test091) + (deps test091.lama test091.input)) +(cram (applies_to test092) + (deps test092.lama test092.input)) +(cram (applies_to test093) + (deps test093.lama test093.input)) +(cram (applies_to test094) + (deps test094.lama test094.input)) +(cram (applies_to test095) + (deps test095.lama test095.input)) +(cram (applies_to test096) + (deps test096.lama test096.input)) +(cram (applies_to test097) + (deps test097.lama test097.input)) +(cram (applies_to test098) + (deps test098.lama test098.input)) +(cram (applies_to test099) + (deps test099.lama test099.input)) +(cram (applies_to test100) + (deps test100.lama test100.input)) +(cram (applies_to test101) + (deps test101.lama test101.input)) +(cram (applies_to test102) + (deps test102.lama test102.input)) +(cram (applies_to test103) + (deps test103.lama test103.input)) +(cram (applies_to test104) + (deps test104.lama test104.input)) +(cram (applies_to test105) + (deps test105.lama test105.input)) +(cram (applies_to test106) + (deps test106.lama test106.input)) +(cram (applies_to test107) + (deps test107.lama test107.input)) +(cram (applies_to test110) + (deps test110.lama test110.input)) +(cram (applies_to test111) + (deps test111.lama test111.input)) +(cram (applies_to test112) + (deps test112.lama test112.input)) +(cram (applies_to test801) + (deps test801.lama test801.input)) +(cram (applies_to test802) + (deps test802.lama test802.input)) +(cram (applies_to test803) + (deps test803.lama test803.input)) diff --git a/regression/gen.ml b/regression/gen.ml index 74630521a..f8e34841c 100644 --- a/regression/gen.ml +++ b/regression/gen.ml @@ -21,7 +21,7 @@ let () = let found = if Sys.file_exists !lama_file then ( cram_printfn - " $ ../src/Driver.exe -i test%03d.lama < \ + " $ ../src/Driver.exe -runtime ../runtime -I ../stdlib/x64 -i test%03d.lama < \ test%03d.input" i i; true) diff --git a/regression/test001.t b/regression/test001.t index 518e6ade4..d0bed44ae 100644 --- a/regression/test001.t +++ b/regression/test001.t @@ -1,3 +1,2 @@ - $ ../src/Driver.exe -i test001.lama < test001.input - Error: could not find an interface file for import "Std" - [255] + $ ../src/Driver.exe -runtime ../runtime -I ../stdlib/x64 -i test001.lama < test001.input + > > 90 diff --git a/regression/test002.t b/regression/test002.t index 1660aedcf..dbea6b049 100644 --- a/regression/test002.t +++ b/regression/test002.t @@ -1,3 +1,2 @@ - $ ../src/Driver.exe -i test002.lama < test002.input - Error: could not find an interface file for import "Std" - [255] + $ ../src/Driver.exe -runtime ../runtime -I ../stdlib/x64 -i test002.lama < test002.input + > > 41 diff --git a/regression/test003.t b/regression/test003.t index b84e725c1..b0c19f13b 100644 --- a/regression/test003.t +++ b/regression/test003.t @@ -1,3 +1,4 @@ - $ ../src/Driver.exe -i test003.lama < test003.input - Error: could not find an interface file for import "Std" - [255] + $ ../src/Driver.exe -runtime ../runtime -I ../stdlib/x64 -i test003.lama < test003.input + > > 7 + 3 + 1 diff --git a/regression/test004.t b/regression/test004.t index 58b3bcba7..09eb20f86 100644 --- a/regression/test004.t +++ b/regression/test004.t @@ -1,3 +1,2 @@ - $ ../src/Driver.exe -i test004.lama < test004.input - Error: could not find an interface file for import "Std" - [255] + $ ../src/Driver.exe -runtime ../runtime -I ../stdlib/x64 -i test004.lama < test004.input + > > 10 diff --git a/regression/test005.t b/regression/test005.t index 53a6c5732..a3265dd01 100644 --- a/regression/test005.t +++ b/regression/test005.t @@ -1,3 +1,2 @@ - $ ../src/Driver.exe -i test005.lama < test005.input - Error: could not find an interface file for import "Std" - [255] + $ ../src/Driver.exe -runtime ../runtime -I ../stdlib/x64 -i test005.lama < test005.input + > > 11 diff --git a/regression/test006.t b/regression/test006.t index 074663a48..0b3315cd8 100644 --- a/regression/test006.t +++ b/regression/test006.t @@ -1,3 +1,7 @@ - $ ../src/Driver.exe -i test006.lama < test006.input - Error: could not find an interface file for import "Std" - [255] + $ ../src/Driver.exe -runtime ../runtime -I ../stdlib/x64 -i test006.lama < test006.input + > > 1 + 1 + 0 + 1 + 0 + 0 diff --git a/regression/test007.t b/regression/test007.t index 86fc9f47f..fd2ef9355 100644 --- a/regression/test007.t +++ b/regression/test007.t @@ -1,3 +1,2 @@ - $ ../src/Driver.exe -i test007.lama < test007.input - Error: could not find an interface file for import "Std" - [255] + $ ../src/Driver.exe -runtime ../runtime -I ../stdlib/x64 -i test007.lama < test007.input + -4 diff --git a/regression/test008.t b/regression/test008.t index ba4c09b5d..dabb80f5f 100644 --- a/regression/test008.t +++ b/regression/test008.t @@ -1,3 +1,2 @@ - $ ../src/Driver.exe -i test008.lama < test008.input - Error: could not find an interface file for import "Std" - [255] + $ ../src/Driver.exe -runtime ../runtime -I ../stdlib/x64 -i test008.lama < test008.input + -45 diff --git a/regression/test009.t b/regression/test009.t index f450edd1a..8b1101b6a 100644 --- a/regression/test009.t +++ b/regression/test009.t @@ -1,3 +1,2 @@ - $ ../src/Driver.exe -i test009.lama < test009.input - Error: could not find an interface file for import "Std" - [255] + $ ../src/Driver.exe -runtime ../runtime -I ../stdlib/x64 -i test009.lama < test009.input + 1024 diff --git a/regression/test010.t b/regression/test010.t index 0d4224f08..4a8a7e115 100644 --- a/regression/test010.t +++ b/regression/test010.t @@ -1,3 +1,2 @@ - $ ../src/Driver.exe -i test010.lama < test010.input - Error: could not find an interface file for import "Std" - [255] + $ ../src/Driver.exe -runtime ../runtime -I ../stdlib/x64 -i test010.lama < test010.input + 499950 diff --git a/regression/test011.t b/regression/test011.t index 1d9f70055..83a123979 100644 --- a/regression/test011.t +++ b/regression/test011.t @@ -1,3 +1,2 @@ - $ ../src/Driver.exe -i test011.lama < test011.input - Error: could not find an interface file for import "Std" - [255] + $ ../src/Driver.exe -runtime ../runtime -I ../stdlib/x64 -i test011.lama < test011.input + 2 diff --git a/regression/test012.t b/regression/test012.t index a3abd09ac..9242d69ea 100644 --- a/regression/test012.t +++ b/regression/test012.t @@ -1,3 +1,9 @@ - $ ../src/Driver.exe -i test012.lama < test012.input - Error: could not find an interface file for import "Std" - [255] + $ ../src/Driver.exe -runtime ../runtime -I ../stdlib/x64 -i test012.lama < test012.input + > 0 + 0 + 0 + 1 + 1 + 0 + 1 + 1 diff --git a/regression/test013.t b/regression/test013.t index c6a66b2d1..b1d33a9f5 100644 --- a/regression/test013.t +++ b/regression/test013.t @@ -1,3 +1,9 @@ - $ ../src/Driver.exe -i test013.lama < test013.input - Error: could not find an interface file for import "Std" - [255] + $ ../src/Driver.exe -runtime ../runtime -I ../stdlib/x64 -i test013.lama < test013.input + > 10 + 11 + 10 + 11 + 3 + 2 + 1 + 0 diff --git a/regression/test014.t b/regression/test014.t index 707cd59d2..76bb2f7d5 100644 --- a/regression/test014.t +++ b/regression/test014.t @@ -1,3 +1,32 @@ - $ ../src/Driver.exe -i test014.lama < test014.input - Error: could not find an interface file for import "Std" - [255] + $ ../src/Driver.exe -runtime ../runtime -I ../stdlib/x64 -i test014.lama < test014.input + > 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 diff --git a/regression/test015.t b/regression/test015.t index ccd7a6aea..68064ed14 100644 --- a/regression/test015.t +++ b/regression/test015.t @@ -1,3 +1,2 @@ - $ ../src/Driver.exe -i test015.lama < test015.input - Error: could not find an interface file for import "Std" - [255] + $ ../src/Driver.exe -runtime ../runtime -I ../stdlib/x64 -i test015.lama < test015.input + > 7919 diff --git a/regression/test016.t b/regression/test016.t index b756b183e..3fa8f16a0 100644 --- a/regression/test016.t +++ b/regression/test016.t @@ -1,3 +1,2 @@ - $ ../src/Driver.exe -i test016.lama < test016.input - Error: could not find an interface file for import "Std" - [255] + $ ../src/Driver.exe -runtime ../runtime -I ../stdlib/x64 -i test016.lama < test016.input + > 3628800 diff --git a/regression/test017.t b/regression/test017.t index ed92d09b7..2569536e4 100644 --- a/regression/test017.t +++ b/regression/test017.t @@ -1,3 +1,2 @@ - $ ../src/Driver.exe -i test017.lama < test017.input - Error: could not find an interface file for import "Std" - [255] + $ ../src/Driver.exe -runtime ../runtime -I ../stdlib/x64 -i test017.lama < test017.input + > 6765 diff --git a/regression/test018.t b/regression/test018.t index 07b5b96b2..a3c2b1847 100644 --- a/regression/test018.t +++ b/regression/test018.t @@ -1,3 +1,15 @@ - $ ../src/Driver.exe -i test018.lama < test018.input - Error: could not find an interface file for import "Std" - [255] + $ ../src/Driver.exe -runtime ../runtime -I ../stdlib/x64 -i test018.lama < test018.input + > 2 + 0 + 3 + 4 + 5 + 0 + 7 + 0 + 11 + 0 + 13 + 0 + 17 + 2 diff --git a/regression/test019.t b/regression/test019.t index 6ab1b2fa1..d6cbd6ca2 100644 --- a/regression/test019.t +++ b/regression/test019.t @@ -1,3 +1,2 @@ - $ ../src/Driver.exe -i test019.lama < test019.input - Error: could not find an interface file for import "Std" - [255] + $ ../src/Driver.exe -runtime ../runtime -I ../stdlib/x64 -i test019.lama < test019.input + 499950 diff --git a/regression/test020.t b/regression/test020.t index a9fa2ee60..265754f85 100644 --- a/regression/test020.t +++ b/regression/test020.t @@ -1,3 +1,2 @@ - $ ../src/Driver.exe -i test020.lama < test020.input - Error: could not find an interface file for import "Std" - [255] + $ ../src/Driver.exe -runtime ../runtime -I ../stdlib/x64 -i test020.lama < test020.input + > 7919 diff --git a/regression/test021.t b/regression/test021.t index 8adcfb814..42d7f250d 100644 --- a/regression/test021.t +++ b/regression/test021.t @@ -1,3 +1,2 @@ - $ ../src/Driver.exe -i test021.lama < test021.input - Error: could not find an interface file for import "Std" - [255] + $ ../src/Driver.exe -runtime ../runtime -I ../stdlib/x64 -i test021.lama < test021.input + > 3628800 diff --git a/regression/test022.t b/regression/test022.t index 1064c82c3..e8a476acc 100644 --- a/regression/test022.t +++ b/regression/test022.t @@ -1,3 +1,2 @@ - $ ../src/Driver.exe -i test022.lama < test022.input - Error: could not find an interface file for import "Std" - [255] + $ ../src/Driver.exe -runtime ../runtime -I ../stdlib/x64 -i test022.lama < test022.input + > 6765 diff --git a/regression/test023.t b/regression/test023.t index d1819e258..be6a9247a 100644 --- a/regression/test023.t +++ b/regression/test023.t @@ -1,3 +1,2 @@ - $ ../src/Driver.exe -i test023.lama < test023.input - Error: could not find an interface file for import "Std" - [255] + $ ../src/Driver.exe -runtime ../runtime -I ../stdlib/x64 -i test023.lama < test023.input + > > > > > > 35 diff --git a/regression/test024.t b/regression/test024.t index 7cd9205c6..8a57cde52 100644 --- a/regression/test024.t +++ b/regression/test024.t @@ -1,3 +1,3 @@ - $ ../src/Driver.exe -i test024.lama < test024.input - Error: could not find an interface file for import "Std" - [255] + $ ../src/Driver.exe -runtime ../runtime -I ../stdlib/x64 -i test024.lama < test024.input + > 3 + 8 diff --git a/regression/test025.t b/regression/test025.t index f22a4673a..2e8984752 100644 --- a/regression/test025.t +++ b/regression/test025.t @@ -1,3 +1,13 @@ - $ ../src/Driver.exe -i test025.lama < test025.input - Error: could not find an interface file for import "Std" - [255] + $ ../src/Driver.exe -runtime ../runtime -I ../stdlib/x64 -i test025.lama < test025.input + > 1 + 100 + 200 + 300 + 2 + 100 + 200 + 300 + 3 + 100 + 200 + 300 diff --git a/regression/test026.t b/regression/test026.t index 853e1f567..e1ebf39fe 100644 --- a/regression/test026.t +++ b/regression/test026.t @@ -1,3 +1,22 @@ - $ ../src/Driver.exe -i test026.lama < test026.input - Error: could not find an interface file for import "Std" - [255] + $ ../src/Driver.exe -runtime ../runtime -I ../stdlib/x64 -i test026.lama < test026.input + > 1 + 100 + 200 + 300 + 100 + 200 + 300 + 2 + 100 + 200 + 300 + 100 + 200 + 300 + 3 + 100 + 200 + 300 + 100 + 200 + 300 diff --git a/regression/test027.t b/regression/test027.t index 8540028e3..e78b6e477 100644 --- a/regression/test027.t +++ b/regression/test027.t @@ -1,3 +1,36 @@ - $ ../src/Driver.exe -i test027.lama < test027.input - Error: could not find an interface file for import "Std" - [255] + $ ../src/Driver.exe -runtime ../runtime -I ../stdlib/x64 -i test027.lama < test027.input + > 1 + 100 + 200 + 300 + 1 + 2 + 100 + 200 + 300 + 3 + 100 + 200 + 300 + 3 + 4 + 100 + 200 + 300 + 5 + 100 + 200 + 300 + 5 + 100 + 200 + 300 + 100 + 200 + 300 + 100 + 200 + 300 + 100 + 200 + 300 diff --git a/regression/test028.t b/regression/test028.t index 7091a4741..8c8126ada 100644 --- a/regression/test028.t +++ b/regression/test028.t @@ -1,3 +1,15 @@ - $ ../src/Driver.exe -i test028.lama < test028.input - Error: could not find an interface file for import "Std" - [255] + $ ../src/Driver.exe -runtime ../runtime -I ../stdlib/x64 -i test028.lama < test028.input + > 7 + 5040 + 6 + 720 + 5 + 120 + 4 + 24 + 3 + 6 + 2 + 2 + 1 + 1 diff --git a/regression/test029.t b/regression/test029.t index 04d4f1a6e..cfdb9bec3 100644 --- a/regression/test029.t +++ b/regression/test029.t @@ -1,3 +1,19 @@ - $ ../src/Driver.exe -i test029.lama < test029.input - Error: could not find an interface file for import "Std" - [255] + $ ../src/Driver.exe -runtime ../runtime -I ../stdlib/x64 -i test029.lama < test029.input + > 9 + 55 + 8 + 34 + 7 + 21 + 6 + 13 + 5 + 8 + 4 + 5 + 3 + 3 + 2 + 2 + 1 + 1 diff --git a/regression/test034.t b/regression/test034.t index 8601bd531..5bb297cc3 100644 --- a/regression/test034.t +++ b/regression/test034.t @@ -1,3 +1,17 @@ - $ ../src/Driver.exe -i test034.lama < test034.input - Error: could not find an interface file for import "Std" - [255] + $ ../src/Driver.exe -runtime ../runtime -I ../stdlib/x64 -i test034.lama < test034.input + > 97 + 98 + 99 + 100 + 101 + 102 + 103 + 104 + 99 + 100 + 101 + 102 + 103 + 104 + 105 + 106 diff --git a/regression/test036.t b/regression/test036.t index 1db95d055..4f2416b36 100644 --- a/regression/test036.t +++ b/regression/test036.t @@ -1,3 +1,17 @@ - $ ../src/Driver.exe -i test036.lama < test036.input - Error: could not find an interface file for import "Std" - [255] + $ ../src/Driver.exe -runtime ../runtime -I ../stdlib/x64 -i test036.lama < test036.input + > 97 + 98 + 99 + 100 + 101 + 102 + 103 + 104 + 97 + 97 + 97 + 97 + 97 + 97 + 97 + 97 diff --git a/regression/test040.t b/regression/test040.t index 2c7563e3d..5941bb36a 100644 --- a/regression/test040.t +++ b/regression/test040.t @@ -1,3 +1,5 @@ - $ ../src/Driver.exe -i test040.lama < test040.input - Error: could not find an interface file for import "Std" - [255] + $ ../src/Driver.exe -runtime ../runtime -I ../stdlib/x64 -i test040.lama < test040.input + > 1 + 2 + 3 + 4 diff --git a/regression/test041.t b/regression/test041.t index 0e725f312..7b3d8614f 100644 --- a/regression/test041.t +++ b/regression/test041.t @@ -1,3 +1,3 @@ - $ ../src/Driver.exe -i test041.lama < test041.input - Error: could not find an interface file for import "Std" - [255] + $ ../src/Driver.exe -runtime ../runtime -I ../stdlib/x64 -i test041.lama < test041.input + > 600 + 1800 diff --git a/regression/test042.t b/regression/test042.t index 5ab593583..ff70733f9 100644 --- a/regression/test042.t +++ b/regression/test042.t @@ -1,3 +1,11 @@ - $ ../src/Driver.exe -i test042.lama < test042.input - Error: could not find an interface file for import "Std" - [255] + $ ../src/Driver.exe -runtime ../runtime -I ../stdlib/x64 -i test042.lama < test042.input + > 0 + 1 + 2 + 3 + 4 + 4 + 4 + 4 + 4 + 4 diff --git a/regression/test045.t b/regression/test045.t index d135df2b8..057631e33 100644 --- a/regression/test045.t +++ b/regression/test045.t @@ -1,3 +1,41 @@ - $ ../src/Driver.exe -i test045.lama < test045.input - Error: could not find an interface file for import "Std" - [255] + $ ../src/Driver.exe -runtime ../runtime -I ../stdlib/x64 -i test045.lama < test045.input + > 49 + 34 + 97 + 98 + 99 + 34 + 91 + 93 + 91 + 49 + 44 + 32 + 50 + 44 + 32 + 51 + 93 + 67 + 111 + 110 + 115 + 32 + 40 + 49 + 44 + 32 + 67 + 111 + 110 + 115 + 32 + 40 + 50 + 44 + 32 + 78 + 105 + 108 + 41 + 41 diff --git a/regression/test046.t b/regression/test046.t index 6c920bc8c..774ea8f00 100644 --- a/regression/test046.t +++ b/regression/test046.t @@ -1,3 +1,14 @@ - $ ../src/Driver.exe -i test046.lama < test046.input - Error: could not find an interface file for import "Std" - [255] + $ ../src/Driver.exe -runtime ../runtime -I ../stdlib/x64 -i test046.lama < test046.input + > 3 + 3 + 3 + 1 + 2 + 3 + 5 + 5 + 1 + 2 + 3 + 4 + 5 diff --git a/regression/test050.t b/regression/test050.t index 474a590e2..6ffa63d34 100644 --- a/regression/test050.t +++ b/regression/test050.t @@ -1,3 +1,2 @@ - $ ../src/Driver.exe -i test050.lama < test050.input - Error: could not find an interface file for import "Std" - [255] + $ ../src/Driver.exe -runtime ../runtime -I ../stdlib/x64 -i test050.lama < test050.input + > 2 diff --git a/regression/test054.t b/regression/test054.t index f5e6ab47c..a3c28c553 100644 --- a/regression/test054.t +++ b/regression/test054.t @@ -1,3 +1,14 @@ - $ ../src/Driver.exe -i test054.lama < test054.input - Error: could not find an interface file for import "Std" - [255] + $ ../src/Driver.exe -runtime ../runtime -I ../stdlib/x64 -i test054.lama < test054.input + > 105 + 105 + 105 + 230 + 105 + 105 + 105 + 230 + 105 + 250 + 1 + 2 + 3 diff --git a/regression/test059.t b/regression/test059.t index 36771040e..edba4d0c8 100644 --- a/regression/test059.t +++ b/regression/test059.t @@ -1,3 +1,4 @@ - $ ../src/Driver.exe -i test059.lama < test059.input - Error: could not find an interface file for import "Std" - [255] + $ ../src/Driver.exe -runtime ../runtime -I ../stdlib/x64 -i test059.lama < test059.input + > 0 + 1 + 2 diff --git a/regression/test063.t b/regression/test063.t index 5cbcaf32a..41f505c44 100644 --- a/regression/test063.t +++ b/regression/test063.t @@ -1,3 +1,3 @@ - $ ../src/Driver.exe -i test063.lama < test063.input - Error: could not find an interface file for import "Std" - [255] + $ ../src/Driver.exe -runtime ../runtime -I ../stdlib/x64 -i test063.lama < test063.input + > 100 + 200 diff --git a/regression/test072.t b/regression/test072.t index c669333ea..a8e7765f3 100644 --- a/regression/test072.t +++ b/regression/test072.t @@ -1,3 +1,19 @@ - $ ../src/Driver.exe -i test072.lama < test072.input - Error: could not find an interface file for import "Std" - [255] + $ ../src/Driver.exe -runtime ../runtime -I ../stdlib/x64 -i test072.lama < test072.input + > 9 + 55 + 8 + 34 + 7 + 21 + 6 + 13 + 5 + 8 + 4 + 5 + 3 + 3 + 2 + 2 + 1 + 1 diff --git a/regression/test073.t b/regression/test073.t index 08743d828..9949b3e6c 100644 --- a/regression/test073.t +++ b/regression/test073.t @@ -1,3 +1,15 @@ - $ ../src/Driver.exe -i test073.lama < test073.input - Error: could not find an interface file for import "Std" - [255] + $ ../src/Driver.exe -runtime ../runtime -I ../stdlib/x64 -i test073.lama < test073.input + > 7 + 5040 + 6 + 720 + 5 + 120 + 4 + 24 + 3 + 6 + 2 + 2 + 1 + 1 diff --git a/regression/test074.t b/regression/test074.t index be1774e6e..23e9e5d1c 100644 --- a/regression/test074.t +++ b/regression/test074.t @@ -1,3 +1,37 @@ - $ ../src/Driver.exe -i test074.lama < test074.input - Error: could not find an interface file for import "Std" - [255] + $ ../src/Driver.exe -runtime ../runtime -I ../stdlib/x64 -i test074.lama < test074.input + > 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 3 + 5 + 7 + 9 + 11 + 13 + 15 + 17 + 19 + 5 + 13 + 29 + 61 + 125 + 253 + 509 + 1021 + 2045 diff --git a/regression/test077.t b/regression/test077.t index 8e5a4fad2..d20448ac9 100644 --- a/regression/test077.t +++ b/regression/test077.t @@ -1,3 +1,7 @@ - $ ../src/Driver.exe -i test077.lama < test077.input - Error: could not find an interface file for import "Std" - [255] + $ ../src/Driver.exe -runtime ../runtime -I ../stdlib/x64 -i test077.lama < test077.input + > 5 + 6 + 7 + 8 + 9 + 10 diff --git a/regression/test078.t b/regression/test078.t index 0dbc6bcd4..a1ec08938 100644 --- a/regression/test078.t +++ b/regression/test078.t @@ -1,3 +1,13 @@ - $ ../src/Driver.exe -i test078.lama < test078.input - Error: could not find an interface file for import "Std" - [255] + $ ../src/Driver.exe -runtime ../runtime -I ../stdlib/x64 -i test078.lama < test078.input + > 1 + 2 + 3 + 4 + 1 + 2 + 3 + 4 + 3 + 4 + 1 + 2 diff --git a/regression/test079.t b/regression/test079.t index 1b61aac6c..9a308541e 100644 --- a/regression/test079.t +++ b/regression/test079.t @@ -1,3 +1,7 @@ - $ ../src/Driver.exe -i test079.lama < test079.input - Error: could not find an interface file for import "Std" - [255] + $ ../src/Driver.exe -runtime ../runtime -I ../stdlib/x64 -i test079.lama < test079.input + > 1 + 1 + 1 + 1 + 0 + 0 diff --git a/regression/test080.t b/regression/test080.t index b58eacc24..ec2fde0ea 100644 --- a/regression/test080.t +++ b/regression/test080.t @@ -1,3 +1,4 @@ - $ ../src/Driver.exe -i test080.lama < test080.input - Error: could not find an interface file for import "Std" - [255] + $ ../src/Driver.exe -runtime ../runtime -I ../stdlib/x64 -i test080.lama < test080.input + > 0 + 100 + 300 diff --git a/regression/test081.t b/regression/test081.t index 87a068735..d50969c29 100644 --- a/regression/test081.t +++ b/regression/test081.t @@ -1,3 +1,7 @@ - $ ../src/Driver.exe -i test081.lama < test081.input - Error: could not find an interface file for import "Std" - [255] + $ ../src/Driver.exe -runtime ../runtime -I ../stdlib/x64 -i test081.lama < test081.input + > 1 + 2 + 3 + 100 + 200 + 300 diff --git a/regression/test082.t b/regression/test082.t index 9099a229a..4a87a9abd 100644 --- a/regression/test082.t +++ b/regression/test082.t @@ -1,3 +1,18 @@ - $ ../src/Driver.exe -i test082.lama < test082.input - Error: could not find an interface file for import "Std" - [255] + $ ../src/Driver.exe -runtime ../runtime -I ../stdlib/x64 -i test082.lama < test082.input + > 1 + 1 + 1 + 1 + 1 + 2 + 3 + 100 + 3 + 2 + 1 + 6 + 5 + 4 + 3 + 2 + 1 diff --git a/regression/test083.t b/regression/test083.t index 545e3890f..dfce6143b 100644 --- a/regression/test083.t +++ b/regression/test083.t @@ -1,3 +1,4 @@ - $ ../src/Driver.exe -i test083.lama < test083.input - Error: could not find an interface file for import "Std" - [255] + $ ../src/Driver.exe -runtime ../runtime -I ../stdlib/x64 -i test083.lama < test083.input + > 7 + 7 + 28 diff --git a/regression/test084.t b/regression/test084.t index 497f83055..f96122588 100644 --- a/regression/test084.t +++ b/regression/test084.t @@ -1,3 +1,4 @@ - $ ../src/Driver.exe -i test084.lama < test084.input - Error: could not find an interface file for import "Std" - [255] + $ ../src/Driver.exe -runtime ../runtime -I ../stdlib/x64 -i test084.lama < test084.input + > 55 + 310 + 310 diff --git a/regression/test085.t b/regression/test085.t index 98dbc5659..cc28aaa11 100644 --- a/regression/test085.t +++ b/regression/test085.t @@ -1,3 +1,9 @@ - $ ../src/Driver.exe -i test085.lama < test085.input - Error: could not find an interface file for import "Std" - [255] + $ ../src/Driver.exe -runtime ../runtime -I ../stdlib/x64 -i test085.lama < test085.input + > 0 + 15 + 15 + 1 + 2 + 3 + 4 + 5 diff --git a/regression/test086.t b/regression/test086.t index 8fb0841f4..ac00537ab 100644 --- a/regression/test086.t +++ b/regression/test086.t @@ -1,3 +1,4 @@ - $ ../src/Driver.exe -i test086.lama < test086.input - Error: could not find an interface file for import "Std" - [255] + $ ../src/Driver.exe -runtime ../runtime -I ../stdlib/x64 -i test086.lama < test086.input + > 1 + 2 + 3 diff --git a/regression/test088.t b/regression/test088.t index bdd2970b2..61755d444 100644 --- a/regression/test088.t +++ b/regression/test088.t @@ -1,3 +1,3 @@ - $ ../src/Driver.exe -i test088.lama < test088.input - Error: could not find an interface file for import "Std" - [255] + $ ../src/Driver.exe -runtime ../runtime -I ../stdlib/x64 -i test088.lama < test088.input + 0 + 3 diff --git a/regression/test089.t b/regression/test089.t index 113626425..f9f1c0e8c 100644 --- a/regression/test089.t +++ b/regression/test089.t @@ -1,3 +1,2 @@ - $ ../src/Driver.exe -i test089.lama < test089.input - Error: could not find an interface file for import "Std" - [255] + $ ../src/Driver.exe -runtime ../runtime -I ../stdlib/x64 -i test089.lama < test089.input + > > > 8 diff --git a/regression/test090.t b/regression/test090.t index ae4d68414..4577eb78f 100644 --- a/regression/test090.t +++ b/regression/test090.t @@ -1,3 +1,4 @@ - $ ../src/Driver.exe -i test090.lama < test090.input - Error: could not find an interface file for import "Std" - [255] + $ ../src/Driver.exe -runtime ../runtime -I ../stdlib/x64 -i test090.lama < test090.input + > 6 + 7 + 8 diff --git a/regression/test091.t b/regression/test091.t index 299bf17f6..75bce3cff 100644 --- a/regression/test091.t +++ b/regression/test091.t @@ -1,3 +1,10 @@ - $ ../src/Driver.exe -i test091.lama < test091.input - Error: could not find an interface file for import "Std" - [255] + $ ../src/Driver.exe -runtime ../runtime -I ../stdlib/x64 -i test091.lama < test091.input + > 1 + 2 + 3 + 2 + 3 + 4 + 3 + 4 + 5 diff --git a/regression/test092.t b/regression/test092.t index c09945bad..689ab2cb3 100644 --- a/regression/test092.t +++ b/regression/test092.t @@ -1,3 +1,6 @@ - $ ../src/Driver.exe -i test092.lama < test092.input - Error: could not find an interface file for import "Std" - [255] + $ ../src/Driver.exe -runtime ../runtime -I ../stdlib/x64 -i test092.lama < test092.input + > 1 + 1 + 1 + 1 + 0 diff --git a/regression/test093.t b/regression/test093.t index bcfad3b29..19266d5f0 100644 --- a/regression/test093.t +++ b/regression/test093.t @@ -1,3 +1,3 @@ - $ ../src/Driver.exe -i test093.lama < test093.input - Error: could not find an interface file for import "Std" - [255] + $ ../src/Driver.exe -runtime ../runtime -I ../stdlib/x64 -i test093.lama < test093.input + > 11 + 18 diff --git a/regression/test094.t b/regression/test094.t index c6c4ef1cd..72f39d9e0 100644 --- a/regression/test094.t +++ b/regression/test094.t @@ -1,3 +1,5 @@ - $ ../src/Driver.exe -i test094.lama < test094.input - Error: could not find an interface file for import "Std" - [255] + $ ../src/Driver.exe -runtime ../runtime -I ../stdlib/x64 -i test094.lama < test094.input + > 5 + 7 + 12 + -2 diff --git a/regression/test095.t b/regression/test095.t index ac74eb128..0d8ac26f1 100644 --- a/regression/test095.t +++ b/regression/test095.t @@ -1,3 +1,2 @@ - $ ../src/Driver.exe -i test095.lama < test095.input - Error: could not find an interface file for import "Std" - [255] + $ ../src/Driver.exe -runtime ../runtime -I ../stdlib/x64 -i test095.lama < test095.input + > 5 diff --git a/regression/test096.t b/regression/test096.t index 5cc29a0b1..367025406 100644 --- a/regression/test096.t +++ b/regression/test096.t @@ -1,3 +1,3 @@ - $ ../src/Driver.exe -i test096.lama < test096.input - Error: could not find an interface file for import "Std" - [255] + $ ../src/Driver.exe -runtime ../runtime -I ../stdlib/x64 -i test096.lama < test096.input + > 2 + 1 diff --git a/regression/test097.t b/regression/test097.t index a298e83ba..f2d487d93 100644 --- a/regression/test097.t +++ b/regression/test097.t @@ -1,3 +1,2 @@ - $ ../src/Driver.exe -i test097.lama < test097.input - Error: could not find an interface file for import "Std" - [255] + $ ../src/Driver.exe -runtime ../runtime -I ../stdlib/x64 -i test097.lama < test097.input + > 35 diff --git a/regression/test098.t b/regression/test098.t index c47319ee8..b9fea5ab4 100644 --- a/regression/test098.t +++ b/regression/test098.t @@ -1,3 +1,2 @@ - $ ../src/Driver.exe -i test098.lama < test098.input - Error: could not find an interface file for import "Std" - [255] + $ ../src/Driver.exe -runtime ../runtime -I ../stdlib/x64 -i test098.lama < test098.input + > 12 diff --git a/regression/test099.t b/regression/test099.t index 9e21031d6..3a5da4fbe 100644 --- a/regression/test099.t +++ b/regression/test099.t @@ -1,3 +1,4 @@ - $ ../src/Driver.exe -i test099.lama < test099.input - Error: could not find an interface file for import "Std" - [255] + $ ../src/Driver.exe -runtime ../runtime -I ../stdlib/x64 -i test099.lama < test099.input + > 1 + 800 + 800 diff --git a/regression/test100.t b/regression/test100.t index 21ab73166..d872a8977 100644 --- a/regression/test100.t +++ b/regression/test100.t @@ -1,3 +1,2 @@ - $ ../src/Driver.exe -i test100.lama < test100.input - Error: could not find an interface file for import "Std" - [255] + $ ../src/Driver.exe -runtime ../runtime -I ../stdlib/x64 -i test100.lama < test100.input + > 0 diff --git a/regression/test101.t b/regression/test101.t index 62f822d6d..9cd1bbcc3 100644 --- a/regression/test101.t +++ b/regression/test101.t @@ -1,3 +1,2 @@ - $ ../src/Driver.exe -i test101.lama < test101.input - Error: could not find an interface file for import "Std" - [255] + $ ../src/Driver.exe -runtime ../runtime -I ../stdlib/x64 -i test101.lama < test101.input + > 0 diff --git a/regression/test102.t b/regression/test102.t index b56ff1899..7a7fc9130 100644 --- a/regression/test102.t +++ b/regression/test102.t @@ -1,3 +1,2 @@ - $ ../src/Driver.exe -i test102.lama < test102.input - Error: could not find an interface file for import "Std" - [255] + $ ../src/Driver.exe -runtime ../runtime -I ../stdlib/x64 -i test102.lama < test102.input + > 5 diff --git a/regression/test103.t b/regression/test103.t index b67ea1eee..5f8c9356c 100644 --- a/regression/test103.t +++ b/regression/test103.t @@ -1,3 +1,2 @@ - $ ../src/Driver.exe -i test103.lama < test103.input - Error: could not find an interface file for import "Std" - [255] + $ ../src/Driver.exe -runtime ../runtime -I ../stdlib/x64 -i test103.lama < test103.input + > > > 5 diff --git a/regression/test104.t b/regression/test104.t index 9a230d221..843537a6d 100644 --- a/regression/test104.t +++ b/regression/test104.t @@ -1,3 +1,11 @@ - $ ../src/Driver.exe -i test104.lama < test104.input - Error: could not find an interface file for import "Std" - [255] + $ ../src/Driver.exe -runtime ../runtime -I ../stdlib/x64 -i test104.lama < test104.input + > 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 diff --git a/regression/test105.t b/regression/test105.t index f51ca70b3..c625f9639 100644 --- a/regression/test105.t +++ b/regression/test105.t @@ -1,3 +1,2 @@ - $ ../src/Driver.exe -i test105.lama < test105.input - Error: could not find an interface file for import "Std" - [255] + $ ../src/Driver.exe -runtime ../runtime -I ../stdlib/x64 -i test105.lama < test105.input + > 3 diff --git a/regression/test106.t b/regression/test106.t index bc9a9b64a..b8a470a9d 100644 --- a/regression/test106.t +++ b/regression/test106.t @@ -1,3 +1,3 @@ - $ ../src/Driver.exe -i test106.lama < test106.input - Error: could not find an interface file for import "Std" - [255] + $ ../src/Driver.exe -runtime ../runtime -I ../stdlib/x64 -i test106.lama < test106.input + > 1 + 2 diff --git a/regression/test107.t b/regression/test107.t index 603c339fa..4092ae943 100644 --- a/regression/test107.t +++ b/regression/test107.t @@ -1,3 +1,2 @@ - $ ../src/Driver.exe -i test107.lama < test107.input - Error: could not find an interface file for import "Std" - [255] + $ ../src/Driver.exe -runtime ../runtime -I ../stdlib/x64 -i test107.lama < test107.input + > 0 diff --git a/regression/test110.t b/regression/test110.t index 7bc8c67a4..782b2bf81 100644 --- a/regression/test110.t +++ b/regression/test110.t @@ -1,3 +1,7 @@ - $ ../src/Driver.exe -i test110.lama < test110.input - Error: could not find an interface file for import "Std" - [255] + $ ../src/Driver.exe -runtime ../runtime -I ../stdlib/x64 -i test110.lama < test110.input + > 0 + 0 + 10 + 0 + 10 + 100 diff --git a/regression/test111.t b/regression/test111.t index 257987648..c211681d8 100644 --- a/regression/test111.t +++ b/regression/test111.t @@ -1,3 +1,3 @@ - $ ../src/Driver.exe -i test111.lama < test111.input - Error: could not find an interface file for import "Std" + $ ../src/Driver.exe -runtime ../runtime -I ../stdlib/x64 -i test111.lama < test111.input + Error: undefined name "stringcat" at (11, 15) [255] diff --git a/regression/test112.t b/regression/test112.t index 520d60335..2f8c3f930 100644 --- a/regression/test112.t +++ b/regression/test112.t @@ -1,3 +1,12 @@ - $ ../src/Driver.exe -i test112.lama < test112.input - Error: could not find an interface file for import "Std" - [255] + $ ../src/Driver.exe -runtime ../runtime -I ../stdlib/x64 -i test112.lama < test112.input + 1 + 2 + 5 + 6 + 7 + 8 + 5 + 6 + 7 + 8 + 3 diff --git a/regression/test801.t b/regression/test801.t index f99da3eb7..b3c8ded53 100644 --- a/regression/test801.t +++ b/regression/test801.t @@ -1,3 +1,6 @@ - $ ../src/Driver.exe -i test801.lama < test801.input - Error: could not find an interface file for import "Std" - [255] + $ ../src/Driver.exe -runtime ../runtime -I ../stdlib/x64 -i test801.lama < test801.input + 1 + 2 + 3 + 4 + 5 diff --git a/regression/test802.t b/regression/test802.t index df6e1d2ef..0d48765c7 100644 --- a/regression/test802.t +++ b/regression/test802.t @@ -1,3 +1,11 @@ - $ ../src/Driver.exe -i test802.lama < test802.input - Error: could not find an interface file for import "Std" - [255] + $ ../src/Driver.exe -runtime ../runtime -I ../stdlib/x64 -i test802.lama < test802.input + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 diff --git a/regression/test803.t b/regression/test803.t index 61ae4e9ad..be1b55018 100644 --- a/regression/test803.t +++ b/regression/test803.t @@ -1,3 +1,3 @@ - $ ../src/Driver.exe -i test803.lama < test803.input - Error: could not find an interface file for import "Std" - [255] + $ ../src/Driver.exe -runtime ../runtime -I ../stdlib/x64 -i test803.lama < test803.input + Fatal error: exception Failure("int value expected (Closure ([\"unit\"], , ))\n") + [2] From 9ae305b6ac6cafc978b4b6c5bd6a6a60a5a78d46 Mon Sep 17 00:00:00 2001 From: danyaberezun Date: Fri, 28 Feb 2025 17:53:28 +0100 Subject: [PATCH 51/64] add opam init --- .github/workflows/docker.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml index 472a58e86..b61478639 100644 --- a/.github/workflows/docker.yml +++ b/.github/workflows/docker.yml @@ -17,6 +17,7 @@ jobs: steps: - run: opam --version + - run: opam init - run: opam exec -- ocamlopt --version - name: Cancel Previous Runs From e4631513e4f5ff5183ae6e7d20c1323d0f6a8620 Mon Sep 17 00:00:00 2001 From: danyaberezun Date: Fri, 28 Feb 2025 17:56:19 +0100 Subject: [PATCH 52/64] desiable sandboxing --- .github/workflows/docker.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml index b61478639..85a0c9a77 100644 --- a/.github/workflows/docker.yml +++ b/.github/workflows/docker.yml @@ -17,7 +17,7 @@ jobs: steps: - run: opam --version - - run: opam init + - run: opam init --disable-sandboxing -y - run: opam exec -- ocamlopt --version - name: Cancel Previous Runs From 303819db267efdeb0f9870b557764458be7e9e6c Mon Sep 17 00:00:00 2001 From: danyaberezun Date: Fri, 28 Feb 2025 18:06:09 +0100 Subject: [PATCH 53/64] try add enable if to install --- runtime32/dune | 2 ++ 1 file changed, 2 insertions(+) diff --git a/runtime32/dune b/runtime32/dune index c81d429cd..854ed9ac2 100644 --- a/runtime32/dune +++ b/runtime32/dune @@ -10,6 +10,8 @@ (install (section share) + (enabled_if + (= %{system} "linux")) (files (runtime.a as x32/runtime.a) (Std.i as x32/Std.i))) From d4ba366c203903eb739518adc18ec405856ea27d Mon Sep 17 00:00:00 2001 From: danyaberezun Date: Fri, 28 Feb 2025 18:08:51 +0100 Subject: [PATCH 54/64] try --- .github/workflows/blank.yml | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/.github/workflows/blank.yml b/.github/workflows/blank.yml index 0783640ff..5144f37a3 100644 --- a/.github/workflows/blank.yml +++ b/.github/workflows/blank.yml @@ -42,18 +42,25 @@ jobs: - run: opam install . --deps-only --with-test - run: eval $(opam env) - - run: rm -fr runtime32 - if: ${{ matrix.os == 'macos-latest' }} - - run: opam exec -- dune b src runtime runtime32 stdlib tutorial - if: ${{ matrix.os != 'macos-latest' }} - - run: opam exec -- dune b src runtime stdlib tutorial - if: ${{ matrix.os == 'macos-latest' }} - - run: opam exec -- dune b @install --profile=release + # - run: rm -fr runtime32 + # if: ${{ matrix.os == 'macos-latest' }} + # - run: opam exec -- dune b src runtime runtime32 stdlib tutorial + # if: ${{ matrix.os != 'macos-latest' }} + # - run: opam exec -- dune b src runtime stdlib tutorial + # if: ${{ matrix.os == 'macos-latest' }} + # - run: opam exec -- dune b @install --profile=release + # - run: opam exec -- dune install --profile=release + # - run: opam exec -- dune test stdlib/regression + # - run: opam exec -- dune test regression_long + # - run: opam exec -- dune test regression + # - run: opam exec -- make regression-all + + - run: opam exec -- dune b - run: opam exec -- dune install --profile=release - run: opam exec -- dune test stdlib/regression - run: opam exec -- dune test regression_long - - run: opam exec -- dune test regression - # - run: opam exec -- make regression-all + - run: opam exec -- make regression-all + # works # - run: rm -fr runtime32 From 7356ddc80d16d91c7c1c7029132a230d3c1a7e04 Mon Sep 17 00:00:00 2001 From: danyaberezun Date: Fri, 28 Feb 2025 18:19:31 +0100 Subject: [PATCH 55/64] try --- .github/workflows/blank.yml | 3 +-- tutorial/dune | 15 ++++++++++----- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/.github/workflows/blank.yml b/.github/workflows/blank.yml index 5144f37a3..19f5a3610 100644 --- a/.github/workflows/blank.yml +++ b/.github/workflows/blank.yml @@ -58,9 +58,8 @@ jobs: - run: opam exec -- dune b - run: opam exec -- dune install --profile=release - run: opam exec -- dune test stdlib/regression + - run: opam exec -- dune test regression - run: opam exec -- dune test regression_long - - run: opam exec -- make regression-all - # works # - run: rm -fr runtime32 diff --git a/tutorial/dune b/tutorial/dune index 9da618d90..2e0df6f9c 100644 --- a/tutorial/dune +++ b/tutorial/dune @@ -1,7 +1,8 @@ (rule (targets Expressions.x32.exe) - (enabled_if (= %{ocaml-config:os_type} "linux")) +; (enabled_if (= %{ocaml-config:os_type} "linux")) + (enabled_if (= %{system} "linux")) (deps (:lama Expressions.lama) ../runtime32/runtime.a ../stdlib/x32/Fun.i) (mode (promote (until-clean))) @@ -43,7 +44,8 @@ (rule (targets Functions.x32.exe) - (enabled_if (= %{ocaml-config:os_type} "linux")) +; (enabled_if (= %{ocaml-config:os_type} "linux")) + (enabled_if (= %{system} "linux")) (deps (:lama Functions.lama) ../runtime32/runtime.a ../stdlib/x32/Fun.i) (mode (promote (until-clean))) @@ -85,7 +87,8 @@ (rule (targets Hello.x32.exe) - (enabled_if (= %{ocaml-config:os_type} "linux")) +; (enabled_if (= %{ocaml-config:os_type} "linux")) + (enabled_if (= %{system} "linux")) (deps (:lama Hello.lama) ../runtime32/runtime.a ../stdlib/x32/Fun.i) (mode (promote (until-clean))) @@ -127,7 +130,8 @@ (rule (targets PatternMatching.x32.exe) - (enabled_if (= %{ocaml-config:os_type} "linux")) +; (enabled_if (= %{ocaml-config:os_type} "linux")) + (enabled_if (= %{system} "linux")) (deps (:lama PatternMatching.lama) ../runtime32/runtime.a ../stdlib/x32/Fun.i) (mode (promote (until-clean))) @@ -169,7 +173,8 @@ (rule (targets Values.x32.exe) - (enabled_if (= %{ocaml-config:os_type} "linux")) +; (enabled_if (= %{ocaml-config:os_type} "linux")) + (enabled_if (= %{system} "linux")) (deps (:lama Values.lama) ../runtime32/runtime.a ../stdlib/x32/Fun.i) (mode (promote (until-clean))) From aead6095c7fe468951b18f1daf22aebc85a1bbf0 Mon Sep 17 00:00:00 2001 From: danyaberezun Date: Fri, 28 Feb 2025 18:25:06 +0100 Subject: [PATCH 56/64] should work; and installs on mac --- .github/workflows/blank.yml | 31 ++++++++++++++++--------------- 1 file changed, 16 insertions(+), 15 deletions(-) diff --git a/.github/workflows/blank.yml b/.github/workflows/blank.yml index 19f5a3610..022749407 100644 --- a/.github/workflows/blank.yml +++ b/.github/workflows/blank.yml @@ -42,24 +42,25 @@ jobs: - run: opam install . --deps-only --with-test - run: eval $(opam env) - # - run: rm -fr runtime32 - # if: ${{ matrix.os == 'macos-latest' }} - # - run: opam exec -- dune b src runtime runtime32 stdlib tutorial - # if: ${{ matrix.os != 'macos-latest' }} - # - run: opam exec -- dune b src runtime stdlib tutorial - # if: ${{ matrix.os == 'macos-latest' }} - # - run: opam exec -- dune b @install --profile=release - # - run: opam exec -- dune install --profile=release - # - run: opam exec -- dune test stdlib/regression - # - run: opam exec -- dune test regression_long - # - run: opam exec -- dune test regression - # - run: opam exec -- make regression-all - - - run: opam exec -- dune b + - run: rm -fr runtime32 + if: ${{ matrix.os == 'macos-latest' }} + - run: opam exec -- dune b src runtime runtime32 stdlib tutorial + if: ${{ matrix.os != 'macos-latest' }} + - run: opam exec -- dune b src runtime stdlib tutorial + if: ${{ matrix.os == 'macos-latest' }} + - run: opam exec -- dune b @install --profile=release - run: opam exec -- dune install --profile=release - run: opam exec -- dune test stdlib/regression - - run: opam exec -- dune test regression - run: opam exec -- dune test regression_long + - run: opam exec -- dune test regression + - run: opam exec -- make regression-all + + # fails on mac + # - run: opam exec -- dune b + # - run: opam exec -- dune install --profile=release + # - run: opam exec -- dune test stdlib/regression + # - run: opam exec -- dune test regression + # - run: opam exec -- dune test regression_long # works # - run: rm -fr runtime32 From 92cc13f1fdeecdb35843e27339e6226250fc087e Mon Sep 17 00:00:00 2001 From: Kakadu Date: Fri, 28 Feb 2025 22:23:56 +0300 Subject: [PATCH 57/64] Fix docker CI Signed-off-by: Kakadu --- .github/workflows/docker.yml | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml index 85a0c9a77..8d9e6d8b6 100644 --- a/.github/workflows/docker.yml +++ b/.github/workflows/docker.yml @@ -6,6 +6,7 @@ on: - 'i686-cross' env: + OPAMROOT: /home/user/.opam OPAMCONFIRMLEVEL: unsafe-yes jobs: @@ -13,18 +14,16 @@ jobs: runs-on: ubuntu-24.04 container: image: kakadu18/ocaml:lama - #options: --user user + + concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true steps: - run: opam --version - - run: opam init --disable-sandboxing -y + - run: whoami - run: opam exec -- ocamlopt --version - - name: Cancel Previous Runs - uses: styfle/cancel-workflow-action@0.11.0 - with: - access_token: ${{ github.token }} - - name: Checkout code uses: actions/checkout@v4 @@ -32,7 +31,6 @@ jobs: opam install . --depext-only --with-test --with-doc opam install . --deps-only --with-test --with-doc - - name: List installed packages run: opam list From ccfb88cb9ddff6d03b613976986925f2c0e052b5 Mon Sep 17 00:00:00 2001 From: Kakadu Date: Sat, 1 Mar 2025 15:05:07 +0300 Subject: [PATCH 58/64] CI: prepare main CI for cross-compilation Signed-off-by: Kakadu --- .github/workflows/blank.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/blank.yml b/.github/workflows/blank.yml index 022749407..1fb08ecc2 100644 --- a/.github/workflows/blank.yml +++ b/.github/workflows/blank.yml @@ -36,6 +36,8 @@ jobs: ocaml-compiler: ${{ matrix.ocaml-compiler }} - run: gcc --version + - name: Prepare to install cross-compiler (Ubuntu specific) + run: dpkg --add-architecture i386 - run: opam pin add Lama.dev . --no-action - run: opam depext Lama.dev --yes --with-test @@ -52,7 +54,7 @@ jobs: - run: opam exec -- dune install --profile=release - run: opam exec -- dune test stdlib/regression - run: opam exec -- dune test regression_long - - run: opam exec -- dune test regression + - run: opam exec -- dune test regression - run: opam exec -- make regression-all # fails on mac From f93ce4ddaaf58e93093021212a3ea002a073e436 Mon Sep 17 00:00:00 2001 From: Kakadu Date: Sat, 1 Mar 2025 15:12:58 +0300 Subject: [PATCH 59/64] Fixing linux CI Signed-off-by: Kakadu --- .github/workflows/blank.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/blank.yml b/.github/workflows/blank.yml index 1fb08ecc2..54a27174d 100644 --- a/.github/workflows/blank.yml +++ b/.github/workflows/blank.yml @@ -36,8 +36,10 @@ jobs: ocaml-compiler: ${{ matrix.ocaml-compiler }} - run: gcc --version + - name: Prepare to install cross-compiler (Ubuntu specific) - run: dpkg --add-architecture i386 + if: ${{ matrix.os == 'ubuntu-latest' }} + run: sudo dpkg --add-architecture i386 - run: opam pin add Lama.dev . --no-action - run: opam depext Lama.dev --yes --with-test From 4e9b1da254e2cef7c00c18b5a7dbc1aaa704c569 Mon Sep 17 00:00:00 2001 From: Kakadu Date: Sat, 1 Mar 2025 16:56:16 +0300 Subject: [PATCH 60/64] CI: trying to add :i386 pacages Signed-off-by: Kakadu --- .github/workflows/blank.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/blank.yml b/.github/workflows/blank.yml index 54a27174d..36674aec7 100644 --- a/.github/workflows/blank.yml +++ b/.github/workflows/blank.yml @@ -39,7 +39,9 @@ jobs: - name: Prepare to install cross-compiler (Ubuntu specific) if: ${{ matrix.os == 'ubuntu-latest' }} - run: sudo dpkg --add-architecture i386 + run: | + sudo dpkg --add-architecture i386 + sudo apt update -y - run: opam pin add Lama.dev . --no-action - run: opam depext Lama.dev --yes --with-test From 774fb134c67c828ed2b5da21998f109f27771369 Mon Sep 17 00:00:00 2001 From: Danya Berezun Date: Mon, 3 Mar 2025 12:51:48 +0100 Subject: [PATCH 61/64] try fix maco error --- src/X86_64.ml | 33 +++++++++++++++++++++------------ 1 file changed, 21 insertions(+), 12 deletions(-) diff --git a/src/X86_64.ml b/src/X86_64.ml index 5b7482bbe..62b09ee3d 100644 --- a/src/X86_64.ml +++ b/src/X86_64.ml @@ -261,10 +261,15 @@ let in_memory = function M _ | S _ | I _ -> true | C _ | R _ | L _ -> false let mov x s = (* Numeric literals with more than 32 bits cannot be directly moved to memory location *) - let big_numeric_literal = function L num -> (num > 0xFFFFFFFF || num < -0xFFFFFFFF) | _ -> false in + let big_numeric_literal = function + | L num -> num > 0xFFFFFFFF || num < -0xFFFFFFFF + | _ -> false + in if x = s then [] - else if (in_memory x && in_memory s) || (big_numeric_literal x && (in_memory x || in_memory s)) then - [ Mov (x, rax); Mov (rax, s) ] + else if + (in_memory x && in_memory s) + || (big_numeric_literal x && (in_memory x || in_memory s)) + then [ Mov (x, rax); Mov (rax, s) ] else [ Mov (x, s) ] (* Boxing for numeric values *) @@ -697,7 +702,10 @@ let compile cmd env imports code = let l, env = env#allocate in let env, call = compile_call env ~fname:".string" 1 false in (env, mov addr l @ call) - | LDA _ -> failwith "Should not happen. Indirect assignemts are temporarily prohibited." + | LDA _ -> + failwith + "Should not happen. Indirect assignemts are temporarily \ + prohibited." (* let s, env' = (env#variable x)#allocate in let s', env'' = env'#allocate in @@ -726,8 +734,11 @@ let compile cmd env imports code = | S _ | M _ -> [ Mov (s, rax); Mov (rax, env'#loc x) ] | _ -> [ Mov (s, env'#loc x) ] )) | STA -> compile_call env ~fname:".sta" 3 false - | STI -> failwith "Should not happen. Indirect assignemts are temporarily prohibited." - (* + | STI -> + failwith + "Should not happen. Indirect assignemts are temporarily \ + prohibited." + (* let v, env = env#pop in let x = env#peek in ( env, @@ -921,7 +932,7 @@ let compile cmd env imports code = ] @ (if name = "main" then [ Binop ("^", rax, rax) ] else []) @ [ - Meta "\t.cfi_restore\t5"; + Meta "\t.cfi_restore\trbp"; Meta "\t.cfi_def_cfa\t4, 4"; Ret; Meta "\t.cfi_endproc"; @@ -995,11 +1006,9 @@ let compile cmd env imports code = in let _, env = env#pop in ( env, - mov (L col) col_arg_addr - @ mov (L line) line_arg_addr - @ mov msg_addr msg_arg_addr - @ mov value value_arg_addr - @ code ) + mov (L col) col_arg_addr @ mov (L line) line_arg_addr + @ mov msg_addr msg_arg_addr @ mov value value_arg_addr @ code + ) | i -> invalid_arg (Printf.sprintf "invalid SM insn: %s\n" (GT.show insn i)) From 039e81233fdd8a314c09dc1b8409f31643adfc8a Mon Sep 17 00:00:00 2001 From: Danya Berezun Date: Mon, 3 Mar 2025 13:06:12 +0100 Subject: [PATCH 62/64] add intel mac to ci --- .github/workflows/blank.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/blank.yml b/.github/workflows/blank.yml index 36674aec7..51b47eb4a 100644 --- a/.github/workflows/blank.yml +++ b/.github/workflows/blank.yml @@ -21,6 +21,8 @@ jobs: os: - ubuntu-latest - macos-latest + # intel macos + - macos-13 ocaml-compiler: - 4.14.2 From 266933500af73b1ef0f716060c5bb7e6785bfe0b Mon Sep 17 00:00:00 2001 From: Danya Berezun Date: Tue, 4 Mar 2025 17:52:21 +0100 Subject: [PATCH 63/64] fix macos-13 --- .github/workflows/blank.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/blank.yml b/.github/workflows/blank.yml index 51b47eb4a..22f1f9523 100644 --- a/.github/workflows/blank.yml +++ b/.github/workflows/blank.yml @@ -51,11 +51,11 @@ jobs: - run: eval $(opam env) - run: rm -fr runtime32 - if: ${{ matrix.os == 'macos-latest' }} + if: ${{ matrix.os == 'macos-latest' || matrix.os == 'macos-13' }} - run: opam exec -- dune b src runtime runtime32 stdlib tutorial - if: ${{ matrix.os != 'macos-latest' }} + if: ${{ matrix.os != 'macos-latest' && matrix.os != 'macos-13'}} - run: opam exec -- dune b src runtime stdlib tutorial - if: ${{ matrix.os == 'macos-latest' }} + if: ${{ matrix.os == 'macos-latest' || matrix.os == 'macos-13' }} - run: opam exec -- dune b @install --profile=release - run: opam exec -- dune install --profile=release - run: opam exec -- dune test stdlib/regression From 56fcd832cb251a88e95f9ae53ae4c2efc3cad842 Mon Sep 17 00:00:00 2001 From: Dmitry Boulytchev Date: Sun, 9 Mar 2025 21:34:17 +0300 Subject: [PATCH 64/64] Let-expr to the spec --- lama-spec.pdf | Bin 281840 -> 283220 bytes spec/03.04.expressions.tex | 28 +++++++++++++++++++++++++++- spec/08.standard_library.tex | 4 ++-- 3 files changed, 29 insertions(+), 3 deletions(-) diff --git a/lama-spec.pdf b/lama-spec.pdf index fd70c440720947a9d1ff14bab7cf1adc14ea383d..6ed537181b6babc00a2280e4b364ed50e1a150ac 100644 GIT binary patch delta 47412 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 SBJ!}Zu(HEbQc5UE!v9}}RhTXS delta 46017 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�_}maB@riY*wmg6J)R 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 z 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 b + esac +\end{lstlisting} + +As let expression lacks an explicit ending specifier its scope extends to the right while possible; multiple let expressions on +the same nesting level associate to the right. + \FloatBarrier diff --git a/spec/08.standard_library.tex b/spec/08.standard_library.tex index 383702992..bed1b1787 100644 --- a/spec/08.standard_library.tex +++ b/spec/08.standard_library.tex @@ -95,8 +95,8 @@ is automatically created and closed within the call.} \descr{\lstinline|fun fprintf (file, fmt, ...)|}{Same as "\lstinline|printf|", but outputs to a given file. The file argument should be that acquired by \lstinline|fopen| function.} -\descr{\lstinline|fun regexp (str)|}{Compiles a string representation of a regular expression (as per POSIX-Extended Regular Expressions syntax) into - an internal representation. The return value is a external pointer to the internal representation.} +\descr{\lstinline|fun regexp (string)|}{Compiles a string representation of a regular expression (as per POSIX-Extended Regular Expressions syntax) into + an internal representation. The return value is an external pointer to the internal representation.} \descr{\lstinline|fun regexpMatch (pattern, subj, pos)|}{Matches a string "\lstinline{subj}", starting from the position "\lstinline|pos|", against a pattern "\lstinline{pattern}". The pattern is an external pointer to a compiled representation, returned by the