On Friday, 27 July 2018 at 04:56:01 UTC, Mark wrote:
Hello,

I am building a toy compiler in D, and during this I ran into a situation. It involves checking the header of each function, going through the arguments, and seeing if there is any duplicate identifiers.

I have a python script that feeds a whole bunch of source files that have one error of a specific type each (with an expected error).

The only file that causes this problem is called fnDupArgs.nerf (I called my language nerf).

In my mind, this is a simple check, but for some reason that I can't identify, it causes the entire computers memory to be filled up, causing swapping on the hard drive!

Here is my project: https://github.com/MarkTigchelaar/Nerf-Compiler-2.0

In system_test.py, that test is commented out (un comment it, line 135)

the source of the problem is in the file analyze_semantics.d, on line 36:

void add_func_args_to_local_variable_table(Function* func, ref SymbolTable table) {
    string[] func_args = func.arg_names.dup;
    string[] arg_types = table.get_function_args(func.name);
    if(func_args.length != arg_types.length) {
throw new Exception("Number of function variables is not the same as number of types for same function."); <--compiler error
    }
    for(int i = 0; i < func_args.length; i++) {
table.add_local_variable(func_args[i], arg_types[i]); <-- line 36
    }
}

this calls the symbol tables method in the file symbol_table.d, on line 129:

final void add_local_variable(string variable, string type) { <-- line 129
        import fn_header_syntax_errors: duplicate_fn_args;
        if(!is_declared_variable(variable)) {
            variable_table[variable] = type;
            variables_at_scope_level[scope_level] ~= variable;
        } else {
            duplicate_fn_args();
        }
    }

Now I've been staring at this for an hour and a half. If you leave the one test commented out, everything passes, and all is well.

But if you run that one extra test, it tries to swallow up all the available memory on the computer.

I genuinely have 0 clue why this is happening, could someone help? If I can't figure this one out, my compiler will have a hole in it's semantic checking that I don't want.


Thanks!

Have you tried using -profile-gc ?

Reply via email to