Signature of a function in IR.
| 75 | |
| 76 | |
| 77 | class FuncSignature: |
| 78 | """Signature of a function in IR.""" |
| 79 | |
| 80 | # TODO: Track if method? |
| 81 | |
| 82 | def __init__(self, args: Sequence[RuntimeArg], ret_type: RType) -> None: |
| 83 | self.args = tuple(args) |
| 84 | self.ret_type = ret_type |
| 85 | # Bitmap arguments are use to mark default values for arguments that |
| 86 | # have types with overlapping error values. |
| 87 | self.num_bitmap_args = num_bitmap_args(self.args) |
| 88 | if self.num_bitmap_args: |
| 89 | extra = [ |
| 90 | RuntimeArg(bitmap_name(i), bitmap_rprimitive, pos_only=True) |
| 91 | for i in range(self.num_bitmap_args) |
| 92 | ] |
| 93 | self.args = self.args + tuple(reversed(extra)) |
| 94 | |
| 95 | def real_args(self) -> tuple[RuntimeArg, ...]: |
| 96 | """Return arguments without any synthetic bitmap arguments.""" |
| 97 | if self.num_bitmap_args: |
| 98 | return self.args[: -self.num_bitmap_args] |
| 99 | return self.args |
| 100 | |
| 101 | def bound_sig(self) -> FuncSignature: |
| 102 | if self.num_bitmap_args: |
| 103 | return FuncSignature(self.args[1 : -self.num_bitmap_args], self.ret_type) |
| 104 | else: |
| 105 | return FuncSignature(self.args[1:], self.ret_type) |
| 106 | |
| 107 | def __repr__(self) -> str: |
| 108 | return f"FuncSignature(args={self.args!r}, ret={self.ret_type!r})" |
| 109 | |
| 110 | def serialize(self) -> JsonDict: |
| 111 | if self.num_bitmap_args: |
| 112 | args = self.args[: -self.num_bitmap_args] |
| 113 | else: |
| 114 | args = self.args |
| 115 | return {"args": [t.serialize() for t in args], "ret_type": self.ret_type.serialize()} |
| 116 | |
| 117 | @classmethod |
| 118 | def deserialize(cls, data: JsonDict, ctx: DeserMaps) -> FuncSignature: |
| 119 | return FuncSignature( |
| 120 | [RuntimeArg.deserialize(arg, ctx) for arg in data["args"]], |
| 121 | deserialize_type(data["ret_type"], ctx), |
| 122 | ) |
| 123 | |
| 124 | |
| 125 | def num_bitmap_args(args: tuple[RuntimeArg, ...]) -> int: |
no outgoing calls
searching dependent graphs…