rubywrapper.cpp
1 #ifndef _MSC_VER
2  #include <ruby.h>
3 #endif
4 #include "rubywrapper.h"
5 #ifdef _MSC_VER
6  #include <ruby.h>
7 #endif
8 
9 static_assert(sizeof(VALUE) == sizeof(Ruby::Value), "Size mismatch for VALUE.");
10 
11 const int Ruby::Nil = Qnil;
12 const int Ruby::False = Qfalse;
13 const int Ruby::True = Qtrue;
14 
15 Ruby::Ruby(const char *scriptname) {
16  ruby_init();
17  ruby_script(scriptname);
18  ruby_init_loadpath();
19 }
20 Ruby::~Ruby() {
21 // ruby_finalize();
22  ruby_cleanup(0);
23 }
24 int
25 Ruby::evalProtect(const char* str) {
26  int state = 0;
27  rb_eval_string_protect(str, &state);
28  return state;
29 }
30 void
31 Ruby::defineGlobalConst(const char *rbname, Value obj) {
32  rb_define_global_const(rbname, obj);
33 }
34 Ruby::Value
35 Ruby::wrap_obj(Value cl, void *p, void (*f)(void *)) {
36  return Data_Wrap_Struct(cl, 0, f, p);
37 }
38 void *
39 Ruby::unwrap_obj(Value self) {
40  wrapped_t *ptr;
41  Data_Get_Struct(self, wrapped_t, ptr);
42  return ptr;
43 }
44 
45 void
46 Ruby::define_method(Value cl, const char *rbname, Value (*func)(...), int argnum) {
47  rb_define_method(cl, rbname, func, argnum);
48 }
49 void
50 Ruby::define_singleton_method(Value obj, const char *rbname, Value (*func)(...), int argnum) {
51  rb_define_singleton_method(obj, rbname, func, argnum);
52 }
53 Ruby::Value
54 Ruby::define_class(const char *rbname, Value super) {
55  Value c = rb_define_class(rbname, (super != Nil) ? super : rb_cObject);
56  rb_global_variable(&c);
57  return c;
58 }
59 void
60 Ruby::emit_error(const char *errstr) {
61  rb_raise(rb_eRuntimeError, "%s", errstr);
62 }
63 
64 template <>
65 bool Ruby::isConvertible<const char*>(Value v) {
66  return TYPE(v) == T_STRING;
67 }
68 template <>
69 bool Ruby::isConvertible<long>(Value v) {
70  return FIXNUM_P(v);
71 }
72 template <>
73 bool Ruby::isConvertible<double>(Value v) {
74  return (TYPE(v) == T_FLOAT) || FIXNUM_P(v) || (TYPE(v) == T_BIGNUM);
75 }
76 template <>
77 bool Ruby::isConvertible<bool>(Value v) {
78  return (TYPE(v) == T_TRUE) || (TYPE(v) == T_FALSE);
79 }
80 
81 template <>
82 const char* Ruby::convert(Value v) {
83  if( !isConvertible<const char*>(v))
84  throw "Type mismatch to STRING.";
85  return RSTRING_PTR(v);
86 }
87 template <>
88 long Ruby::convert(Value v) {
89  if( !isConvertible<long>(v))
90  throw "Type mismatch to LONG.";
91  return FIX2LONG(v);
92 }
93 template <>
94 double Ruby::convert(Value v) {
95  if( !isConvertible<double>(v))
96  throw "Type mismatch to NUM.";
97  return NUM2DBL(v);
98 }
99 template <>
100 bool Ruby::convert(Value v) {
101  if( !isConvertible<bool>(v))
102  throw "Type mismatch to NUM.";
103  return (TYPE(v) == T_TRUE) ? true : false;
104 }
105 
106 Ruby::Value Ruby::convertToRuby(const std::string &str) {
107  if(str.empty()) return rb_str_new2("");
108  return rb_str_new2(str.c_str());
109 }
110 
111 template <>
112 Ruby::Value Ruby::convertToRuby(int v) {
113  return INT2NUM(v);
114 }
115 
116 template <>
117 Ruby::Value Ruby::convertToRuby(unsigned int v) {
118  return UINT2NUM(v);
119 }
120 
121 template <>
122 Ruby::Value Ruby::convertToRuby(long v) {
123  return LONG2NUM(v);
124 }
125 
126 template <>
127 Ruby::Value Ruby::convertToRuby(unsigned long v) {
128  return ULONG2NUM(v);
129 }
130 
131 template <>
132 Ruby::Value Ruby::convertToRuby(double v) {
133  return rb_float_new(v);
134 }
135 
136 template <>
137 Ruby::Value Ruby::convertToRuby(bool v) {
138  return v ? Qtrue : Qfalse;
139 }
140 
141 void
142 Ruby::printErrorInfo() {
143  rb_p(rb_errinfo());
144 }
145 

Generated for KAME4 by  doxygen 1.8.3