diff --git a/ext/mini_racer_extension/mini_racer_extension.cc b/ext/mini_racer_extension/mini_racer_extension.cc index c38b7c9..a308f71 100644 --- a/ext/mini_racer_extension/mini_racer_extension.cc +++ b/ext/mini_racer_extension/mini_racer_extension.cc @@ -53,7 +53,7 @@ typedef struct { Local* filename; useconds_t timeout; EvalResult* result; - long max_memory; + size_t max_memory; } EvalParams; enum IsolateFlags { @@ -118,11 +118,11 @@ static void init_v8() { static void gc_callback(Isolate *isolate, GCType type, GCCallbackFlags flags) { if((bool)isolate->GetData(MEM_SOFTLIMIT_REACHED)) return; - long softlimit = *(long*) isolate->GetData(MEM_SOFTLIMIT_VALUE); + size_t softlimit = *(size_t*) isolate->GetData(MEM_SOFTLIMIT_VALUE); HeapStatistics* stats = new HeapStatistics(); isolate->GetHeapStatistics(stats); - long used = stats->used_heap_size(); + size_t used = stats->used_heap_size(); if(used > softlimit) { isolate->SetData(MEM_SOFTLIMIT_REACHED, (void*)true); @@ -582,7 +582,7 @@ static VALUE rb_context_eval_unsafe(VALUE self, VALUE str, VALUE filename) { VALUE mem_softlimit = rb_iv_get(self, "@max_memory"); if (mem_softlimit != Qnil) { - eval_params.max_memory = (long)NUM2LONG(mem_softlimit); + eval_params.max_memory = (size_t)NUM2ULONG(mem_softlimit); } eval_result.message = NULL; diff --git a/lib/mini_racer.rb b/lib/mini_racer.rb index 8be2507..94a5af5 100644 --- a/lib/mini_racer.rb +++ b/lib/mini_racer.rb @@ -148,7 +148,9 @@ module MiniRacer @max_memory = nil @current_exception = nil @timeout = options[:timeout] - @max_memory = options[:max_memory] + if options[:max_memory].is_a?(Numeric) && options[:max_memory] > 0 + @max_memory = options[:max_memory] + end @isolate = options[:isolate] || Isolate.new(options[:snapshot]) @disposed = false diff --git a/test/mini_racer_test.rb b/test/mini_racer_test.rb index fed7b35..53a08a0 100644 --- a/test/mini_racer_test.rb +++ b/test/mini_racer_test.rb @@ -283,11 +283,15 @@ raise FooError, "I like foos" assert_equal("Undefined Conversion", context.eval("test()")) end - def test_fatal_alloc - context = MiniRacer::Context.new(max_memory: 200000000) - context.attach("print", proc{|a| a}) + def test_max_memory + context = MiniRacer::Context.new(max_memory: 200_000_000) - assert_raises(MiniRacer::V8OutOfMemoryError) { context.eval('var a = new Array(10000); while(true) {a = a.concat(new Array(10000)); print("loop " + a.length);}') } + assert_raises(MiniRacer::V8OutOfMemoryError) { context.eval('let s = 1000; var a = new Array(s); a.fill(0); while(true) {s *= 1.1; let n = new Array(Math.floor(s)); n.fill(0); a = a.concat(n); };') } + end + + def test_negative_max_memory + context = MiniRacer::Context.new(max_memory: -200_000_000) + assert_nil(context.instance_variable_get(:@max_memory)) end module Echo