Revision: 4419 http://trac.macosforge.org/projects/ruby/changeset/4419 Author: lsansonetti@apple.com Date: 2010-08-10 17:55:41 -0700 (Tue, 10 Aug 2010) Log Message: ----------- don't crash in case rb_vm_keep_vars is called with no variables Modified Paths: -------------- MacRuby/trunk/compiler.cpp MacRuby/trunk/vm.cpp Modified: MacRuby/trunk/compiler.cpp =================================================================== --- MacRuby/trunk/compiler.cpp 2010-08-11 00:30:14 UTC (rev 4418) +++ MacRuby/trunk/compiler.cpp 2010-08-11 00:55:41 UTC (rev 4419) @@ -2488,7 +2488,8 @@ bb = notNullBB; - // params must be filled each time because in AOT mode it contains instructions + // params must be filled each time because in AOT mode it contains + // instructions std::vector<Value *> params; params.push_back(new LoadInst(current_var_uses, "", bb)); params.push_back(NULL); Modified: MacRuby/trunk/vm.cpp =================================================================== --- MacRuby/trunk/vm.cpp 2010-08-11 00:30:14 UTC (rev 4418) +++ MacRuby/trunk/vm.cpp 2010-08-11 00:55:41 UTC (rev 4419) @@ -2989,23 +2989,26 @@ { rb_vm_var_uses *current = uses; - if ((current == NULL) || (current->uses_count == 0)) { + if (current == NULL || current->uses_count == 0) { // there's no use alive so nothing to do return; } - rb_vm_kept_local *locals = (rb_vm_kept_local *)xmalloc( - sizeof(rb_vm_kept_local)*lvars_size); + rb_vm_kept_local *locals = NULL; + if (lvars_size > 0) { + locals = (rb_vm_kept_local *)xmalloc(sizeof(rb_vm_kept_local) + * lvars_size); - va_list ar; - va_start(ar, lvars_size); - for (int i = 0; i < lvars_size; ++i) { - locals[i].name = va_arg(ar, ID); - locals[i].stack_address = va_arg(ar, VALUE *); - GC_WB(&locals[i].new_address, (VALUE *)xmalloc(sizeof(VALUE))); - GC_WB(locals[i].new_address, *locals[i].stack_address); + va_list ar; + va_start(ar, lvars_size); + for (int i = 0; i < lvars_size; ++i) { + locals[i].name = va_arg(ar, ID); + locals[i].stack_address = va_arg(ar, VALUE *); + GC_WB(&locals[i].new_address, (VALUE *)xmalloc(sizeof(VALUE))); + GC_WB(locals[i].new_address, *locals[i].stack_address); + } + va_end(ar); } - va_end(ar); while (current != NULL) { for (int use_index = 0; use_index < current->uses_count; ++use_index) {
participants (1)
-
source_changes@macosforge.org