• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

CityOfZion / neo3-boa / 5c8eab45-f99f-4697-a4ff-d2c04d4d17ac

01 Feb 2024 09:59PM UTC coverage: 92.107% (+0.5%) from 91.625%
5c8eab45-f99f-4697-a4ff-d2c04d4d17ac

push

circleci

Mirella de Medeiros
Bump version: 1.1.0 → 1.1.1

1 of 1 new or added line in 1 file covered. (100.0%)

302 existing lines in 22 files now uncovered.

20784 of 22565 relevant lines covered (92.11%)

2.76 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

98.51
/boa3/internal/model/builtin/method/reversedmethod.py
1
from typing import Any, Dict, Iterable, Optional
3✔
2

3
from boa3.internal.model.builtin.method.builtinmethod import IBuiltinMethod
3✔
4
from boa3.internal.model.type.collection.sequence.sequencetype import SequenceType
3✔
5
from boa3.internal.model.variable import Variable
3✔
6
from boa3.internal.neo.vm.opcode.Opcode import Opcode
3✔
7

8

9
class ReversedMethod(IBuiltinMethod):
3✔
10
    def __init__(self, args_type: SequenceType = None):
3✔
11
        from boa3.internal.model.type.type import Type
3✔
12
        identifier = 'reversed'
3✔
13
        if not isinstance(args_type, SequenceType):
3✔
14
            args_type = Type.sequence
3✔
15

16
        args: Dict[str, Variable] = {'sequence': Variable(args_type)}
3✔
17

18
        super().__init__(identifier, args, return_type=Type.reversed)
3✔
19

20
    @property
3✔
21
    def _args_on_stack(self) -> int:
3✔
22
        return len(self.args)
3✔
23

24
    @property
3✔
25
    def identifier(self) -> str:
3✔
26
        from boa3.internal.model.type.type import Type
3✔
27
        if self.args['sequence'].type is Type.sequence:
3✔
28
            return self.raw_identifier
3✔
29
        return '-{0}_from_{1}'.format(self._identifier, self.args['sequence'].type.identifier)
3✔
30

31
    def build(self, value: Any) -> IBuiltinMethod:
3✔
32
        if isinstance(value, Iterable) and len(value) > 0:
3✔
33
            value = value[0]
3✔
34

35
        if not isinstance(value, SequenceType):
3✔
36
            return ReversedMethod()
3✔
37

38
        if type(value) == type(self.args['sequence'].type):
3✔
39
            return self
3✔
40

41
        return ReversedMethod(value)
3✔
42

43
    @property
3✔
44
    def _body(self) -> Optional[str]:
3✔
UNCOV
45
        return
×
46

47
    def generate_internal_opcodes(self, code_generator):
3✔
48
        from boa3.internal.model.builtin.builtin import Builtin
3✔
49
        from boa3.internal.model.operation.binaryop import BinaryOp
3✔
50
        from boa3.internal.model.type.type import Type
3✔
51
        from boa3.internal.neo.vm.type.StackItem import StackItemType
3✔
52

53
        # if isinstance(arg1, (str, bytes)):
54
        code_generator.duplicate_stack_top_item()
3✔
55
        code_generator.insert_type_check(StackItemType.ByteString)
3✔
56
        is_byte_str = code_generator.convert_begin_if()
3✔
57

58
        #     list_aux = []
59
        code_generator.convert_new_empty_array(length=0, array_type=self.return_type)
3✔
60
        #     limit = len(arg)
61
        code_generator.swap_reverse_stack_items(2)
3✔
62
        code_generator.duplicate_stack_top_item()
3✔
63
        code_generator.convert_builtin_method_call(Builtin.Len, is_internal=True)
3✔
64
        #     index = 0
65
        code_generator.convert_literal(0)
3✔
66

67
        #     while index < limit:
68
        while_index_is_valid = code_generator.convert_begin_while()
3✔
69
        #         list_aux.append(arg[index])
70
        code_generator.duplicate_stack_item(4)
3✔
71
        code_generator.duplicate_stack_item(4)
3✔
72
        code_generator.duplicate_stack_item(3)
3✔
73
        code_generator.convert_literal(1)
3✔
74
        code_generator.convert_get_substring(is_internal=True)
3✔
75
        code_generator.convert_cast(Type.int if Type.bytes.is_type_of(self.args['sequence'].type)
3✔
76
                                    else Type.str, is_internal=True)
77
        code_generator.convert_builtin_method_call(Builtin.SequenceAppend, is_internal=True)
3✔
78
        #         index += 1
79
        code_generator.insert_opcode(Opcode.INC)
3✔
80

81
        while_condition = code_generator.bytecode_size
3✔
82
        code_generator.duplicate_stack_top_item()
3✔
83
        code_generator.duplicate_stack_item(3)
3✔
84
        code_generator.convert_operation(BinaryOp.Lt, is_internal=True)
3✔
85
        code_generator.convert_end_while(while_index_is_valid, while_condition, is_internal=True)
3✔
86

87
        for _ in range(3):
3✔
88
            code_generator.remove_stack_top_item()
3✔
89

90
        # else:
91
        else_is_bytes_str = code_generator.convert_begin_else(is_byte_str, is_internal=True)
3✔
92
        #     list_aux = arg.copy()
93
        code_generator.convert_copy()
3✔
94

95
        # list_aux.reverse()
96
        code_generator.convert_end_if(else_is_bytes_str, is_internal=True)
3✔
97

98
        code_generator.duplicate_stack_top_item()
3✔
99
        code_generator.insert_opcode(Opcode.REVERSEITEMS)
3✔
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc