1. 18 Jun, 2015 10 commits
    • Chris Toshok's avatar
      end the unwind session by setting the is_active flag to false. if the unwind... · 14ee9479
      Chris Toshok authored
      end the unwind session by setting the is_active flag to false.  if the unwind session isn't active we don't mark through the ExcInfo, so exceptions/tracebacks should get gc'ed properly.
      14ee9479
    • Chris Toshok's avatar
    • Chris Toshok's avatar
    • Chris Toshok's avatar
      a few cleanups · 8e88774f
      Chris Toshok authored
      1. remove the BoxedTraceback** argument from maybeTracebackHere.  the unwinding.cpp
         code can get it just as easily.
      2. combine UNWIND_STATE_OSR and UNWIND_STATE_RERAISE into UNWIND_STATE_SKIPNEXT,
         since they share the same behavior.
      3. put the SKIPNEXT behavior in the callers of unwindProcessFrame.  Now unwindProcessFrame
         does nothing but create a PythonFrameIteratorImpl (if it can), and if it can
         calls its callback with it.
      4. initialize the unwind state to NORMAL in raiseExc.
      8e88774f
    • Chris Toshok's avatar
      move unwind_state to ThreadStateInternal. move the class decl to threading.h... · af1aea2f
      Chris Toshok authored
      move unwind_state to ThreadStateInternal.  move the class decl to threading.h and ensure the small/hot accessors are inlined
      af1aea2f
    • Chris Toshok's avatar
      stop using 'WHY' just to be similar to cpython. 'STATE' is better. also,... · 6f9c6d68
      Chris Toshok authored
      stop using 'WHY' just to be similar to cpython.  'STATE' is better.  also, reduce duplicate code in unwindProcessFrame
      6f9c6d68
    • Chris Toshok's avatar
      trace through the exception ferry during GC · 083ef4e1
      Chris Toshok authored
      store the exception ferry (as an ExcInfo, not ExcData) within our internal
      thread state, and explicit visit type/value/traceback at gc time.
      
      This allows the gc to run during an unwind (a necessity since
      we're allocating new BoxedTraceback instances)
      083ef4e1
    • Chris Toshok's avatar
    • Chris Toshok's avatar
      build tracebacks incrementally while c++ unwinding · 9305f720
      Chris Toshok authored
      Add a tb_next to the BoxedTraceback object, which during normal unwinding is how we add lines to a traceback.
      For getTraceback() we take advantage fo the fact that each BoxedTraceback can have multiple lines in it, and
      only create one.  Also add BoxedTraceback::Here which is kinda like PyTraceback_Here, except that since we
      don't have access to the ExcInfo inside it, we have to pass a pointer to the BoxedTraceback*.
      
      three wrinkles in traceback generation while unwinding are:
      
         1) if the previous frame was an osr frame (so we should skip the current frame)
         2) if the traceback object was passed to raise3, or raise0 was used (treated as a re-raise by cpython)
         3) the interpreter map
      
      1 and 2 are fixed by keeping a per-thread interpreter state variable, "unwind_why" ("why" is probably
      a bad name to use in this context, but cpython's logic uses that word as well), to record if we're in
      either of those cases.  Both cases have the same effect (skip the next traceback line, and reset state
      to NORMAL.)
      
      The interpreter map problem comes about because of the way c++ unwinding works.  since ASTInterpreter::execute
      uses RAII for RegisterHelper, unwinding through the frame causes us to jump to a cleanup block and then resume
      unwinding (with the IP still in ASTInterpreter::execute).  Since the IP is there, we assume the frame is valid
      and we can look up $rbp in the interpreter map.  Given that we just cleaned up the RegisterHelper (and removed
      the $rbp mapping), we crash.
      
      The fix here is to keep the same RegisterHelper in ASTInterpreter::execute, but the ip checked for by the
      unwinder (and the $rbp in the mapping) correspond to ASTInterpreter::executeInner.
      
      Lastly, AST_Interpreter::invoke catches exceptions, so we won't make it to the top-most ASTInterpreter::execute,
      and so won't add the final line.  We make use of BoxedTraceback::Here here as well to add the final line.
      9305f720
    • Kevin Modzelewski's avatar
      Merge pull request #619 from kmod/sre_compile4 · 46d6bba3
      Kevin Modzelewski authored
      Rewrite "a in b" expressions
      46d6bba3
  2. 17 Jun, 2015 12 commits
  3. 16 Jun, 2015 10 commits
  4. 12 Jun, 2015 5 commits
  5. 11 Jun, 2015 1 commit
  6. 10 Jun, 2015 2 commits
    • Kevin Modzelewski's avatar
      Add weakref workaround to another test · 6007daed
      Kevin Modzelewski authored
      6007daed
    • Kevin Modzelewski's avatar
      Change the way we store and pass string data · 95ad7ffc
      Kevin Modzelewski authored
      Convert to BoxedString much sooner, and have any functions that
      might need to box a string take a BoxedString.  This means that
      on some paths, we will need to box when previously we didn't, but
      for callsites that we control we can just intern the string and
      not have to box again.  The much more common case is that we
      passed in unboxed string data, but then ran into a branch
      that required boxing.
      
      BoxedString shouldn't be that much more costly than std::string,
      and this should cut down on string allocations.
      
      For django-template.py, the number of strings allocated drops from
      800k to 525k; for virtualenv_test.py, it goes from 1.25M to 1.0M
      
      A couple things made this not 100% mechanical:
      - taking advantage of places that we could eliminate unbox/rebox pairs
      - different null-termination assumptions between StringRef and the c api.
      95ad7ffc