summaryrefslogtreecommitdiffstats
path: root/ext/dl/sample/c++sample.rb
diff options
context:
space:
mode:
authorttate <ttate@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2002-04-20 16:09:44 +0000
committerttate <ttate@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2002-04-20 16:09:44 +0000
commitfd104732bde4d2eea07eae11161e35e8f0b7790e (patch)
treec25c28f4ceddb3a9639407546ae6faa9d77b80ca /ext/dl/sample/c++sample.rb
parent6f6ea9d0f23415b427d4d9aa08659ff885c2e231 (diff)
downloadruby-fd104732bde4d2eea07eae11161e35e8f0b7790e.tar.gz
ruby-fd104732bde4d2eea07eae11161e35e8f0b7790e.tar.xz
ruby-fd104732bde4d2eea07eae11161e35e8f0b7790e.zip
Add a sample which shows how to deal with C++ libraries.
git-svn-id: http://svn.ruby-lang.org/repos/ruby/trunk@2394 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'ext/dl/sample/c++sample.rb')
-rw-r--r--ext/dl/sample/c++sample.rb60
1 files changed, 60 insertions, 0 deletions
diff --git a/ext/dl/sample/c++sample.rb b/ext/dl/sample/c++sample.rb
new file mode 100644
index 000000000..29887df84
--- /dev/null
+++ b/ext/dl/sample/c++sample.rb
@@ -0,0 +1,60 @@
+=begin
+ This script shows how to deal with C++ classes using Ruby/DL.
+ You must build a dynamic loadable library using "c++sample.C"
+ to run this script as follows:
+ $ g++ -o libsample.so -shared c++sample.C
+=end
+
+require 'dl'
+require 'dl/import'
+require 'dl/struct'
+
+# Give a name of dynamic loadable library
+LIBNAME = ARGV[0] || "libsample.so"
+
+class Person
+ module Core
+ extend DL::Importable
+
+ dlload LIBNAME
+
+ # mangled symbol names
+ extern "void __6PersonPCci(void *, const char *, int)"
+ extern "const char *get_name__6Person(void *)"
+ extern "int get_age__6Person(void *)"
+ extern "void set_age__6Personi(void *, int)"
+
+ Data = struct [
+ "char *name",
+ "int age",
+ ]
+ end
+
+ def initialize(name, age)
+ @ptr = Core::Data.alloc
+ Core::__6PersonPCci(@ptr, name, age)
+ end
+
+ def get_name()
+ str = Core::get_name__6Person(@ptr)
+ if( str )
+ str.to_s
+ else
+ nil
+ end
+ end
+
+ def get_age()
+ Core::get_age__6Person(@ptr)
+ end
+
+ def set_age(age)
+ Core::set_age__6Personi(@ptr, age)
+ end
+end
+
+obj = Person.new("ttate", 1)
+p obj.get_name()
+p obj.get_age()
+obj.set_age(10)
+p obj.get_age()