diff --git a/shotgun/lib/subtend/ruby.c b/shotgun/lib/subtend/ruby.c
index 5a9ca63..07d033d 100644
--- a/shotgun/lib/subtend/ruby.c
+++ b/shotgun/lib/subtend/ruby.c
@@ -309,6 +309,20 @@ VALUE rb_iv_set(VALUE obj, char *name, VALUE val) {
return rb_ivar_set(obj, rb_intern(name), val);
}
+
+VALUE rb_ivar_defined(VALUE obj, ID sym) {
+ CTX;
+
+ if(object_has_ivars(ctx->state, HNDL(obj))) {
+ if (object_get_ivar(ctx->state, HNDL(obj), HNDL(sym)) != Qundef) {
+ return Qtrue;
+ }
+ }
+
+ return Qfalse;
+}
+
+
void rb_define_method_(const char *file, VALUE vmod, const char *name, void *func, int args, int kind) {
OBJECT meth, sym, mod;
CTX;
@@ -467,6 +481,14 @@ VALUE rb_class_new_instance(int nargs, VALUE *args, VALUE klass) {
return obj;
}
+VALUE rb_singleton_class(VALUE obj) {
+ OBJECT val;
+ CTX;
+
+ val = object_metaclass(ctx->state, HNDL(obj));
+ return NEW_HANDLE(ctx, val);
+}
+
void rb_thread_schedule() {
rb_funcall2(rb_const_get(rb_cObject, rb_intern("Thread")), rb_intern("pass"), 0, NULL);
}
@@ -515,6 +537,9 @@ VALUE rb_ary_new(void) {
return rb_ary_new2(ARRAY_DEFAULT_SIZE);
}
+VALUE OBJ_TAINT(VALUE val) { return val; }
+int OBJ_TAINTED(VALUE val) { return 0; }
+
VALUE rb_ary_new2(long length) {
OBJECT ary;
CTX;
@@ -524,6 +549,24 @@ VALUE rb_ary_new2(long length) {
return NEW_HANDLE(ctx, ary);
}
+VALUE rb_ary_new3(long length, ...) {
+ OBJECT ary;
+ CTX;
+
+ va_list ar;
+ long i;
+
+ ary = array_new(ctx->state, length);
+
+ va_start(ar, length);
+ for(i = 0; i < length; i++) {
+ array_append(ctx->state, ary, HNDL(va_arg(ar, VALUE)));
+ }
+ va_end(ar);
+
+ return NEW_HANDLE(ctx, ary);
+}
+
VALUE rb_ary_push(VALUE array, VALUE val) {
CTX;
OBJECT ary = HNDL(array);
diff --git a/shotgun/lib/subtend/ruby.h b/shotgun/lib/subtend/ruby.h
index 532bc88..22ef728 100644
--- a/shotgun/lib/subtend/ruby.h
+++ b/shotgun/lib/subtend/ruby.h
@@ -76,6 +76,8 @@ VALUE rb_ivar_get(VALUE obj, ID sym);
VALUE rb_iv_get(VALUE obj, char *name);
VALUE rb_ivar_set(VALUE obj, ID sym, VALUE val);
VALUE rb_iv_set(VALUE obj, char *name, VALUE val);
+VALUE rb_ivar_defined(VALUE obj, ID sym);
+
void rb_define_attr(VALUE klass, const char* id, int read, int write);
VALUE rb_attr_get(VALUE obj, ID sym);
@@ -182,6 +184,7 @@ VALUE INT2NUM(int num);
VALUE rb_Array(VALUE val);
VALUE rb_ary_new(void);
VALUE rb_ary_new2(long length);
+VALUE rb_ary_new3(long length, ...);
int rb_ary_size(VALUE self);
VALUE rb_ary_push(VALUE array, VALUE val);
VALUE rb_ary_pop(VALUE array);