From c5b1e85c2ebb5df7590b2e744ae6aa764247104a Mon Sep 17 00:00:00 2001 From: Jimmy Zhuo Date: Wed, 17 Jul 2013 20:54:09 +0800 Subject: [PATCH] added assign and assignunchecked ops --- lib/MAST/Ops.nqp | 14 +++++++++ nqp-cc/src/QASTOperationsMAST.nqp | 2 ++ src/core/interp.c | 52 ++++++++++++++++++++++--------- src/core/oplist | 2 ++ src/core/ops.c | 14 ++++++++- src/core/ops.h | 2 ++ 6 files changed, 71 insertions(+), 15 deletions(-) diff --git a/lib/MAST/Ops.nqp b/lib/MAST/Ops.nqp index b3f27c3f65..655b02ea6f 100644 --- a/lib/MAST/Ops.nqp +++ b/lib/MAST/Ops.nqp @@ -1324,6 +1324,20 @@ class MAST::Ops { $MVM_operand_write_reg +| $MVM_operand_int64, $MVM_operand_read_reg +| $MVM_operand_num64 ] + ), + 'assign', nqp::hash( + 'code', 174, + 'operands', [ + $MVM_operand_read_reg +| $MVM_operand_obj, + $MVM_operand_read_reg +| $MVM_operand_obj + ] + ), + 'assignunchecked', nqp::hash( + 'code', 175, + 'operands', [ + $MVM_operand_read_reg +| $MVM_operand_obj, + $MVM_operand_read_reg +| $MVM_operand_obj + ] ) ], [ diff --git a/nqp-cc/src/QASTOperationsMAST.nqp b/nqp-cc/src/QASTOperationsMAST.nqp index d8a37acb52..5b5d4be1aa 100644 --- a/nqp-cc/src/QASTOperationsMAST.nqp +++ b/nqp-cc/src/QASTOperationsMAST.nqp @@ -1591,6 +1591,8 @@ QAST::MASTOperations.add_core_moarop_mapping('settypecache', 'settypecache', 0); QAST::MASTOperations.add_core_moarop_mapping('isinvokable', 'isinvokable'); QAST::MASTOperations.add_core_moarop_mapping('setinvokespec', 'setinvokespec', 0); QAST::MASTOperations.add_core_moarop_mapping('setcontspec', 'setcontspec', 0); +QAST::MASTOperations.add_core_moarop_mapping('assign', 'assign', 0); +QAST::MASTOperations.add_core_moarop_mapping('assignunchecked', 'assignunchecked', 0); # defined - overridden by HLL, but by default same as .DEFINITE. QAST::MASTOperations.add_core_moarop_mapping('defined', 'isconcrete'); diff --git a/src/core/interp.c b/src/core/interp.c index c607ac3683..740a4b524c 100644 --- a/src/core/interp.c +++ b/src/core/interp.c @@ -1007,24 +1007,48 @@ void MVM_interp_run(MVMThreadContext *tc, void (*initial_invoke)(MVMThreadContex cur_op += 6; break; } - case MVM_OP_ceil_n: - { - MVMnum64 num = GET_REG(cur_op, 2).n64; - MVMint64 abs = (MVMint64)num; - if (num > abs) num = ++abs; - GET_REG(cur_op, 0).i64 = num; - cur_op += 4; + case MVM_OP_ceil_n:{ + MVMnum64 num = GET_REG(cur_op, 2).n64; + MVMint64 abs = (MVMint64)num; + if (num > abs) num = ++abs; + GET_REG(cur_op, 0).i64 = num; + cur_op += 4; + break; + } + case MVM_OP_floor_n: { + MVMnum64 num = GET_REG(cur_op, 2).n64; + MVMint64 abs = (MVMint64)num; + if (num < abs) num = --abs; + GET_REG(cur_op, 0).i64 = num; + cur_op += 4; + break; + } + case MVM_OP_assign: { + MVMObject *cont = GET_REG(cur_op, 0).o; + MVMRegister value; + MVMContainerSpec *spec = STABLE(cont)->container_spec; + if (spec) { + DECONT(tc, GET_REG(cur_op, 2).o, value); + spec->store(tc, cont, value.o); + } else { + MVM_exception_throw_adhoc(tc, "Cannot assign to an immutable value"); } + cur_op += 4; break; - case MVM_OP_floor_n: - { - MVMnum64 num = GET_REG(cur_op, 2).n64; - MVMint64 abs = (MVMint64)num; - if (num < abs) num = --abs; - GET_REG(cur_op, 0).i64 = num; - cur_op += 4; + } + case MVM_OP_assignunchecked: { + MVMObject *cont = GET_REG(cur_op, 0).o; + MVMRegister value; + MVMContainerSpec *spec = STABLE(cont)->container_spec; + if (spec) { + DECONT(tc, GET_REG(cur_op, 2).o, value); + spec->store_unchecked(tc, cont, value.o); + } else { + MVM_exception_throw_adhoc(tc, "Cannot assign to an immutable value"); } + cur_op += 4; break; + } default: { MVM_panic(MVM_exitcode_invalidopcode, "Invalid opcode executed (corrupt bytecode stream?) bank %u opcode %u", MVM_OP_BANK_primitives, *(cur_op-1)); diff --git a/src/core/oplist b/src/core/oplist index 700b5b3a43..8ab7e86f5e 100644 --- a/src/core/oplist +++ b/src/core/oplist @@ -173,6 +173,8 @@ BANK 0 primitives 0xAB lexprimspec w(int64) r(obj) r(str) 0xAC ceil_n w(int64) r(num64) 0xAD floor_n w(int64) r(num64) +0xAE assign r(obj) r(obj) +0xAF assignunchecked r(obj) r(obj) BANK 1 dev 0x00 sleep r(int64) diff --git a/src/core/ops.c b/src/core/ops.c index e32c8a937d..0f6d9a8713 100644 --- a/src/core/ops.c +++ b/src/core/ops.c @@ -1052,6 +1052,18 @@ static MVMOpInfo MVM_op_info_primitives[] = { 2, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_num64 } }, + { + MVM_OP_assign, + "assign", + 2, + { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } + }, + { + MVM_OP_assignunchecked, + "assignunchecked", + 2, + { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } + }, }; static MVMOpInfo MVM_op_info_dev[] = { { @@ -3125,7 +3137,7 @@ static MVMOpInfo *MVM_op_info[] = { static unsigned char MVM_op_banks = 8; static unsigned char MVM_opcounts_by_bank[] = { - 174, + 176, 2, 52, 55, diff --git a/src/core/ops.h b/src/core/ops.h index c1d3ea2093..96332b3ed4 100644 --- a/src/core/ops.h +++ b/src/core/ops.h @@ -185,6 +185,8 @@ #define MVM_OP_lexprimspec 171 #define MVM_OP_ceil_n 172 #define MVM_OP_floor_n 173 +#define MVM_OP_assign 174 +#define MVM_OP_assignunchecked 175 /* Op name defines for bank dev. */ #define MVM_OP_sleep 0