prim merges the basic blocks of the given primitive into a corresponding conceputal basic block for the primitive.
(prim *primitive.Primitive)
| 13 | // prim merges the basic blocks of the given primitive into a corresponding |
| 14 | // conceputal basic block for the primitive. |
| 15 | func (d *decompiler) prim(prim *primitive.Primitive) (*basicBlock, error) { |
| 16 | switch prim.Prim { |
| 17 | case "if": |
| 18 | condName := prim.Nodes["cond"] |
| 19 | condBlock, ok := d.blocks[condName] |
| 20 | if !ok { |
| 21 | return nil, errors.Errorf("unable to located cond basic block %q", condName) |
| 22 | } |
| 23 | bodyName := prim.Nodes["body"] |
| 24 | bodyBlock, ok := d.blocks[bodyName] |
| 25 | if !ok { |
| 26 | return nil, errors.Errorf("unable to located body basic block %q", bodyName) |
| 27 | } |
| 28 | exitName := prim.Nodes["exit"] |
| 29 | exitBlock, ok := d.blocks[exitName] |
| 30 | if !ok { |
| 31 | return nil, errors.Errorf("unable to located exit basic block %q", exitName) |
| 32 | } |
| 33 | block, err := d.primIf(condBlock, bodyBlock, exitBlock) |
| 34 | if err != nil { |
| 35 | return nil, errors.WithStack(err) |
| 36 | } |
| 37 | block.Name = prim.Entry |
| 38 | block.num = condBlock.num |
| 39 | return block, nil |
| 40 | case "if_else": |
| 41 | condName := prim.Nodes["cond"] |
| 42 | condBlock, ok := d.blocks[condName] |
| 43 | if !ok { |
| 44 | return nil, errors.Errorf("unable to located cond basic block %q", condName) |
| 45 | } |
| 46 | bodyTrueName := prim.Nodes["body_true"] |
| 47 | bodyTrueBlock, ok := d.blocks[bodyTrueName] |
| 48 | if !ok { |
| 49 | return nil, errors.Errorf("unable to located body_true basic block %q", bodyTrueName) |
| 50 | } |
| 51 | bodyFalseName := prim.Nodes["body_false"] |
| 52 | bodyFalseBlock, ok := d.blocks[bodyFalseName] |
| 53 | if !ok { |
| 54 | return nil, errors.Errorf("unable to located body_false basic block %q", bodyFalseName) |
| 55 | } |
| 56 | exitName := prim.Nodes["exit"] |
| 57 | exitBlock, ok := d.blocks[exitName] |
| 58 | if !ok { |
| 59 | return nil, errors.Errorf("unable to located exit basic block %q", exitName) |
| 60 | } |
| 61 | block, err := d.primIfElse(condBlock, bodyTrueBlock, bodyFalseBlock, exitBlock) |
| 62 | if err != nil { |
| 63 | return nil, errors.WithStack(err) |
| 64 | } |
| 65 | block.Name = prim.Entry |
| 66 | block.num = condBlock.num |
| 67 | return block, nil |
| 68 | case "if_return": |
| 69 | condName := prim.Nodes["cond"] |
| 70 | condBlock, ok := d.blocks[condName] |
| 71 | if !ok { |
| 72 | return nil, errors.Errorf("unable to located cond basic block %q", condName) |
no test coverage detected