LINUX.ORG.RU

[SBCL][FFI][CL-GTK2][Мэджик] непредсказуемое поведение FFI

 ,


0

1

В процессе написания биндингов к gtksourceview столкнулся со странной проблемой.

Загрузим в SBCL кусок кода:


(in-package :gtk)
(load-foreign-library "libgtksourceview-2.0.so")

(define-g-object-class "GtkSourceLanguageManager" source-language-manager
                       (:export t :interfaces
                        ())
			())

(defcfun gtk-source-language-manager-get-language-ids
	:pointer
	(language-manager (g-object source-language-manager)))

(defun get-language-list (language-manager)
	(let ((pointer (gtk-source-language-manager-get-language-ids language-manager)))
	(loop with i = 0
	      until (null-pointer-p (mem-aref pointer :pointer i))
	      collect (mem-aref pointer :string i)
	      do (incf i))))

теперь можно заметить, что код

(setq *lm* (make-instance 'source-language-manager))
(get-language-list *lm*)
работает нормально, а вот это - нет:
(make-instance 'source-language-manager)
(get-language-list *)
- нет:
* (make-instance 'source-language-manager)

(<unknown>:4278): GLib-GObject-CRITICAL **: g_object_newv: assertion `G_TYPE_IS_OBJECT (object_type)' failed

(<unknown>:4278): GLib-GObject-CRITICAL **: g_object_add_toggle_ref: assertion `G_IS_OBJECT (object)' failed

(<unknown>:4278): GLib-GObject-CRITICAL **: g_object_unref: assertion `G_IS_OBJECT (object)' failed

#<SOURCE-LANGUAGE-MANAGER {C587AB9}>
* (get-language-list *)

(<unknown>:4278): GtkSourceView-CRITICAL **: gtk_source_language_manager_get_language_ids: assertion `GTK_IS_SOURCE_LANGUAGE_MANAGER (lm)' failed
CORRUPTION WARNING in SBCL pid 4278(tid 3085097760):
Memory fault at 0 (pc=0xc52a6f5, sp=0xb7985ba8)
The integrity of this image is possibly compromised.
Continuing with fingers crossed.

debugger invoked on a SB-SYS:MEMORY-FAULT-ERROR in thread #<THREAD "initial thread" RUNNING {BECF659}>:
  Unhandled memory fault at #x0.

Type HELP for debugger help, or (SB-EXT:QUIT) to exit from SBCL.

restarts (invokable by number or by possibly-abbreviated name):
  0: [ABORT] Exit debugger, returning to top level.

(SB-SYS:MEMORY-FAULT-ERROR)
0]
Хотя, на первый взгляд, это и не мешает использованию таких биндингов, это вызывает у меня справедливое беспокойство. В чем может быть дело? Подозреваю memory corruption где-то в ffi. Прошу лисперов помочь мне.

★★★

> (make-instance 'source-language-manager)

Может его сразу сборщик мусора и подобрал?

yoghurt ★★★★★
()

Это все потому что ты отступы правильные не делаешь.

anonymous
()

А дело все вот в этом:

(<unknown>:4278): GLib-GObject-CRITICAL **: g_object_newv: assertion `G_TYPE_IS_OBJECT (object_type)' failed
Это говорит о том, что в g_object_newv передан не тип создаваемого объекта, а фигня.

Вероятно, где-то до этого раньше была ошибка:

WARNING: GType GtkSourceLanguageManager is not known to GObject

Я в джаббере вам описывал эту проблему - до тех пор, пока gtk_source_language_manager_get_type не будет вызван, соответствующий класс в GObject не будет зарегистрирован. Решение состоит в том, чтобы добавить в описание класса опцию :type-initializer.

dmitry_vk ★★★
()

И еще: общение насчет лиспа следует вести на специализированном, предназначенном для этого ресурсе - http://lisper.ru/. Вероятность получить ответ там больше.

dmitry_vk ★★★
()
Ответ на: комментарий от Minoru

>Да, работает.

Работает, потому что «за кулисами» кто-то когда-то вызывает gtk_source_language_manager_get_type. Созданные до этого момента экземпляры будут сломанными, а созданные после этого момента - нормальными объектами.

dmitry_vk ★★★
()
Ответ на: комментарий от dmitry_vk

Type-initializer там был, но к тому времени, как я запостил код на лор, уже успел убрать.

Minoru ★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.