69 lines
2.1 KiB
Python
69 lines
2.1 KiB
Python
"""
|
|
Base compiler class for the modular compilation system
|
|
"""
|
|
|
|
import os
|
|
import subprocess
|
|
import tempfile
|
|
from abc import ABC, abstractmethod
|
|
|
|
|
|
class BaseCompiler(ABC):
|
|
"""
|
|
Abstract base class for all compilers
|
|
"""
|
|
|
|
def __init__(self, language, file_extension):
|
|
self.language = language
|
|
self.file_extension = file_extension
|
|
|
|
@abstractmethod
|
|
def compile(self, code, timeout=10):
|
|
"""
|
|
Compile the code and return the result
|
|
:param code: Source code to compile
|
|
:param timeout: Compilation timeout in seconds
|
|
:return: Dictionary with success, output, and error fields
|
|
"""
|
|
pass
|
|
|
|
@abstractmethod
|
|
def run(self, file_path, timeout=5):
|
|
"""
|
|
Run the compiled code and return the result
|
|
:param file_path: Path to the compiled file
|
|
:param timeout: Execution timeout in seconds
|
|
:return: Dictionary with success, output, and error fields
|
|
"""
|
|
pass
|
|
|
|
def compile_and_run(self, code, compile_timeout=10, run_timeout=5):
|
|
"""
|
|
Compile and run the code in one step
|
|
:param code: Source code to compile and run
|
|
:param compile_timeout: Compilation timeout in seconds
|
|
:param run_timeout: Execution timeout in seconds
|
|
:return: Dictionary with success, output, and error fields
|
|
"""
|
|
# Create a temporary file for the source code
|
|
with tempfile.NamedTemporaryFile(mode='w', suffix=self.file_extension, delete=False) as temp_source:
|
|
temp_source.write(code)
|
|
temp_source_path = temp_source.name
|
|
|
|
try:
|
|
# Compile the code
|
|
compile_result = self.compile(temp_source_path, compile_timeout)
|
|
|
|
if not compile_result['success']:
|
|
return compile_result
|
|
|
|
# Run the code
|
|
run_result = self.run(temp_source_path, run_timeout)
|
|
return run_result
|
|
|
|
finally:
|
|
# Clean up temporary files
|
|
try:
|
|
os.remove(temp_source_path)
|
|
except:
|
|
pass # Ignore cleanup errors |