1. 02 Apr, 2020 2 commits
    • da-woods's avatar
      Concatenate strings in place if possible (GH-3451) · 76043d6e
      da-woods authored
      Optimized inplace operations for str/unicode so that they're
      genuinely done in place if no-one else needs the object. This
      is what CPython tries to do (and string concatenation was
      a point where it significantly beat Cython at times).
      
      This only works if the types are known at compile time, so with
      unknown types CPython will still be faster in some cases.
      
      Note: Uses slightly odd-macro trickery - does modify the input argument too
      (although only in places where it shouldn't matter).
      76043d6e
    • William Ayd's avatar
      Optimize builtin str() calls (GH-3478) · 2c8e7b22
      William Ayd authored
      2c8e7b22
  2. 01 Apr, 2020 5 commits
  3. 31 Mar, 2020 14 commits
  4. 26 Mar, 2020 4 commits
  5. 25 Mar, 2020 1 commit
    • Dmitry Shesterkin's avatar
      Avoid incorrect type calls from cython.declare and cython.cast in Shadow.py (GH-3244) · 48dc1f01
      Dmitry Shesterkin authored
      The following code:
      ```
      # cython: infer_types=True
      import cython
      
      @cython.cclass
      class Foo:
          a: cython.double
          b: cython.double
          c: cython.double
      
          def __init__(self, a: cython.double, b: cython.double ,c: cython.double):
              self.a = a
              self.b = b
              self.c = c
      
      def bar():
          l = []
          l.append(Foo(10, 20, 30))
      
          v = cython.declare(Foo, l[0])
          r = v.a + v.b
          print( r )
      
          v2 = cython.cast(Foo, l[0]) #Faster - No __Pyx_TypeTest() call
          r = v2.b + v2.c
          print( r )
      
      bar()
      ```
      works fine when compiled and throws an exception when interpreted: `TypeError: __init__() missing 2 required positional arguments: 'b' and 'c'`
      
      It could be fixed if we change implementations as shown in the patch.
      Also, added more tests for the cases I'm trying to fix
      NB: Removed execution of `test_declare(None)` to make sure that the new `none_declare()` test works instead. `test_declare(None)` doesn't throw exception in pure mode but does it in the native mode
      
      Replacing `hasattr(t, '__call__')` to `callable(t)` in the master branch broke the implementation and the tests because the construction was used to detect typedefs. To fix that I got rid of this check completely and replaced it to exact checks which also simplified the code
      
      Changed `declare` implementation when initializing arguments are not provided. Now it correctly works with typedefs of the user classes and also directly support arrays:
          ```
          >>> EmptyClassSyn = cython.typedef(EmptyClass)
          >>> cython.declare(EmptyClassSyn) is None
          True
          >>> cython.declare(cython.int[2]) is not None
          True
          ```
      Added missed return statement to `index_type` which made the following assigment possible:
          ```
              a = cython.declare(cython.int[2])
              a[0] = 1
          ```
      48dc1f01
  6. 24 Mar, 2020 11 commits
  7. 23 Mar, 2020 3 commits