MCPcopy Index your code
hub / github.com/chain/Core / opCheckPredicate

Function opCheckPredicate

protocol/vm/control.go:30–79  ·  view source on GitHub ↗
(vm *virtualMachine)

Source from the content-addressed store, hash-verified

28}
29
30func opCheckPredicate(vm *virtualMachine) error {
31 err := vm.applyCost(256)
32 if err != nil {
33 return err
34 }
35 vm.deferCost(-256 + 64) // get most of that cost back at the end
36 limit, err := vm.popInt64(true)
37 if err != nil {
38 return err
39 }
40 predicate, err := vm.pop(true)
41 if err != nil {
42 return err
43 }
44 n, err := vm.popInt64(true)
45 if err != nil {
46 return err
47 }
48 if limit < 0 {
49 return ErrBadValue
50 }
51 l := int64(len(vm.dataStack))
52 if n > l {
53 return ErrDataStackUnderflow
54 }
55 if limit == 0 {
56 limit = vm.runLimit
57 }
58 err = vm.applyCost(limit)
59 if err != nil {
60 return err
61 }
62
63 childVM := virtualMachine{
64 context: vm.context,
65 program: predicate,
66 runLimit: limit,
67 depth: vm.depth + 1,
68 dataStack: append([][]byte{}, vm.dataStack[l-n:]...),
69 }
70 vm.dataStack = vm.dataStack[:l-n]
71
72 childErr := childVM.run()
73
74 vm.deferCost(-childVM.runLimit)
75 vm.deferCost(-stackCost(childVM.dataStack))
76 vm.deferCost(-stackCost(childVM.altStack))
77
78 return vm.pushBool(childErr == nil && !childVM.falseResult(), true)
79}
80
81func opJump(vm *virtualMachine) error {
82 err := vm.applyCost(1)

Callers

nothing calls this directly

Calls 8

runMethod · 0.95
falseResultMethod · 0.95
stackCostFunction · 0.85
applyCostMethod · 0.80
deferCostMethod · 0.80
popInt64Method · 0.80
popMethod · 0.80
pushBoolMethod · 0.80

Tested by

no test coverage detected