JSBool unwrap_ruby_land_proxy(JohnsonRuntime* runtime, VALUE wrapped, jsval* retval) { JSContext * context = johnson_get_current_context(runtime); assert(ruby_value_is_proxy(wrapped)); PREPARE_JROOTS(context, 0); RubyLandProxy* proxy; Data_Get_Struct(wrapped, RubyLandProxy, proxy); JCHECK(get_jsval_for_proxy(proxy, retval)); JRETURN; }
JSBool convert_to_js(JohnsonRuntime* runtime, VALUE ruby, jsval* retval) { JSContext * context = johnson_get_current_context(runtime); PREPARE_JROOTS(context, 0); switch(TYPE(ruby)) { case T_NONE: JERROR("I don't know how to handle T_NONE."); JRETURN; case T_ICLASS: JERROR("I don't know how to handle T_ICLASS."); JRETURN; case T_MATCH: JERROR("I don't know how to handle T_MATCH."); JRETURN; case T_BLKTAG: JERROR("I don't know how to handle T_BLKTAG."); JRETURN; case T_NODE: JERROR("I don't know how to handle T_NODE | T_MASK."); JRETURN; case T_UNDEF: JERROR("I don't know how to handle T_UNDEF."); JRETURN; case T_VARMAP: JERROR("I don't know how to handle T_VARMAP."); JRETURN; case T_NIL: *retval = JSVAL_NULL; JRETURN; case T_TRUE: *retval = JSVAL_TRUE; JRETURN; case T_FALSE: *retval = JSVAL_FALSE; JRETURN; case T_STRING: { JSString* str = JS_NewStringCopyN(context, StringValuePtr(ruby), (size_t) StringValueLen(ruby)); JCHECK(str); *retval = STRING_TO_JSVAL(str); JRETURN; } case T_FIXNUM: { long val = NUM2LONG(ruby); if (val >= JSVAL_INT_MIN && val <= JSVAL_INT_MAX) { *retval = INT_TO_JSVAL((jsint)val); JRETURN; } } case T_FLOAT: case T_BIGNUM: JCHECK(convert_float_or_bignum_to_js(runtime, ruby, retval)); JRETURN; case T_SYMBOL: JCHECK(convert_symbol_to_js(runtime, ruby, retval)); JRETURN; case T_CLASS: case T_ARRAY: case T_HASH: case T_MODULE: case T_FILE: case T_STRUCT: case T_OBJECT: JCHECK(make_js_land_proxy(runtime, ruby, retval)); JRETURN; case T_REGEXP: JCHECK(convert_regexp_to_js(runtime, ruby, retval)); JRETURN; case T_DATA: // HEY! keep T_DATA last for fall-through if (ruby_value_is_proxy(ruby)) JCHECK(unwrap_ruby_land_proxy(runtime, ruby, retval)); else // If we can't identify the object, just wrap it JCHECK(make_js_land_proxy(runtime, ruby, retval)); JRETURN; default: JERROR("unknown ruby type in switch"); } *retval = JSVAL_NULL; JRETURN; }