SM fixes, add fixes to vork with sysargs Std variable

This commit is contained in:
ProgramSnail 2025-04-12 22:19:28 +03:00
parent d8eb21c066
commit 474b0a8ed2
3 changed files with 29 additions and 11 deletions

View file

@ -72,7 +72,8 @@ void set_argc_argv(int argc, char **argv) {
void *args_array = Barray((aint *)s_peek(), BOX(argc));
s_popn(argc);
s_push(args_array);
*var_by_category(VAR_GLOBAL, 0) = args_array; // NOTE: implementation detail, stdlib/test26.lama
// NOTE: V,sysargs from Std
*var_by_category(VAR_GLOBAL, 0) = args_array;
#ifdef DEBUG_VERSION
print_stack(&s);

View file

@ -108,8 +108,13 @@ void rewrite_code_with_offsets(Bytefile *bytefile, const Offsets &offsets) {
case Cmd::LDA:
case Cmd::ST:
if (to_var_category(l) == VAR_GLOBAL) {
ip_write_int_unsafe(write_ip,
ip_read_int_unsafe(&read_ip) + offsets.globals);
aint id = ip_read_int_unsafe(&read_ip);
if (id > 0) { // NOTE: do not rewrite sysargs usages
ip_write_int_unsafe(
write_ip,
id - 1 + offsets.globals); // rewrite with exclusion of local
// module sysargs reference
}
}
break;
default:
@ -239,7 +244,8 @@ Offsets calc_merge_sizes(const std::vector<Bytefile *> &bytefiles) {
Offsets sizes{.strings = 0, .globals = 0, .code = 0, .publics_num = 0};
for (size_t i = 0; i < bytefiles.size(); ++i) {
sizes.strings += bytefiles[i]->stringtab_size;
sizes.globals += bytefiles[i]->global_area_size;
sizes.globals += bytefiles[i]->global_area_size -
1; // NOTE: exclude default variable sysargs
sizes.code += bytefiles[i]->code_size;
// sizes.publics_num += bytefiles[i]->public_symbols_number;
}
@ -268,6 +274,9 @@ MergeResult merge_files(std::vector<Bytefile *> &&bytefiles) {
gen_builtins(sizes.code, builtins_map);
sizes.code += builtins_code_size;
// V,sysparams fro, Std
++sizes.globals;
Bytefile *result =
(Bytefile *)malloc(sizeof(Bytefile) + sizes.strings + sizes.code +
public_symbols_size); // globals are on the stack
@ -322,7 +331,10 @@ MergeResult merge_files(std::vector<Bytefile *> &&bytefiles) {
result->substs_ptr = NULL;
// update & merge code segments
Offsets offsets{.strings = 0, .globals = 0, .code = 0, .publics_num = 0};
Offsets offsets{.strings = 0,
.globals = 1,
.code = 0,
.publics_num = 0}; // NOTE: one global: sysargs
// REMOVE printf("merge bytefiles\n");
for (size_t i = 0; i < bytefiles.size(); ++i) {
// REMOVE printf("rewrite offsets %zu\n", i);
@ -346,7 +358,8 @@ MergeResult merge_files(std::vector<Bytefile *> &&bytefiles) {
// update offsets
offsets.strings += bytefiles[i]->stringtab_size;
offsets.globals += bytefiles[i]->global_area_size;
offsets.globals +=
bytefiles[i]->global_area_size - 1; // NOTE: exclude sysargs
offsets.code += bytefiles[i]->code_size;
// offsets.publics_num += bytefiles[i]->public_symbols_number;

View file

@ -176,8 +176,8 @@ module ByteCode = struct
let externs = Stdlib.ref S.empty in
let pubs = Stdlib.ref S.empty in
let imports = Stdlib.ref S.empty in
let globals = Stdlib.ref M.empty in
let glob_count = Stdlib.ref 0 in
let globals = Stdlib.ref @@ M.add "sysargs" 0 @@ M.empty in (* sysargs is a vaiable from Std *)
let glob_count = Stdlib.ref 1 in (* sysargs *)
let fixups = Stdlib.ref [] in
let func_fixups = Stdlib.ref [] in
let add_lab l = lmap := M.add l (Buffer.length code) !lmap in
@ -298,7 +298,7 @@ module ByteCode = struct
(* 0x54 l:32 n:32 d*:32 *)
| CLOSURE (s, ds) ->
add_bytes [ (5 * 16) + 4 ];
add_fixup s;
add_func_fixup s;
add_ints [ 0; List.length ds ];
add_designations None ds
(* 0x55 n:32 *)
@ -373,7 +373,7 @@ module ByteCode = struct
@@
try M.find l !lmap
with Not_found ->
failwith (Printf.sprintf "ERROR: undefined label '%s'" l) ))
failwith (Printf.sprintf "ERROR: undefined label of public '%s'" l) ))
@@ S.elements !pubs
in
let str_table = Buffer.to_bytes st.StringTab.buffer in
@ -1314,6 +1314,10 @@ class env cmd imports =
end [@@ocaml.warning "-15"]
let compile cmd ((imports, _), p) =
(* TODO: better solution *)
let replace_escaped_symbols s = Str.global_replace (Str.regexp "\\\\n") "\n" @@
Str.global_replace (Str.regexp "\\\\r") "\r" @@
Str.global_replace (Str.regexp "\\\\t") "\t" s in
let rec pattern env lfalse = function
| Pattern.Wildcard -> (env, false, [ DROP ])
| Pattern.Named (_, p) -> pattern env lfalse p
@ -1477,7 +1481,7 @@ let compile cmd ((imports, _), p) =
| _ -> (env, false, line @ [ LD 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.String s -> (env, false, [ STRING (replace_escaped_symbols s) ])
| Expr.Binop (op, x, y) ->
let lop, env = env#get_label in
add_code (compile_list false lop env [ x; y ]) lop false [ BINOP op ]