crosshair-tool 0.0.93__cp310-cp310-win_amd64.whl → 0.0.95__cp310-cp310-win_amd64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- _crosshair_tracers.cp310-win_amd64.pyd +0 -0
- crosshair/__init__.py +1 -1
- crosshair/core.py +13 -0
- crosshair/core_test.py +25 -1
- crosshair/dynamic_typing.py +36 -15
- crosshair/dynamic_typing_test.py +18 -3
- crosshair/examples/check_examples_test.py +1 -1
- crosshair/libimpl/builtinslib.py +0 -12
- crosshair/main.py +18 -10
- crosshair/main_test.py +18 -9
- crosshair/objectproxy.py +38 -13
- crosshair/objectproxy_test.py +20 -2
- {crosshair_tool-0.0.93.dist-info → crosshair_tool-0.0.95.dist-info}/METADATA +1 -1
- {crosshair_tool-0.0.93.dist-info → crosshair_tool-0.0.95.dist-info}/RECORD +18 -18
- {crosshair_tool-0.0.93.dist-info → crosshair_tool-0.0.95.dist-info}/WHEEL +0 -0
- {crosshair_tool-0.0.93.dist-info → crosshair_tool-0.0.95.dist-info}/entry_points.txt +0 -0
- {crosshair_tool-0.0.93.dist-info → crosshair_tool-0.0.95.dist-info}/licenses/LICENSE +0 -0
- {crosshair_tool-0.0.93.dist-info → crosshair_tool-0.0.95.dist-info}/top_level.txt +0 -0
|
Binary file
|
crosshair/__init__.py
CHANGED
|
@@ -15,7 +15,7 @@ from crosshair.statespace import StateSpace
|
|
|
15
15
|
from crosshair.tracers import NoTracing, ResumedTracing
|
|
16
16
|
from crosshair.util import IgnoreAttempt, debug
|
|
17
17
|
|
|
18
|
-
__version__ = "0.0.
|
|
18
|
+
__version__ = "0.0.95" # Do not forget to update in setup.py!
|
|
19
19
|
__author__ = "Phillip Schanely"
|
|
20
20
|
__license__ = "MIT"
|
|
21
21
|
__status__ = "Alpha"
|
crosshair/core.py
CHANGED
|
@@ -127,6 +127,14 @@ from crosshair.util import (
|
|
|
127
127
|
warn,
|
|
128
128
|
)
|
|
129
129
|
|
|
130
|
+
if sys.version_info >= (3, 12):
|
|
131
|
+
from typing import TypeAliasType
|
|
132
|
+
|
|
133
|
+
TypeAliasTypes = (TypeAliasType,)
|
|
134
|
+
else:
|
|
135
|
+
TypeAliasTypes = ()
|
|
136
|
+
|
|
137
|
+
|
|
130
138
|
_MISSING = object()
|
|
131
139
|
|
|
132
140
|
|
|
@@ -667,6 +675,11 @@ def proxy_for_type(
|
|
|
667
675
|
typ = normalize_pytype(typ)
|
|
668
676
|
origin = origin_of(typ)
|
|
669
677
|
type_args = type_args_of(typ)
|
|
678
|
+
while isinstance(origin, TypeAliasTypes):
|
|
679
|
+
type_var_bindings = dict(zip(origin.__type_params__, type_args))
|
|
680
|
+
unified = dynamic_typing.realize(origin.__value__, type_var_bindings)
|
|
681
|
+
return proxy_for_type(unified, varname, allow_subtypes)
|
|
682
|
+
|
|
670
683
|
# special cases
|
|
671
684
|
if isinstance(typ, type) and issubclass(typ, enum.Enum):
|
|
672
685
|
enum_values = list(typ) # type:ignore
|
crosshair/core_test.py
CHANGED
|
@@ -5,6 +5,7 @@ import re
|
|
|
5
5
|
import sys
|
|
6
6
|
import time
|
|
7
7
|
from typing import *
|
|
8
|
+
from unittest import skipIf
|
|
8
9
|
|
|
9
10
|
import pytest # type: ignore
|
|
10
11
|
|
|
@@ -28,7 +29,7 @@ from crosshair.core_and_libs import (
|
|
|
28
29
|
standalone_statespace,
|
|
29
30
|
)
|
|
30
31
|
from crosshair.fnutil import FunctionInfo, walk_qualname
|
|
31
|
-
from crosshair.libimpl.builtinslib import SymbolicInt
|
|
32
|
+
from crosshair.libimpl.builtinslib import LazyIntSymbolicStr, SymbolicInt
|
|
32
33
|
from crosshair.options import DEFAULT_OPTIONS, AnalysisOptionSet
|
|
33
34
|
from crosshair.statespace import (
|
|
34
35
|
CANNOT_CONFIRM,
|
|
@@ -735,6 +736,29 @@ def test_newtype() -> None:
|
|
|
735
736
|
assert isinstance(x, SymbolicInt)
|
|
736
737
|
|
|
737
738
|
|
|
739
|
+
@skipIf(sys.version_info < (3, 12), "type statements added in 3.12")
|
|
740
|
+
def test_type_statement() -> None:
|
|
741
|
+
env: dict[str, Any] = {}
|
|
742
|
+
exec("type MyIntNew = int\n", env)
|
|
743
|
+
assert "MyIntNew" in env
|
|
744
|
+
MyIntNew = env["MyIntNew"]
|
|
745
|
+
with standalone_statespace:
|
|
746
|
+
x = proxy_for_type(MyIntNew, "x")
|
|
747
|
+
assert isinstance(x, SymbolicInt)
|
|
748
|
+
|
|
749
|
+
|
|
750
|
+
@skipIf(sys.version_info < (3, 12), "type statements added in 3.12")
|
|
751
|
+
def test_parameterized_type_statement() -> None:
|
|
752
|
+
env: dict[str, Any] = {}
|
|
753
|
+
exec("type Pair[A, B] = tuple[B, A]\n", env)
|
|
754
|
+
assert "Pair" in env
|
|
755
|
+
Pair = env["Pair"]
|
|
756
|
+
with standalone_statespace:
|
|
757
|
+
x = proxy_for_type(Pair[int, str], "x")
|
|
758
|
+
assert isinstance(x[0], LazyIntSymbolicStr)
|
|
759
|
+
assert isinstance(x[1], SymbolicInt)
|
|
760
|
+
|
|
761
|
+
|
|
738
762
|
def test_container_typevar() -> None:
|
|
739
763
|
T = TypeVar("T")
|
|
740
764
|
|
crosshair/dynamic_typing.py
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import collections.abc
|
|
2
|
+
import sys
|
|
2
3
|
import typing
|
|
3
4
|
from inspect import Parameter, Signature
|
|
4
5
|
from itertools import zip_longest
|
|
@@ -223,21 +224,41 @@ def get_bindings_from_type_arguments(pytype: Type) -> Mapping[object, type]:
|
|
|
223
224
|
return {}
|
|
224
225
|
|
|
225
226
|
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
newargs
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
pytype_origin
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
227
|
+
if sys.version_info >= (3, 9):
|
|
228
|
+
|
|
229
|
+
def realize(pytype: Type, bindings: Mapping[object, type]) -> object:
|
|
230
|
+
if typing_inspect.is_typevar(pytype):
|
|
231
|
+
return bindings[pytype]
|
|
232
|
+
if not hasattr(pytype, "__args__"):
|
|
233
|
+
return pytype
|
|
234
|
+
newargs: List = []
|
|
235
|
+
for arg in pytype.__args__: # type:ignore
|
|
236
|
+
newargs.append(realize(arg, bindings))
|
|
237
|
+
pytype_origin = origin_of(pytype)
|
|
238
|
+
if pytype_origin in (
|
|
239
|
+
collections.abc.Callable,
|
|
240
|
+
typing.Callable,
|
|
241
|
+
): # Callable args get flattened
|
|
242
|
+
newargs = [newargs[:-1], newargs[-1]]
|
|
243
|
+
return pytype_origin.__class_getitem__(tuple(newargs))
|
|
244
|
+
|
|
245
|
+
else:
|
|
246
|
+
|
|
247
|
+
def realize(pytype: Type, bindings: Mapping[object, type]) -> object:
|
|
248
|
+
if typing_inspect.is_typevar(pytype):
|
|
249
|
+
return bindings[pytype]
|
|
250
|
+
if not hasattr(pytype, "__args__"):
|
|
251
|
+
return pytype
|
|
252
|
+
newargs: List = []
|
|
253
|
+
for arg in pytype.__args__: # type:ignore
|
|
254
|
+
newargs.append(realize(arg, bindings))
|
|
255
|
+
# print('realizing pytype', repr(pytype), 'newargs', repr(newargs))
|
|
256
|
+
pytype_origin = origin_of(pytype)
|
|
257
|
+
if not hasattr(pytype_origin, "_name"):
|
|
258
|
+
pytype_origin = getattr(typing, pytype._name) # type:ignore
|
|
259
|
+
if pytype_origin is Callable: # Callable args get flattened
|
|
260
|
+
newargs = [newargs[:-1], newargs[-1]]
|
|
261
|
+
return pytype_origin.__getitem__(tuple(newargs))
|
|
241
262
|
|
|
242
263
|
|
|
243
264
|
def isolate_var_params(
|
crosshair/dynamic_typing_test.py
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import collections
|
|
2
|
+
import sys
|
|
2
3
|
from inspect import Parameter, Signature, signature
|
|
3
4
|
from typing import (
|
|
4
5
|
Callable,
|
|
@@ -60,7 +61,12 @@ def test_typedicts():
|
|
|
60
61
|
def test_typevars():
|
|
61
62
|
bindings = collections.ChainMap()
|
|
62
63
|
assert unify(Tuple[int, str, List[int]], Tuple[int, _T, _U], bindings)
|
|
63
|
-
|
|
64
|
+
|
|
65
|
+
ret = realize(Mapping[_U, _T], bindings)
|
|
66
|
+
if sys.version_info >= (3, 9):
|
|
67
|
+
assert ret == collections.abc.Mapping[List[int], str]
|
|
68
|
+
else:
|
|
69
|
+
assert ret == Mapping[List[int], str]
|
|
64
70
|
|
|
65
71
|
|
|
66
72
|
def test_bound_vtypears():
|
|
@@ -79,7 +85,13 @@ def test_callable():
|
|
|
79
85
|
|
|
80
86
|
assert not unify(Callable[[List], bool], Callable[[Iterable], bool], bindings)
|
|
81
87
|
assert unify(Callable[[int, _T], List[int]], Callable[[int, str], _U], bindings)
|
|
82
|
-
|
|
88
|
+
if sys.version_info >= (3, 9):
|
|
89
|
+
assert (
|
|
90
|
+
realize(Callable[[_U], _T], bindings)
|
|
91
|
+
== collections.abc.Callable[[List[int]], str]
|
|
92
|
+
)
|
|
93
|
+
else:
|
|
94
|
+
assert realize(Callable[[_U], _T], bindings) == Callable[[List[int]], str]
|
|
83
95
|
|
|
84
96
|
|
|
85
97
|
def test_plain_callable():
|
|
@@ -131,7 +143,10 @@ class Pair(Generic[_U, _T]):
|
|
|
131
143
|
def test_bindings_from_type_arguments():
|
|
132
144
|
var_mapping = get_bindings_from_type_arguments(Pair[int, str])
|
|
133
145
|
assert var_mapping == {_U: int, _T: str}
|
|
134
|
-
|
|
146
|
+
if sys.version_info >= (3, 9):
|
|
147
|
+
assert realize(List[_U], var_mapping) == list[int]
|
|
148
|
+
else:
|
|
149
|
+
assert realize(List[_U], var_mapping) == List[int]
|
|
135
150
|
|
|
136
151
|
|
|
137
152
|
def test_intersect_signatures_basic():
|
|
@@ -24,7 +24,7 @@ def extract_linenums(text: str) -> List[int]:
|
|
|
24
24
|
|
|
25
25
|
def find_examples() -> Iterable[Path]:
|
|
26
26
|
examples_dir = pathlib.Path(os.path.realpath(__file__)).parent
|
|
27
|
-
for path in sorted(examples_dir.glob("
|
|
27
|
+
for path in sorted(examples_dir.glob("*/**/*.py")):
|
|
28
28
|
if path.stem != "__init__":
|
|
29
29
|
yield path
|
|
30
30
|
|
crosshair/libimpl/builtinslib.py
CHANGED
|
@@ -2611,18 +2611,6 @@ class SymbolicObject(ObjectProxy, CrossHairValue, Untracable):
|
|
|
2611
2611
|
return object()
|
|
2612
2612
|
return proxy_for_type(pytype, varname, allow_subtypes=False)
|
|
2613
2613
|
|
|
2614
|
-
def _wrapped(self):
|
|
2615
|
-
with NoTracing():
|
|
2616
|
-
inner = _MISSING
|
|
2617
|
-
try:
|
|
2618
|
-
inner = object.__getattribute__(self, "_inner")
|
|
2619
|
-
except AttributeError:
|
|
2620
|
-
pass
|
|
2621
|
-
if inner is _MISSING:
|
|
2622
|
-
inner = self._realize()
|
|
2623
|
-
object.__setattr__(self, "_inner", inner)
|
|
2624
|
-
return inner
|
|
2625
|
-
|
|
2626
2614
|
def __ch_realize__(self):
|
|
2627
2615
|
return realize(self._wrapped())
|
|
2628
2616
|
|
crosshair/main.py
CHANGED
|
@@ -860,16 +860,24 @@ def check(
|
|
|
860
860
|
if isinstance(entities, int):
|
|
861
861
|
return entities
|
|
862
862
|
full_options = DEFAULT_OPTIONS.overlay(report_verbose=False).overlay(options)
|
|
863
|
-
for
|
|
864
|
-
|
|
865
|
-
|
|
866
|
-
|
|
867
|
-
|
|
868
|
-
|
|
869
|
-
|
|
870
|
-
|
|
871
|
-
|
|
872
|
-
|
|
863
|
+
checkables = [c for e in entities for c in analyze_any(e, options)]
|
|
864
|
+
if not checkables:
|
|
865
|
+
extra_help = ""
|
|
866
|
+
if full_options.analysis_kind == [AnalysisKind.asserts]:
|
|
867
|
+
extra_help = "\nHINT: Ensure that your functions to analyze lead with assert statements."
|
|
868
|
+
print(
|
|
869
|
+
"WARNING: Targets found, but contain no checkable functions." + extra_help,
|
|
870
|
+
file=stderr,
|
|
871
|
+
)
|
|
872
|
+
|
|
873
|
+
for message in run_checkables(checkables):
|
|
874
|
+
line = describe_message(message, full_options)
|
|
875
|
+
if line is None:
|
|
876
|
+
continue
|
|
877
|
+
stdout.write(line + "\n")
|
|
878
|
+
debug("Traceback for output message:\n", message.traceback)
|
|
879
|
+
if message.state > MessageType.PRE_UNSAT:
|
|
880
|
+
any_problems = True
|
|
873
881
|
return 1 if any_problems else 0
|
|
874
882
|
|
|
875
883
|
|
crosshair/main_test.py
CHANGED
|
@@ -251,19 +251,28 @@ def test_no_args_prints_usage(root):
|
|
|
251
251
|
assert re.search(r"^usage", out)
|
|
252
252
|
|
|
253
253
|
|
|
254
|
-
def
|
|
254
|
+
def test_assert_mode_e2e(root, capsys: pytest.CaptureFixture[str]):
|
|
255
255
|
simplefs(root, ASSERT_BASED_FOO)
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
finally:
|
|
260
|
-
out = sys.stdout.getvalue()
|
|
261
|
-
sys.stdout = sys.__stdout__
|
|
262
|
-
assert exitcode == 1
|
|
256
|
+
exitcode = unwalled_main(["check", str(root / "foo.py"), "--analysis_kind=asserts"])
|
|
257
|
+
(out, err) = capsys.readouterr()
|
|
258
|
+
assert err == ""
|
|
263
259
|
assert re.search(
|
|
264
|
-
r"foo.py\:8\: error\: AssertionError\: when calling foofn\(
|
|
260
|
+
r"foo.py\:8\: error\: AssertionError\: when calling foofn\(100\)", out
|
|
265
261
|
)
|
|
266
262
|
assert len([ls for ls in out.split("\n") if ls]) == 1
|
|
263
|
+
assert exitcode == 1
|
|
264
|
+
|
|
265
|
+
|
|
266
|
+
def test_assert_without_checkable(root, capsys: pytest.CaptureFixture[str]):
|
|
267
|
+
simplefs(root, SIMPLE_FOO)
|
|
268
|
+
exitcode = unwalled_main(["check", str(root / "foo.py"), "--analysis_kind=asserts"])
|
|
269
|
+
(out, err) = capsys.readouterr()
|
|
270
|
+
assert (
|
|
271
|
+
err
|
|
272
|
+
== "WARNING: Targets found, but contain no checkable functions.\nHINT: Ensure that your functions to analyze lead with assert statements.\n"
|
|
273
|
+
)
|
|
274
|
+
assert out == ""
|
|
275
|
+
assert exitcode == 0
|
|
267
276
|
|
|
268
277
|
|
|
269
278
|
def test_directives(root):
|
crosshair/objectproxy.py
CHANGED
|
@@ -10,11 +10,36 @@ from crosshair.tracers import NoTracing
|
|
|
10
10
|
# (which is BSD licenced)
|
|
11
11
|
#
|
|
12
12
|
|
|
13
|
+
_MISSING = object()
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
def proxy_inplace_op(proxy, op, *args):
|
|
17
|
+
my_original_value = proxy._wrapped()
|
|
18
|
+
my_new_value = op(my_original_value, *args)
|
|
19
|
+
# We need to return our own identity if (and only if!) the underlying value does.
|
|
20
|
+
if my_new_value is my_original_value:
|
|
21
|
+
return proxy
|
|
22
|
+
else:
|
|
23
|
+
object.__setattr__(proxy, "_inner", my_new_value)
|
|
24
|
+
return my_new_value
|
|
25
|
+
|
|
13
26
|
|
|
14
27
|
class ObjectProxy:
|
|
15
|
-
def
|
|
28
|
+
def _realize(self):
|
|
16
29
|
raise NotImplementedError
|
|
17
30
|
|
|
31
|
+
def _wrapped(self):
|
|
32
|
+
with NoTracing():
|
|
33
|
+
inner = _MISSING
|
|
34
|
+
try:
|
|
35
|
+
inner = object.__getattribute__(self, "_inner")
|
|
36
|
+
except AttributeError:
|
|
37
|
+
pass
|
|
38
|
+
if inner is _MISSING:
|
|
39
|
+
inner = self._realize()
|
|
40
|
+
object.__setattr__(self, "_inner", inner)
|
|
41
|
+
return inner
|
|
42
|
+
|
|
18
43
|
def __get_module__(self) -> str:
|
|
19
44
|
return self._wrapped().__module__
|
|
20
45
|
|
|
@@ -233,40 +258,40 @@ class ObjectProxy:
|
|
|
233
258
|
return other | self._wrapped()
|
|
234
259
|
|
|
235
260
|
def __iadd__(self, other):
|
|
236
|
-
return operator.iadd
|
|
261
|
+
return proxy_inplace_op(self, operator.iadd, other)
|
|
237
262
|
|
|
238
263
|
def __isub__(self, other):
|
|
239
|
-
return operator.isub
|
|
264
|
+
return proxy_inplace_op(self, operator.isub, other)
|
|
240
265
|
|
|
241
266
|
def __imul__(self, other):
|
|
242
|
-
return operator.imul
|
|
267
|
+
return proxy_inplace_op(self, operator.imul, other)
|
|
243
268
|
|
|
244
269
|
def __itruediv__(self, other):
|
|
245
|
-
return operator.itruediv
|
|
270
|
+
return proxy_inplace_op(self, operator.itruediv, other)
|
|
246
271
|
|
|
247
272
|
def __ifloordiv__(self, other):
|
|
248
|
-
return
|
|
273
|
+
return proxy_inplace_op(self, operator.ifloordiv, other)
|
|
249
274
|
|
|
250
275
|
def __imod__(self, other):
|
|
251
|
-
return operator.imod
|
|
276
|
+
return proxy_inplace_op(self, operator.imod, other)
|
|
252
277
|
|
|
253
278
|
def __ipow__(self, other, *args):
|
|
254
|
-
return operator.ipow
|
|
279
|
+
return proxy_inplace_op(self, operator.ipow, other, *args)
|
|
255
280
|
|
|
256
281
|
def __ilshift__(self, other):
|
|
257
|
-
return operator.ilshift
|
|
282
|
+
return proxy_inplace_op(self, operator.ilshift, other)
|
|
258
283
|
|
|
259
284
|
def __irshift__(self, other):
|
|
260
|
-
return operator.irshift
|
|
285
|
+
return proxy_inplace_op(self, operator.irshift, other)
|
|
261
286
|
|
|
262
287
|
def __iand__(self, other):
|
|
263
|
-
return operator.iand
|
|
288
|
+
return proxy_inplace_op(self, operator.iand, other)
|
|
264
289
|
|
|
265
290
|
def __ixor__(self, other):
|
|
266
|
-
return operator.ixor
|
|
291
|
+
return proxy_inplace_op(self, operator.ixor, other)
|
|
267
292
|
|
|
268
293
|
def __ior__(self, other):
|
|
269
|
-
return operator.ior
|
|
294
|
+
return proxy_inplace_op(self, operator.ior, other)
|
|
270
295
|
|
|
271
296
|
def __neg__(self):
|
|
272
297
|
return -self._wrapped()
|
crosshair/objectproxy_test.py
CHANGED
|
@@ -7,12 +7,12 @@ class ObjectWrap(ObjectProxy):
|
|
|
7
7
|
def __init__(self, obj):
|
|
8
8
|
object.__setattr__(self, "_o", obj)
|
|
9
9
|
|
|
10
|
-
def
|
|
10
|
+
def _realize(self):
|
|
11
11
|
return object.__getattribute__(self, "_o")
|
|
12
12
|
|
|
13
13
|
|
|
14
14
|
class TestObjectProxy:
|
|
15
|
-
def
|
|
15
|
+
def test_object_proxy_over_list(self) -> None:
|
|
16
16
|
i = [1, 2, 3]
|
|
17
17
|
proxy = ObjectWrap(i)
|
|
18
18
|
assert i == proxy
|
|
@@ -21,3 +21,21 @@ class TestObjectProxy:
|
|
|
21
21
|
assert [1, 2, 3, 4, 5] == proxy + [5]
|
|
22
22
|
assert [2, 3] == proxy[1:3]
|
|
23
23
|
assert [1, 2, 3, 4] == proxy
|
|
24
|
+
|
|
25
|
+
def test_inplace_identities(self) -> None:
|
|
26
|
+
proxy = ObjectWrap(3.0)
|
|
27
|
+
orig_proxy = proxy
|
|
28
|
+
proxy += 1.0
|
|
29
|
+
assert proxy is not orig_proxy
|
|
30
|
+
proxy = ObjectWrap([1, 2])
|
|
31
|
+
orig_proxy = proxy
|
|
32
|
+
proxy += [3, 4]
|
|
33
|
+
assert proxy is orig_proxy
|
|
34
|
+
|
|
35
|
+
def test_object_proxy_over_float(self) -> None:
|
|
36
|
+
proxy = ObjectWrap(4.5)
|
|
37
|
+
proxy //= 2.0
|
|
38
|
+
assert 2.0 == proxy
|
|
39
|
+
proxy = ObjectWrap(5.0)
|
|
40
|
+
proxy /= 2.0
|
|
41
|
+
assert 2.5 == proxy
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
_crosshair_tracers.cp310-win_amd64.pyd,sha256=
|
|
2
|
-
crosshair/__init__.py,sha256=
|
|
1
|
+
_crosshair_tracers.cp310-win_amd64.pyd,sha256=Zgg9S88TLS3FEsdp0BDK9U2KSC68CVX3_zfi_85Ir2M,21504
|
|
2
|
+
crosshair/__init__.py,sha256=XbBs-TqTx2QK4vO42Kpx0CAca6LT-IL1drYdNRiRj94,978
|
|
3
3
|
crosshair/__main__.py,sha256=i4pjsZlXvtieQHJTEB0sF3e40qJjLoOm1z5rm-u70Uo,260
|
|
4
4
|
crosshair/_mark_stacks.h,sha256=IImygydFK9qethf41gUZDjySHR3WLXs-YsqWCHK9UFg,29468
|
|
5
5
|
crosshair/_preliminaries_test.py,sha256=klkzKGpyyVDGctCXdvq1xyXbGa4PRnXda1jfgE-7LLY,522
|
|
@@ -16,14 +16,14 @@ crosshair/condition_parser_test.py,sha256=kosW60A4HnBBT3sOHxWCl_cixpbO1kmsjgNuNU
|
|
|
16
16
|
crosshair/conftest.py,sha256=JjUauvXnjERszuS46iskuBRHBx-0uHacwKHeQ-gEQ2c,683
|
|
17
17
|
crosshair/copyext.py,sha256=_SRnS6UrUFl2-CHl8uRIOq-Y0MKYNQTFK132S3Ru34A,5044
|
|
18
18
|
crosshair/copyext_test.py,sha256=VSIoVeqAf18g2RNuLTbyNWJiMBgzHeab7LNX1KHCWZU,2182
|
|
19
|
-
crosshair/core.py,sha256=
|
|
19
|
+
crosshair/core.py,sha256=1aAptxDoCv-hYIxl5USINEE6eJsKKctoZf0k9wpX9v8,65928
|
|
20
20
|
crosshair/core_and_libs.py,sha256=U9GDCBE9Ecxy7T7bmJT7IYiQTdY1C8qbcoIoMMocu5U,4112
|
|
21
21
|
crosshair/core_regestered_types_test.py,sha256=3o1GrtjCEWSW-paPp5-yVdE2K1_ZIviGCff7KVZ0VS0,2181
|
|
22
|
-
crosshair/core_test.py,sha256=
|
|
22
|
+
crosshair/core_test.py,sha256=2rKU1rUrUPeYLQ-I0UbddUx9henGAacRbmeeMd-2K14,34323
|
|
23
23
|
crosshair/diff_behavior.py,sha256=2T11J2Hk35Qp3RRp5ALtXyTgAl3v0W3KDNR_mSec-D4,11567
|
|
24
24
|
crosshair/diff_behavior_test.py,sha256=TUmqPOj_Qij8a7NMLFYt0IskL5Q_CdDLD5pnxnomuJ0,7505
|
|
25
|
-
crosshair/dynamic_typing.py,sha256=
|
|
26
|
-
crosshair/dynamic_typing_test.py,sha256=
|
|
25
|
+
crosshair/dynamic_typing.py,sha256=UspjP89YmX5CzkMrXrPRl6DL4eqmsuHMQv-zTpq4JcQ,13104
|
|
26
|
+
crosshair/dynamic_typing_test.py,sha256=4z9s6j-u2oQqlrzFx9Mc2Mc0RBPGiCZ2mDqP0F4IFVA,6117
|
|
27
27
|
crosshair/enforce.py,sha256=lIeDeqavEa06tVMlIk5ScibVGS04yHZ3xIpkTPK5QQw,10291
|
|
28
28
|
crosshair/enforce_test.py,sha256=CvofUxa_Y-np5vhlBcjsrZ2CkpxNFbjv5U-rH027pw4,4847
|
|
29
29
|
crosshair/fnutil.py,sha256=Fe77jLudjf7X_fNLExLoMTFElQWQ3wCpA_MC06JaOKk,13515
|
|
@@ -31,10 +31,10 @@ crosshair/fnutil_test.py,sha256=I-jFcROrNFUs7xSGrLcGJk_cX8014g5h8ItwPSFpvLY,2264
|
|
|
31
31
|
crosshair/fuzz_core_test.py,sha256=wWILaE5cpxfiRl89WgCWMpNIGS8BnWcQmgartQYCCJ8,17411
|
|
32
32
|
crosshair/lsp_server.py,sha256=Kl6z-Nudt2ZkzV0ojfzvGGa3cukXLOYKTCHYJUxzrRk,8920
|
|
33
33
|
crosshair/lsp_server_test.py,sha256=yHp7JtJLpF2G049lwhNlgAYXnVM88CtsudVVHVY7Hs0,999
|
|
34
|
-
crosshair/main.py,sha256=
|
|
35
|
-
crosshair/main_test.py,sha256=
|
|
36
|
-
crosshair/objectproxy.py,sha256=
|
|
37
|
-
crosshair/objectproxy_test.py,sha256=
|
|
34
|
+
crosshair/main.py,sha256=2kiGrmjNeLYkgzPnrc-zyfWPJqCi2km_SSZ0IDhm-_Q,35630
|
|
35
|
+
crosshair/main_test.py,sha256=BQvSEE_hkyIOW_n9-SIkG29k1ZFuB6j8LgftVvNmXAU,15377
|
|
36
|
+
crosshair/objectproxy.py,sha256=P-i5DK2e_uIK1bYbo9B3KCskAd5TdPeeu5L9GzvmqXI,10166
|
|
37
|
+
crosshair/objectproxy_test.py,sha256=tYLehy10sFFeJczZj7jiRFdnDlAdK80rE8F8yi-YfdU,1122
|
|
38
38
|
crosshair/opcode_intercept.py,sha256=RGcwx4f5-KKjY2C3Do4mBm4S8rEpn6nWtOQvaSKQnoM,22453
|
|
39
39
|
crosshair/opcode_intercept_test.py,sha256=giJ9HK0jJ4r41epJMZ4PPT6-qn8nqDjS-900ULxIlLM,9545
|
|
40
40
|
crosshair/options.py,sha256=y3lYP5AfwkHFXjF7zl0kUrTH1_C5u1DMo_yAH_mivm8,6993
|
|
@@ -72,7 +72,7 @@ crosshair/watcher_test.py,sha256=TCOdXmdGZ3NJ59X_w7SRVqiJY-BL2tUqyXK-3ql1d6s,287
|
|
|
72
72
|
crosshair/z3util.py,sha256=_NcVbYhvSt24vhkpiXdEh4o2VRSIjb4g8Xpq49sJsGg,1835
|
|
73
73
|
crosshair/z3util_test.py,sha256=9_6fhpTphEQlg4QY29bGzN0KxfktsT8wYveNgbfqueg,184
|
|
74
74
|
crosshair/examples/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
75
|
-
crosshair/examples/check_examples_test.py,sha256=
|
|
75
|
+
crosshair/examples/check_examples_test.py,sha256=0xoBSAVt3cLJdmvPVvSXsN8Szot16kPyihWG8iToi_4,4207
|
|
76
76
|
crosshair/examples/PEP316/__init__.py,sha256=39eVIMt1avfS9HXte7nzP9LbVlFo97Q4-YL1CQXM1JM,35
|
|
77
77
|
crosshair/examples/PEP316/bugs_detected/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
78
78
|
crosshair/examples/PEP316/bugs_detected/getattr_magic.py,sha256=PyaKiAVHnlaPTEpaupKmGQcyK24HGiq1eKU2t-mHJFo,335
|
|
@@ -100,7 +100,7 @@ crosshair/libimpl/binascii_ch_test.py,sha256=qWAYU1Sid3muwYL8pvVoCsMQtm5t3J8jFto
|
|
|
100
100
|
crosshair/libimpl/binascii_test.py,sha256=Yg37_B-eywcLq7EbsJZR3BUYYF6A1PGxE4qsmeBMyXg,2037
|
|
101
101
|
crosshair/libimpl/binasciilib.py,sha256=kBFH5-W_q1gCTC-wusSq0cAsUsB_xOUpcW0XQbLzkSQ,5220
|
|
102
102
|
crosshair/libimpl/bisectlib_test.py,sha256=rVpcalZ4g3xr_b6z1Bv2FU1N07vPZyWhU9_CPzC8sBk,776
|
|
103
|
-
crosshair/libimpl/builtinslib.py,sha256=
|
|
103
|
+
crosshair/libimpl/builtinslib.py,sha256=8MFc8BRqY-ifuzLP7wiH5t__mLgOvLiOs0muCB8r9CU,176369
|
|
104
104
|
crosshair/libimpl/builtinslib_ch_test.py,sha256=Do8kWNgfosLfI3yzZvTZ3ceuKTF0axN1ckkNZyn4ozE,31685
|
|
105
105
|
crosshair/libimpl/builtinslib_test.py,sha256=yqNE0027NV7-5l9JI-YdsZ8_TPx4F6kOrYxA5Czu2XQ,94322
|
|
106
106
|
crosshair/libimpl/codecslib.py,sha256=cvpCbieFRB4BdfLqmKeJzpvm35qZ0ONqtilXPmN8OWI,2754
|
|
@@ -167,9 +167,9 @@ crosshair/tools/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
|
167
167
|
crosshair/tools/check_help_in_doc.py,sha256=An-2EJ0_Xr-Szo431AoEgJafoFWwnPl8HoT4bi86dd8,8499
|
|
168
168
|
crosshair/tools/check_init_and_setup_coincide.py,sha256=f4TvPg1Q3C_BQYtGgPfY_fqxo_ZTeU7QCy7WwQjaIlA,3621
|
|
169
169
|
crosshair/tools/generate_demo_table.py,sha256=qm4ZUXjUBKkVZ3bVVK9h6dJMDKYme8zMl-7at_aG7b0,3958
|
|
170
|
-
crosshair_tool-0.0.
|
|
171
|
-
crosshair_tool-0.0.
|
|
172
|
-
crosshair_tool-0.0.
|
|
173
|
-
crosshair_tool-0.0.
|
|
174
|
-
crosshair_tool-0.0.
|
|
175
|
-
crosshair_tool-0.0.
|
|
170
|
+
crosshair_tool-0.0.95.dist-info/licenses/LICENSE,sha256=qQLSJN48eqvalILMr3uzkg0p74FtK7WSwkux-0twy-s,4552
|
|
171
|
+
crosshair_tool-0.0.95.dist-info/METADATA,sha256=DUdd1DL9enYXFn3T4SWDsdgLTjrVkfXm37XQjl3QqKY,6923
|
|
172
|
+
crosshair_tool-0.0.95.dist-info/WHEEL,sha256=KUuBC6lxAbHCKilKua8R9W_TM71_-9Sg5uEP3uDWcoU,101
|
|
173
|
+
crosshair_tool-0.0.95.dist-info/entry_points.txt,sha256=u5FIPVn1jqn4Kzg5K_iNnbP6L4hQw5FWjQ0UMezG2VE,96
|
|
174
|
+
crosshair_tool-0.0.95.dist-info/top_level.txt,sha256=2jLWtM-BWg_ZYNbNfrcds0HFZD62a6J7ZIbcgcQrRk4,29
|
|
175
|
+
crosshair_tool-0.0.95.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|