MultiPLE-Evaluator / src /eval_cs.py
dongsheng's picture
Upload 48 files
41e79e2 verified
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)