84
(rb_num_t idx, rb_num_t type)
83
(VALUE key, rb_num_t type)
89
VALUE *pv = lfp_svar(GET_LFP(), idx);
93
VALUE backref = *lfp_svar(GET_LFP(), 1);
97
val = rb_reg_last_match(backref);
100
val = rb_reg_match_pre(backref);
103
val = rb_reg_match_post(backref);
106
val = rb_reg_match_last(backref);
109
rb_bug("unexpected back-ref");
113
val = rb_reg_nth_match(type >> 1, backref);
87
val = vm_getspecial(th, GET_LFP(), key, type);
486
446
num�ȏ�̗v�f�͐�̂Ă�B
487
447
�z��I�u�W�F�N�g�łȂ���Anum - 1 �� nil ��ςށB
488
448
���� flag ���^�Ȃ�A�c��v�f�̔z���ς�
449
flag: 0x01 - �Ō��z���
450
flag: 0x02 - postarg �p
451
flag: 0x04 - reverse?
492
455
(rb_num_t num, rb_num_t flag)
494
(...) // inc += (num > 0) ? num - 1 + (flag ? 1 : 0) : num + 1 - (flag ? 1 : 0);
457
(...) // inc += flag == 0x02 ? num : ((num > 0) ? num - 1 + (flag ? 1 : 0) : num + 1 - (flag ? 1 : 0));
497
if ((long)num >= 0) {
499
if (TYPE(ary) != T_ARRAY) {
500
ary = rb_ary_to_ary(ary);
502
len = RARRAY_LEN(ary);
503
for (i = 0; i < len && i < num; i++) {
504
PUSH(RARRAY_PTR(ary)[i]);
506
for (; i < num; i++) {
511
PUSH(rb_ary_new4(len - num, &RARRAY_PTR(ary)[num]));
522
val = rb_ary_new4(holdnum, STACK_ADDR_FROM_TOP(holdnum));
523
if (CLASS_OF(ary) == rb_cArray) {
524
val = rb_ary_concat(val, ary);
527
rb_ary_push(val, ary);
459
vm_expandarray(GET_CFP(), ary, num, flag);
545
473
VALUE ary2 = ary2st;
551
VALUE tmp1 = rb_check_convert_type(ary1, T_ARRAY, "Array", "to_splat");
552
VALUE tmp2 = rb_check_convert_type(ary2, T_ARRAY, "Array", "to_splat");
555
tmp1 = rb_ary_new3(1, ary1);
559
tmp2 = rb_ary_new3(1, ary2);
563
tmp1 = rb_ary_dup(ary1);
565
ary = rb_ary_concat(tmp1, tmp2);
474
VALUE tmp1 = rb_check_convert_type(ary1, T_ARRAY, "Array", "to_splat");
475
VALUE tmp2 = rb_check_convert_type(ary2, T_ARRAY, "Array", "to_splat");
478
tmp1 = rb_ary_new3(1, ary1);
482
tmp2 = rb_ary_new3(1, ary2);
486
tmp1 = rb_ary_dup(ary1);
488
ary = rb_ary_concat(tmp1, tmp2);
1084
988
rb_const_set(cbase, id, klass);
1085
989
rb_class_inherited(super, klass);
1088
else if (define_type == 1) {
1089
993
/* val is dummy. classdef returns class scope value */
1090
994
/* super is dummy */
1091
995
klass = rb_singleton_class(cbase);
1093
else if (define_type == 2) {
1094
998
/* val is dummy. classdef returns class scope value */
1095
999
/* super is dummy */
1096
1000
if (cbase == Qnil) {
1097
cbase = th_get_cbase(th);
1001
cbase = vm_get_cbase(th);
1100
1004
/* find klass */
1111
1015
rb_set_class_path(klass, cbase, rb_id2name(id));
1112
1016
rb_const_set(cbase, id, klass);
1116
rb_bug("unknown defineclass type: %d", define_type);
1119
COPY_CREF(klass_iseq->cref_stack, th_cref_push(th, klass, NOEX_PUBLIC));
1020
rb_bug("unknown defineclass type: %d", (int)define_type);
1023
COPY_CREF(klass_iseq->cref_stack, vm_cref_push(th, klass, NOEX_PUBLIC));
1121
1025
/* enter scope */
1122
push_frame(th, klass_iseq,
1123
FRAME_MAGIC_CLASS, klass, (VALUE) GET_DFP() | 0x02,
1124
klass_iseq->iseq_encoded, GET_SP(), 0,
1125
klass_iseq->local_size);
1026
vm_push_frame(th, klass_iseq,
1027
FRAME_MAGIC_CLASS, klass, (VALUE) GET_DFP() | 0x02,
1028
klass_iseq->iseq_encoded, GET_SP(), 0,
1029
klass_iseq->local_size);
1126
1030
RESTORE_REGS();
1128
1032
INC_VM_STATE_VERSION();
1150
1054
(VALUE val) // inc += - (op_argc + ((op_flag & VM_CALL_ARGS_BLOCKARG_BIT) ? 1 : 0));
1155
1058
rb_block_t *blockptr = 0;
1156
rb_num_t num = op_argc;
1059
rb_num_t num = caller_setup_args(th, GET_CFP(), op_flag, op_argc, (rb_iseq_t *)blockiseq, &blockptr);
1157
1060
rb_num_t flag = op_flag;
1160
macro_eval_setup_send_arguments(num, blockptr, flag, blockiseq);
1162
if (flag & VM_CALL_FCALL_BIT) {
1167
/* recv.method(...) */
1064
recv = (flag & VM_CALL_FCALL_BIT) ? GET_SELF() : TOPN(num);
1171
1065
klass = CLASS_OF(recv);
1173
mn = eval_method_search(id, klass, ic);
1175
if ((flag & VM_CALL_SEND_BIT) && mn && nd_type(mn->nd_body) == NODE_CFUNC) {
1176
NODE *node = mn->nd_body;
1177
extern VALUE rb_f_funcall(int argc, VALUE *argv, VALUE recv);
1178
extern VALUE rb_f_send(int argc, VALUE *argv, VALUE recv);
1180
if (node->nd_cfnc == rb_f_funcall || node->nd_cfnc == rb_f_send) {
1182
VALUE sym = TOPN(num - 1);
1183
id = SYMBOL_P(sym) ? SYM2ID(sym) : rb_to_id(sym);
1185
/* shift arguments */
1186
for (i=num-1; i>0; i--) {
1187
TOPN(i) = TOPN(i-1);
1190
mn = rb_method_node(klass, id);
1196
if (node->nd_cfnc == rb_f_funcall) {
1197
flag |= VM_CALL_FCALL_BIT;
1201
#if CURRENT_INSN_send || CURRENT_INSN_send_SC_xx_ax
1202
#if !YARV_AOT_COMPILED
1205
LABEL_IS_SC(start_init_in_send_for_opt_1):
1210
LABEL_IS_SC(start_init_in_send_for_opt_2):
1216
klass = CLASS_OF(recv);
1218
mn = rb_method_node(klass, id);
1221
LABEL_IS_SC(start_init_in_super):
1223
rb_iseq_t *iseq = GET_ISEQ();
1224
rb_iseq_t *ip = iseq;
1227
flag = VM_CALL_FCALL_BIT;
1230
while (ip && !ip->klass) {
1231
ip = ip->parent_iseq;
1235
rb_raise(rb_eNoMethodError, "super called outside of method");
1238
id = ip->defined_method_id;
1240
if (ip != ip->local_iseq) {
1241
/* defined by Module#define_method() */
1242
rb_control_frame_t *lcfp = GET_CFP();
1244
while (lcfp->iseq != ip) {
1245
VALUE *tdfp = GET_PREV_DFP(lcfp->dfp);
1247
lcfp = RUBY_VM_PREVIOUS_CONTROL_FRAME(lcfp);
1248
if (lcfp->dfp == tdfp) {
1254
id = lcfp->method_id;
1255
klass = search_super_klass(lcfp->method_klass, recv);
1257
if (TOPN(num) == Qfalse) {
1262
for (i = 0; i < ip->argc; i++) {
1263
PUSH(lcfp->dfp[i - ip->local_size]);
1268
klass = search_super_klass(ip->klass, recv);
1271
flag = VM_CALL_SUPER_BIT | VM_CALL_FCALL_BIT;
1272
blockptr = tmp_blockptr;
1273
mn = rb_method_node(klass, id);
1276
LABEL_IS_SC(start_method_dispatch):
1279
macro_eval_invoke_method(recv, klass, id, num, mn, blockptr);
1280
RUBY_VM_CHECK_INTS();
1066
mn = vm_method_search(id, klass, ic);
1068
/* send/funcall optimization */
1069
if (flag & VM_CALL_SEND_BIT) {
1070
vm_send_optimize(GET_CFP(), &mn, &flag, &num, &id, klass);
1073
CALL_METHOD(num, blockptr, flag, id, mn, recv, klass);
1290
(rb_num_t op_argc, ISEQ blockiseq, rb_num_t flag)
1083
(rb_num_t op_argc, ISEQ blockiseq, rb_num_t op_flag)
1292
1085
(VALUE val) // inc += - op_argc;
1294
#if YARV_AOT_COMPILED
1300
macro_eval_setup_send_arguments(tmp_num, tmp_blockptr, flag, blockiseq);
1301
if (!tmp_blockptr && !(flag & VM_CALL_ARGS_BLOCKARG_BIT)) {
1302
tmp_blockptr = GET_BLOCK_PTR();
1304
goto LABEL_IS_SC(start_init_in_super);
1087
rb_block_t *blockptr = !(op_flag & VM_CALL_ARGS_BLOCKARG_BIT) ? GET_BLOCK_PTR() : 0;
1088
int num = caller_setup_args(th, GET_CFP(), op_flag, op_argc, blockiseq, &blockptr);
1092
const VALUE flag = VM_CALL_SUPER_BIT | VM_CALL_FCALL_BIT;
1095
vm_search_super_klass(GET_CFP(), GET_ISEQ(), recv, TOPN(num), &id, &klass);
1096
mn = rb_method_node(klass, id);
1098
CALL_METHOD(num, blockptr, flag, id, mn, recv, klass);
1317
1110
(VALUE val) // inc += 1 - num;
1319
rb_block_t *block = GET_BLOCK_PTR();
1323
if (GET_ISEQ()->local_iseq->type != ISEQ_TYPE_METHOD || block == 0) {
1324
th_localjump_error("no block given (yield)", Qnil, 0);
1328
if (BUILTIN_TYPE(iseq) != T_NODE) {
1329
if (flag & VM_CALL_ARGS_SPLAT_BIT) {
1330
VALUE ary = TOPN(0);
1331
if (CLASS_OF(ary) != rb_cArray) {
1335
VALUE *ptr = RARRAY_PTR(ary);
1336
VALUE *dst = GET_SP() - 1;
1337
int i, len = RARRAY_LEN(ary);
1339
for (i = 0; i < len; i++) {
1348
argc = th_yield_setup_args(th, iseq, argc, GET_SP(),
1349
block_proc_is_lambda(block->proc));
1352
push_frame(th, iseq,
1353
FRAME_MAGIC_BLOCK, block->self, (VALUE) block->dfp,
1354
iseq->iseq_encoded, GET_SP(), block->lfp,
1355
iseq->local_size - argc);
1357
reg_cfp->sp -= argc;
1112
val = vm_invoke_block(th, GET_CFP(), num, flag);
1113
if (val == Qundef) {
1358
1114
RESTORE_REGS();
1363
val = th_yield_with_cfunc(th, block, block->self,
1364
num, STACK_ADDR_FROM_TOP(num));
1419
1173
(VALUE throwobj)
1422
rb_num_t state = throw_state & 0xff;
1423
rb_num_t flag = throw_state & 0x8000;
1424
rb_num_t level = throw_state >> 16;
1425
val = Qnil; /* dummy */
1431
if (throw_state & 0x4000) {
1439
if (state == TAG_BREAK || state == TAG_RETRY) {
1440
pt = GC_GUARDED_PTR_REF((VALUE *) * GET_DFP());
1441
for (i = 0; i < level; i++) {
1442
pt = GC_GUARDED_PTR_REF((VALUE *) * pt);
1445
else if (state == TAG_RETURN) {
1446
rb_control_frame_t *cfp = GET_CFP();
1448
VALUE *dfp = GET_DFP();
1451
while ((VALUE *) cfp < th->stack + th->stack_size) {
1452
if (GET_LFP() == cfp->lfp) {
1456
else if (dfp == cfp->dfp) {
1457
/* return from lambda{} */
1458
if (cfp->magic == FRAME_MAGIC_LAMBDA) {
1462
dfp = GC_GUARDED_PTR_REF(*cfp->dfp);
1467
th_localjump_error("unexpected return", throwobj,
1471
/* set current lfp */
1475
rb_bug("isns(throw): unsupport throw type");
1479
return (VALUE) NEW_THROW_OBJECT(throwobj, (VALUE) pt, state);
1482
/* continue throw */
1483
VALUE err = throwobj;
1485
if (FIXNUM_P(err)) {
1486
th->state = FIX2INT(err);
1488
else if (SYMBOL_P(err)) {
1489
th->state = TAG_THROW;
1491
else if (BUILTIN_TYPE(err) == T_NODE) {
1492
th->state = GET_THROWOBJ_STATE(err);
1495
th->state = FIX2INT(rb_ivar_get(err, idThrowState));
1176
RUBY_VM_CHECK_INTS();
1177
val = vm_throw(th, GET_CFP(), throw_state, throwobj);
1178
THROW_EXCEPTION(val);
1499
1179
/* unreachable */
1682
1362
else if (FIXNUM_2_P(recv, obj) &&
1683
1363
BASIC_OP_UNREDEFINED_P(BOP_PLUS)) {
1684
1364
/* fixnum + fixnum */
1365
#ifndef LONG_LONG_VALUE
1685
1366
val = (recv + (obj & (~1)));
1686
1367
if ((~(recv ^ obj) & (recv ^ val)) &
1687
1368
((VALUE)0x01 << ((sizeof(VALUE) * CHAR_BIT) - 1))) {
1688
val = rb_big_plus(rb_int2big(FIX2INT(recv)),
1689
rb_int2big(FIX2INT(obj)));
1369
val = rb_big_plus(rb_int2big(FIX2LONG(recv)),
1370
rb_int2big(FIX2LONG(obj)));
1381
val = rb_big_plus(rb_int2big(a), rb_int2big(b));
2338
1952
if (!SPECIAL_CONST_P(recv) &&
2339
1953
BASIC_OP_UNREDEFINED_P(BOP_LENGTH)) {
2340
if (HEAP_CLASS_OF(recv) == rb_cArray) {
1954
if (HEAP_CLASS_OF(recv) == rb_cString) {
1955
val = rb_str_length(recv);
1957
else if (HEAP_CLASS_OF(recv) == rb_cArray) {
2341
1958
val = LONG2NUM(RARRAY_LEN(recv));
2343
else if (HEAP_CLASS_OF(recv) == rb_cString) {
2344
val = LONG2NUM(RSTRING_LEN(recv));
2346
1960
else if (HEAP_CLASS_OF(recv) == rb_cHash) {
2347
val = INT2FIX(RHASH(recv)->tbl->num_entries);
1961
val = INT2FIX(RHASH_SIZE(recv));
2350
1964
goto INSN_LABEL(normal_dispatch);
2378
1988
const VALUE obj = INT2FIX(1);
2379
1989
/* fixnum + INT2FIX(1) */
2380
1990
val = (recv + (obj & (~1)));
2381
if ((~(recv ^ obj) & (recv ^ val)) & 0x80000000) {
2382
val = rb_big_plus(rb_int2big(INT2FIX(recv)),
2383
rb_int2big(INT2FIX(obj)));
1991
if ((~(recv ^ obj) & (recv ^ val)) & ((unsigned long)LONG_MAX + 1)) {
1992
val = rb_big_plus(rb_int2big(FIX2LONG(recv)),
1993
rb_int2big(FIX2LONG(obj)));