-
-
Save banister/febb1f0580cc42eb4297 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
VALUE | |
rb_obj_id(VALUE obj) | |
{ | |
/* | |
* 32-bit VALUE space | |
* MSB ------------------------ LSB | |
* false 00000000000000000000000000000000 | |
* true 00000000000000000000000000000010 | |
* nil 00000000000000000000000000000100 | |
* undef 00000000000000000000000000000110 | |
* symbol ssssssssssssssssssssssss00001110 | |
* object oooooooooooooooooooooooooooooo00 = 0 (mod sizeof(RVALUE)) | |
* fixnum fffffffffffffffffffffffffffffff1 | |
* | |
* object_id space | |
* LSB | |
* false 00000000000000000000000000000000 | |
* true 00000000000000000000000000000010 | |
* nil 00000000000000000000000000000100 | |
* undef 00000000000000000000000000000110 | |
* symbol 000SSSSSSSSSSSSSSSSSSSSSSSSSSS0 S...S % A = 4 (S...S = s...s * A + 4) | |
* object oooooooooooooooooooooooooooooo0 o...o % A = 0 | |
* fixnum fffffffffffffffffffffffffffffff1 bignum if required | |
* | |
* where A = sizeof(RVALUE)/4 | |
* | |
* sizeof(RVALUE) is | |
* 20 if 32-bit, double is 4-byte aligned | |
* 24 if 32-bit, double is 8-byte aligned | |
* 40 if 64-bit | |
*/ | |
if (TYPE(obj) == T_SYMBOL) { | |
return (SYM2ID(obj) * sizeof(RVALUE) + (4 << 2)) | FIXNUM_FLAG; | |
} | |
if (SPECIAL_CONST_P(obj)) { | |
return LONG2NUM((SIGNED_VALUE)obj); | |
} | |
return (VALUE)((SIGNED_VALUE)obj|FIXNUM_FLAG); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment