selma 0.3.0 → 0.4.0
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.
- checksums.yaml +4 -4
 - data/Cargo.lock +107 -99
 - data/README.md +57 -43
 - data/ext/selma/Cargo.toml +4 -1
 - data/ext/selma/src/html/element.rs +11 -6
 - data/ext/selma/src/native_ref_wrap.rs +15 -12
 - data/ext/selma/src/rewriter.rs +257 -106
 - data/ext/selma/src/sanitizer.rs +3 -3
 - data/lib/selma/config.rb +12 -0
 - data/lib/selma/version.rb +1 -1
 - metadata +3 -2
 
    
        data/README.md
    CHANGED
    
    | 
         @@ -180,6 +180,19 @@ The `element` argument in `handle_element` has the following methods: 
     | 
|
| 
       180 
180 
     | 
    
         
             
            - `after(content, as: content_type)`: Inserts `content` after the text. `content_type` is either `:text` or `:html` and determines how the content will be applied.
         
     | 
| 
       181 
181 
     | 
    
         
             
            - `replace(content, as: content_type)`: Replaces the text node with `content`. `content_type` is either `:text` or `:html` and determines how the content will be applied.
         
     | 
| 
       182 
182 
     | 
    
         | 
| 
      
 183 
     | 
    
         
            +
            ## Security
         
     | 
| 
      
 184 
     | 
    
         
            +
             
     | 
| 
      
 185 
     | 
    
         
            +
            Theoretically, a malicious user can provide a very large document for processing, which can exhaust the memory of the host machine. To set a limit on how much string content is processed at once, you can provide two options into the `memory` namespace:
         
     | 
| 
      
 186 
     | 
    
         
            +
             
     | 
| 
      
 187 
     | 
    
         
            +
            ```ruby
         
     | 
| 
      
 188 
     | 
    
         
            +
            memory: {
         
     | 
| 
      
 189 
     | 
    
         
            +
              max_allowed_memory_usage: 1000,
         
     | 
| 
      
 190 
     | 
    
         
            +
              preallocated_parsing_buffer_size: 100,
         
     | 
| 
      
 191 
     | 
    
         
            +
            },
         
     | 
| 
      
 192 
     | 
    
         
            +
            ```
         
     | 
| 
      
 193 
     | 
    
         
            +
             
     | 
| 
      
 194 
     | 
    
         
            +
            Note that `preallocated_parsing_buffer_size` must always be less than `max_allowed_memory_usage`. See [the`lol_html` project documentation](https://docs.rs/lol_html/1.2.1/lol_html/struct.MemorySettings.html) to learn more about the default values.
         
     | 
| 
      
 195 
     | 
    
         
            +
             
     | 
| 
       183 
196 
     | 
    
         
             
            ## Benchmarks
         
     | 
| 
       184 
197 
     | 
    
         | 
| 
       185 
198 
     | 
    
         
             
            When `bundle exec rake benchmark`, two different benchmarks are calculated. Here are those results on my machine.
         
     | 
| 
         @@ -191,30 +204,33 @@ Comparing Selma against popular Ruby sanitization gems: 
     | 
|
| 
       191 
204 
     | 
    
         
             
            <!-- prettier-ignore-start -->
         
     | 
| 
       192 
205 
     | 
    
         
             
            <details>
         
     | 
| 
       193 
206 
     | 
    
         
             
            <pre>
         
     | 
| 
      
 207 
     | 
    
         
            +
            input size = 25309 bytes, 0.03 MB
         
     | 
| 
      
 208 
     | 
    
         
            +
             
     | 
| 
      
 209 
     | 
    
         
            +
            ruby 3.3.0 (2023-12-25 revision 5124f9ac75) [arm64-darwin23]
         
     | 
| 
       194 
210 
     | 
    
         
             
            Warming up --------------------------------------
         
     | 
| 
       195 
     | 
    
         
            -
                     sanitize-sm     
     | 
| 
       196 
     | 
    
         
            -
                        selma-sm    
     | 
| 
      
 211 
     | 
    
         
            +
                     sanitize-sm    16.000 i/100ms
         
     | 
| 
      
 212 
     | 
    
         
            +
                        selma-sm   214.000 i/100ms
         
     | 
| 
       197 
213 
     | 
    
         
             
            Calculating -------------------------------------
         
     | 
| 
       198 
     | 
    
         
            -
                     sanitize-sm     
     | 
| 
       199 
     | 
    
         
            -
                        selma-sm       
     | 
| 
      
 214 
     | 
    
         
            +
                     sanitize-sm    171.670 (± 1.2%) i/s -      5.152k in  30.017081s
         
     | 
| 
      
 215 
     | 
    
         
            +
                        selma-sm      2.146k (± 3.0%) i/s -     64.414k in  30.058470s
         
     | 
| 
       200 
216 
     | 
    
         | 
| 
       201 
217 
     | 
    
         
             
            Comparison:
         
     | 
| 
       202 
     | 
    
         
            -
                        selma-sm:      
     | 
| 
       203 
     | 
    
         
            -
                     sanitize-sm:       
     | 
| 
      
 218 
     | 
    
         
            +
                        selma-sm:     2145.8 i/s
         
     | 
| 
      
 219 
     | 
    
         
            +
                     sanitize-sm:      171.7 i/s - 12.50x  slower
         
     | 
| 
       204 
220 
     | 
    
         | 
| 
       205 
221 
     | 
    
         
             
            input size = 86686 bytes, 0.09 MB
         
     | 
| 
       206 
222 
     | 
    
         | 
| 
       207 
223 
     | 
    
         
             
            ruby 3.3.0 (2023-12-25 revision 5124f9ac75) [arm64-darwin23]
         
     | 
| 
       208 
224 
     | 
    
         
             
            Warming up --------------------------------------
         
     | 
| 
       209 
     | 
    
         
            -
                     sanitize-md      
     | 
| 
       210 
     | 
    
         
            -
                        selma-md     
     | 
| 
      
 225 
     | 
    
         
            +
                     sanitize-md     4.000 i/100ms
         
     | 
| 
      
 226 
     | 
    
         
            +
                        selma-md    56.000 i/100ms
         
     | 
| 
       211 
227 
     | 
    
         
             
            Calculating -------------------------------------
         
     | 
| 
       212 
     | 
    
         
            -
                     sanitize-md      
     | 
| 
       213 
     | 
    
         
            -
                        selma-md     
     | 
| 
      
 228 
     | 
    
         
            +
                     sanitize-md     44.397 (± 2.3%) i/s -      1.332k in  30.022430s
         
     | 
| 
      
 229 
     | 
    
         
            +
                        selma-md    558.448 (± 1.4%) i/s -     16.800k in  30.089196s
         
     | 
| 
       214 
230 
     | 
    
         | 
| 
       215 
231 
     | 
    
         
             
            Comparison:
         
     | 
| 
       216 
     | 
    
         
            -
                        selma-md:       
     | 
| 
       217 
     | 
    
         
            -
                     sanitize-md:        
     | 
| 
      
 232 
     | 
    
         
            +
                        selma-md:      558.4 i/s
         
     | 
| 
      
 233 
     | 
    
         
            +
                     sanitize-md:       44.4 i/s - 12.58x  slower
         
     | 
| 
       218 
234 
     | 
    
         | 
| 
       219 
235 
     | 
    
         
             
            input size = 7172510 bytes, 7.17 MB
         
     | 
| 
       220 
236 
     | 
    
         | 
| 
         @@ -223,12 +239,12 @@ Warming up -------------------------------------- 
     | 
|
| 
       223 
239 
     | 
    
         
             
                     sanitize-lg     1.000 i/100ms
         
     | 
| 
       224 
240 
     | 
    
         
             
                        selma-lg     1.000 i/100ms
         
     | 
| 
       225 
241 
     | 
    
         
             
            Calculating -------------------------------------
         
     | 
| 
       226 
     | 
    
         
            -
                     sanitize-lg      0. 
     | 
| 
       227 
     | 
    
         
            -
                        selma-lg       
     | 
| 
      
 242 
     | 
    
         
            +
                     sanitize-lg      0.163 (± 0.0%) i/s -      6.000 in  37.375628s
         
     | 
| 
      
 243 
     | 
    
         
            +
                        selma-lg      6.750 (± 0.0%) i/s -    203.000 in  30.080976s
         
     | 
| 
       228 
244 
     | 
    
         | 
| 
       229 
245 
     | 
    
         
             
            Comparison:
         
     | 
| 
       230 
     | 
    
         
            -
                        selma-lg:         
     | 
| 
       231 
     | 
    
         
            -
                     sanitize-lg:        0. 
     | 
| 
      
 246 
     | 
    
         
            +
                        selma-lg:        6.7 i/s
         
     | 
| 
      
 247 
     | 
    
         
            +
                     sanitize-lg:        0.2 i/s - 41.32x  slower
         
     | 
| 
       232 
248 
     | 
    
         
             
            </pre>
         
     | 
| 
       233 
249 
     | 
    
         
             
            </details>
         
     | 
| 
       234 
250 
     | 
    
         
             
            <!-- prettier-ignore-end -->
         
     | 
| 
         @@ -239,41 +255,39 @@ Comparing Selma against popular Ruby HTML parsing gems: 
     | 
|
| 
       239 
255 
     | 
    
         | 
| 
       240 
256 
     | 
    
         
             
            <!-- prettier-ignore-start -->
         
     | 
| 
       241 
257 
     | 
    
         
             
            <details>
         
     | 
| 
       242 
     | 
    
         
            -
            <pre>
         
     | 
| 
       243 
     | 
    
         
            -
             
     | 
| 
       244 
     | 
    
         
            -
            input size = 25309 bytes, 0.03 MB
         
     | 
| 
      
 258 
     | 
    
         
            +
            <pre>input size = 25309 bytes, 0.03 MB
         
     | 
| 
       245 
259 
     | 
    
         | 
| 
       246 
260 
     | 
    
         
             
            ruby 3.3.0 (2023-12-25 revision 5124f9ac75) [arm64-darwin23]
         
     | 
| 
       247 
261 
     | 
    
         
             
            Warming up --------------------------------------
         
     | 
| 
       248 
     | 
    
         
            -
                     nokogiri-sm 
     | 
| 
       249 
     | 
    
         
            -
                   nokolexbor-sm    
     | 
| 
       250 
     | 
    
         
            -
                        selma-sm    
     | 
| 
      
 262 
     | 
    
         
            +
                     nokogiri-sm   107.000 i/100ms
         
     | 
| 
      
 263 
     | 
    
         
            +
                   nokolexbor-sm   340.000 i/100ms
         
     | 
| 
      
 264 
     | 
    
         
            +
                        selma-sm   380.000 i/100ms
         
     | 
| 
       251 
265 
     | 
    
         
             
            Calculating -------------------------------------
         
     | 
| 
       252 
     | 
    
         
            -
                     nokogiri-sm 
     | 
| 
       253 
     | 
    
         
            -
                   nokolexbor-sm       
     | 
| 
       254 
     | 
    
         
            -
                        selma-sm       
     | 
| 
      
 266 
     | 
    
         
            +
                     nokogiri-sm      1.073k (± 2.1%) i/s -     32.207k in  30.025474s
         
     | 
| 
      
 267 
     | 
    
         
            +
                   nokolexbor-sm      3.300k (±13.2%) i/s -     27.540k in  36.788212s
         
     | 
| 
      
 268 
     | 
    
         
            +
                        selma-sm      3.779k (± 3.4%) i/s -    113.240k in  30.013908s
         
     | 
| 
       255 
269 
     | 
    
         | 
| 
       256 
270 
     | 
    
         
             
            Comparison:
         
     | 
| 
       257 
     | 
    
         
            -
             
     | 
| 
       258 
     | 
    
         
            -
             
     | 
| 
       259 
     | 
    
         
            -
                     nokogiri-sm: 
     | 
| 
      
 271 
     | 
    
         
            +
                        selma-sm:     3779.4 i/s
         
     | 
| 
      
 272 
     | 
    
         
            +
                   nokolexbor-sm:     3300.1 i/s - same-ish: difference falls within error
         
     | 
| 
      
 273 
     | 
    
         
            +
                     nokogiri-sm:     1073.1 i/s - 3.52x  slower
         
     | 
| 
       260 
274 
     | 
    
         | 
| 
       261 
275 
     | 
    
         
             
            input size = 86686 bytes, 0.09 MB
         
     | 
| 
       262 
276 
     | 
    
         | 
| 
       263 
277 
     | 
    
         
             
            ruby 3.3.0 (2023-12-25 revision 5124f9ac75) [arm64-darwin23]
         
     | 
| 
       264 
278 
     | 
    
         
             
            Warming up --------------------------------------
         
     | 
| 
       265 
     | 
    
         
            -
                     nokogiri-md 
     | 
| 
       266 
     | 
    
         
            -
                   nokolexbor-md     
     | 
| 
       267 
     | 
    
         
            -
                        selma-md     
     | 
| 
      
 279 
     | 
    
         
            +
                     nokogiri-md    11.000 i/100ms
         
     | 
| 
      
 280 
     | 
    
         
            +
                   nokolexbor-md    48.000 i/100ms
         
     | 
| 
      
 281 
     | 
    
         
            +
                        selma-md    53.000 i/100ms
         
     | 
| 
       268 
282 
     | 
    
         
             
            Calculating -------------------------------------
         
     | 
| 
       269 
     | 
    
         
            -
                     nokogiri-md 
     | 
| 
       270 
     | 
    
         
            -
                   nokolexbor-md     
     | 
| 
       271 
     | 
    
         
            -
                        selma-md     
     | 
| 
      
 283 
     | 
    
         
            +
                     nokogiri-md    103.998 (± 5.8%) i/s -      3.113k in  30.029932s
         
     | 
| 
      
 284 
     | 
    
         
            +
                   nokolexbor-md    428.928 (± 7.9%) i/s -     12.816k in  30.066662s
         
     | 
| 
      
 285 
     | 
    
         
            +
                        selma-md    492.190 (± 6.9%) i/s -     14.734k in  30.082943s
         
     | 
| 
       272 
286 
     | 
    
         | 
| 
       273 
287 
     | 
    
         
             
            Comparison:
         
     | 
| 
       274 
     | 
    
         
            -
             
     | 
| 
       275 
     | 
    
         
            -
             
     | 
| 
       276 
     | 
    
         
            -
                     nokogiri-md: 
     | 
| 
      
 288 
     | 
    
         
            +
                        selma-md:      492.2 i/s
         
     | 
| 
      
 289 
     | 
    
         
            +
                   nokolexbor-md:      428.9 i/s - same-ish: difference falls within error
         
     | 
| 
      
 290 
     | 
    
         
            +
                     nokogiri-md:      104.0 i/s - 4.73x  slower
         
     | 
| 
       277 
291 
     | 
    
         | 
| 
       278 
292 
     | 
    
         
             
            input size = 7172510 bytes, 7.17 MB
         
     | 
| 
       279 
293 
     | 
    
         | 
| 
         @@ -283,14 +297,14 @@ Warming up -------------------------------------- 
     | 
|
| 
       283 
297 
     | 
    
         
             
                   nokolexbor-lg     1.000 i/100ms
         
     | 
| 
       284 
298 
     | 
    
         
             
                        selma-lg     1.000 i/100ms
         
     | 
| 
       285 
299 
     | 
    
         
             
            Calculating -------------------------------------
         
     | 
| 
       286 
     | 
    
         
            -
                     nokogiri-lg      0. 
     | 
| 
       287 
     | 
    
         
            -
                   nokolexbor-lg      2. 
     | 
| 
       288 
     | 
    
         
            -
                        selma-lg       
     | 
| 
      
 300 
     | 
    
         
            +
                     nokogiri-lg      0.874 (± 0.0%) i/s -     27.000 in  30.921090s
         
     | 
| 
      
 301 
     | 
    
         
            +
                   nokolexbor-lg      2.227 (± 0.0%) i/s -     67.000 in  30.137903s
         
     | 
| 
      
 302 
     | 
    
         
            +
                        selma-lg      8.354 (± 0.0%) i/s -    251.000 in  30.075227s
         
     | 
| 
       289 
303 
     | 
    
         | 
| 
       290 
304 
     | 
    
         
             
            Comparison:
         
     | 
| 
       291 
     | 
    
         
            -
                        selma-lg:         
     | 
| 
       292 
     | 
    
         
            -
                   nokolexbor-lg:        2.2 i/s -  
     | 
| 
       293 
     | 
    
         
            -
                     nokogiri-lg:        0.9 i/s -  
     | 
| 
      
 305 
     | 
    
         
            +
                        selma-lg:        8.4 i/s
         
     | 
| 
      
 306 
     | 
    
         
            +
                   nokolexbor-lg:        2.2 i/s - 3.75x  slower
         
     | 
| 
      
 307 
     | 
    
         
            +
                     nokogiri-lg:        0.9 i/s - 9.56x  slower
         
     | 
| 
       294 
308 
     | 
    
         
             
            </pre>
         
     | 
| 
       295 
309 
     | 
    
         
             
            </details>
         
     | 
| 
       296 
310 
     | 
    
         
             
            <!-- prettier-ignore-end -->
         
     | 
    
        data/ext/selma/Cargo.toml
    CHANGED
    
    | 
         @@ -8,7 +8,10 @@ publish = false 
     | 
|
| 
       8 
8 
     | 
    
         
             
            [dependencies]
         
     | 
| 
       9 
9 
     | 
    
         
             
            enum-iterator = "2.1"
         
     | 
| 
       10 
10 
     | 
    
         
             
            escapist = "0.0.2"
         
     | 
| 
       11 
     | 
    
         
            -
            magnus = "0.6"
         
     | 
| 
      
 11 
     | 
    
         
            +
            magnus = { version = "0.6", features = ["rb-sys"] }
         
     | 
| 
      
 12 
     | 
    
         
            +
            rb-sys = { version = "*", default-features = false, features = [
         
     | 
| 
      
 13 
     | 
    
         
            +
                "stable-api-compiled-fallback",
         
     | 
| 
      
 14 
     | 
    
         
            +
            ] }
         
     | 
| 
       12 
15 
     | 
    
         
             
            lol_html = "1.2"
         
     | 
| 
       13 
16 
     | 
    
         | 
| 
       14 
17 
     | 
    
         
             
            [lib]
         
     | 
| 
         @@ -119,11 +119,13 @@ impl SelmaHTMLElement { 
     | 
|
| 
       119 
119 
     | 
    
         
             
                            .iter()
         
     | 
| 
       120 
120 
     | 
    
         
             
                            .for_each(|attr| match hash.aset(attr.name(), attr.value()) {
         
     | 
| 
       121 
121 
     | 
    
         
             
                                Ok(_) => {}
         
     | 
| 
       122 
     | 
    
         
            -
                                Err(err) =>  
     | 
| 
       123 
     | 
    
         
            -
                                     
     | 
| 
       124 
     | 
    
         
            -
                                     
     | 
| 
       125 
     | 
    
         
            -
             
     | 
| 
       126 
     | 
    
         
            -
             
     | 
| 
      
 122 
     | 
    
         
            +
                                Err(err) => panic!(
         
     | 
| 
      
 123 
     | 
    
         
            +
                                    "{:?}",
         
     | 
| 
      
 124 
     | 
    
         
            +
                                    Error::new(
         
     | 
| 
      
 125 
     | 
    
         
            +
                                        exception::runtime_error(),
         
     | 
| 
      
 126 
     | 
    
         
            +
                                        format!("AttributeNameError: {err:?}"),
         
     | 
| 
      
 127 
     | 
    
         
            +
                                    )
         
     | 
| 
      
 128 
     | 
    
         
            +
                                ),
         
     | 
| 
       127 
129 
     | 
    
         
             
                            });
         
     | 
| 
       128 
130 
     | 
    
         
             
                    }
         
     | 
| 
       129 
131 
     | 
    
         
             
                    Ok(hash)
         
     | 
| 
         @@ -139,7 +141,10 @@ impl SelmaHTMLElement { 
     | 
|
| 
       139 
141 
     | 
    
         
             
                        .for_each(|ancestor| match array.push(RString::new(ancestor)) {
         
     | 
| 
       140 
142 
     | 
    
         
             
                            Ok(_) => {}
         
     | 
| 
       141 
143 
     | 
    
         
             
                            Err(err) => {
         
     | 
| 
       142 
     | 
    
         
            -
                                 
     | 
| 
      
 144 
     | 
    
         
            +
                                panic!(
         
     | 
| 
      
 145 
     | 
    
         
            +
                                    "{:?}",
         
     | 
| 
      
 146 
     | 
    
         
            +
                                    Error::new(exception::runtime_error(), format!("{err:?}"))
         
     | 
| 
      
 147 
     | 
    
         
            +
                                )
         
     | 
| 
       143 
148 
     | 
    
         
             
                            }
         
     | 
| 
       144 
149 
     | 
    
         
             
                        });
         
     | 
| 
       145 
150 
     | 
    
         | 
| 
         @@ -1,15 +1,17 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            use std::{ 
     | 
| 
      
 1 
     | 
    
         
            +
            use std::{
         
     | 
| 
      
 2 
     | 
    
         
            +
                marker::PhantomData,
         
     | 
| 
      
 3 
     | 
    
         
            +
                sync::{Arc, Mutex},
         
     | 
| 
      
 4 
     | 
    
         
            +
            };
         
     | 
| 
       2 
5 
     | 
    
         | 
| 
       3 
     | 
    
         
            -
            // NOTE:  
     | 
| 
       4 
     | 
    
         
            -
            // but it was taken from https://github.com/cloudflare/lol-html/blob/1a1ab2e2bf896f815fe8888ed78ccdf46d7c6b85/js-api/src/lib.rs#LL38
         
     | 
| 
      
 6 
     | 
    
         
            +
            // NOTE: this was taken from https://github.com/cloudflare/lol-html/blob/1a1ab2e2bf896f815fe8888ed78ccdf46d7c6b85/js-api/src/lib.rs#LL38
         
     | 
| 
       5 
7 
     | 
    
         | 
| 
       6 
8 
     | 
    
         
             
            pub struct Anchor<'r> {
         
     | 
| 
       7 
     | 
    
         
            -
                poisoned:  
     | 
| 
      
 9 
     | 
    
         
            +
                poisoned: Arc<Mutex<bool>>,
         
     | 
| 
       8 
10 
     | 
    
         
             
                lifetime: PhantomData<&'r mut ()>,
         
     | 
| 
       9 
11 
     | 
    
         
             
            }
         
     | 
| 
       10 
12 
     | 
    
         | 
| 
       11 
13 
     | 
    
         
             
            impl<'r> Anchor<'r> {
         
     | 
| 
       12 
     | 
    
         
            -
                pub fn new(poisoned:  
     | 
| 
      
 14 
     | 
    
         
            +
                pub fn new(poisoned: Arc<Mutex<bool>>) -> Self {
         
     | 
| 
       13 
15 
     | 
    
         
             
                    Anchor {
         
     | 
| 
       14 
16 
     | 
    
         
             
                        poisoned,
         
     | 
| 
       15 
17 
     | 
    
         
             
                        lifetime: PhantomData,
         
     | 
| 
         @@ -19,7 +21,7 @@ impl<'r> Anchor<'r> { 
     | 
|
| 
       19 
21 
     | 
    
         | 
| 
       20 
22 
     | 
    
         
             
            // impl Drop for Anchor<'_> {
         
     | 
| 
       21 
23 
     | 
    
         
             
            //     fn drop(&mut self) {
         
     | 
| 
       22 
     | 
    
         
            -
            //         self.poisoned. 
     | 
| 
      
 24 
     | 
    
         
            +
            //         *self.poisoned.lock().unwrap() = true;
         
     | 
| 
       23 
25 
     | 
    
         
             
            //     }
         
     | 
| 
       24 
26 
     | 
    
         
             
            // }
         
     | 
| 
       25 
27 
     | 
    
         | 
| 
         @@ -31,17 +33,17 @@ impl<'r> Anchor<'r> { 
     | 
|
| 
       31 
33 
     | 
    
         
             
            // object results in exception.
         
     | 
| 
       32 
34 
     | 
    
         
             
            pub struct NativeRefWrap<R> {
         
     | 
| 
       33 
35 
     | 
    
         
             
                inner_ptr: *mut R,
         
     | 
| 
       34 
     | 
    
         
            -
                poisoned:  
     | 
| 
      
 36 
     | 
    
         
            +
                poisoned: Arc<Mutex<bool>>,
         
     | 
| 
       35 
37 
     | 
    
         
             
            }
         
     | 
| 
       36 
38 
     | 
    
         | 
| 
       37 
39 
     | 
    
         
             
            impl<R> NativeRefWrap<R> {
         
     | 
| 
       38 
40 
     | 
    
         
             
                pub fn wrap<I>(inner: &I) -> (Self, Anchor) {
         
     | 
| 
       39 
41 
     | 
    
         
             
                    let wrap = NativeRefWrap {
         
     | 
| 
       40 
42 
     | 
    
         
             
                        inner_ptr: inner as *const I as *mut R,
         
     | 
| 
       41 
     | 
    
         
            -
                        poisoned:  
     | 
| 
      
 43 
     | 
    
         
            +
                        poisoned: Arc::new(Mutex::new(false)),
         
     | 
| 
       42 
44 
     | 
    
         
             
                    };
         
     | 
| 
       43 
45 
     | 
    
         | 
| 
       44 
     | 
    
         
            -
                    let anchor = Anchor::new( 
     | 
| 
      
 46 
     | 
    
         
            +
                    let anchor = Anchor::new(Arc::clone(&wrap.poisoned));
         
     | 
| 
       45 
47 
     | 
    
         | 
| 
       46 
48 
     | 
    
         
             
                    (wrap, anchor)
         
     | 
| 
       47 
49 
     | 
    
         
             
                }
         
     | 
| 
         @@ -49,10 +51,10 @@ impl<R> NativeRefWrap<R> { 
     | 
|
| 
       49 
51 
     | 
    
         
             
                pub fn wrap_mut<I>(inner: &mut I) -> (Self, Anchor) {
         
     | 
| 
       50 
52 
     | 
    
         
             
                    let wrap = NativeRefWrap {
         
     | 
| 
       51 
53 
     | 
    
         
             
                        inner_ptr: inner as *mut I as *mut R,
         
     | 
| 
       52 
     | 
    
         
            -
                        poisoned:  
     | 
| 
      
 54 
     | 
    
         
            +
                        poisoned: Arc::new(Mutex::new(false)),
         
     | 
| 
       53 
55 
     | 
    
         
             
                    };
         
     | 
| 
       54 
56 
     | 
    
         | 
| 
       55 
     | 
    
         
            -
                    let anchor = Anchor::new( 
     | 
| 
      
 57 
     | 
    
         
            +
                    let anchor = Anchor::new(Arc::clone(&wrap.poisoned));
         
     | 
| 
       56 
58 
     | 
    
         | 
| 
       57 
59 
     | 
    
         
             
                    (wrap, anchor)
         
     | 
| 
       58 
60 
     | 
    
         
             
                }
         
     | 
| 
         @@ -70,7 +72,8 @@ impl<R> NativeRefWrap<R> { 
     | 
|
| 
       70 
72 
     | 
    
         
             
                }
         
     | 
| 
       71 
73 
     | 
    
         | 
| 
       72 
74 
     | 
    
         
             
                fn assert_not_poisoned(&self) -> Result<(), &'static str> {
         
     | 
| 
       73 
     | 
    
         
            -
                     
     | 
| 
      
 75 
     | 
    
         
            +
                    let lock = self.poisoned.lock().unwrap();
         
     | 
| 
      
 76 
     | 
    
         
            +
                    if *lock {
         
     | 
| 
       74 
77 
     | 
    
         
             
                        Err("The object has been freed and can't be used anymore.")
         
     | 
| 
       75 
78 
     | 
    
         
             
                    } else {
         
     | 
| 
       76 
79 
     | 
    
         
             
                        Ok(())
         
     |