示例#1
0
 call(KurumiScript script, KurumiValueList args)
 {
     reference.call(script, args);
 }
示例#2
0
    execute_command(KurumiCommand command)
    {
        //Console.WriteLine("execute_command: {0}", command.command_type.ToString());
        //stack_debug();
        switch (command.command_type)
        {
        case KurumiCommandType.JMPIN: {
            KurumiValue jmpp = expression[vp++];
            KurumiValue expv = value_stack[--sp];
            if (expv.to_bool() == false)
            {
                vp = (int)jmpp.to_number();
            }
            break;
        }

        case KurumiCommandType.JMP: {
            KurumiValue jmpp = expression[vp++];
            vp = (int)jmpp.to_number();
            break;
        }

        case KurumiCommandType.ASSIGN: {
            KurumiValue rexp = value_stack[--sp];
            KurumiValue lexp = value_stack[--sp];
            ((KurumiReference)lexp).reference = rexp.clone();
            break;
        }

        case KurumiCommandType.ADD: {
            KurumiValue rexp = value_stack[--sp].dereference();
            KurumiValue lexp = value_stack[--sp].dereference();
            value_stack[sp++] = rexp.add(lexp);
            break;
        }

        case KurumiCommandType.SUB: {
            KurumiValue rexp = value_stack[--sp].dereference();
            KurumiValue lexp = value_stack[--sp].dereference();
            value_stack[sp] = lexp.sub(rexp);
            sp++;
            break;
        }

        case KurumiCommandType.MUL: {
            KurumiValue rexp = value_stack[--sp].dereference();
            KurumiValue lexp = value_stack[--sp].dereference();
            value_stack[sp++] = lexp.mul(rexp);
            break;
        }

        case KurumiCommandType.DIV: {
            KurumiValue rexp = value_stack[--sp].dereference();
            KurumiValue lexp = value_stack[--sp].dereference();
            value_stack[sp++] = lexp.div(rexp);
            break;
        }

        case KurumiCommandType.EQUAL: {
            KurumiValue rexp = value_stack[--sp].dereference();
            KurumiValue lexp = value_stack[--sp].dereference();
            value_stack[sp++] = lexp.equal(rexp);
            break;
        }

        case KurumiCommandType.NOTEQ: {
            KurumiValue rexp = value_stack[--sp].dereference();
            KurumiValue lexp = value_stack[--sp].dereference();
            value_stack[sp++] = lexp.noteq(rexp);
            break;
        }

        case KurumiCommandType.GTHAN: {
            KurumiValue rexp = value_stack[--sp].dereference();
            KurumiValue lexp = value_stack[--sp].dereference();
            value_stack[sp++] = lexp.gthan(rexp);
            break;
        }

        case KurumiCommandType.LTHAN: {
            KurumiValue rexp = value_stack[--sp].dereference();
            KurumiValue lexp = value_stack[--sp].dereference();
            value_stack[sp++] = lexp.lthan(rexp);
            break;
        }

        case KurumiCommandType.GOREQ: {
            KurumiValue rexp = value_stack[--sp].dereference();
            KurumiValue lexp = value_stack[--sp].dereference();
            value_stack[sp++] = lexp.goreq(rexp);
            break;
        }

        case KurumiCommandType.LOREQ: {
            KurumiValue rexp = value_stack[--sp].dereference();
            KurumiValue lexp = value_stack[--sp].dereference();
            value_stack[sp++] = lexp.loreq(rexp);
            break;
        }

        case KurumiCommandType.CALL: {
            KurumiValue     func = value_stack[--sp];
            KurumiValue     retc = expression[vp++];
            KurumiValue     size = expression[vp++];
            int             sz   = (int)size.to_number();
            int             rc   = (int)retc.to_number();
            KurumiValueList args = new KurumiValueList();
            if (sz > 0)
            {
                for (int i = 0; i < sz; i++)
                {
                    args.add(value_stack[--sp].dereference());
                }
            }
            func.call(this, args);
            if (rc > 0)
            {
                value_stack[sp++] = args.top();
            }
            break;
        }

        case KurumiCommandType.REF: {
            KurumiValue refv = expression[vp++];
            value_stack[sp++] = data[(int)refv.to_number()];
            break;
        }
        }
        //Console.WriteLine("after_execute_command");
        //stack_debug();
    }