MCPcopy Create free account
hub / github.com/decomp/decomp / prim

Method prim

cmd/ll2go/primitive.go:15–153  ·  view source on GitHub ↗

prim merges the basic blocks of the given primitive into a corresponding conceputal basic block for the primitive.

(prim *primitive.Primitive)

Source from the content-addressed store, hash-verified

13// prim merges the basic blocks of the given primitive into a corresponding
14// conceputal basic block for the primitive.
15func (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)

Callers 1

funcDeclMethod · 0.95

Calls 6

primIfMethod · 0.95
primIfElseMethod · 0.95
primIfReturnMethod · 0.95
primPreLoopMethod · 0.95
primPostLoopMethod · 0.95
primSeqMethod · 0.95

Tested by

no test coverage detected