static VALUE bignum_spec_rb_big2long(VALUE self, VALUE num) { return LONG2NUM(rb_big2long(num)); }
zval *value_to_zval(VALUE v) { zval *zv; MAKE_STD_ZVAL(zv); switch (TYPE(v)) { case T_FALSE: ZVAL_FALSE(zv); return zv; case T_TRUE: ZVAL_TRUE(zv); return zv; case T_UNDEF: case T_NIL: ZVAL_NULL(zv); return zv; case T_FIXNUM: ZVAL_LONG(zv, rb_fix2int(v)); return zv; case T_BIGNUM: ZVAL_LONG(zv, rb_big2long(v)); // FIXME: bignum over long return zv; case T_FLOAT: ZVAL_DOUBLE(zv, RFLOAT_VALUE(v)); return zv; case T_ARRAY: { int i; array_init(zv); for(i=0;i<RARRAY_LEN(v);++i) { zval *add = value_to_zval(RARRAY_PTR(v)[i]); zend_hash_next_index_insert(Z_ARRVAL_P(zv), &add, sizeof(zval *), NULL); } return zv; } case T_HASH: { array_init(zv); rb_hash_foreach(v, hash_to_zval, (VALUE)zv); return zv; } case T_SYMBOL: { VALUE symbol_str = rb_sym_to_s(v); ZVAL_STRINGL(zv, StringValuePtr(symbol_str), RSTRING_LEN(symbol_str), 1); return zv; } case T_STRING: { ZVAL_STRINGL(zv, StringValuePtr(v), RSTRING_LEN(v), 1); return zv; } default: { if (CLASS_OF(v) == cPhpEmbedValue) { php_value* pv; Data_Get_Struct(v, php_value, pv); MAKE_COPY_ZVAL(&pv->value, zv); return zv; } } FREE_ZVAL(zv); rb_raise(rb_eRuntimeError, "no implemented"); } }