When we create a new Thread object, it is allocated with a the initializion lock locked. This means that any other method can needs to grab this lock has to wait for the thread to be actually started. If a method such as getting a backtrace of the thread is called before the thread is scheduled to be started, it can deadlock because it can't grab the lock and if there is simultanous GC triggered.
The --libdir option is retained for specifying where to put the Rubinius shared library. We don't build a shared or static library yet but we will when we have an embedding API. The --appdir option specifies where the application runtime and library files will be installed. The use of --libdir for this was misleading.
This fixes the problem on OS X where opening an agent console would just hang. Related to #1933.
We have to work around a bug in LLVM here which makes smul.with.overflow not work correctly. It will not properly detect overflows if we use the i63 / i31 integer types as described here: http://llvm.org/bugs/show_bug.cgi?id=13991 We work around it by do multiplication with overflow detection for i64 and i32 which does work and manually do a bounds check for Fixnum::MIN and Fixnum::MAX.
float_compare and fixnum_compare are actually the comparators for the Float#<=> and Fixnum#<=> behavior, so this name makes it less ambiguous what these wrappers are for.
This way we ensure that the destructor for OnStack is executed, even when we encounter an exception. We use setjmp / longjmp in the C-API but that means we can't depend on RAII behavior here. By moving this into a separate block we make sure the destructor part of RAII runs before we do the longjmp.
When we use OnStack, we might mark a location that holds the return value of a call. This return value can be NULL to indicate an exception so if we see a NULL here, that is a valid value and we just shouldn't do anything with it. Before this would cause a segmentation fault because we would deference a NULL pointer.
These are initialized with cUndef. We already guard the cases for adding them so we don't add cUndef, so we should also guard this case when trying to remove it.