From 60c38a1ecbbe0c1702ce613dfba6165585de2709 Mon Sep 17 00:00:00 2001 From: "hyunghwan.chung" Date: Sun, 5 Feb 2017 15:05:25 +0000 Subject: [PATCH] added make_association, pop_into_association_key, pop_into_association_value byte codes to support assocation expressions --- moo/kernel/Mill.moo | 23 +++++++++++++++++++++-- moo/lib/comp.c | 1 - moo/lib/decode.c | 12 ++++++++++++ moo/lib/exec.c | 39 +++++++++++++++++++++++++++++++++++++++ moo/lib/moo-prv.h | 7 +++++-- 5 files changed, 77 insertions(+), 5 deletions(-) diff --git a/moo/kernel/Mill.moo b/moo/kernel/Mill.moo index 5b18f17..76a0e75 100644 --- a/moo/kernel/Mill.moo +++ b/moo/kernel/Mill.moo @@ -215,14 +215,33 @@ class MyObject(Object) ## end of elimination. a :=999. - a := #{ + a := #{ 1, 2, a, 4, 1 + 1, - 2 + 2 + #{ 1, 2, #{a, a := a + 1, a, if (a > 10) { a + 20 } }, 3}, + 2 + 2, + #'a b c' }. + + (* Dictionary ??? + a := #{ + "a": 20, + b : 30 + }. + a := #{ + { key, value }, + { key, value }, + { key, value }, + { key, value } + } + *) + + abc := { key, value }. + { key, value } dump. + a do: [ :v | v dump]. (* diff --git a/moo/lib/comp.c b/moo/lib/comp.c index 9531cac..697aea5 100644 --- a/moo/lib/comp.c +++ b/moo/lib/comp.c @@ -3993,7 +3993,6 @@ static int compile_array_expression (moo_t* moo) index = 0; do { -/* TODO: check if index exceeds the index that the BCODE_POP_INTO_ARRAY and BCODE_MAKE_ARRAY can support */ if (compile_method_expression (moo, 0) <= -1) return -1; if (emit_single_param_instruction (moo, BCODE_POP_INTO_ARRAY, index) <= -1) return -1; index++; diff --git a/moo/lib/decode.c b/moo/lib/decode.c index 06d96dc..fc2124b 100644 --- a/moo/lib/decode.c +++ b/moo/lib/decode.c @@ -488,6 +488,18 @@ int moo_decode (moo_t* moo, moo_oop_method_t mth, const moo_oocs_t* classfqn) break; /* -------------------------------------------------------- */ + case BCODE_MAKE_ASSOCIATION: + LOG_INST_0 (moo, "make_association"); + break; + + case BCODE_POP_INTO_ASSOCIATION_KEY: + LOG_INST_0 (moo, "pop_into_association_key"); + break; + + case BCODE_POP_INTO_ASSOCIATION_VALUE: + LOG_INST_0 (moo, "pop_into_association_value"); + break; + case BCODE_MAKE_ARRAY: FETCH_PARAM_CODE_TO (moo, b1); LOG_INST_1 (moo, "make_array %zu", b1); diff --git a/moo/lib/exec.c b/moo/lib/exec.c index 6d61c36..76348b6 100644 --- a/moo/lib/exec.c +++ b/moo/lib/exec.c @@ -3795,6 +3795,45 @@ int moo_execute (moo_t* moo) break; /* -------------------------------------------------------- */ + case BCODE_MAKE_ASSOCIATION: + { + moo_oop_t t; + + LOG_INST_0 (moo, "make_association"); + + t = moo_instantiate (moo, moo->_association, MOO_NULL, 0); + if (!t) goto oops; + + MOO_STACK_PUSH (moo, t); /* push the association created */ + break; + } + + case BCODE_POP_INTO_ASSOCIATION_KEY: + { + moo_oop_t t1, t2; + + LOG_INST_0 (moo, "pop_into_association_key"); + + t1 = MOO_STACK_GETTOP(moo); + MOO_STACK_POP (moo); + t2 = MOO_STACK_GETTOP(moo); + ((moo_oop_association_t)t2)->key = t1; + break; + } + + case BCODE_POP_INTO_ASSOCIATION_VALUE: + { + moo_oop_t t1, t2; + + LOG_INST_0 (moo, "pop_into_association_value"); + + t1 = MOO_STACK_GETTOP(moo); + MOO_STACK_POP (moo); + t2 = MOO_STACK_GETTOP(moo); + ((moo_oop_association_t)t2)->value = t1; + break; + } + case BCODE_MAKE_ARRAY: { moo_oop_t t; diff --git a/moo/lib/moo-prv.h b/moo/lib/moo-prv.h index e567fa9..4c71085 100644 --- a/moo/lib/moo-prv.h +++ b/moo/lib/moo-prv.h @@ -858,8 +858,11 @@ enum moo_bcode_t BCODE_STORE_INTO_OBJVAR_X = 0xE8, /* 232 ## */ BCODE_POP_INTO_OBJVAR_X = 0xEC, /* 236 ## */ - BCODE_SEND_MESSAGE_X = 0xF0, /* 240 ## */ - BCODE_SEND_MESSAGE_TO_SUPER_X = 0xF4, /* 244 ## */ + BCODE_SEND_MESSAGE_X = 0xF0, /* 240 ## */ + BCODE_MAKE_ASSOCIATION = 0xF1, /* 241 */ + BCODE_POP_INTO_ASSOCIATION_KEY = 0xF2, /* 242 */ + BCODE_POP_INTO_ASSOCIATION_VALUE = 0xF3, /* 243 */ + BCODE_SEND_MESSAGE_TO_SUPER_X = 0xF4, /* 244 ## */ /* -------------------------------------- */