Created
September 1, 2010 00:02
-
-
Save chad/560003 to your computer and use it in GitHub Desktop.
This file contains hidden or 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
| typedef struct { | |
| VALUE *pc; /* cfp[0] */ | |
| VALUE *sp; /* cfp[1] */ | |
| VALUE *bp; /* cfp[2] */ | |
| rb_iseq_t *iseq; /* cfp[3] */ | |
| VALUE flag; /* cfp[4] */ | |
| VALUE self; /* cfp[5] / block[0] */ | |
| VALUE klass; /* cfp[6] / block[1] */ | |
| VALUE *lfp; /* cfp[7] / block[2] */ | |
| VALUE *dfp; /* cfp[8] / block[3] */ | |
| rb_iseq_t *block_iseq; /* cfp[9] / block[4] */ | |
| VALUE proc; /* cfp[10] / block[5] */ | |
| const rb_method_entry_t *me;/* cfp[11] */ | |
| } rb_control_frame_t; |
If I recall correctly...
flags = ... flags?
Bad name. Currently it represents frame type: VM_FRAME_MAGIC_*.
dfp = ?
dynamic frame pointer (= block locals frame pointer, as chad said)
def foo(a)
b = 1
# lfp = dfp, which has a and b
foo do |c|
d = 1
# lfp has a and b
# dfp has c and d
end
end
block_iseq = pretty sure this is unused, there was just a patch to remove it
proc = unsure, perhaps the proc if the current frame is for a block
Both fields are actually used, via cast to type rb_block_t; The comment "cfp[8] / block[3]" means so.
They represents current given block.
block_iseq is accessed as rb_block_t.iseq, and represents iseq of given block.
proc is accessed as rb_block_t.proc, and represents a Proc object created for the block, if any.
me = unsure, the method being executed?
If the current frame is method, this field has the method info.
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
/**
@c variable
@e get block local variable(which is pointed by idx and level).
level means nest level of block, and specify how above this variable.
@j level, idx Ç≈éwíËÇ≥ÇÍÇΩÉuÉçÉbÉNÉçÅ[ÉJÉãïœêîÇÃílÇÉXÉ^ÉbÉNÇ…íuÇ≠ÅB
level ÇÕÉuÉçÉbÉNÇÃÉlÉXÉgÉåÉxÉãÇ≈ÅAâΩíiè„Ç©Çé¶Ç∑ÅB
*/
DEFINE_INSN
getdynamic
(dindex_t idx, rb_num_t level)
()
(VALUE val)
{
rb_num_t i;
VALUE *dfp2 = GET_DFP();
for (i = 0; i < level; i++) {
dfp2 = GET_PREV_DFP(dfp2);
}
val = *(dfp2 - idx);
}