code: func (it *instructionIterator) Next() bool {
  	if it.error != nil || uint64(len(it.code)) <= it.pc {
  		// We previously reached an error or the end.
  		return false
  	}
  
  	if it.started {
  		// Since the iteration has been already started we move to the next instruction.
  		if it.arg != nil {
  			it.pc += uint64(len(it.arg))
  		}
  		it.pc++
  	} else {
  		// We start the iteration from the first instruction.
  		it.started = true
  	}
  
  	if uint64(len(it.code)) <= it.pc {
  		// We reached the end.
  		return false
  	}
  
  	it.op = vm.OpCode(it.code[it.pc])
  	if it.op.IsPush() {
  		a := uint64(it.op) - uint64(vm.PUSH1) + 1
  		u := it.pc + 1 + a
  		if uint64(len(it.code)) <= it.pc || uint64(len(it.code)) < u {
  			it.error = fmt.Errorf("incomplete push instruction at %v", it.pc)
  			return false
  		}
  		it.arg = it.code[it.pc+1 : u]
  	} else {
  		it.arg = nil
  	}
  	return true
  }
docs: // Returns true if there is a next instruction and moves on.