Spaces:
Sleeping
Sleeping
| from pathlib import Path | |
| from typing import Callable | |
| import settings | |
| from config import LanguageConfig | |
| class Runtime: | |
| language: str | |
| compile_cmd: str = "" | |
| execute_cmd: str = "" | |
| compile_flags: str = "" | |
| execute_flags: str = "" | |
| file_name: Callable[[str], str] | str | |
| sanitize: Callable[[str], str] | None | |
| _compile: Callable[[Path, str, str], tuple[str | None, Path]] | None | |
| _execute: Callable[[Path, str, str], str] | |
| timelimit_factor: int = 1 | |
| extend_mem_for_vm: bool = False | |
| extend_mem_flag_name: str = "" | |
| def __init__(self, cfg: LanguageConfig): | |
| self.language = cfg.language | |
| self.compile_cmd = cfg.compile_cmd | |
| self.compile_flags = cfg.compile_flags | |
| self.execute_cmd = cfg.execute_cmd | |
| self.execute_flags = cfg.execute_flags | |
| self.timelimit_factor = cfg.timelimit_factor | |
| self.file_name = getattr( | |
| settings, cfg.file_name_fn_or_str_name, cfg.file_name_fn_or_str_name | |
| ) | |
| self.sanitize = getattr(settings, cfg.sanitize_fn_name, None) | |
| self._compile = getattr(settings, cfg.compile_fn_name, None) | |
| self._execute = getattr(settings, cfg.execute_fn_name, lambda _, __, ___: "") | |
| self.extend_mem_for_vm = cfg.extend_mem_for_vm | |
| self.extend_mem_flag_name = cfg.extend_mem_flag_name | |
| def is_compiled_language(self): | |
| return self._compile is not None | |
| def has_sanitizer(self): | |
| return self.sanitize is not None | |
| def get_info(self): | |
| return dict( | |
| runtime_name=self.language, | |
| compile_cmd=self.compile_cmd, | |
| compile_flags=self.compile_flags, | |
| execute_cmd=self.execute_cmd, | |
| execute_flags=self.execute_flags, | |
| timelimit_factor=self.timelimit_factor, | |
| is_compiled=self.is_compiled_language, | |
| has_sanitizer=self.has_sanitizer, | |
| ) | |
| def get_file_path(self, source_code: str) -> Path | settings.JavaClassNotFoundError: | |
| if isinstance(self.file_name, str): | |
| return Path(self.file_name) | |
| file_name = self.file_name(source_code) | |
| if isinstance(file_name, settings.JavaClassNotFoundError): | |
| return file_name | |
| return Path(file_name) | |
| def compile( | |
| self, | |
| source_code_path: Path, | |
| cmd: str | None = None, | |
| flags: str | None = None, | |
| ): | |
| if self._compile is None: | |
| return [None, source_code_path] | |
| return self._compile( | |
| source_code_path, | |
| self.compile_cmd if cmd is None else cmd, | |
| ("" if self.compile_flags is None else self.compile_flags) + " " + ("" if flags is None else flags), | |
| ) | |
| def execute( | |
| self, executable: Path, cmd: str | None = None, flags: str | None = None | |
| ): | |
| return self._execute( | |
| executable, | |
| self.execute_cmd if cmd is None else cmd, | |
| ("" if self.execute_flags is None else self.execute_flags) + " " + ("" if flags is None else flags), | |
| ) | |