Olga Sorkine

56 papers A 1B 3Journal 34Unranked 17
YearRankTypeTitle / Venue / Authors
2013 ed.
Eurographics (Short Papers)
Miguel A. Otaduy, Olga Sorkine
2013 J jnl
CoRR
Mario Paolucci, Donald Kossmann, Rosaria Conte, Paul Lukowicz, Panos Argyrakis, Ann Blandford, Giulia Bonelli, Stuart Anderson, Sara de Freitas, Bruce Edmonds, Nigel Gilbert, Markus H. Gross, Jörn Kohlhammer, Petros Koumoutsakos, Andreas Krause, Björn-Ola Linnér, Philipp Slusallek, Olga Sorkine, Robert W. Sumner, Dirk Helbing
2012 J jnl
ACM Trans. Graph.
Ladislav Kavan, Olga Sorkine
2012 J jnl
ACM Trans. Graph.
Alec Jacobson, Ilya Baran, Ladislav Kavan, Jovan Popovic, Olga Sorkine
2012 J jnl
Comput. Graph. Forum
Daniele Panozzo, Ofir Weber, Olga Sorkine
2012 J jnl
Comput. Graph. Forum
Alec Jacobson, Tino Weinkauf, Olga Sorkine
2012 J jnl
ACM Trans. Graph.
Kaan Yücer, Alec Jacobson, Alexander Hornung, Olga Sorkine
2011 J jnl
ACM Trans. Graph.
Alec Jacobson, Ilya Baran, Jovan Popovic, Olga Sorkine
2011 conf
Eurographics (Short Papers)
Qingnan Zhou, Tino Weinkauf, Olga Sorkine
2011 J jnl
Comput. Graph. Forum
Kenshi Takayama, Ryan M. Schmidt, Karan Singh, Takeo Igarashi, Tamy Boubekeur, Olga Sorkine
2011 J jnl
ACM Trans. Graph.
Nico Pietroni, Marco Tarini, Olga Sorkine, Denis Zorin
2011 J jnl
ACM Trans. Graph.
David Harmon, Daniele Panozzo, Olga Sorkine, Denis Zorin
2011 J jnl
ACM Trans. Graph.
Yu-Shuen Wang, Jen-Hung Hsiao, Olga Sorkine, Tong-Yee Lee
2011 conf
SIGGRAPH Awards
Olga Sorkine
2011 J jnl
Comput. Graph. Forum
Gaurav Chaurasia, Olga Sorkine, George Drettakis
2011 J jnl
ACM Trans. Graph.
Alec Jacobson, Olga Sorkine
2011 J jnl
IEEE Trans. Vis. Comput. Graph.
I-Cheng Yeh, Chao-Hung Lin, Olga Sorkine, Tong-Yee Lee
2010 J jnl
ACM Trans. Graph.
Michael Rubinstein, Diego Gutierrez, Olga Sorkine, Ariel Shamir
2010 J jnl
Comput. Graph. Forum
Alec Jacobson, Elif Tosun, Olga Sorkine, Denis Zorin
2010 J jnl
ACM Trans. Graph.
Yu-Shuen Wang, Hui-Chih Lin, Olga Sorkine, Tong-Yee Lee
2010 J jnl
Comput. Graph. Forum
Tino Weinkauf, Yotam I. Gingold, Olga Sorkine
2010 J jnl
ACM Trans. Graph.
Kenshi Takayama, Olga Sorkine, Andrew Nealen, Takeo Igarashi
2009 J jnl
ACM Trans. Graph.
Belén Masiá, Sandra Agustin, Roland W. Fleming, Olga Sorkine, Diego Gutierrez
2009 conf
Eurographics (Tutorials)
Olga Sorkine, Mario Botsch
2009 J jnl
ACM Trans. Graph.
Yu-Shuen Wang, Hongbo Fu, Olga Sorkine, Tong-Yee Lee, Hans-Peter Seidel
2009 conf
SIGGRAPH ASIA Courses
Ariel Shamir, Olga Sorkine
2009 J jnl
ACM Trans. Graph.
Ran Gal, Olga Sorkine, Niloy J. Mitra, Daniel Cohen-Or
2008 J jnl
IEEE Trans. Vis. Comput. Graph.
Mario Botsch, Olga Sorkine
2008 J jnl
ACM Trans. Graph.
Yu-Shuen Wang, Chiew-Lan Tai, Olga Sorkine, Tong-Yee Lee
2008 conf
CEIG
Miguel Martin, Roland W. Fleming, Olga Sorkine, Diego Gutierrez
2007 conf
NPAR
Ran Gal, Olga Sorkine, Tiberiu Popa, Alla Sheffer, Daniel Cohen-Or
2007 conf
SIGGRAPH Courses
Andrew Nealen, Olga Sorkine, Marc Alexa, Daniel Cohen-Or
2007 B conf
Symposium on Geometry Processing
Olga Sorkine, Marc Alexa
2007 J jnl
Comput. Graph. Forum
Ofir Weber, Olga Sorkine, Yaron Lipman, Craig Gotsman
2007 J jnl
ACM Trans. Graph.
Andrew Nealen, Takeo Igarashi, Olga Sorkine, Marc Alexa
2007 conf
PBG@Eurographics
Tamy Boubekeur, Olga Sorkine, Christophe Schlick
2007 conf
SIGGRAPH Sketches
Tamy Boubekeur, Olga Sorkine, Christophe Schlick
2007 conf
VMV
Mathias Eitz, Olga Sorkine, Marc Alexa
2006 J jnl
ACM Trans. Graph.
Daniel Cohen-Or, Olga Sorkine, Ran Gal, Tommer Leyvand, Ying-Qing Xu
2006 J jnl
Comput. Graph. Forum
Olga Sorkine
2006 conf
Rendering Techniques
Ran Gal, Olga Sorkine, Daniel Cohen-Or
2006 conf
GRAPHITE
Andrew Nealen, Takeo Igarashi, Olga Sorkine, Marc Alexa
2006 conf
SIGGRAPH Sketches
Ran Gal, Olga Sorkine, Tiberiu Popa, Alla Sheffer, Daniel Cohen-Or
2005 J jnl
ACM Trans. Graph.
Andrew Nealen, Olga Sorkine, Marc Alexa, Daniel Cohen-Or
2005 J jnl
ACM Trans. Graph.
Doron Chen, Daniel Cohen-Or, Olga Sorkine, Sivan Toledo
2005 J jnl
IEEE Trans. Vis. Comput. Graph.
Olga Sorkine, Daniel Cohen-Or
2005 J jnl
Int. J. Shape Model.
Yaron Lipman, Olga Sorkine, Marc Alexa, Daniel Cohen-Or, David Levin, Christian Rössl, Hans-Peter Seidel
2005 conf
Eurographics (State of the Art Reports)
Olga Sorkine
2005 J jnl
ACM Trans. Graph.
Yaron Lipman, Olga Sorkine, David Levin, Daniel Cohen-Or
2004 conf
SMI
Yaron Lipman, Olga Sorkine, Daniel Cohen-Or, David Levin, Christian Rössl, Hans-Peter Seidel
2004 B conf
Symposium on Geometry Processing
Olga Sorkine, Daniel Cohen-Or, Yaron Lipman, Marc Alexa, Christian Rössl, Hans-Peter Seidel
2004 conf
SMI
Olga Sorkine, Daniel Cohen-Or
2003 B conf
Symposium on Geometry Processing
Olga Sorkine, Daniel Cohen-Or, Sivan Toledo
2003 J jnl
ACM Trans. Graph.
Tommer Leyvand, Olga Sorkine, Daniel Cohen-Or
2002 A conf
IEEE Visualization
Olga Sorkine, Daniel Cohen-Or, Rony Goldenthal, Dani Lischinski
2001 conf
Eurographics (Short Presentations)
Olga Sorkine, Daniel Cohen-Or
redb/extractors/decompiler/apk/jadx_wrapper.py
← Index redb/extractors/decompiler/apk/jadx_wrapper.py python
"""JADX decompiler subprocess wrapper.

Manages JADX subprocess execution for Java decompilation,
following the CAPA extractor subprocess pattern.
"""

import os
import re
import signal
import subprocess
from typing import Dict, Optional


class JADXDecompiler:
    """Subprocess wrapper for JADX Java decompilation."""

    def __init__(self, jadx_path: str = None, timeout: int = None, log=None):
        self.jadx_path = jadx_path or os.getenv("JADX_PATH", "jadx")
        self.timeout = timeout or int(os.getenv("JADX_TIMEOUT", "300"))
        self.log = log

    def decompile(self, apk_path: str, output_dir: str) -> bool:
        """Run JADX decompilation on an APK file.

        Returns True on success, False on failure.
        """
        cmd = [
            self.jadx_path,
            "--no-res",
            "--no-imports",
            "--threads-count", "2",
            "--output-dir", output_dir,
            apk_path,
        ]

        try:
            process = subprocess.Popen(
                cmd,
                stdout=subprocess.PIPE,
                stderr=subprocess.PIPE,
                text=True,
                preexec_fn=os.setsid,
            )

            try:
                stdout, stderr = process.communicate(timeout=self.timeout)
                if process.returncode != 0:
                    if self.log:
                        self.log.warning(
                            f"JADX returned non-zero exit code {process.returncode}: "
                            f"{stderr[:500] if stderr else 'no stderr'}"
                        )
                    # JADX may still produce partial output on non-zero exit
                    return os.path.isdir(os.path.join(output_dir, "sources"))
                return True

            except subprocess.TimeoutExpired:
                if self.log:
                    self.log.error(
                        f"JADX timed out after {self.timeout}s"
                    )
                # Kill the process group
                try:
                    os.killpg(os.getpgid(process.pid), signal.SIGTERM)
                    process.wait(timeout=3)
                except (ProcessLookupError, subprocess.TimeoutExpired):
                    try:
                        os.killpg(os.getpgid(process.pid), signal.SIGKILL)
                    except ProcessLookupError:
                        pass
                return False

        except FileNotFoundError:
            if self.log:
                self.log.error(
                    f"JADX not found at '{self.jadx_path}'. "
                    "Install JADX or set JADX_PATH env var."
                )
            return False
        except Exception as e:
            if self.log:
                self.log.error(f"JADX execution error: {e}")
            return False

    def parse_java_methods(self, output_dir: str) -> Dict[str, str]:
        """Parse JADX output into per-method Java source.

        Returns dict keyed by 'package.ClassName.methodName(ParamType1, ParamType2)'.
        """
        sources_dir = os.path.join(output_dir, "sources")
        if not os.path.isdir(sources_dir):
            return {}

        methods = {}
        for root, _dirs, files in os.walk(sources_dir):
            for fname in files:
                if not fname.endswith(".java"):
                    continue
                fpath = os.path.join(root, fname)
                try:
                    with open(fpath, "r", encoding="utf-8", errors="replace") as f:
                        content = f.read()

                    # Derive the fully qualified class name from file path
                    rel_path = os.path.relpath(fpath, sources_dir)
                    class_fqn = rel_path.replace(os.sep, ".").replace("/", ".")
                    if class_fqn.endswith(".java"):
                        class_fqn = class_fqn[:-5]

                    file_methods = self._extract_methods_from_java(
                        content, class_fqn
                    )
                    methods.update(file_methods)

                except Exception:
                    continue

        return methods

    def _extract_methods_from_java(
        self, source: str, class_fqn: str
    ) -> Dict[str, str]:
        """Extract individual methods from a Java source file.

        Uses brace-depth tracking to find method boundaries.
        """
        methods = {}
        lines = source.split("\n")
        i = 0

        while i < len(lines):
            line = lines[i]
            match = self._is_method_declaration(line)
            if match:
                method_name, param_types = match
                # Track brace depth to find method end
                start_line = i
                brace_depth = 0
                found_open = False

                for j in range(i, len(lines)):
                    for ch in lines[j]:
                        if ch == "{":
                            brace_depth += 1
                            found_open = True
                        elif ch == "}":
                            brace_depth -= 1

                    if found_open and brace_depth == 0:
                        method_body = "\n".join(lines[start_line : j + 1])
                        key = f"{class_fqn}.{method_name}({param_types})"
                        methods[key] = method_body
                        i = j + 1
                        break
                else:
                    i += 1
            else:
                i += 1

        return methods

    # Regex for method declarations (not constructors, not class/interface decl)
    _METHOD_DECL_RE = re.compile(
        r"^\s*(?:(?:public|private|protected|static|final|synchronized|"
        r"native|abstract|strictfp)\s+)*"
        r"(?:[\w<>\[\]?.]+\s+)"  # return type
        r"(\w+)"  # method name
        r"\s*\(([^)]*)\)"  # parameters
        r"(?:\s*throws\s+[\w.,\s]+)?"
        r"\s*\{"
    )

    def _is_method_declaration(self, line: str) -> Optional[tuple]:
        """Check if a line is a method declaration.

        Returns (method_name, param_types_str) or None.
        """
        m = self._METHOD_DECL_RE.match(line)
        if not m:
            return None

        method_name = m.group(1)
        params_raw = m.group(2).strip()

        # Skip class-level blocks
        if method_name in ("if", "for", "while", "switch", "try", "catch"):
            return None

        # Extract just the type names from parameters
        if not params_raw:
            return (method_name, "")

        param_types = []
        for param in params_raw.split(","):
            param = param.strip()
            if not param:
                continue
            parts = param.split()
            # Last non-annotation token before the variable name is the type
            # Simple heuristic: type is second-to-last, name is last
            if len(parts) >= 2:
                param_types.append(parts[-2])
            elif len(parts) == 1:
                param_types.append(parts[0])

        return (method_name, ", ".join(param_types))