aboutsummaryrefslogtreecommitdiffstats
path: root/src/dumm/ext
diff options
context:
space:
mode:
Diffstat (limited to 'src/dumm/ext')
-rw-r--r--src/dumm/ext/dumm.c28
-rw-r--r--src/dumm/ext/lib/dumm.rb12
2 files changed, 36 insertions, 4 deletions
diff --git a/src/dumm/ext/dumm.c b/src/dumm/ext/dumm.c
index 21435b5aa..fa180ee0e 100644
--- a/src/dumm/ext/dumm.c
+++ b/src/dumm/ext/dumm.c
@@ -92,7 +92,9 @@ static VALUE guest_find(VALUE class, VALUE key)
{
enumerator_t *enumerator;
guest_t *guest, *found = NULL;
- if (TYPE(key) == T_SYMBOL) {
+
+ if (TYPE(key) == T_SYMBOL)
+ {
key = rb_convert_type(key, T_STRING, "String", "to_s");
}
enumerator = dumm->create_guest_enumerator(dumm);
@@ -255,7 +257,9 @@ static VALUE guest_find_iface(VALUE self, VALUE key)
enumerator_t *enumerator;
iface_t *iface, *found = NULL;
guest_t *guest;
- if (TYPE(key) == T_SYMBOL) {
+
+ if (TYPE(key) == T_SYMBOL)
+ {
key = rb_convert_type(key, T_STRING, "String", "to_s");
}
Data_Get_Struct(self, guest_t, guest);
@@ -355,11 +359,15 @@ static void guest_init()
/**
* Bridge binding
*/
-static VALUE bridge_get(VALUE class, VALUE key)
+static VALUE bridge_find(VALUE class, VALUE key)
{
enumerator_t *enumerator;
bridge_t *bridge, *found = NULL;
+ if (TYPE(key) == T_SYMBOL)
+ {
+ key = rb_convert_type(key, T_STRING, "String", "to_s");
+ }
enumerator = dumm->create_bridge_enumerator(dumm);
while (enumerator->enumerate(enumerator, &bridge))
{
@@ -372,11 +380,21 @@ static VALUE bridge_get(VALUE class, VALUE key)
enumerator->destroy(enumerator);
if (!found)
{
- rb_raise(rb_eRuntimeError, "bridge not found");
+ return Qnil;
}
return Data_Wrap_Struct(class, NULL, NULL, found);
}
+static VALUE bridge_get(VALUE class, VALUE key)
+{
+ VALUE bridge = bridge_find(class, key);
+ if (NIL_P(bridge))
+ {
+ rb_raise(rb_eRuntimeError, "bridge not found");
+ }
+ return bridge;
+}
+
static VALUE bridge_each(int argc, VALUE *argv, VALUE class)
{
enumerator_t *enumerator;
@@ -468,6 +486,8 @@ static void bridge_init()
rb_define_singleton_method(rbc_bridge, "[]", bridge_get, 1);
rb_define_singleton_method(rbc_bridge, "each", bridge_each, -1);
rb_define_singleton_method(rbc_bridge, "new", bridge_new, 1);
+ rb_define_singleton_method(rbc_bridge, "include?", bridge_find, 1);
+ rb_define_singleton_method(rbc_bridge, "bridge?", bridge_find, 1);
rb_define_method(rbc_bridge, "to_s", bridge_to_s, 0);
rb_define_method(rbc_bridge, "each", bridge_each_iface, -1);
diff --git a/src/dumm/ext/lib/dumm.rb b/src/dumm/ext/lib/dumm.rb
index ba1ccceb2..28485e994 100644
--- a/src/dumm/ext/lib/dumm.rb
+++ b/src/dumm/ext/lib/dumm.rb
@@ -19,6 +19,18 @@ require 'dumm.so'
require 'dumm/guest'
module Dumm
+
+ # use guest/bridge indentifiers directly
+ def method_missing(id, *args)
+ if Guest.guest? id
+ return Guest[id]
+ end
+ if Bridge.bridge? id
+ return Bridge[id]
+ end
+ super(id, *args)
+ end
+
# unload templates, reset all guests and delete bridges
def reset
Template.unload