summaryrefslogtreecommitdiffstats
path: root/lib/efl/ecore_getopt.rb
diff options
context:
space:
mode:
authorJérémy Zurcher <jeremy@asynk.ch>2011-04-25 20:38:14 +0200
committerJérémy Zurcher <jeremy@asynk.ch>2011-04-25 20:38:14 +0200
commit80c11812e1e1c3c33158cd25eb0db0dba1ced4e7 (patch)
treeb78958148ae168fa7ea8adbd2a21e96a4adc3178 /lib/efl/ecore_getopt.rb
parent578071f27c8aac182abe2b3627f17e26d01a27fc (diff)
downloadffi-efl-80c11812e1e1c3c33158cd25eb0db0dba1ced4e7.zip
ffi-efl-80c11812e1e1c3c33158cd25eb0db0dba1ced4e7.tar.gz
ecore_getopt : prevent FFI::MemoryPointer.from_string beeing GC'ed
Diffstat (limited to 'lib/efl/ecore_getopt.rb')
-rw-r--r--lib/efl/ecore_getopt.rb22
1 files changed, 16 insertions, 6 deletions
diff --git a/lib/efl/ecore_getopt.rb b/lib/efl/ecore_getopt.rb
index 00de244..10074b5 100644
--- a/lib/efl/ecore_getopt.rb
+++ b/lib/efl/ecore_getopt.rb
@@ -92,6 +92,13 @@ module Efl
@values = [
[ :ptrp, FFI::Pointer::NULL ]
]
+ @refs = [] # to prevent FFI::MemoryPointer.from_string from beeing GC'ed
+ end
+ def p_from_string r
+ return r if r==FFI::Pointer::NULL
+ p = FFI::MemoryPointer.from_string r
+ @refs << p
+ p
end
def << o
@options.insert -2, o
@@ -99,6 +106,9 @@ module Efl
def value type, ptr
@values.insert -2, [ type, ptr ]
end
+ def to_ptr
+ @parser_p.to_ptr
+ end
def create
@parser_p = Efl::API::EcoreGetopt.new FFI::MemoryPointer.new (Efl::API::EcoreGetopt.size+Efl::API::EcoreGetoptDesc.size*@options.length), 1
[:prog,:usage,:version,:copyright,:license,:description].each do |sym|
@@ -108,8 +118,8 @@ module Efl
@options.each_with_index do |o,i|
d = @parser_p.desc_ptr i
d[:shortname] = o[0].ord
- d[:longname] = (o[1]==FFI::Pointer::NULL ? FFI::Pointer::NULL : FFI::MemoryPointer.from_string(o[1]))
- d[:help] = (o[2]==FFI::Pointer::NULL ? FFI::Pointer::NULL : FFI::MemoryPointer.from_string(o[2]))
+ d[:longname] = p_from_string o[1]
+ d[:help] = p_from_string o[2]
d[:metavar] = o[3]
d[:action] = o[4]
k, v = o[5]
@@ -128,7 +138,7 @@ module Efl
st[:arg_req] = v[1]
if not v[2].nil?
if v[2][0]==:strv
- st[:def][:strv] = FFI::MemoryPointer.from_string v[2][1]
+ st[:def][:strv] = p_from_string v[2][1]
else
st[:def][v[2][0]] = v[2][1]
end
@@ -151,7 +161,7 @@ module Efl
def parse argv
ptr = FFI::MemoryPointer.new(:pointer, argv.length+1)
argv.each_with_index do |s, i|
- ptr[i].put_pointer 0, FFI::MemoryPointer.from_string(s)
+ ptr[i].put_pointer 0, p_from_string(s)
end
ptr[argv.length].put_pointer 0, FFI::Pointer::NULL
Efl::EcoreGetopt.parse @parser_p, @values_p, argv.length, ptr
@@ -192,7 +202,7 @@ module Efl
def choice short, long, help, choices
ptr = FFI::MemoryPointer.new(:pointer, choices.length+1)
choices.each_with_index do |s, i|
- ptr[i].put_pointer 0, FFI::MemoryPointer.from_string(s)
+ ptr[i].put_pointer 0, p_from_string(s)
end
ptr[choices.length].put_pointer 0, FFI::Pointer::NULL
self << [ short, long, help, FFI::Pointer::NULL, :ecore_getopt_action_choice, [:choices,ptr] ]
@@ -200,7 +210,7 @@ module Efl
def choice_metavar short, long, help, meta, choices
ptr = FFI::MemoryPointer.new(:pointer, choices.length+1)
choices.each_with_index do |s, i|
- ptr[i].put_pointer 0, FFI::MemoryPointer.from_string(s)
+ ptr[i].put_pointer 0, p_from_string(s)
end
ptr[choices.length].put_pointer 0, FFI::Pointer::NULL
self << [ short, long, help, meta, :ecore_getopt_action_choice, [:choices,ptr] ]