mini_racer 0.2.7 → 0.2.12
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/.travis.yml +1 -1
 - data/CHANGELOG +31 -0
 - data/README.md +8 -3
 - data/ext/mini_racer_extension/mini_racer_extension.cc +94 -15
 - data/lib/mini_racer.rb +50 -2
 - data/lib/mini_racer/version.rb +1 -1
 - data/mini_racer.gemspec +9 -3
 - metadata +19 -15
 
    
        checksums.yaml
    CHANGED
    
    | 
         @@ -1,7 +1,7 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            ---
         
     | 
| 
       2 
2 
     | 
    
         
             
            SHA256:
         
     | 
| 
       3 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       4 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 3 
     | 
    
         
            +
              metadata.gz: 35ced47bf0cd66e605b6bd14005c23381b9fa42e438b0ab45a3c99414d107634
         
     | 
| 
      
 4 
     | 
    
         
            +
              data.tar.gz: '02968be5850b866d1c399995cb6d942dc826730447524df008f604035449050e'
         
     | 
| 
       5 
5 
     | 
    
         
             
            SHA512:
         
     | 
| 
       6 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       7 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 6 
     | 
    
         
            +
              metadata.gz: 3c4fc5f71bcfddd5d58f5b0ae0f68e4b59067005362afbf29f096752f63fab9ea0d0526f2ba02d5a85f89976e607eae395c3714b6186282a6bce19217ae86ec0
         
     | 
| 
      
 7 
     | 
    
         
            +
              data.tar.gz: 3d6268a03f472c01fa68278e4349c18b270765a8e831b020286a929b0fd0f2a1422b2c0c11432a33a348ec28044a38acdcd55d4cff93b436acc2fbed07ddfdf8
         
     | 
    
        data/.travis.yml
    CHANGED
    
    
    
        data/CHANGELOG
    CHANGED
    
    | 
         @@ -1,3 +1,34 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            - 15-05-2020
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            - 0.2.12
         
     | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
      
 5 
     | 
    
         
            +
              - FEATURE: isolate.low_memory_notification which can force a full GC
         
     | 
| 
      
 6 
     | 
    
         
            +
              - FEATURE: MiniRacer::Context.new(ensure_gc_after_idle: 2) - to force full GC 2 seconds after context is idle, this allows you to conserve memory on isolates
         
     | 
| 
      
 7 
     | 
    
         
            +
             
     | 
| 
      
 8 
     | 
    
         
            +
            - 14-05-2020
         
     | 
| 
      
 9 
     | 
    
         
            +
             
     | 
| 
      
 10 
     | 
    
         
            +
            - 0.2.11
         
     | 
| 
      
 11 
     | 
    
         
            +
             
     | 
| 
      
 12 
     | 
    
         
            +
              - FIX: dumping heap snapshots was not flushing the file leading to corrupt snapshots
         
     | 
| 
      
 13 
     | 
    
         
            +
              - FIX: a use-after-free shutdown crash
         
     | 
| 
      
 14 
     | 
    
         
            +
             
     | 
| 
      
 15 
     | 
    
         
            +
            - 0.2.10
         
     | 
| 
      
 16 
     | 
    
         
            +
             
     | 
| 
      
 17 
     | 
    
         
            +
            - 22-04-2020
         
     | 
| 
      
 18 
     | 
    
         
            +
             
     | 
| 
      
 19 
     | 
    
         
            +
              - FEATURE: memory softlimit support for nogvl_context_call
         
     | 
| 
      
 20 
     | 
    
         
            +
             
     | 
| 
      
 21 
     | 
    
         
            +
            - 0.2.9
         
     | 
| 
      
 22 
     | 
    
         
            +
             
     | 
| 
      
 23 
     | 
    
         
            +
            - 09-01-2020
         
     | 
| 
      
 24 
     | 
    
         
            +
             
     | 
| 
      
 25 
     | 
    
         
            +
              - FIX: correct segfault when JS returns a Symbol and properly cast to ruby symbol
         
     | 
| 
      
 26 
     | 
    
         
            +
             
     | 
| 
      
 27 
     | 
    
         
            +
            - 0.2.8
         
     | 
| 
      
 28 
     | 
    
         
            +
             
     | 
| 
      
 29 
     | 
    
         
            +
            - 11-11-2019
         
     | 
| 
      
 30 
     | 
    
         
            +
             
     | 
| 
      
 31 
     | 
    
         
            +
              - FIX: ensure thread live cycle is properly accounter for following file descriptor fix
         
     | 
| 
       1 
32 
     | 
    
         | 
| 
       2 
33 
     | 
    
         
             
            - 0.2.7
         
     | 
| 
       3 
34 
     | 
    
         | 
    
        data/README.md
    CHANGED
    
    | 
         @@ -1,6 +1,6 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            # MiniRacer
         
     | 
| 
       2 
2 
     | 
    
         | 
| 
       3 
     | 
    
         
            -
            [](https://travis-ci.org/rubyjs/mini_racer)
         
     | 
| 
       4 
4 
     | 
    
         | 
| 
       5 
5 
     | 
    
         
             
            Minimal, modern embedded V8 for Ruby.
         
     | 
| 
       6 
6 
     | 
    
         | 
| 
         @@ -230,12 +230,17 @@ context = MiniRacer::Context.new(isolate: isolate) 
     | 
|
| 
       230 
230 
     | 
    
         
             
            # give up to 100ms for V8 garbage collection
         
     | 
| 
       231 
231 
     | 
    
         
             
            isolate.idle_notification(100)
         
     | 
| 
       232 
232 
     | 
    
         | 
| 
      
 233 
     | 
    
         
            +
            # force V8 to perform a full GC
         
     | 
| 
      
 234 
     | 
    
         
            +
            isolate.low_memory_notification
         
     | 
| 
      
 235 
     | 
    
         
            +
             
     | 
| 
       233 
236 
     | 
    
         
             
            ```
         
     | 
| 
       234 
237 
     | 
    
         | 
| 
       235 
238 
     | 
    
         
             
            This can come in handy to force V8 GC runs for example in between requests if you use MiniRacer on a web application.
         
     | 
| 
       236 
239 
     | 
    
         | 
| 
       237 
240 
     | 
    
         
             
            Note that this method maps directly to [`v8::Isolate::IdleNotification`](http://bespin.cz/~ondras/html/classv8_1_1Isolate.html#aea16cbb2e351de9a3ae7be2b7cb48297), and that in particular its return value is the same (true if there is no further garbage to collect, false otherwise) and the same caveats apply, in particular that `there is no guarantee that the [call will return] within the time limit.`
         
     | 
| 
       238 
241 
     | 
    
         | 
| 
      
 242 
     | 
    
         
            +
            Additionally you may automate this process on a context by defining it with `MiniRacer::Content.new(ensure_gc_after_idle: 1)`. Using this will ensure V8 will run a full GC using `context.isolate.low_memory_notification` 1 second after the last eval on the context. Low memory notification is both slower and more aggressive than an idle_notification and will ensure long living isolates use minimal amounts of memory.
         
     | 
| 
      
 243 
     | 
    
         
            +
             
     | 
| 
       239 
244 
     | 
    
         
             
            ### V8 Runtime flags
         
     | 
| 
       240 
245 
     | 
    
         | 
| 
       241 
246 
     | 
    
         
             
            It is possible to set V8 Runtime flags:
         
     | 
| 
         @@ -273,7 +278,7 @@ context.eval js 
     | 
|
| 
       273 
278 
     | 
    
         
             
            The same code without the harmony runtime flag results in a `MiniRacer::RuntimeError: RangeError: Maximum call stack size exceeded` exception.
         
     | 
| 
       274 
279 
     | 
    
         
             
            Please refer to http://node.green/ as a reference on other harmony features.
         
     | 
| 
       275 
280 
     | 
    
         | 
| 
       276 
     | 
    
         
            -
            A list of all V8 runtime flags can be found using `node --v8-options`, or else by perusing [the V8 source code for flags (make sure to use the right version of V8)](https://github.com/v8/v8/blob/master/src/flag-definitions.h).
         
     | 
| 
      
 281 
     | 
    
         
            +
            A list of all V8 runtime flags can be found using `node --v8-options`, or else by perusing [the V8 source code for flags (make sure to use the right version of V8)](https://github.com/v8/v8/blob/master/src/flags/flag-definitions.h).
         
     | 
| 
       277 
282 
     | 
    
         | 
| 
       278 
283 
     | 
    
         
             
            Note that runtime flags must be set before any other operation (e.g. creating a context, a snapshot or an isolate), otherwise an exception will be thrown.
         
     | 
| 
       279 
284 
     | 
    
         | 
| 
         @@ -447,7 +452,7 @@ Add this to your .travis.yml file: 
     | 
|
| 
       447 
452 
     | 
    
         | 
| 
       448 
453 
     | 
    
         
             
            ## Contributing
         
     | 
| 
       449 
454 
     | 
    
         | 
| 
       450 
     | 
    
         
            -
            Bug reports and pull requests are welcome on GitHub at https://github.com/ 
     | 
| 
      
 455 
     | 
    
         
            +
            Bug reports and pull requests are welcome on GitHub at https://github.com/rubyjs/mini_racer. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct.
         
     | 
| 
       451 
456 
     | 
    
         | 
| 
       452 
457 
     | 
    
         | 
| 
       453 
458 
     | 
    
         
             
            ## License
         
     | 
| 
         @@ -127,6 +127,7 @@ typedef struct { 
     | 
|
| 
       127 
127 
     | 
    
         
             
                Local<Function> fun;
         
     | 
| 
       128 
128 
     | 
    
         
             
                Local<Value> *argv;
         
     | 
| 
       129 
129 
     | 
    
         
             
                EvalResult result;
         
     | 
| 
      
 130 
     | 
    
         
            +
                size_t max_memory;
         
     | 
| 
       130 
131 
     | 
    
         
             
            } FunctionCall;
         
     | 
| 
       131 
132 
     | 
    
         | 
| 
       132 
133 
     | 
    
         
             
            enum IsolateFlags {
         
     | 
| 
         @@ -155,6 +156,10 @@ static VALUE rb_cDateTime = Qnil; 
     | 
|
| 
       155 
156 
     | 
    
         
             
            static std::unique_ptr<Platform> current_platform = NULL;
         
     | 
| 
       156 
157 
     | 
    
         
             
            static std::mutex platform_lock;
         
     | 
| 
       157 
158 
     | 
    
         | 
| 
      
 159 
     | 
    
         
            +
            static pthread_attr_t *thread_attr_p;
         
     | 
| 
      
 160 
     | 
    
         
            +
            static pthread_rwlock_t exit_lock = PTHREAD_RWLOCK_INITIALIZER;
         
     | 
| 
      
 161 
     | 
    
         
            +
            static bool ruby_exiting; // guarded by exit_lock
         
     | 
| 
      
 162 
     | 
    
         
            +
             
     | 
| 
       158 
163 
     | 
    
         
             
            static VALUE rb_platform_set_flag_as_str(VALUE _klass, VALUE flag_as_str) {
         
     | 
| 
       159 
164 
     | 
    
         
             
                bool platform_already_initialized = false;
         
     | 
| 
       160 
165 
     | 
    
         | 
| 
         @@ -444,8 +449,27 @@ static VALUE convert_v8_to_ruby(Isolate* isolate, Local 
     | 
|
| 
       444 
449 
     | 
    
         
             
                    return rb_hash;
         
     | 
| 
       445 
450 
     | 
    
         
             
                }
         
     | 
| 
       446 
451 
     | 
    
         | 
| 
       447 
     | 
    
         
            -
                 
     | 
| 
       448 
     | 
    
         
            -
             
     | 
| 
      
 452 
     | 
    
         
            +
                if (value->IsSymbol()) {
         
     | 
| 
      
 453 
     | 
    
         
            +
            	v8::String::Utf8Value symbol_name(isolate,
         
     | 
| 
      
 454 
     | 
    
         
            +
            	    Local<Symbol>::Cast(value)->Name());
         
     | 
| 
      
 455 
     | 
    
         
            +
             
     | 
| 
      
 456 
     | 
    
         
            +
            	VALUE str_symbol = rb_enc_str_new(
         
     | 
| 
      
 457 
     | 
    
         
            +
            	    *symbol_name,
         
     | 
| 
      
 458 
     | 
    
         
            +
            	    symbol_name.length(),
         
     | 
| 
      
 459 
     | 
    
         
            +
            	    rb_enc_find("utf-8")
         
     | 
| 
      
 460 
     | 
    
         
            +
            	);
         
     | 
| 
      
 461 
     | 
    
         
            +
             
     | 
| 
      
 462 
     | 
    
         
            +
            	return ID2SYM(rb_intern_str(str_symbol));
         
     | 
| 
      
 463 
     | 
    
         
            +
                }
         
     | 
| 
      
 464 
     | 
    
         
            +
             
     | 
| 
      
 465 
     | 
    
         
            +
                MaybeLocal<String> rstr_maybe = value->ToString(context);
         
     | 
| 
      
 466 
     | 
    
         
            +
             
     | 
| 
      
 467 
     | 
    
         
            +
                if (rstr_maybe.IsEmpty()) {
         
     | 
| 
      
 468 
     | 
    
         
            +
            	return Qnil;
         
     | 
| 
      
 469 
     | 
    
         
            +
                } else {
         
     | 
| 
      
 470 
     | 
    
         
            +
            	Local<String> rstr = rstr_maybe.ToLocalChecked();
         
     | 
| 
      
 471 
     | 
    
         
            +
            	return rb_enc_str_new(*String::Utf8Value(isolate, rstr), rstr->Utf8Length(isolate), rb_enc_find("utf-8"));
         
     | 
| 
      
 472 
     | 
    
         
            +
                }
         
     | 
| 
       449 
473 
     | 
    
         
             
            }
         
     | 
| 
       450 
474 
     | 
    
         | 
| 
       451 
475 
     | 
    
         
             
            static VALUE convert_v8_to_ruby(Isolate* isolate,
         
     | 
| 
         @@ -745,6 +769,16 @@ static VALUE rb_isolate_idle_notification(VALUE self, VALUE idle_time_in_ms) { 
     | 
|
| 
       745 
769 
     | 
    
         
             
                return isolate_info->isolate->IdleNotificationDeadline(now + duration) ? Qtrue : Qfalse;
         
     | 
| 
       746 
770 
     | 
    
         
             
            }
         
     | 
| 
       747 
771 
     | 
    
         | 
| 
      
 772 
     | 
    
         
            +
            static VALUE rb_isolate_low_memory_notification(VALUE self) {
         
     | 
| 
      
 773 
     | 
    
         
            +
                IsolateInfo* isolate_info;
         
     | 
| 
      
 774 
     | 
    
         
            +
                Data_Get_Struct(self, IsolateInfo, isolate_info);
         
     | 
| 
      
 775 
     | 
    
         
            +
             
     | 
| 
      
 776 
     | 
    
         
            +
                if (current_platform == NULL) return Qfalse;
         
     | 
| 
      
 777 
     | 
    
         
            +
             
     | 
| 
      
 778 
     | 
    
         
            +
                isolate_info->isolate->LowMemoryNotification();
         
     | 
| 
      
 779 
     | 
    
         
            +
                return Qnil;
         
     | 
| 
      
 780 
     | 
    
         
            +
            }
         
     | 
| 
      
 781 
     | 
    
         
            +
             
     | 
| 
       748 
782 
     | 
    
         
             
            static VALUE rb_context_init_unsafe(VALUE self, VALUE isolate, VALUE snap) {
         
     | 
| 
       749 
783 
     | 
    
         
             
                ContextInfo* context_info;
         
     | 
| 
       750 
784 
     | 
    
         
             
                Data_Get_Struct(self, ContextInfo, context_info);
         
     | 
| 
         @@ -1185,7 +1219,7 @@ void free_isolate(IsolateInfo* isolate_info) { 
     | 
|
| 
       1185 
1219 
     | 
    
         
             
                delete isolate_info->allocator;
         
     | 
| 
       1186 
1220 
     | 
    
         
             
            }
         
     | 
| 
       1187 
1221 
     | 
    
         | 
| 
       1188 
     | 
    
         
            -
            static void  
     | 
| 
      
 1222 
     | 
    
         
            +
            static void free_context_raw(void *arg) {
         
     | 
| 
       1189 
1223 
     | 
    
         
             
                ContextInfo* context_info = (ContextInfo*)arg;
         
     | 
| 
       1190 
1224 
     | 
    
         
             
                IsolateInfo* isolate_info = context_info->isolate_info;
         
     | 
| 
       1191 
1225 
     | 
    
         
             
                Persistent<Context>* context = context_info->context;
         
     | 
| 
         @@ -1202,6 +1236,20 @@ static void *free_context_raw(void* arg) { 
     | 
|
| 
       1202 
1236 
     | 
    
         
             
                }
         
     | 
| 
       1203 
1237 
     | 
    
         | 
| 
       1204 
1238 
     | 
    
         
             
                xfree(context_info);
         
     | 
| 
      
 1239 
     | 
    
         
            +
            }
         
     | 
| 
      
 1240 
     | 
    
         
            +
             
     | 
| 
      
 1241 
     | 
    
         
            +
            static void *free_context_thr(void* arg) {
         
     | 
| 
      
 1242 
     | 
    
         
            +
                if (pthread_rwlock_tryrdlock(&exit_lock) != 0) {
         
     | 
| 
      
 1243 
     | 
    
         
            +
                    return NULL;
         
     | 
| 
      
 1244 
     | 
    
         
            +
                }
         
     | 
| 
      
 1245 
     | 
    
         
            +
                if (ruby_exiting) {
         
     | 
| 
      
 1246 
     | 
    
         
            +
                    return NULL;
         
     | 
| 
      
 1247 
     | 
    
         
            +
                }
         
     | 
| 
      
 1248 
     | 
    
         
            +
             
     | 
| 
      
 1249 
     | 
    
         
            +
                free_context_raw(arg);
         
     | 
| 
      
 1250 
     | 
    
         
            +
             
     | 
| 
      
 1251 
     | 
    
         
            +
                pthread_rwlock_unlock(&exit_lock);
         
     | 
| 
      
 1252 
     | 
    
         
            +
             
     | 
| 
       1205 
1253 
     | 
    
         
             
                return NULL;
         
     | 
| 
       1206 
1254 
     | 
    
         
             
            }
         
     | 
| 
       1207 
1255 
     | 
    
         | 
| 
         @@ -1215,22 +1263,17 @@ static void free_context(ContextInfo* context_info) { 
     | 
|
| 
       1215 
1263 
     | 
    
         
             
                context_info_copy->context = context_info->context;
         
     | 
| 
       1216 
1264 
     | 
    
         | 
| 
       1217 
1265 
     | 
    
         
             
                if (isolate_info && isolate_info->refs() > 1) {
         
     | 
| 
       1218 
     | 
    
         
            -
             
     | 
| 
       1219 
     | 
    
         
            -
             
     | 
| 
       1220 
     | 
    
         
            -
             
     | 
| 
       1221 
     | 
    
         
            -
             
     | 
| 
       1222 
     | 
    
         
            -
             
     | 
| 
      
 1266 
     | 
    
         
            +
                    pthread_t free_context_thread;
         
     | 
| 
      
 1267 
     | 
    
         
            +
                    if (pthread_create(&free_context_thread, thread_attr_p,
         
     | 
| 
      
 1268 
     | 
    
         
            +
                                       free_context_thr, (void*)context_info_copy)) {
         
     | 
| 
      
 1269 
     | 
    
         
            +
                        fprintf(stderr, "WARNING failed to release memory in MiniRacer, thread to release could not be created, process will leak memory\n");
         
     | 
| 
      
 1270 
     | 
    
         
            +
                    }
         
     | 
| 
       1223 
1271 
     | 
    
         
             
                } else {
         
     | 
| 
       1224 
1272 
     | 
    
         
             
                    free_context_raw(context_info_copy);
         
     | 
| 
       1225 
1273 
     | 
    
         
             
                }
         
     | 
| 
       1226 
1274 
     | 
    
         | 
| 
       1227 
     | 
    
         
            -
                 
     | 
| 
       1228 
     | 
    
         
            -
             
     | 
| 
       1229 
     | 
    
         
            -
                }
         
     | 
| 
       1230 
     | 
    
         
            -
             
     | 
| 
       1231 
     | 
    
         
            -
                if (isolate_info) {
         
     | 
| 
       1232 
     | 
    
         
            -
                    context_info->isolate_info = NULL;
         
     | 
| 
       1233 
     | 
    
         
            -
                }
         
     | 
| 
      
 1275 
     | 
    
         
            +
                context_info->context = NULL;
         
     | 
| 
      
 1276 
     | 
    
         
            +
                context_info->isolate_info = NULL;
         
     | 
| 
       1234 
1277 
     | 
    
         
             
            }
         
     | 
| 
       1235 
1278 
     | 
    
         | 
| 
       1236 
1279 
     | 
    
         
             
            static void deallocate_isolate(void* data) {
         
     | 
| 
         @@ -1388,6 +1431,8 @@ rb_heap_snapshot(VALUE self, VALUE file) { 
     | 
|
| 
       1388 
1431 
     | 
    
         
             
                FileOutputStream stream(fp);
         
     | 
| 
       1389 
1432 
     | 
    
         
             
                snap->Serialize(&stream, HeapSnapshot::kJSON);
         
     | 
| 
       1390 
1433 
     | 
    
         | 
| 
      
 1434 
     | 
    
         
            +
                fflush(fp);
         
     | 
| 
      
 1435 
     | 
    
         
            +
             
     | 
| 
       1391 
1436 
     | 
    
         
             
                const_cast<HeapSnapshot*>(snap)->Delete();
         
     | 
| 
       1392 
1437 
     | 
    
         | 
| 
       1393 
1438 
     | 
    
         
             
                return Qtrue;
         
     | 
| 
         @@ -1435,6 +1480,12 @@ nogvl_context_call(void *args) { 
     | 
|
| 
       1435 
1480 
     | 
    
         
             
                // terminate ASAP
         
     | 
| 
       1436 
1481 
     | 
    
         
             
                isolate->SetData(DO_TERMINATE, (void*)false);
         
     | 
| 
       1437 
1482 
     | 
    
         | 
| 
      
 1483 
     | 
    
         
            +
                if (call->max_memory > 0) {
         
     | 
| 
      
 1484 
     | 
    
         
            +
                    isolate->SetData(MEM_SOFTLIMIT_VALUE, &call->max_memory);
         
     | 
| 
      
 1485 
     | 
    
         
            +
                    isolate->SetData(MEM_SOFTLIMIT_REACHED, (void*)false);
         
     | 
| 
      
 1486 
     | 
    
         
            +
                    isolate->AddGCEpilogueCallback(gc_callback);
         
     | 
| 
      
 1487 
     | 
    
         
            +
                }
         
     | 
| 
      
 1488 
     | 
    
         
            +
             
     | 
| 
       1438 
1489 
     | 
    
         
             
                Isolate::Scope isolate_scope(isolate);
         
     | 
| 
       1439 
1490 
     | 
    
         
             
                EscapableHandleScope handle_scope(isolate);
         
     | 
| 
       1440 
1491 
     | 
    
         
             
                TryCatch trycatch(isolate);
         
     | 
| 
         @@ -1492,6 +1543,13 @@ static VALUE rb_context_call_unsafe(int argc, VALUE *argv, VALUE self) { 
     | 
|
| 
       1492 
1543 
     | 
    
         
             
                    call_argv = argv + 1;
         
     | 
| 
       1493 
1544 
     | 
    
         
             
                }
         
     | 
| 
       1494 
1545 
     | 
    
         | 
| 
      
 1546 
     | 
    
         
            +
                call.max_memory = 0;
         
     | 
| 
      
 1547 
     | 
    
         
            +
                VALUE mem_softlimit = rb_iv_get(self, "@max_memory");
         
     | 
| 
      
 1548 
     | 
    
         
            +
                if (mem_softlimit != Qnil) {
         
     | 
| 
      
 1549 
     | 
    
         
            +
                    unsigned long sl_int = NUM2ULONG(mem_softlimit);
         
     | 
| 
      
 1550 
     | 
    
         
            +
                    call.max_memory = (size_t)sl_int;
         
     | 
| 
      
 1551 
     | 
    
         
            +
                }
         
     | 
| 
      
 1552 
     | 
    
         
            +
             
     | 
| 
       1495 
1553 
     | 
    
         
             
                bool missingFunction = false;
         
     | 
| 
       1496 
1554 
     | 
    
         
             
                {
         
     | 
| 
       1497 
1555 
     | 
    
         
             
                    Locker lock(isolate);
         
     | 
| 
         @@ -1549,6 +1607,16 @@ static VALUE rb_context_create_isolate_value(VALUE self) { 
     | 
|
| 
       1549 
1607 
     | 
    
         
             
                return Data_Wrap_Struct(rb_cIsolate, NULL, &deallocate_isolate, isolate_info);
         
     | 
| 
       1550 
1608 
     | 
    
         
             
            }
         
     | 
| 
       1551 
1609 
     | 
    
         | 
| 
      
 1610 
     | 
    
         
            +
            static void set_ruby_exiting(VALUE value) {
         
     | 
| 
      
 1611 
     | 
    
         
            +
                (void)value;
         
     | 
| 
      
 1612 
     | 
    
         
            +
             
     | 
| 
      
 1613 
     | 
    
         
            +
                int res = pthread_rwlock_wrlock(&exit_lock);
         
     | 
| 
      
 1614 
     | 
    
         
            +
                ruby_exiting  = true;
         
     | 
| 
      
 1615 
     | 
    
         
            +
                if (res == 0) {
         
     | 
| 
      
 1616 
     | 
    
         
            +
                    pthread_rwlock_unlock(&exit_lock);
         
     | 
| 
      
 1617 
     | 
    
         
            +
                }
         
     | 
| 
      
 1618 
     | 
    
         
            +
            }
         
     | 
| 
      
 1619 
     | 
    
         
            +
             
     | 
| 
       1552 
1620 
     | 
    
         
             
            extern "C" {
         
     | 
| 
       1553 
1621 
     | 
    
         | 
| 
       1554 
1622 
     | 
    
         
             
                void Init_mini_racer_extension ( void )
         
     | 
| 
         @@ -1599,8 +1667,19 @@ extern "C" { 
     | 
|
| 
       1599 
1667 
     | 
    
         
             
                    rb_define_private_method(rb_cSnapshot, "load", (VALUE(*)(...))&rb_snapshot_load, 1);
         
     | 
| 
       1600 
1668 
     | 
    
         | 
| 
       1601 
1669 
     | 
    
         
             
                    rb_define_method(rb_cIsolate, "idle_notification", (VALUE(*)(...))&rb_isolate_idle_notification, 1);
         
     | 
| 
      
 1670 
     | 
    
         
            +
                    rb_define_method(rb_cIsolate, "low_memory_notification", (VALUE(*)(...))&rb_isolate_low_memory_notification, 0);
         
     | 
| 
      
 1671 
     | 
    
         
            +
             
     | 
| 
       1602 
1672 
     | 
    
         
             
                    rb_define_private_method(rb_cIsolate, "init_with_snapshot",(VALUE(*)(...))&rb_isolate_init_with_snapshot, 1);
         
     | 
| 
       1603 
1673 
     | 
    
         | 
| 
       1604 
1674 
     | 
    
         
             
                    rb_define_singleton_method(rb_cPlatform, "set_flag_as_str!", (VALUE(*)(...))&rb_platform_set_flag_as_str, 1);
         
     | 
| 
      
 1675 
     | 
    
         
            +
             
     | 
| 
      
 1676 
     | 
    
         
            +
                    rb_set_end_proc(set_ruby_exiting, Qnil);
         
     | 
| 
      
 1677 
     | 
    
         
            +
             
     | 
| 
      
 1678 
     | 
    
         
            +
                    static pthread_attr_t attr;
         
     | 
| 
      
 1679 
     | 
    
         
            +
                    if (pthread_attr_init(&attr) == 0) {
         
     | 
| 
      
 1680 
     | 
    
         
            +
                        if (pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED) == 0) {
         
     | 
| 
      
 1681 
     | 
    
         
            +
                            thread_attr_p = &attr;
         
     | 
| 
      
 1682 
     | 
    
         
            +
                        }
         
     | 
| 
      
 1683 
     | 
    
         
            +
                    }
         
     | 
| 
       1605 
1684 
     | 
    
         
             
                }
         
     | 
| 
       1606 
1685 
     | 
    
         
             
            }
         
     | 
    
        data/lib/mini_racer.rb
    CHANGED
    
    | 
         @@ -145,6 +145,15 @@ module MiniRacer 
     | 
|
| 
       145 
145 
     | 
    
         
             
                  end
         
     | 
| 
       146 
146 
     | 
    
         
             
                  # false signals it should be fetched if requested
         
     | 
| 
       147 
147 
     | 
    
         
             
                  @isolate = options[:isolate] || false
         
     | 
| 
      
 148 
     | 
    
         
            +
             
     | 
| 
      
 149 
     | 
    
         
            +
                  @ensure_gc_after_idle = options[:ensure_gc_after_idle]
         
     | 
| 
      
 150 
     | 
    
         
            +
             
     | 
| 
      
 151 
     | 
    
         
            +
                  if @ensure_gc_after_idle
         
     | 
| 
      
 152 
     | 
    
         
            +
                    @last_eval = nil
         
     | 
| 
      
 153 
     | 
    
         
            +
                    @ensure_gc_thread = nil
         
     | 
| 
      
 154 
     | 
    
         
            +
                    @ensure_gc_mutex = Mutex.new
         
     | 
| 
      
 155 
     | 
    
         
            +
                  end
         
     | 
| 
      
 156 
     | 
    
         
            +
             
     | 
| 
       148 
157 
     | 
    
         
             
                  @disposed = false
         
     | 
| 
       149 
158 
     | 
    
         | 
| 
       150 
159 
     | 
    
         
             
                  @callback_mutex = Mutex.new
         
     | 
| 
         @@ -203,6 +212,7 @@ module MiniRacer 
     | 
|
| 
       203 
212 
     | 
    
         
             
                  end
         
     | 
| 
       204 
213 
     | 
    
         
             
                ensure
         
     | 
| 
       205 
214 
     | 
    
         
             
                  @eval_thread = nil
         
     | 
| 
      
 215 
     | 
    
         
            +
                  ensure_gc_thread if @ensure_gc_after_idle
         
     | 
| 
       206 
216 
     | 
    
         
             
                end
         
     | 
| 
       207 
217 
     | 
    
         | 
| 
       208 
218 
     | 
    
         
             
                def call(function_name, *arguments)
         
     | 
| 
         @@ -216,15 +226,17 @@ module MiniRacer 
     | 
|
| 
       216 
226 
     | 
    
         
             
                  end
         
     | 
| 
       217 
227 
     | 
    
         
             
                ensure
         
     | 
| 
       218 
228 
     | 
    
         
             
                  @eval_thread = nil
         
     | 
| 
      
 229 
     | 
    
         
            +
                  ensure_gc_thread if @ensure_gc_after_idle
         
     | 
| 
       219 
230 
     | 
    
         
             
                end
         
     | 
| 
       220 
231 
     | 
    
         | 
| 
       221 
232 
     | 
    
         
             
                def dispose
         
     | 
| 
       222 
233 
     | 
    
         
             
                  return if @disposed
         
     | 
| 
       223 
234 
     | 
    
         
             
                  isolate_mutex.synchronize do
         
     | 
| 
      
 235 
     | 
    
         
            +
                    return if @disposed
         
     | 
| 
       224 
236 
     | 
    
         
             
                    dispose_unsafe
         
     | 
| 
      
 237 
     | 
    
         
            +
                    @disposed = true
         
     | 
| 
      
 238 
     | 
    
         
            +
                    @isolate = nil # allow it to be garbage collected, if set
         
     | 
| 
       225 
239 
     | 
    
         
             
                  end
         
     | 
| 
       226 
     | 
    
         
            -
                  @disposed = true
         
     | 
| 
       227 
     | 
    
         
            -
                  @isolate = nil # allow it to be garbage collected, if set
         
     | 
| 
       228 
240 
     | 
    
         
             
                end
         
     | 
| 
       229 
241 
     | 
    
         | 
| 
       230 
242 
     | 
    
         | 
| 
         @@ -273,6 +285,36 @@ module MiniRacer 
     | 
|
| 
       273 
285 
     | 
    
         | 
| 
       274 
286 
     | 
    
         
             
              private
         
     | 
| 
       275 
287 
     | 
    
         | 
| 
      
 288 
     | 
    
         
            +
                def ensure_gc_thread
         
     | 
| 
      
 289 
     | 
    
         
            +
                  @last_eval = Process.clock_gettime(Process::CLOCK_MONOTONIC)
         
     | 
| 
      
 290 
     | 
    
         
            +
                  @ensure_gc_mutex.synchronize do
         
     | 
| 
      
 291 
     | 
    
         
            +
                    @ensure_gc_thread = nil if !@ensure_gc_thread&.alive?
         
     | 
| 
      
 292 
     | 
    
         
            +
                    @ensure_gc_thread ||= Thread.new do
         
     | 
| 
      
 293 
     | 
    
         
            +
                      done = false
         
     | 
| 
      
 294 
     | 
    
         
            +
                      while !done
         
     | 
| 
      
 295 
     | 
    
         
            +
                        now = Process.clock_gettime(Process::CLOCK_MONOTONIC)
         
     | 
| 
      
 296 
     | 
    
         
            +
             
     | 
| 
      
 297 
     | 
    
         
            +
                        if @disposed
         
     | 
| 
      
 298 
     | 
    
         
            +
                          @ensure_gc_thread = nil
         
     | 
| 
      
 299 
     | 
    
         
            +
                          break
         
     | 
| 
      
 300 
     | 
    
         
            +
                        end
         
     | 
| 
      
 301 
     | 
    
         
            +
             
     | 
| 
      
 302 
     | 
    
         
            +
                        if @ensure_gc_after_idle < now - @last_eval
         
     | 
| 
      
 303 
     | 
    
         
            +
                          @ensure_gc_mutex.synchronize do
         
     | 
| 
      
 304 
     | 
    
         
            +
                            isolate_mutex.synchronize do
         
     | 
| 
      
 305 
     | 
    
         
            +
                              # extra 50ms to make sure that we really have enough time
         
     | 
| 
      
 306 
     | 
    
         
            +
                              isolate.low_memory_notification if !@disposed
         
     | 
| 
      
 307 
     | 
    
         
            +
                              @ensure_gc_thread = nil
         
     | 
| 
      
 308 
     | 
    
         
            +
                              done = true
         
     | 
| 
      
 309 
     | 
    
         
            +
                            end
         
     | 
| 
      
 310 
     | 
    
         
            +
                          end
         
     | 
| 
      
 311 
     | 
    
         
            +
                        end
         
     | 
| 
      
 312 
     | 
    
         
            +
                        sleep @ensure_gc_after_idle if !done
         
     | 
| 
      
 313 
     | 
    
         
            +
                      end
         
     | 
| 
      
 314 
     | 
    
         
            +
                    end
         
     | 
| 
      
 315 
     | 
    
         
            +
                  end
         
     | 
| 
      
 316 
     | 
    
         
            +
                end
         
     | 
| 
      
 317 
     | 
    
         
            +
             
     | 
| 
       276 
318 
     | 
    
         
             
                def stop_attached
         
     | 
| 
       277 
319 
     | 
    
         
             
                  @callback_mutex.synchronize{
         
     | 
| 
       278 
320 
     | 
    
         
             
                    if @callback_running
         
     | 
| 
         @@ -313,9 +355,15 @@ module MiniRacer 
     | 
|
| 
       313 
355 
     | 
    
         | 
| 
       314 
356 
     | 
    
         
             
                  # ensure we do not leak a thread in state
         
     | 
| 
       315 
357 
     | 
    
         
             
                  t.join
         
     | 
| 
      
 358 
     | 
    
         
            +
                  t = nil
         
     | 
| 
       316 
359 
     | 
    
         | 
| 
       317 
360 
     | 
    
         
             
                  rval
         
     | 
| 
       318 
361 
     | 
    
         
             
                ensure
         
     | 
| 
      
 362 
     | 
    
         
            +
                  # exceptions need to be handled
         
     | 
| 
      
 363 
     | 
    
         
            +
                  if t && wp
         
     | 
| 
      
 364 
     | 
    
         
            +
                    wp.write("done")
         
     | 
| 
      
 365 
     | 
    
         
            +
                    t.join
         
     | 
| 
      
 366 
     | 
    
         
            +
                  end
         
     | 
| 
       319 
367 
     | 
    
         
             
                  wp.close if wp
         
     | 
| 
       320 
368 
     | 
    
         
             
                  rp.close if rp
         
     | 
| 
       321 
369 
     | 
    
         
             
                end
         
     | 
    
        data/lib/mini_racer/version.rb
    CHANGED
    
    
    
        data/mini_racer.gemspec
    CHANGED
    
    | 
         @@ -14,18 +14,24 @@ Gem::Specification.new do |spec| 
     | 
|
| 
       14 
14 
     | 
    
         
             
              spec.homepage      = "https://github.com/discourse/mini_racer"
         
     | 
| 
       15 
15 
     | 
    
         
             
              spec.license       = "MIT"
         
     | 
| 
       16 
16 
     | 
    
         | 
| 
      
 17 
     | 
    
         
            +
              spec.metadata      = {
         
     | 
| 
      
 18 
     | 
    
         
            +
                "bug_tracker_uri"   => "https://github.com/discourse/mini_racer/issues",
         
     | 
| 
      
 19 
     | 
    
         
            +
                "changelog_uri"     => "https://github.com/discourse/mini_racer/blob/v#{spec.version}/CHANGELOG",
         
     | 
| 
      
 20 
     | 
    
         
            +
                "documentation_uri" => "https://www.rubydoc.info/gems/mini_racer/#{spec.version}",
         
     | 
| 
      
 21 
     | 
    
         
            +
                "source_code_uri"   => "https://github.com/discourse/mini_racer/tree/v#{spec.version}",
         
     | 
| 
      
 22 
     | 
    
         
            +
              }
         
     | 
| 
       17 
23 
     | 
    
         | 
| 
       18 
24 
     | 
    
         
             
              spec.files         = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(benchmark|test|spec|features|examples)/}) }
         
     | 
| 
       19 
25 
     | 
    
         
             
              spec.bindir        = "exe"
         
     | 
| 
       20 
26 
     | 
    
         
             
              spec.executables   = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
         
     | 
| 
       21 
27 
     | 
    
         
             
              spec.require_paths = ["lib"]
         
     | 
| 
       22 
28 
     | 
    
         | 
| 
       23 
     | 
    
         
            -
              spec.add_development_dependency "bundler" 
     | 
| 
       24 
     | 
    
         
            -
              spec.add_development_dependency "rake", " 
     | 
| 
      
 29 
     | 
    
         
            +
              spec.add_development_dependency "bundler"
         
     | 
| 
      
 30 
     | 
    
         
            +
              spec.add_development_dependency "rake", ">= 12.3.3"
         
     | 
| 
       25 
31 
     | 
    
         
             
              spec.add_development_dependency "minitest", "~> 5.0"
         
     | 
| 
       26 
32 
     | 
    
         
             
              spec.add_development_dependency "rake-compiler"
         
     | 
| 
       27 
33 
     | 
    
         | 
| 
       28 
     | 
    
         
            -
              spec.add_dependency 'libv8', ' 
     | 
| 
      
 34 
     | 
    
         
            +
              spec.add_dependency 'libv8', '> 7.3'
         
     | 
| 
       29 
35 
     | 
    
         
             
              spec.require_paths = ["lib", "ext"]
         
     | 
| 
       30 
36 
     | 
    
         | 
| 
       31 
37 
     | 
    
         
             
              spec.extensions = ["ext/mini_racer_extension/extconf.rb"]
         
     | 
    
        metadata
    CHANGED
    
    | 
         @@ -1,43 +1,43 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            --- !ruby/object:Gem::Specification
         
     | 
| 
       2 
2 
     | 
    
         
             
            name: mini_racer
         
     | 
| 
       3 
3 
     | 
    
         
             
            version: !ruby/object:Gem::Version
         
     | 
| 
       4 
     | 
    
         
            -
              version: 0.2. 
     | 
| 
      
 4 
     | 
    
         
            +
              version: 0.2.12
         
     | 
| 
       5 
5 
     | 
    
         
             
            platform: ruby
         
     | 
| 
       6 
6 
     | 
    
         
             
            authors:
         
     | 
| 
       7 
7 
     | 
    
         
             
            - Sam Saffron
         
     | 
| 
       8 
8 
     | 
    
         
             
            autorequire: 
         
     | 
| 
       9 
9 
     | 
    
         
             
            bindir: exe
         
     | 
| 
       10 
10 
     | 
    
         
             
            cert_chain: []
         
     | 
| 
       11 
     | 
    
         
            -
            date:  
     | 
| 
      
 11 
     | 
    
         
            +
            date: 2020-05-15 00:00:00.000000000 Z
         
     | 
| 
       12 
12 
     | 
    
         
             
            dependencies:
         
     | 
| 
       13 
13 
     | 
    
         
             
            - !ruby/object:Gem::Dependency
         
     | 
| 
       14 
14 
     | 
    
         
             
              name: bundler
         
     | 
| 
       15 
15 
     | 
    
         
             
              requirement: !ruby/object:Gem::Requirement
         
     | 
| 
       16 
16 
     | 
    
         
             
                requirements:
         
     | 
| 
       17 
     | 
    
         
            -
                - - " 
     | 
| 
      
 17 
     | 
    
         
            +
                - - ">="
         
     | 
| 
       18 
18 
     | 
    
         
             
                  - !ruby/object:Gem::Version
         
     | 
| 
       19 
     | 
    
         
            -
                    version: ' 
     | 
| 
      
 19 
     | 
    
         
            +
                    version: '0'
         
     | 
| 
       20 
20 
     | 
    
         
             
              type: :development
         
     | 
| 
       21 
21 
     | 
    
         
             
              prerelease: false
         
     | 
| 
       22 
22 
     | 
    
         
             
              version_requirements: !ruby/object:Gem::Requirement
         
     | 
| 
       23 
23 
     | 
    
         
             
                requirements:
         
     | 
| 
       24 
     | 
    
         
            -
                - - " 
     | 
| 
      
 24 
     | 
    
         
            +
                - - ">="
         
     | 
| 
       25 
25 
     | 
    
         
             
                  - !ruby/object:Gem::Version
         
     | 
| 
       26 
     | 
    
         
            -
                    version: ' 
     | 
| 
      
 26 
     | 
    
         
            +
                    version: '0'
         
     | 
| 
       27 
27 
     | 
    
         
             
            - !ruby/object:Gem::Dependency
         
     | 
| 
       28 
28 
     | 
    
         
             
              name: rake
         
     | 
| 
       29 
29 
     | 
    
         
             
              requirement: !ruby/object:Gem::Requirement
         
     | 
| 
       30 
30 
     | 
    
         
             
                requirements:
         
     | 
| 
       31 
     | 
    
         
            -
                - - " 
     | 
| 
      
 31 
     | 
    
         
            +
                - - ">="
         
     | 
| 
       32 
32 
     | 
    
         
             
                  - !ruby/object:Gem::Version
         
     | 
| 
       33 
     | 
    
         
            -
                    version:  
     | 
| 
      
 33 
     | 
    
         
            +
                    version: 12.3.3
         
     | 
| 
       34 
34 
     | 
    
         
             
              type: :development
         
     | 
| 
       35 
35 
     | 
    
         
             
              prerelease: false
         
     | 
| 
       36 
36 
     | 
    
         
             
              version_requirements: !ruby/object:Gem::Requirement
         
     | 
| 
       37 
37 
     | 
    
         
             
                requirements:
         
     | 
| 
       38 
     | 
    
         
            -
                - - " 
     | 
| 
      
 38 
     | 
    
         
            +
                - - ">="
         
     | 
| 
       39 
39 
     | 
    
         
             
                  - !ruby/object:Gem::Version
         
     | 
| 
       40 
     | 
    
         
            -
                    version:  
     | 
| 
      
 40 
     | 
    
         
            +
                    version: 12.3.3
         
     | 
| 
       41 
41 
     | 
    
         
             
            - !ruby/object:Gem::Dependency
         
     | 
| 
       42 
42 
     | 
    
         
             
              name: minitest
         
     | 
| 
       43 
43 
     | 
    
         
             
              requirement: !ruby/object:Gem::Requirement
         
     | 
| 
         @@ -70,16 +70,16 @@ dependencies: 
     | 
|
| 
       70 
70 
     | 
    
         
             
              name: libv8
         
     | 
| 
       71 
71 
     | 
    
         
             
              requirement: !ruby/object:Gem::Requirement
         
     | 
| 
       72 
72 
     | 
    
         
             
                requirements:
         
     | 
| 
       73 
     | 
    
         
            -
                - - " 
     | 
| 
      
 73 
     | 
    
         
            +
                - - ">"
         
     | 
| 
       74 
74 
     | 
    
         
             
                  - !ruby/object:Gem::Version
         
     | 
| 
       75 
     | 
    
         
            -
                    version:  
     | 
| 
      
 75 
     | 
    
         
            +
                    version: '7.3'
         
     | 
| 
       76 
76 
     | 
    
         
             
              type: :runtime
         
     | 
| 
       77 
77 
     | 
    
         
             
              prerelease: false
         
     | 
| 
       78 
78 
     | 
    
         
             
              version_requirements: !ruby/object:Gem::Requirement
         
     | 
| 
       79 
79 
     | 
    
         
             
                requirements:
         
     | 
| 
       80 
     | 
    
         
            -
                - - " 
     | 
| 
      
 80 
     | 
    
         
            +
                - - ">"
         
     | 
| 
       81 
81 
     | 
    
         
             
                  - !ruby/object:Gem::Version
         
     | 
| 
       82 
     | 
    
         
            -
                    version:  
     | 
| 
      
 82 
     | 
    
         
            +
                    version: '7.3'
         
     | 
| 
       83 
83 
     | 
    
         
             
            description: Minimal embedded v8 engine for Ruby
         
     | 
| 
       84 
84 
     | 
    
         
             
            email:
         
     | 
| 
       85 
85 
     | 
    
         
             
            - sam.saffron@gmail.com
         
     | 
| 
         @@ -106,7 +106,11 @@ files: 
     | 
|
| 
       106 
106 
     | 
    
         
             
            homepage: https://github.com/discourse/mini_racer
         
     | 
| 
       107 
107 
     | 
    
         
             
            licenses:
         
     | 
| 
       108 
108 
     | 
    
         
             
            - MIT
         
     | 
| 
       109 
     | 
    
         
            -
            metadata: 
     | 
| 
      
 109 
     | 
    
         
            +
            metadata:
         
     | 
| 
      
 110 
     | 
    
         
            +
              bug_tracker_uri: https://github.com/discourse/mini_racer/issues
         
     | 
| 
      
 111 
     | 
    
         
            +
              changelog_uri: https://github.com/discourse/mini_racer/blob/v0.2.12/CHANGELOG
         
     | 
| 
      
 112 
     | 
    
         
            +
              documentation_uri: https://www.rubydoc.info/gems/mini_racer/0.2.12
         
     | 
| 
      
 113 
     | 
    
         
            +
              source_code_uri: https://github.com/discourse/mini_racer/tree/v0.2.12
         
     | 
| 
       110 
114 
     | 
    
         
             
            post_install_message: 
         
     | 
| 
       111 
115 
     | 
    
         
             
            rdoc_options: []
         
     | 
| 
       112 
116 
     | 
    
         
             
            require_paths:
         
     |