Ошибка сегментации на Lion, создающем NSData из RubyCocoa с любыми байтами> 127 - PullRequest
1 голос
/ 21 июля 2011

Следующее RubyCocoa отлично подходит для Max OS X 10.6, но с ошибками 10.7

require 'osx/cocoa'
include OSX
bytes = [128].pack('i1')
NSData.alloc.initWithBytes_length(bytes, bytes.length)

Во всех случаях это работает, когда старший бит не установлен.На самом деле NSData.alloc, похоже, дает сбой при передаче буфера, в котором для любого из байтов установлен верхний бит.

Версия Ruby для обеих ОС - 1.8.7, поэтому я не могу диагностироватьпочему NSData интерпретирует буфер по-разному.Кто-нибудь может пролить свет?

Ответы [ 4 ]

1 голос
/ 03 августа 2011

MacRuby все еще не завершен - он просто не работает с некоторыми кодами ruby, с которыми я работаю. Я столкнулся с той же проблемой NSData и смог создать экземпляр CFData, который выглядит нормально со следующим кодом

gem 'RubyInline'
require 'inline'

class CFDataWrapper
  begin 
    inline do |builder|
      builder.include "<CoreFoundation/CoreFoundation.h>"
      builder.c_raw_singleton "

      static VALUE fromString(int argc, VALUE *args){
        CFDataRef d = CFDataCreate(NULL, RSTRING_PTR(args[0]), RSTRING_LEN(args[0]));    

        VALUE result;
        char type = '@';
        ocdata_to_rbobj(Qnil,&type, (const void *)&d, &result, false) ;
        return result;
      }
    "
    end
  end
end
bytes = [128].pack('i1')
data = CFDataWrapper.fromString(bytes)
puts data.inspect

Вывод inspect отличается от 10.6, но я могу передать его обратно в методы, которые ожидают экземпляры NSData, и они, кажется, работают, вызывают методы NSData для него и т. Д. Помимо этого игрушечного скрипта он работает скрипт, который я использую для заполнения ядра документы данных, где один из объектов имеет двоичный атрибут данных

1 голос
/ 21 июля 2011

Вы, вероятно, должны пойти на MacRuby , поскольку он заменит RubyCocoa.Возможно, что RubyCocoa не работает (и никогда не будет) работать на Lion.

У меня пока нет опыта работы с MacRuby с Lion, но велика вероятность, что он будет работать.

0 голосов
/ 18 сентября 2011

Это исправлено в RubyCocoa 1.0.2

0 голосов
/ 04 августа 2011

Я предполагаю, что проблема на самом деле pack в повреждении памяти, потому что он не обрабатывает подписанное переполнение хорошим способом. Некоторые вещи, которые можно попробовать, могут привести вас к ответу:

  • попробуй pack('C1')
  • Вывести bytes, сравнить с выводом irb.
  • вызывает некоторую другую функцию, которая выделяет память сразу после пакета (вообще не используя bytes).
...