File: interp_group.py

package info (click to toggle)
pypy3 7.3.19%2Bdfsg-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 212,236 kB
  • sloc: python: 2,098,316; ansic: 540,565; sh: 21,462; asm: 14,419; cpp: 4,451; makefile: 4,209; objc: 761; xml: 530; exp: 499; javascript: 314; pascal: 244; lisp: 45; csh: 12; awk: 4
file content (111 lines) | stat: -rw-r--r-- 4,223 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
from pypy.module.exceptions.interp_exceptions import W_BaseException, W_Exception, _new_exception
from pypy.interpreter.gateway import interp2app, unwrap_spec, WrappedDefault, applevel
from pypy.interpreter.typedef import (
    TypeDef, GetSetProperty, interp_attrproperty_w,
    descr_get_dict, descr_set_dict, descr_del_dict)
from pypy.objspace.std.util import generic_alias_class_getitem

class W_BaseExceptionGroup(W_BaseException):
    """A combination of unrelated exceptions."""

    def __init__(self, space):
        W_BaseException.__init__(self, space)

    @staticmethod
    def descr_new(space, w_subtype, w_message, w_exceptions):
        w_subtype, w_exceptions = space.unpackiterable(check_new_args(space, w_subtype, w_message, w_exceptions), 2)
        exc = space.allocate_instance(W_BaseExceptionGroup, w_subtype)
        W_BaseExceptionGroup.__init__(exc, space)
        exc.w_message = w_message
        exc.w_exceptions = w_exceptions
        exc.args_w = [w_message, w_exceptions]
        return exc

    def descr_init(self, space, args_w):
        if len(args_w) > 0:
            self.w_value = args_w[0]
        W_BaseException.descr_init(self, space, args_w)

    def descr_str(self, space):
        return app_str(space, self)

    def descr_repr(self, space):
        return app_repr(space, self)
    
    def subgroup(self, space, w_condition):
        """
        Returns an exception group that contains only the exceptions from the
        current group that match condition, or None if the result is empty.
        """
        return subgroup(space, self, w_condition)

    def split(self, space, w_condition):
        """
        Like subgroup(), but returns the pair (match, rest) where match is
        subgroup(condition) and rest is the remaining non-matching part.
        """
        return split(space, self, w_condition)


    def derive(self, space, w_excs):
        """
        Returns an exception group that contains only the exceptions from the
        current group that match condition, or None if the result is empty.
        """
        return space.call_function(space.w_BaseExceptionGroup, self.w_message, w_excs)

W_BaseExceptionGroup.typedef = TypeDef(
    'BaseExceptionGroup',
    W_BaseException.typedef,
    __doc__ = W_BaseExceptionGroup.__doc__,
    __module__ = 'builtins',
    __new__ = interp2app(W_BaseExceptionGroup.descr_new),
    __init__ = interp2app(W_BaseExceptionGroup.descr_init),
    __str__ = interp2app(W_BaseExceptionGroup.descr_str),
    __repr__ = interp2app(W_BaseExceptionGroup.descr_repr),
    __class_getitem__ = interp2app(
        generic_alias_class_getitem, as_classmethod=True),
    subgroup = interp2app(W_BaseExceptionGroup.subgroup),
    split = interp2app(W_BaseExceptionGroup.split),
    derive = interp2app(W_BaseExceptionGroup.derive),
    message = interp_attrproperty_w('w_message', W_BaseExceptionGroup),
    exceptions = interp_attrproperty_w('w_exceptions', W_BaseExceptionGroup),
)

class W_ExceptionGroup(W_BaseExceptionGroup):
    pass

W_ExceptionGroup.typedef = TypeDef(
    'ExceptionGroup',
    (W_BaseExceptionGroup.typedef, W_Exception.typedef),
    __module__ = 'builtins',
)
W_ExceptionGroup.typedef.applevel_subclasses_base = W_BaseExceptionGroup

def prep_reraise_star(space, w_obj, w_exc_list):
    return _prep_reraise_star(space, w_obj, w_exc_list)

def collect_eg_leafs(space, w_exc, w_result_set):
    return _collect_eg_leafs(space, w_exc, w_result_set)

def exception_group_projection(space, w_eg, w_keep_list):
    return _exception_group_projection(space, w_eg, w_keep_list)


# lot's of helper code implemented at applevel

import os
appfile = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'app_group.py')

with open(appfile, "r") as f:
    content = f.read()

app = applevel(content, filename=__file__)
check_new_args = app.interphook('check_new_args')
app_str = app.interphook('__str__')
app_repr = app.interphook('__repr__')
subgroup = app.interphook('subgroup')
split = app.interphook('split')
_prep_reraise_star = app.interphook('_prep_reraise_star')
_collect_eg_leafs = app.interphook('_collect_eg_leafs')
_exception_group_projection = app.interphook('_exception_group_projection')