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

CityOfZion / neo3-boa / 858f5658-b835-4f01-86b4-3a69cebd0b86

16 Oct 2023 06:23PM UTC coverage: 91.625% (+0.004%) from 91.621%
858f5658-b835-4f01-86b4-3a69cebd0b86

push

circleci

Mirella de Medeiros
Bump version: 1.0.1 → 1.1.0

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

19988 of 21815 relevant lines covered (91.63%)

0.92 hits per line

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

81.82
/boa3/internal/model/builtin/classmethod/removemethod.py
1
from typing import Any, Dict, Optional
1✔
2

3
from boa3.internal.model.builtin.method.builtinmethod import IBuiltinMethod
1✔
4
from boa3.internal.model.expression import IExpression
1✔
5
from boa3.internal.model.type.collection.sequence.mutable.mutablesequencetype import MutableSequenceType
1✔
6
from boa3.internal.model.variable import Variable
1✔
7

8

9
class RemoveMethod(IBuiltinMethod):
1✔
10
    def __init__(self, sequence_type: MutableSequenceType = None):
1✔
11
        if not isinstance(sequence_type, MutableSequenceType):
1✔
12
            from boa3.internal.model.type.type import Type
1✔
13
            sequence_type = Type.mutableSequence
1✔
14

15
        self_arg = Variable(sequence_type)
1✔
16
        item_arg = Variable(sequence_type.value_type)
1✔
17

18
        identifier = 'remove'
1✔
19
        args: Dict[str, Variable] = {'self': self_arg,
1✔
20
                                     '__value': item_arg}
21
        super().__init__(identifier, args)
1✔
22

23
    @property
1✔
24
    def _arg_self(self) -> Variable:
1✔
25
        return self.args['self']
×
26

27
    def validate_parameters(self, *params: IExpression) -> bool:
1✔
28
        if len(params) != 2:
×
29
            return False
×
30
        if not all(isinstance(param, IExpression) for param in params):
×
31
            return False
×
32

33
        from boa3.internal.model.type.itype import IType
×
34
        sequence_type: IType = params[0].type
×
35
        value_type: IType = params[1].type
×
36

37
        if not isinstance(sequence_type, MutableSequenceType):
×
38
            return False
×
39
        return sequence_type.value_type.is_type_of(value_type)
×
40

41
    def generate_internal_opcodes(self, code_generator):
1✔
42
        from boa3.internal.model.builtin.builtin import Builtin
1✔
43
        from boa3.internal.model.operation.binaryop import BinaryOp
1✔
44
        from boa3.internal.neo.vm.opcode.Opcode import Opcode
1✔
45

46
        # index = 0
47
        # need to find the index to use REMOVE opcode
48
        code_generator.convert_literal(0)
1✔
49

50
        # while index < len(array):
51
        while_begin = code_generator.convert_begin_while()
1✔
52

53
        code_generator.duplicate_stack_item(3)
1✔
54
        code_generator.duplicate_stack_item(2)
1✔
55
        code_generator.convert_get_item(index_inserted_internally=True)
1✔
56
        code_generator.duplicate_stack_item(3)
1✔
57
        #   if array[index] == value
58
        if_found = code_generator.convert_begin_if()
1✔
59
        code_generator.change_jump(if_found, Opcode.JMPNE)
1✔
60

61
        #       break
62
        code_generator.convert_loop_break()
1✔
63
        code_generator.convert_end_if(if_found)
1✔
64

65
        #   index += 1
66
        code_generator.insert_opcode(Opcode.INC)
1✔
67

68
        # while condition
69
        while_condition = code_generator.bytecode_size
1✔
70
        code_generator.duplicate_stack_top_item()
1✔
71
        code_generator.duplicate_stack_item(4)
1✔
72
        code_generator.convert_builtin_method_call(Builtin.Len, is_internal=True)
1✔
73
        code_generator.convert_operation(BinaryOp.Lt, is_internal=True)
1✔
74

75
        code_generator.convert_end_while(while_begin, while_condition, is_internal=True)
1✔
76

77
        # clean stack and remove item from collection
78
        code_generator.remove_stack_item(2)
1✔
79
        code_generator.insert_opcode(Opcode.REMOVE)
1✔
80

81
    def push_self_first(self) -> bool:
1✔
82
        return self.has_self_argument
1✔
83

84
    @property
1✔
85
    def _args_on_stack(self) -> int:
1✔
86
        return len(self.args)
1✔
87

88
    @property
1✔
89
    def _body(self) -> Optional[str]:
1✔
90
        return None
×
91

92
    def build(self, value: Any) -> IBuiltinMethod:
1✔
93
        if type(value) == type(self.args['self'].type):
1✔
94
            return self
1✔
95
        if isinstance(value, MutableSequenceType):
1✔
96
            return RemoveMethod(value)
1✔
97
        return super().build(value)
1✔
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