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

CityOfZion / neo3-boa / e084b44c-1a5f-4649-92cd-d3ed06099181

05 Mar 2024 05:58PM UTC coverage: 92.023% (-0.08%) from 92.107%
e084b44c-1a5f-4649-92cd-d3ed06099181

push

circleci

Mirella de Medeiros
CU-86drpnc9z - Drop support to Python 3.10

20547 of 22328 relevant lines covered (92.02%)

1.84 hits per line

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

81.25
/boa3/internal/model/builtin/classmethod/appendmethod.py
1
from collections.abc import Sized
2✔
2
from typing import Any
2✔
3

4
from boa3.internal.model.builtin.method.builtinmethod import IBuiltinMethod
2✔
5
from boa3.internal.model.expression import IExpression
2✔
6
from boa3.internal.model.type.collection.sequence.mutable.mutablesequencetype import MutableSequenceType
2✔
7
from boa3.internal.model.variable import Variable
2✔
8
from boa3.internal.neo.vm.opcode.Opcode import Opcode
2✔
9

10

11
class AppendMethod(IBuiltinMethod):
2✔
12
    def __init__(self, sequence_type: MutableSequenceType = None):
2✔
13
        if not isinstance(sequence_type, MutableSequenceType):
2✔
14
            from boa3.internal.model.type.type import Type
2✔
15
            self_arg = Variable(Type.mutableSequence)
2✔
16
            item_arg = Variable(Type.any)
2✔
17
        else:
18
            self_arg = Variable(sequence_type)
2✔
19
            item_arg = Variable(sequence_type.value_type)
2✔
20

21
        identifier = 'append'
2✔
22
        args: dict[str, Variable] = {'self': self_arg, 'item': item_arg}
2✔
23
        super().__init__(identifier, args)
2✔
24

25
    @property
2✔
26
    def _arg_self(self) -> Variable:
2✔
27
        return self.args['self']
×
28

29
    @property
2✔
30
    def stores_on_slot(self) -> bool:
2✔
31
        return True
2✔
32

33
    def validate_parameters(self, *params: IExpression) -> bool:
2✔
34
        if len(params) != 2:
×
35
            return False
×
36
        if not all(isinstance(param, IExpression) for param in params):
×
37
            return False
×
38

39
        from boa3.internal.model.type.itype import IType
×
40
        sequence_type: IType = params[0].type
×
41
        value_type: IType = params[1].type
×
42

43
        if not isinstance(sequence_type, MutableSequenceType):
×
44
            return False
×
45
        return sequence_type.value_type.is_type_of(value_type)
×
46

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

52
        code_generator.duplicate_stack_item(2)
2✔
53
        code_generator.insert_type_check(StackItemType.Buffer)  # append opcode only works for array
2✔
54
        # if self is bytes
55
        if_bytes = code_generator.convert_begin_if()
2✔
56
        #   result = self + arg     # when it's bytearray, concatenates the value
57
        code_generator.convert_operation(BinaryOp.Concat.build(Type.bytearray, Type.bytearray))
2✔
58

59
        # else:
60
        else_bytes = code_generator.convert_begin_else(if_bytes, is_internal=True)
2✔
61
        #   self.append()
62
        super().generate_opcodes(code_generator)
2✔
63

64
        code_generator.convert_end_if(else_bytes, is_internal=True)
2✔
65

66
    def generate_internal_opcodes(self, code_generator):
2✔
67
        code_generator.insert_opcode(Opcode.APPEND)
2✔
68

69
    def push_self_first(self) -> bool:
2✔
70
        return self.has_self_argument
2✔
71

72
    @property
2✔
73
    def _args_on_stack(self) -> int:
2✔
74
        return len(self.args)
2✔
75

76
    @property
2✔
77
    def _body(self) -> str | None:
2✔
78
        return None
×
79

80
    def build(self, value: Any) -> IBuiltinMethod:
2✔
81
        if isinstance(value, Sized) and len(value) > 0:
2✔
82
            value = value[0]
2✔
83
        if value == self.args['self'].type:
2✔
84
            return self
2✔
85
        if isinstance(value, MutableSequenceType):
2✔
86
            return AppendMethod(value)
2✔
87
        return super().build(value)
2✔
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