Skip to content
  • Jean Boussier's avatar
    fc0db35f
    Add OutputBuffer#raw and #capture to reduce the need to swap the buffer · fc0db35f
    Jean Boussier authored
    Right now many helpers have to deal with two modes of operation to
    capture view output.
    
    The main one is to swap the `@output_buffer` variable with a new buffer.
    But since some view implementations such as `builder` keep a reference
    on the buffer they were initialized with, this doesn't always work.
    
    So additionally, the various capturing helpers also record the buffer
    length prior to executing the block, and then `slice!` the buffer back
    to its original size.
    
    This is wasteful and make the code rather unclear.
    
    Now that `OutputBuffer` is a delegator, I'd like to refactor all this
    so that:
    
      - @output_buffer is no longer re-assigned
      - A single OutputBuffer instance is used for the entire response rendering
      - Instead capturing is done through `OutputBuffer#capture`
    
    Once the above is achieved, it should allow us to enabled Erubi's
    `:chain_appends` option and get some reduced template size and some
    performance.
    
    Not re-assigning `@output_buffer` will also allow template to access
    the local variable instead of an instance variable, which is cheaper.
    
    But more importantly, that should make the code easier to understand
    and easier to be compatible with `StreamingBuffer`.
    fc0db35f
    Add OutputBuffer#raw and #capture to reduce the need to swap the buffer
    Jean Boussier authored
    Right now many helpers have to deal with two modes of operation to
    capture view output.
    
    The main one is to swap the `@output_buffer` variable with a new buffer.
    But since some view implementations such as `builder` keep a reference
    on the buffer they were initialized with, this doesn't always work.
    
    So additionally, the various capturing helpers also record the buffer
    length prior to executing the block, and then `slice!` the buffer back
    to its original size.
    
    This is wasteful and make the code rather unclear.
    
    Now that `OutputBuffer` is a delegator, I'd like to refactor all this
    so that:
    
      - @output_buffer is no longer re-assigned
      - A single OutputBuffer instance is used for the entire response rendering
      - Instead capturing is done through `OutputBuffer#capture`
    
    Once the above is achieved, it should allow us to enabled Erubi's
    `:chain_appends` option and get some reduced template size and some
    performance.
    
    Not re-assigning `@output_buffer` will also allow template to access
    the local variable instead of an instance variable, which is cheaper.
    
    But more importantly, that should make the code easier to understand
    and easier to be compatible with `StreamingBuffer`.
Loading