Pastie now auto-senses if line-wrap is a bad or good idea. Feedback?
## mark a section (Learn more)
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);
This paste will be private.
From the Design Piracy series on my blog: