Spaces:
Running
Running
import os | |
import subprocess | |
import tempfile | |
from pathlib import Path | |
from src.generic_eval import main | |
LANG_NAME = "CSharp" | |
LANG_EXT = ".cs" | |
#Following files have problems: | |
#137, | |
#22: Any | |
#148: Elipsis | |
def eval_script(path: str): | |
if ".cs" not in path.name: | |
return | |
basename = ".".join(str(path).split(".")[:-1]) | |
binaryname = basename + ".exe" | |
build = subprocess.run(["csc", "/d:DEBUG", "-r:System.Numerics.dll", path, f"/out:{binaryname}"], capture_output=True) | |
status = None | |
returncode = -1 | |
output = None | |
if build.returncode != 0: | |
# Well, it's a compile error. May be a type error or | |
# something. But, why break the set convention | |
status = "SyntaxError" | |
returncode = build.returncode | |
output = build | |
else: | |
try: | |
output = subprocess.run(["mono", binaryname], env={"PATH": os.getenv("PATH"), "MONO_TRACE_LISTENER":"Console.Error"}, capture_output=True, timeout=5) | |
returncode = output.returncode | |
output.stderr = str(output.stderr, "utf-8") | |
#mono return 0 even when failing | |
fail = "System.Diagnostics.DefaultTraceListener.Fail" in output.stderr or "Unhandled Exception" in output.stderr | |
output.returncode = 1 if fail else 0 | |
if output.returncode == 0: | |
status = "OK" | |
else: | |
# Well, it's a panic | |
status = "Exception" | |
except subprocess.TimeoutExpired as exc: | |
status = "Timeout" | |
output = exc | |
os.remove(binaryname) | |
if output.stdout is not None: | |
output.stdout = output.stdout.decode("utf-8") | |
else: | |
output.stdout = "None" | |
if output.stderr == "": | |
output.stderr = "None" | |
return { | |
"status": status, | |
"exit_code": returncode, | |
"stdout": output.stdout, | |
"stderr": output.stderr, | |
} | |
if __name__ == "__main__": | |
main(eval_script, LANG_NAME, LANG_EXT) | |