crosshair-tool 0.0.93__cp38-cp38-musllinux_1_2_x86_64.whl → 0.0.95__cp38-cp38-musllinux_1_2_x86_64.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.

Potentially problematic release.


This version of crosshair-tool might be problematic. Click here for more details.

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.93" # Do not forget to update in setup.py!
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
 
@@ -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
- def realize(pytype: Type, bindings: Mapping[object, type]) -> object:
227
- if typing_inspect.is_typevar(pytype):
228
- return bindings[pytype]
229
- if not hasattr(pytype, "__args__"):
230
- return pytype
231
- newargs: List = []
232
- for arg in pytype.__args__: # type:ignore
233
- newargs.append(realize(arg, bindings))
234
- # print('realizing pytype', repr(pytype), 'newargs', repr(newargs))
235
- pytype_origin = origin_of(pytype)
236
- if not hasattr(pytype_origin, "_name"):
237
- pytype_origin = getattr(typing, pytype._name) # type:ignore
238
- if pytype_origin is Callable: # Callable args get flattened
239
- newargs = [newargs[:-1], newargs[-1]]
240
- return pytype_origin.__getitem__(tuple(newargs))
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(
@@ -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
- assert realize(Mapping[_U, _T], bindings) == Mapping[List[int], str]
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
- assert realize(Callable[[_U], _T], bindings) == Callable[[List[int]], str]
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
- assert realize(List[_U], var_mapping) == List[int]
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("**/*.py")):
27
+ for path in sorted(examples_dir.glob("*/**/*.py")):
28
28
  if path.stem != "__init__":
29
29
  yield path
30
30
 
@@ -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 entity in entities:
864
- debug("Check ", getattr(entity, "__name__", str(entity)))
865
- for message in run_checkables(analyze_any(entity, options)):
866
- line = describe_message(message, full_options)
867
- if line is None:
868
- continue
869
- stdout.write(line + "\n")
870
- debug("Traceback for output message:\n", message.traceback)
871
- if message.state > MessageType.PRE_UNSAT:
872
- any_problems = True
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 DISABLE_TODO_test_assert_mode_e2e(root):
254
+ def test_assert_mode_e2e(root, capsys: pytest.CaptureFixture[str]):
255
255
  simplefs(root, ASSERT_BASED_FOO)
256
- try:
257
- sys.stdout = io.StringIO()
258
- exitcode = unwalled_main(["check", root / "foo.py", "--analysis_kind=asserts"])
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\(x \= 100\)", out
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 _wrapped(self):
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(self._wrapped(), other)
261
+ return proxy_inplace_op(self, operator.iadd, other)
237
262
 
238
263
  def __isub__(self, other):
239
- return operator.isub(self._wrapped(), other)
264
+ return proxy_inplace_op(self, operator.isub, other)
240
265
 
241
266
  def __imul__(self, other):
242
- return operator.imul(self._wrapped(), other)
267
+ return proxy_inplace_op(self, operator.imul, other)
243
268
 
244
269
  def __itruediv__(self, other):
245
- return operator.itruediv(self._wrapped(), other)
270
+ return proxy_inplace_op(self, operator.itruediv, other)
246
271
 
247
272
  def __ifloordiv__(self, other):
248
- return operator.iflootdiv(self._wrapped(), other)
273
+ return proxy_inplace_op(self, operator.ifloordiv, other)
249
274
 
250
275
  def __imod__(self, other):
251
- return operator.imod(self._wrapped(), other)
276
+ return proxy_inplace_op(self, operator.imod, other)
252
277
 
253
278
  def __ipow__(self, other, *args):
254
- return operator.ipow(self._wrapped(), other, *args)
279
+ return proxy_inplace_op(self, operator.ipow, other, *args)
255
280
 
256
281
  def __ilshift__(self, other):
257
- return operator.ilshift(self._wrapped(), other)
282
+ return proxy_inplace_op(self, operator.ilshift, other)
258
283
 
259
284
  def __irshift__(self, other):
260
- return operator.irshift(self._wrapped(), other)
285
+ return proxy_inplace_op(self, operator.irshift, other)
261
286
 
262
287
  def __iand__(self, other):
263
- return operator.iand(self._wrapped(), other)
288
+ return proxy_inplace_op(self, operator.iand, other)
264
289
 
265
290
  def __ixor__(self, other):
266
- return operator.ixor(self._wrapped(), other)
291
+ return proxy_inplace_op(self, operator.ixor, other)
267
292
 
268
293
  def __ior__(self, other):
269
- return operator.ior(self._wrapped(), other)
294
+ return proxy_inplace_op(self, operator.ior, other)
270
295
 
271
296
  def __neg__(self):
272
297
  return -self._wrapped()
@@ -7,12 +7,12 @@ class ObjectWrap(ObjectProxy):
7
7
  def __init__(self, obj):
8
8
  object.__setattr__(self, "_o", obj)
9
9
 
10
- def _wrapped(self):
10
+ def _realize(self):
11
11
  return object.__getattribute__(self, "_o")
12
12
 
13
13
 
14
14
  class TestObjectProxy:
15
- def test_object_proxy(self) -> None:
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,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: crosshair-tool
3
- Version: 0.0.93
3
+ Version: 0.0.95
4
4
  Summary: Analyze Python code for correctness using symbolic execution.
5
5
  Home-page: https://github.com/pschanely/CrossHair
6
6
  Author: Phillip Schanely
@@ -1,5 +1,5 @@
1
1
  _crosshair_tracers.cpython-38-x86_64-linux-gnu.so,sha256=I2PQ2mjtjrfVX3uIISbP3TZ2i1ZIigIgZIWJxRFSX2Q,75984
2
- crosshair/__init__.py,sha256=LfHa3bjHbl9WlLnVFSn-2R3qe0yEptc8-0Edze71rmo,936
2
+ crosshair/__init__.py,sha256=nR2D8DuGMw_J17BMCTn9eHoipZzO7JmRusDfFoLt41k,936
3
3
  crosshair/__main__.py,sha256=zw9Ylf8v2fGocE57o4FqvD0lc7U4Ld2GbeCGxRWrpqo,252
4
4
  crosshair/_mark_stacks.h,sha256=j86qubOUvVhoR19d74iQ084RrTEq8M6oT4wJsGQUySY,28678
5
5
  crosshair/_preliminaries_test.py,sha256=r2PohNNMfIkDqsnvI6gKlJTbwBaZA9NQJueQfJMN2Eo,504
@@ -16,14 +16,14 @@ crosshair/condition_parser_test.py,sha256=eUQYnVkHewn8qg-XbzcElb0mHkPxPJAX548dPV
16
16
  crosshair/conftest.py,sha256=BkLszApkdy6FrvzaHO7xh8_BJrG9AfytFTse-HuQVvg,653
17
17
  crosshair/copyext.py,sha256=GBGQP9YAHoezLXwb_M59Hh1VXSou5EQt4ZmmUA0T_og,4899
18
18
  crosshair/copyext_test.py,sha256=uJzdC9m2FqMjqQ-ITFoP0MZg3OCiO8paU-d533KocD8,2108
19
- crosshair/core.py,sha256=YegFbe3RMJwxHCadhJ42gUJjL9mICaLAE_Dmb1-lsK4,63750
19
+ crosshair/core.py,sha256=7CHbmWvCVK2MlKXJUUe3eILPWGZniF8qXkBJNDkU4qg,64168
20
20
  crosshair/core_and_libs.py,sha256=8FGL62GnyX6WHOqKh0rqJ0aJ_He5pwZm_zwPXTaPqhI,3963
21
21
  crosshair/core_regestered_types_test.py,sha256=er3ianvu-l0RS-WrS46jmOWr4Jq06Cec9htAXGXJSNg,2099
22
- crosshair/core_test.py,sha256=H6qZFBFuUhgh9qWgxxc1Cs7xuC8s6FYvewmTYUh0Dpg,32200
22
+ crosshair/core_test.py,sha256=540ASl3zOQf3AnZORGJus4PMYHP5YM15zTWhNI16Dew,33009
23
23
  crosshair/diff_behavior.py,sha256=_5X_pTN0_-rSPrh8dfpODJG_phFMn7fWc-_zLgO3UTk,11253
24
24
  crosshair/diff_behavior_test.py,sha256=ckK3HScFrmRRZdyq1iCmkwToksMJG2UVUjABnfnSwCM,7242
25
- crosshair/dynamic_typing.py,sha256=jbI9FXv5-WXREQjeDtlDQladv-xCW21TUOM3qErJaJ4,11998
26
- crosshair/dynamic_typing_test.py,sha256=oyg94OXjF_2jNFy33UJjkfWnDXKnM4or2TXbxrOqOQs,5478
25
+ crosshair/dynamic_typing.py,sha256=ANq42kxSQ5B0STZF3uwOEys_fLCj20cMCCcBH6dbXWo,12758
26
+ crosshair/dynamic_typing_test.py,sha256=8p4NOJ6i9q9mozgCYlZP3VCs-TFMDaE_7W-TyNEse4o,5907
27
27
  crosshair/enforce.py,sha256=FsZx3D-KtGrhb8xdAZbPUtwvVmEu8IAn7rwf7tmkrRY,10010
28
28
  crosshair/enforce_test.py,sha256=C6CQ4P1FjkdIJeJg3aJynp1iLDCE6BFCEVtSqXbvmQk,4665
29
29
  crosshair/fnutil.py,sha256=X80bD2Lh4QAh-rF561r3JRxjxcuZepF3hJaxaj1GG9s,13123
@@ -31,10 +31,10 @@ crosshair/fnutil_test.py,sha256=wXtfIxAupRm0KUzKob8luEsNI4YegBQUfwz7msWbfHY,2186
31
31
  crosshair/fuzz_core_test.py,sha256=q7WsZt6bj5OJrXaVsT3JaRYWWnL8X_1flSfty4Z7CcA,16903
32
32
  crosshair/lsp_server.py,sha256=j7SX4pdVwa2MrtkNIjajLilzl5CZTY6PrBQsa26cdNo,8670
33
33
  crosshair/lsp_server_test.py,sha256=7LO1Qqxkper3Xt2krgOlGqF1O_uDObo76o4FZbIqykY,969
34
- crosshair/main.py,sha256=6RXjj1FIyBK6i6xOx-bs-CsHLgOZcc9hL3U1JRwxpA0,34378
35
- crosshair/main_test.py,sha256=eEoK4LHKSaX-6iJx3tAVbwCaBJc0ri3VoCPtLD5em2U,14424
36
- crosshair/objectproxy.py,sha256=Uc6mNkJBInvETGWBHI10GSNEIrBYDIxlAZ30M3PAIhQ,8935
37
- crosshair/objectproxy_test.py,sha256=KykRJLSHCDA7jb_XPBDhXHnS6Q1fG4oIJ579CeSEz3k,567
34
+ crosshair/main.py,sha256=TkaOr39tMV9ZHQXgfJobKFEVW60XpHUqdY520nMIWw8,34659
35
+ crosshair/main_test.py,sha256=2xpgNqog__XcYffGcwPeEEmr0Vy4EgVZE8GCAjQnE8U,14834
36
+ crosshair/objectproxy.py,sha256=1cO_ApA0AKPfCRu6MIsxUOKUUEGn0b1U4IHxTC4nDGI,9790
37
+ crosshair/objectproxy_test.py,sha256=UJuO_jUt8_OEUtgQWyhlekPOdvtM8IQ5M9I_1AqXPWM,1081
38
38
  crosshair/opcode_intercept.py,sha256=z4Yb9prYE2UK21AxhjAeXyXAk5IriDuCSSCeNhbDu2A,21880
39
39
  crosshair/opcode_intercept_test.py,sha256=Si3rJQR5cs5d4uB8uwE2K8MjP8rE1a4yHkjXzhfS10A,9241
40
40
  crosshair/options.py,sha256=htQNgnrpoRjSNq6rfLBAF8nos-NNIwmP6tQYyI8ugsM,6775
@@ -72,7 +72,7 @@ crosshair/watcher_test.py,sha256=Ef1YSwy68wWPR5nPjwvEKPqxltI9pE9lTbnesmDy3Bk,276
72
72
  crosshair/z3util.py,sha256=AkslxCSfzgSni6oWXUckWihWn3LuceQycR0X3D3ZhD8,1759
73
73
  crosshair/z3util_test.py,sha256=CZovn4S9mYcG_yQegcxm80VHrvUdvNei0gvGTF9TOrk,173
74
74
  crosshair/examples/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
75
- crosshair/examples/check_examples_test.py,sha256=CPKG0lKgxpPSjrEf02bBTAivQZwrDyFNTBU-4sSRrr0,4060
75
+ crosshair/examples/check_examples_test.py,sha256=pFZRUi_yubIOaIZ_n7KkrG_qCKyHZnzcL5_y0NFqZKM,4062
76
76
  crosshair/examples/PEP316/__init__.py,sha256=LdmvJx2cbzC3iip3NwtT0Ds2v99l3KXl1q9Kc0TmCWE,34
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=vZ6pWnBsSE641rzNx55iB8lLOI4zB0nXkUU1WxtD0RI,319
@@ -100,7 +100,7 @@ crosshair/libimpl/binascii_ch_test.py,sha256=hFqSfF1Q8jl2LNBIWaQ6vBJIIshPOmSwrR0
100
100
  crosshair/libimpl/binascii_test.py,sha256=LOBqLAJ77Kx8vorjVTaT3X0Z93zw4P5BvwUapMCiSLg,1970
101
101
  crosshair/libimpl/binasciilib.py,sha256=9w4C37uxRNOmz9EUuhJduHlMKn0f7baY5fwwdvx1uto,5070
102
102
  crosshair/libimpl/bisectlib_test.py,sha256=ZQtYmBYD0Pb1IiFelsgdvqyeUMKaqaDb1BRb87LTSbI,753
103
- crosshair/libimpl/builtinslib.py,sha256=UU2WDnQbPQMIETjvKfJlDXAFYyAXcRVvGt4SFYs-Jgk,171663
103
+ crosshair/libimpl/builtinslib.py,sha256=Mr3bDiM6pQhLh5lkMoa4UYM3Hi4A_xm0dLteYCohZzQ,171289
104
104
  crosshair/libimpl/builtinslib_ch_test.py,sha256=W4wWapqlxSjsC5XgREfgxS9e_iwKxgNQhbFE3umUfNI,30504
105
105
  crosshair/libimpl/builtinslib_test.py,sha256=Y_jRe5J6pPaJ_Nuk1lJ1biP5yczsfCj--NgNhwcbAfQ,90654
106
106
  crosshair/libimpl/codecslib.py,sha256=lB87T1EYSBh4JXaqzjSpQG9CMfKtgckwA7f6OIR0S-Q,2668
@@ -167,9 +167,9 @@ crosshair/tools/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
167
167
  crosshair/tools/check_help_in_doc.py,sha256=P21AH3mYrTVuBgWD6v65YXqBqmqpQDUTQeoZ10rB6TU,8235
168
168
  crosshair/tools/check_init_and_setup_coincide.py,sha256=kv61bXqKSKF_5J-kLNEhCrCPyszg7iZQWDu_Scnec98,3502
169
169
  crosshair/tools/generate_demo_table.py,sha256=0SeO0xQdiT-mbLNHt4rYL0wcc2DMh0v3qtzBdoQonDk,3831
170
- crosshair_tool-0.0.93.dist-info/LICENSE,sha256=NVyMvNqn1pH6RSHs6RWRcJyJvORnpgGFBlF73buqYJ0,4459
171
- crosshair_tool-0.0.93.dist-info/METADATA,sha256=soS7KCkL9yyhosaHwR1ROIhEijfFIgqDZtgu-0zPadA,6558
172
- crosshair_tool-0.0.93.dist-info/WHEEL,sha256=AtKzrIIwO6LyEQPNa-CKogjoLSeXFnST8-hqmpwwZQA,110
173
- crosshair_tool-0.0.93.dist-info/entry_points.txt,sha256=u5FIPVn1jqn4Kzg5K_iNnbP6L4hQw5FWjQ0UMezG2VE,96
174
- crosshair_tool-0.0.93.dist-info/top_level.txt,sha256=2jLWtM-BWg_ZYNbNfrcds0HFZD62a6J7ZIbcgcQrRk4,29
175
- crosshair_tool-0.0.93.dist-info/RECORD,,
170
+ crosshair_tool-0.0.95.dist-info/LICENSE,sha256=NVyMvNqn1pH6RSHs6RWRcJyJvORnpgGFBlF73buqYJ0,4459
171
+ crosshair_tool-0.0.95.dist-info/METADATA,sha256=K8KjIbicUtnjDKfPB4UiIlxtYp295WZQ4ZTheC0iqaA,6558
172
+ crosshair_tool-0.0.95.dist-info/WHEEL,sha256=AtKzrIIwO6LyEQPNa-CKogjoLSeXFnST8-hqmpwwZQA,110
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,,