---
# System prepended metadata

title: Changing Control flows
tags: [decompiler]

---

---
tags: decompiler
---

# Changing Control flows
List of all changing control flows with different decompylers

# Concise MWES
## `else` in `try/except`:
Python: 3.8
Decompiler: Uncompyle6 - Decompyle3
```python
def nextUid():
    try:
        pass
    except z:
        raise "errr"
    return x
```
Changes to:
```python
def nextUid():
    try:
        pass
    except z:
        raise 'errr'
    else:
        return x
```
## `else` in `for`:
Python: 3.8
Decompiler: Uncompyle6 - Decompyle3
```python
def copy_original_checksum():
    for replaced in l:
        x = False
    z=z
```
Changes to:
```python
def copy_original_checksum():
    for replaced in l:
        x = False
    else:
        z = z
```
## Add nested `try/except` with `except X as Y`
Python: 3.8 - 3.7
Decompiler: Uncompyle6 - Decompyle3

:::info
This only works with `as` added to `except`. Without it, it deocmpiles fine.
:::
```python
def GetProteinData():
  try:
    pass
  except Exception as e:
    x = x + 1
```
Changes to:
```python
def GetProteinData():
    try:
        pass
    except Exception as e:
        try:
            x = x + 1
        finally:
            e = None
            del e
```
## Remove `while` loop inside loop
Python 3.8
Decompiler: Uncompyle6

```pyhton
def GetTargetDiseases():
    for id_this in ids:
        while a: # must be while loop
            z=z
            a=a.b() # anything and any number of instructions
        z=z # optional
        if cond2: break # must have condition
    z=z # must have instruction
```
Changes to:
```python
def GetTargetDiseases():
    for id_this in ids:
        if a: # While loop removed
            a = a.b()
            z = z
    else:
        z = z # remaining instructions dumped here
        if cond2:
            break # HOW???
        z = z
```

## Breaking `while` loop conditions:
Python: 3.7-3.8
Decompiler: Uncompyle6-Decompyle3

:::info
Regardless of the number of conditions in while loop, the only one condition remains and the rest are nested inside the loop
:::
```pyhton
def _kafka_main_consumer():
    while a or b:
       continue

def _kafka_main_consumer():
    while a or b or c and d:
       continue
```
Changes to => 
```python
def _kafka_main_consumer():
    while not a:
        if b:
            continue


def _kafka_main_consumer():
    while not a:
        if not b:
            if c:
                if d:
                    continue
```
# Anomalies:
## 1. internal decompiler error
The following code throws an internal decompiler error not reported directly in python 3.8 uncompyle6.
```python
def copy_original_checksum():
    for replaced in l:
        x = False
        try:
            pass
        except:
            x = True
        if x:
            continue
```
Gives the following:
```python
def copy_original_checksum():
    for replaced in l:
        x = False

    try:
        pass
    except:
        x = True
    else:
        if x:
            continue


# NOTE: have internal decompilation grammar errors.
# Use -t option to show full context.
# not in loop:
#	continue
#      L.   9        38  CONTINUE              4  'to 4'
```

# Original
## MWE 1:
Python 3.8
Original:
```python=
def nextUid():
    try:
        pass
    except z:
        raise "errr"
    return x
```
Decompiles to: 
```python=
def nextUid():
    try:
        pass
    except z:
        raise 'errr'
    else:
        return x
```
## MWE 2:
Python 3.8
Original:
```python=
def copy_original_checksum():
    for replaced in l:
        x = False
        try:
            pass
        except:
            x = True
        if x:
            continue
```
Decompiles to: 
```python=
def copy_original_checksum():
    for replaced in l:
        x = False

    try:
        pass
    except:
        x = True
    else:
        if x:
            continue
```

## ~~MWE 3:~~
Python 3.7
Original:
```python=
def Drug2Targets():
  for cid in cids:
    try:
      pass
    except Exception as e:
      continue
```
Decompiles to: 
```python=
def Drug2Targets():
    for cid in cids:
        try:
            pass
        except Exception as e:
            try:
                continue
            finally:
                e = None
                del e
```

## MWE 4:
Python 3.8:
Original:
```python=
def DrugTargetPaths():
  for cid in cids:
    for tid in tids:
      if odir and graphml.strip():
        if not fout_graphml: logging.error('Failed to open output file: %s'%ofile_graphml)
        logging.info('%s'%ofile_graphml)
      x = x + 1
      x = x + 1
      x = x + 1
      if tid_nmax and n_tid>=tid_skip+tid_nmax: break
```
Decompiles to:
```python=
def DrugTargetPaths():
    for cid in cids:
        for tid in tids:
            if odir:
                if graphml.strip():
                    if not fout_graphml:
                        logging.error('Failed to open output file: %s' % ofile_graphml)
                    logging.info('%s' % ofile_graphml)
                else:
                    x = x + 1
                    x = x + 1
                    x = x + 1
                    if tid_nmax:
                        if n_tid >= tid_skip + tid_nmax:
                            break
```
## MWE 5:
Python 3.8:
Orginal:
```python=
def GetProteinData():
  temp = None
  try:
    pass
  except Exception as e:
    x = x + 1
    temp = []
  if temp != None: return temp
```
Decompiles to:
```python=
def GetProteinData():
    temp = None
    try:
        pass
    except Exception as e:
        try:
            x = x + 1
            temp = []
        finally:
            e = None
            del e

    else:
        if temp != None:
            return temp
```

## MWE6: 
Python 3.8:
Orginal:
```python=
def ListCompounds():
  tmp = False
  try:
    pass
  except Exception as e:
    tmp = True
  if tmp: return
```
Decompiles to:
```python=
def ListCompounds():
    tmp = False
    try:
        pass
    except Exception as e:
        try:
            tmp = True
        finally:
            e = None
            del e

    else:
        if tmp:
            return
```
## MWE7:
Python 3.8:
Original:
```python=
def GetTargetDiseases():
  for id_this in ids:
    if conda and condb: continue
    while True:
        a.b()
    if cond1 and cond2: break
  x()
```
Decompiles to:
```python=
def GetTargetDiseases():
    for id_this in ids:
        if conda and condb:
            pass
        else:
            a.b()
    else:
        if cond1 and cond2:
            break
        x()
```
## ~~MWE8:~~
Python : 3.8
Original:
```python=
def minify():
    for item in token_generator:
        tmp = a and b
        if tmp:
            if c or d or e :
                z = z 
        else:
            z = z
```
Decompiled:
```python=
def minify():
    for item in token_generator:
        tmp = a and b
        if not tmp or c or d or e:
            z = z
        else:
            z = z
```
## MWE9:
Python : 3.8
Original:
```python=
def _kafka_main_consumer():
    while (a or b or c) and d:
        continue
```
Decompiled:
```python=
def _kafka_main_consumer():
    while not a:
        if b or c:
            if d:
                continue
```