mirror of
https://github.com/zeldaret/mm.git
synced 2026-08-19 13:24:02 -04:00
01a6dea813
* git subrepo pull tools/ZAPD --force subrepo: subdir: "tools/ZAPD" merged: "e02e151c" upstream: origin: "https://github.com/zeldaret/ZAPD.git" branch: "master" commit: "e02e151c" git-subrepo: version: "0.4.3" origin: "https://github.com/ingydotnet/git-subrepo.git" commit: "2f68596" * git subrepo pull tools/decomp-permuter --force subrepo: subdir: "tools/decomp-permuter" merged: "86b1975e" upstream: origin: "https://github.com/simonlindholm/decomp-permuter.git" branch: "main" commit: "86b1975e" git-subrepo: version: "0.4.3" origin: "https://github.com/ingydotnet/git-subrepo.git" commit: "2f68596" * git subrepo pull tools/graphovl --force subrepo: subdir: "tools/graphovl" merged: "eb25be94" upstream: origin: "https://github.com/AngheloAlf/graphovl.git" branch: "master" commit: "eb25be94" git-subrepo: version: "0.4.3" origin: "https://github.com/ingydotnet/git-subrepo.git" commit: "2f68596" * git subrepo pull (merge) tools/z64compress --force subrepo: subdir: "tools/z64compress" merged: "98ef0ac2" upstream: origin: "https://github.com/z64me/z64compress.git" branch: "main" commit: "98ef0ac2" git-subrepo: version: "0.4.3" origin: "https://github.com/ingydotnet/git-subrepo.git" commit: "2f68596" * git subrepo pull tools/ZAPD --force subrepo: subdir: "tools/ZAPD" merged: "45cb0d6b" upstream: origin: "https://github.com/zeldaret/ZAPD.git" branch: "master" commit: "45cb0d6b" git-subrepo: version: "0.4.3" origin: "https://github.com/ingydotnet/git-subrepo.git" commit: "2f68596" * git subrepo pull tools/asm-differ --force subrepo: subdir: "tools/asm-differ" merged: "48e675ff" upstream: origin: "https://github.com/simonlindholm/asm-differ.git" branch: "main" commit: "48e675ff" git-subrepo: version: "0.4.3" origin: "https://github.com/ingydotnet/git-subrepo.git" commit: "2f68596" * git subrepo pull tools/ZAPD --force subrepo: subdir: "tools/ZAPD" merged: "3c00dcb3" upstream: origin: "https://github.com/zeldaret/ZAPD.git" branch: "master" commit: "3c00dcb3" git-subrepo: version: "0.4.3" origin: "https://github.com/ingydotnet/git-subrepo.git" commit: "2f68596" * git subrepo pull tools/asm-differ --force subrepo: subdir: "tools/asm-differ" merged: "47c94c99" upstream: origin: "https://github.com/simonlindholm/asm-differ.git" branch: "main" commit: "47c94c99" git-subrepo: version: "0.4.3" origin: "https://github.com/ingydotnet/git-subrepo.git" commit: "2f68596" * Declare required textures * Name texture, add decomp.me permuter settings * git subrepo pull tools/ZAPD --force subrepo: subdir: "tools/ZAPD" merged: "913810fc" upstream: origin: "https://github.com/zeldaret/ZAPD.git" branch: "master" commit: "913810fc" git-subrepo: version: "0.4.3" origin: "https://github.com/ingydotnet/git-subrepo.git" commit: "2f68596" * git subrepo pull tools/asm-differ --force subrepo: subdir: "tools/asm-differ" merged: "97197f2a" upstream: origin: "https://github.com/simonlindholm/asm-differ.git" branch: "main" commit: "97197f2a" git-subrepo: version: "0.4.3" origin: "https://github.com/ingydotnet/git-subrepo.git" commit: "2f68596" * git subrepo pull tools/ZAPD --force subrepo: subdir: "tools/ZAPD" merged: "623d779f" upstream: origin: "https://github.com/zeldaret/ZAPD.git" branch: "master" commit: "623d779f" git-subrepo: version: "0.4.3" origin: "https://github.com/ingydotnet/git-subrepo.git" commit: "2f68596" * git subrepo pull tools/asm-differ --force subrepo: subdir: "tools/asm-differ" merged: "55bba23a" upstream: origin: "https://github.com/simonlindholm/asm-differ.git" branch: "main" commit: "55bba23a" git-subrepo: version: "0.4.3" origin: "https://github.com/ingydotnet/git-subrepo.git" commit: "2f68596" * git subrepo pull tools/decomp-permuter --force subrepo: subdir: "tools/decomp-permuter" merged: "a20bac94" upstream: origin: "https://github.com/simonlindholm/decomp-permuter.git" branch: "main" commit: "a20bac94" git-subrepo: version: "0.4.3" origin: "https://github.com/ingydotnet/git-subrepo.git" commit: "2f68596"
100 lines
3.2 KiB
Python
100 lines
3.2 KiB
Python
import copy
|
|
from dataclasses import dataclass, field
|
|
import functools
|
|
from typing import Optional, Tuple
|
|
|
|
from pycparser import c_ast as ca
|
|
|
|
from .compiler import Compiler
|
|
from .randomizer import Randomizer
|
|
from .scorer import Scorer
|
|
from .perm.perm import EvalState
|
|
from .perm.ast import apply_ast_perms
|
|
from .helpers import try_remove
|
|
from .profiler import Profiler
|
|
from . import ast_util
|
|
|
|
|
|
@dataclass
|
|
class CandidateResult:
|
|
"""Represents the result of scoring a candidate, and is sent from child to
|
|
parent processes, or server to client with p@h."""
|
|
|
|
score: int
|
|
hash: Optional[str]
|
|
source: Optional[str]
|
|
profiler: Optional[Profiler] = None
|
|
|
|
|
|
@dataclass
|
|
class Candidate:
|
|
"""
|
|
Represents a AST candidate created from a source which can be randomized
|
|
(possibly multiple times), compiled, and scored.
|
|
"""
|
|
|
|
ast: ca.FileAST
|
|
|
|
fn_index: int
|
|
rng_seed: int
|
|
randomizer: Randomizer
|
|
score_value: Optional[int] = field(init=False, default=None)
|
|
score_hash: Optional[str] = field(init=False, default=None)
|
|
_cache_source: Optional[str] = field(init=False, default=None)
|
|
|
|
@staticmethod
|
|
@functools.lru_cache(maxsize=16)
|
|
def _cached_shared_ast(
|
|
source: str, fn_name: str
|
|
) -> Tuple[ca.FuncDef, int, ca.FileAST]:
|
|
ast = ast_util.parse_c(source)
|
|
orig_fn, fn_index = ast_util.extract_fn(ast, fn_name)
|
|
ast_util.normalize_ast(orig_fn, ast)
|
|
return orig_fn, fn_index, ast
|
|
|
|
@staticmethod
|
|
def from_source(
|
|
source: str, eval_state: EvalState, fn_name: str, rng_seed: int
|
|
) -> "Candidate":
|
|
# Use the same AST for all instances of the same original source, but
|
|
# with the target function deeply copied. Since we never change the
|
|
# AST outside of the target function, this is fine, and it saves us
|
|
# performance (deepcopy is really slow).
|
|
orig_fn, fn_index, ast = Candidate._cached_shared_ast(source, fn_name)
|
|
ast = copy.copy(ast)
|
|
ast.ext = copy.copy(ast.ext)
|
|
fn_copy = copy.deepcopy(orig_fn)
|
|
ast.ext[fn_index] = fn_copy
|
|
apply_ast_perms(fn_copy, eval_state)
|
|
return Candidate(
|
|
ast=ast,
|
|
fn_index=fn_index,
|
|
rng_seed=rng_seed,
|
|
randomizer=Randomizer(rng_seed),
|
|
)
|
|
|
|
def randomize_ast(self) -> None:
|
|
self.randomizer.randomize(self.ast, self.fn_index)
|
|
self._cache_source = None
|
|
|
|
def get_source(self) -> str:
|
|
if self._cache_source is None:
|
|
self._cache_source = ast_util.to_c(self.ast)
|
|
return self._cache_source
|
|
|
|
def compile(self, compiler: Compiler, show_errors: bool = False) -> Optional[str]:
|
|
source: str = self.get_source()
|
|
return compiler.compile(source, show_errors=show_errors)
|
|
|
|
def score(self, scorer: Scorer, o_file: Optional[str]) -> CandidateResult:
|
|
self.score_value = None
|
|
self.score_hash = None
|
|
try:
|
|
self.score_value, self.score_hash = scorer.score(o_file)
|
|
finally:
|
|
if o_file:
|
|
try_remove(o_file)
|
|
return CandidateResult(
|
|
score=self.score_value, hash=self.score_hash, source=self.get_source()
|
|
)
|