Here are the release notes for MacRuby 0.9! An e-mail announcing the release will be following. Highlights: - Lots of stability fixes (crashers, memory leaks and race conditions), and a few performance improvements. - The internal representation of Strings changed from a dual binary / UTF-16 model to a pure binary one, principally to avoid problems in multithreaded applications. Performance should remain the same in most cases. - The macruby_deploy program has been enhanced to embed RubyGems (with dependencies) and BridgeSupport files. See the new respective --gem and --bs options. - The libmacruby-static.a library is not built by default anymore, because static compilation is still a work in progress. - Upgraded to RubyGems 1.4.2. Changes: - Fix a bug in IO.open() where numeric file descriptors could not be passed as the first argument. - Fix an assertion that could happen when calling #methods & friends on a class that contains a method name larger than 100 characters. - Fix a bug in IO.open() where the given path would not be handled as a path (calling #to_path if necessary). - Fix a bug in the YAML extension where yajl_free() would be called on a NULL pointer. - Fix a bug in the OpenSSL extension, when calling ossl_pkey_sign(). - Fix a bug where calling a method defined with #define_method with a block accepting a splat argument (arity -2) would crash. - Fix Ruby warnings in the YAML extension. - Fix a bug when some splat methods defined with #define_method() would segfault at dispatch time. - Improve the internal rb_eql() routine for performance, makes faster hash lookup / keys comparison operations. - Improve the hashing function for Arrays. - Move the conformsToProtocol: and performSelector: default logic on direct pure-Ruby subclasses. - Fix a bug in IO#close_write where IOError would not be thrown if the stream was readable and non-duplex. - Fix a bug in IO#write where an exception would be raised if the stream was read-only when writing 0 bytes of data. - Fix a bug in Kernel.require where a file path starting with '~' would not be loaded. - Fix a bug in String#gsub! where we would segfault during string concatenation. - Fix a bug in the compilation of scopes where the current_block_arg state variable wouldn't be re-entrant (this fixes the compilation of the mechanize library). - Fix bugs in String#inspect when called on a string that contains invalid and non-BMP characters. - Fix a potential memory crasher in String#sub and String#gsub where free'd memory would be reused. - Fix a bug where $FILENAME, $* and $-W could be changed. - Fix a bunch of bugs in Array methods where SecurityError would not be raised when $SAFE is 4. - Fix a bug in Kernel#untrust where an exception would not be raised on a frozen object. - Fix a bug in Kernel#trust where an exception would not be raised on a frozen object. - Fix a bug in Kernel#trust where an exception would not be raised if $SAFE is equal or greater than 3. - Fix a crash in Rational#rationalize due to registering the method with a wrong arity. - Fix a bug when we would free outer memory but still keep outers pointing to that memory location, causing crashes later during const lookup (this fixes rspec). - Fix a bug in Struct#hash when called on recursive structs. - Fix a bug in Array#== when called with recursive arrays. - Fix a bug in StringIO#puts when called with recursive arrays. - Fix a bug in Exception#== when an infinite loop would be entered when comparing exceptions from different classes. - Fix a bug when #initialize_copy would not raise an exception when called on Object or BasicObject. - Add support for encodings ISO8859_{2..16}. - Fix a bug in String#search_codepoint where breaks were ignored. - Fix a bug in OpenSSL::BN#to_s. - Fix a bug in OpenSSL::PKey::DH#compute_key. - Fix a bug in OpenSSL::X509::Attribute#to_der. - Fix a bug in OpenSSL::PKCS5.pbkdf2_hmac(_sha1). - Fix a bug in OpenSSL::PKey::DSA#syssign. - Fix a bug in OpenSSL's ossl_x509store_initialize() function where an internal value would not properly be initialized. - Fix a bunch of bugs in Array methods where an exception would not be raised when passing very large indexes or ranges. - Fix a bug in Array#inspect where an untrusted string would not be returned. - Fix a bug in String#unpack when called with a block. - Add support for variadic objc method dispatch in the parser. - Fix a bug in Socket.pair where the sockets would not be yielded when passing a block. - Fix a bug in Socket.pair(domain, type, protocol) and Socket.new(domain, type, protocol) where protocol would not be an optional argument. - Fix a bug in Socket.getservbyport(port) where a port outside the uint16 range would be accepted. - Fix a bug in Socket.getservbyport where the network byte order value would not be passed to the underlying API. - Fix a memory leak and potential crasher in Regexp's internal rb_reg_matcher_new() function. - Fix various memory leaks and potential crashers in code paths that require binary -> UTF-16 conversions. - Fix a bug in OpenSSL::BN#prime?. - Add the #size class method on BridgeSupport struct classes. Example, NSRect#size returns the same as sizeof(NSRect) in C. - Fix a bug in OpenSSL::SSL::SSLSocket#cert. - Fix -[MacRuby evaluateFileAtPath:] to behave like #require, so that it can also handle .rbo or .bundle files. - Fix a bug when sending KVO notifications on immediate objects would cause a crash. - Cleaned out all public header files. - Fix a bug in Sandbox.new where passing a non-String object would cause a crash. - Add rb_str_plus() CRuby API. - Fix a bug in {Thread,ThreadGroup,Mutex}#alloc where we would not return objects from the current class (could be a subclass). - Fix a bug in Kernel#public_method where an exception would not be raised when called without public methods. - Fix bugs in Module#{remove_method,undef_method,public} to honor untrusted state. - Add Pointer.magic_cookie to create pointers with arbitrary values (must fit in a long). Example: Pointer.magic_cookie(42). - Fix a bug in Module#method_defined? where false would not be returned was passed the name of private method. - Fix the compilation of C blocks to not use a global variable to store/load the Proc object to call, but instead retrieve a reference to it from the block literal argument. This fixes nested C blocks. - Fix a bug in Kernel#<=> will 0 would not be returned when receiver's == return true. - Fix a bug in Module#public_method_defined? where true would not be returned when was passed name/symbol of public method. - Fix a bug in Array#pack with format "fFeEdDgG" to raise a TypeError when does not convert into float. - Fix bugs in #sprintf when passing the following formats: "%# x", "%010.4f", "%010.4u". - Fix a bug in String#unpack with format 'Q' to add add nil for each element requested beyond the end of the String. - Fix a bug in String#scan to return an Array object with each element tainted or untrusted when #scan returns nested arrays. - Fix a bug in Array#[]= to check frozen state before attempting to coerce arguments. - Fix a bug in String#initialize to raise a RuntimeError if self is frozen. - Fix a bunch of bugs detected by clang's link time optimization (LTO). - Fix a bug in -[NSArray ==:] and -[NSDictionary ==:] where a crash would occur if passed a Ruby immediate type. - Fix bugs in String#each_char and String#ord to now raise an exception if the String contain invalid characters. - Fix a bug in String#ord to return the byte value even if a it's not an ASCII character. - Fix a bug in the dispatcher where free'd memory would be accessed. - Fix a bug in #at_exit when the process would abort if a block raised an exception. - Fix a bug in Array#delete where we would check if the receiver can be modified *after* modifying it. - Fix a bug in Mutex and ThreadGroup where modifying internal array structures under SAFE level of 4 would raise an exception. - Fix a problem in #load: instead of crashing if we cannot locate the entry point of a .rbo file, raise an exception with a message explaining the most common problem cause instead. - Fix a bug in the compilation of the 'next' expression which would not honor ensure blocks. - Add support for #define_method when passing Method. - Fix a bug in StringScanner on multiline strings. - Fix a bug in macirb where a syntax error would exit the program. - Improve the performance of #pack with most flags by pre-allocating the result bytestring, to avoid too-much frequent memory reallocations. - Fix a 32-bit precision bug when converting Time objects to NSDate objects. - Allow Float objects to be trusted/untrusted and tainted/untainted. - Fix the default value of BasicSocket.do_not_reverse_lookup to be true. - Fix a bug in Thread.kill when passing a non-Thread object would cause a crash. - Fix calls to -[NSString fileSystemRepresentation] to catch potential exceptions. - Fix a bug in macruby_deploy with --embed where the main application's executable's link path would not be updated. - Fix a bug in macruby_deploy with --embed to now delete the Current symlink as it seems to cause the AppStore validation process to fail. - Add the Errno.code method to return the current errno value. - Fix a race condition bug when generating internal class names where concurrent access would cause runtime problems. - Add missing CRuby API rb_thread_blocking_region(). - Fix a race condition bug when spawning a new VM instance and copying the current VM dispatch cache. - Fix a memory leak when resolving JIT methods. - Fix a race condition bug when dispatching and resolving a method at the same time. - Fix lexical const lookup bugs inside modules defined using the :: notation. - Fix const lookup calls to include necessary DWARF metadata, in order for #const_missing calls to appear in backtraces later at runtime. - Change the framework's bundle identifier to use macruby.org instead of apple.com. Tickets closed: #1155 Embed BridgeSupport Files #1067 Segfault occurs when calls Struct#hash with recursive structs. #1116 Yet another String performance issue #1122 Inspection of NSArray stops at unicode char #1134 The new code for next/ensure does not work properly #1133 Silly syntax error crashes macirb #1124 string.ord returns 0xFFFF for all characters 0x80 or greater in binary string #1075 rdoc is way too slow as of r5059 #1160 Need ability to access errno from Ruby code #1055 running RSpec with MacRuby 0.9 r5038 and greater causes seg. fault #1070 rspec2 segfaults when I try to run it #1136 Array#pack performance w/ base64 strings #1087 Assertion fails when Array#[]= was specified with very large index. #1143 Dates in 32-bit converted from NSDate are not precise enough #1142 Array#pack performance while converting array of ASCII values to string #1137 macruby_deploy should automate gems embedding #1083 Segfault occurs when calls the String#unpack('i') with block. #1054 Assertion failed. "(arity >= 0), function compile_block_caller" #1040 Dalli test suite crashes #1088 Performance: String#* is very slow. #1039 Bundler fails with TypeError: can't convert Pathname into String #1076 Abort occurs when raise a SecurityError within Thread. #1074 Abort occurs when install the rubygems. #1078 segfault when trying to use macgem to install a gem #1092 Unable to Update MacRuby Gems #1127 Access to freed memory in rb_vm_dispatch #868 Should not get a value until calling Hash#rehash when Object of Hash's key was changed. #1080 Add #size method for C struct classes #1043 Cocoa Binding broken #1045 restclient gem fails when trying to GET #1081 API function for loading RBO files from Objective-C environment #1105 upgrade to rubygems 1.4.2 #1106 #initialize is not called in class which inherit Mutex. #1107 Need to implement rb_str_plus. #1047 Clean up warnings when installing gems #1009 Can't set status of taint and untrust to Float Object. #1132 Reopening a class modifies it #1050 Segfault occurs with Rake::namespace. #766 macrake overrides /usr/bin/rake #1125 case insensitive fs require bug #1109 Installing a gem from disk fails #1051 Segfault occurs with RDoc::Parser::Ruby. #1034 Requiring Mechanize gives segmentation fault #1123 does not process the "ensure" when called the "next". #1112 Allowing pointers to be created and initialised directly with an integer #1121 Assertion failed: (boundaries.start_offset_in_bytes <= offset_in_bytes) #668 Newlines and carriage returns cause erroneous matches in StringScanner #1048 Performance of Hash with an Array as a key #106 Syntax error with Variadic function #1077 Performance of String #1084 Abort occurs when was passed Object of Method to define_method. #1062 Segfault occurs when calls Rational#rationalize with no arguments. #1019 String#gsub performance #1058 Segfault occurs when Array#== handles recursive array. #1060 Segfault occurs when StringIO#puts handles self-recursive array. #1063 Segfault occurs when compare the objects of Exception. #1113 unexpected behaviour with enumerateObjectsUsingBlock #1131 Abort: exception is not caught when open the file which is not existing in at_exit block. #1115 Bundler not working since updating to rubygems 1.4.2 #1128 MacRuby builds broken gems, probably since 1.4.2 update #1072 macgem is broken in trunk #1073 Allocation/free errors popping up when I try to autocomplete in macirb #1150 Segfault occurs with Thread.kill when was passed Object other than Thread. Laurent