improved memlimit test case and max_memory type handling

This commit is contained in:
gubester 2017-09-26 09:46:45 -07:00
parent b7b727bbb9
commit d8ad7e9178
3 changed files with 15 additions and 9 deletions

View File

@ -53,7 +53,7 @@ typedef struct {
Local<String>* 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;

View File

@ -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

View File

@ -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