KecaknoahILの1つのコードを定義します。
Esempio n. 1
0
 /// <summary>
 /// コードを追加します。
 /// </summary>
 /// <param name="code">コード</param>
 internal void PushCode(KecaknoahILCode code)
 {
     codes.Add(code);
 }
Esempio n. 2
0
        private static KecaknoahScriptMethodInfo ReadMethod(BinaryReader reader)
        {
            string name = null;
            var length = 0;
            var vargs = false;

            while (true)
            {
                switch ((MethodElementType)reader.ReadByte())
                {
                    case MethodElementType.Name:
                        name = reader.ReadString();
                        break;
                    case MethodElementType.ArgumentLength:
                        length = reader.ReadInt32();
                        break;
                    case MethodElementType.VariableArgument:
                        vargs = true;
                        break;
                    case MethodElementType.StartCode:
                        var method = new KecaknoahScriptMethodInfo(name, length, vargs);
                        var il = new KecaknoahIL();
                        method.Codes = il;
                        var count = reader.ReadInt32();
                        for (var i = 0; i < count; i++)
                        {
                            switch (reader.ReadByte())
                            {
                                case 0:
                                    il.PushCode(KecaknoahILCodeType.Nop);
                                    break;
                                case 1:
                                    il.PushCode(KecaknoahILCodeType.PushInteger, reader.ReadInt64());
                                    break;
                                case 2:
                                    il.PushCode(KecaknoahILCodeType.PushString, reader.ReadString());
                                    break;
                                case 3:
                                    il.PushCode(KecaknoahILCodeType.PushSingle, reader.ReadSingle());
                                    break;
                                case 4:
                                    il.PushCode(KecaknoahILCodeType.PushDouble, reader.ReadDouble());
                                    break;
                                case 5:
                                    il.PushCode(KecaknoahILCodeType.PushBoolean, false);
                                    break;
                                case 6:
                                    il.PushCode(KecaknoahILCodeType.PushBoolean, true);
                                    break;
                                case 7:
                                    il.PushCode(KecaknoahILCodeType.PushNil);
                                    break;
                                case 8:
                                    il.PushCode(KecaknoahILCodeType.Pop);
                                    break;
                                case 9:
                                    il.PushCode(KecaknoahILCodeType.Plus);
                                    break;
                                case 10:
                                    il.PushCode(KecaknoahILCodeType.Minus);
                                    break;
                                case 11:
                                    il.PushCode(KecaknoahILCodeType.Multiply);
                                    break;
                                case 12:
                                    il.PushCode(KecaknoahILCodeType.Divide);
                                    break;
                                case 13:
                                    il.PushCode(KecaknoahILCodeType.Modular);
                                    break;
                                case 14:
                                    il.PushCode(KecaknoahILCodeType.And);
                                    break;
                                case 15:
                                    il.PushCode(KecaknoahILCodeType.Or);
                                    break;
                                case 16:
                                    il.PushCode(KecaknoahILCodeType.Xor);
                                    break;
                                case 17:
                                    il.PushCode(KecaknoahILCodeType.Not);
                                    break;
                                case 18:
                                    il.PushCode(KecaknoahILCodeType.Negative);
                                    break;
                                case 19:
                                    il.PushCode(KecaknoahILCodeType.AndAlso);
                                    break;
                                case 20:
                                    il.PushCode(KecaknoahILCodeType.OrElse);
                                    break;
                                case 21:
                                    il.PushCode(KecaknoahILCodeType.LeftBitShift);
                                    break;
                                case 22:
                                    il.PushCode(KecaknoahILCodeType.RightBitShift);
                                    break;
                                case 23:
                                    il.PushCode(KecaknoahILCodeType.Equal);
                                    break;
                                case 24:
                                    il.PushCode(KecaknoahILCodeType.NotEqual);
                                    break;
                                case 25:
                                    il.PushCode(KecaknoahILCodeType.Greater);
                                    break;
                                case 26:
                                    il.PushCode(KecaknoahILCodeType.Lesser);
                                    break;
                                case 27:
                                    il.PushCode(KecaknoahILCodeType.GreaterEqual);
                                    break;
                                case 28:
                                    il.PushCode(KecaknoahILCodeType.LesserEqual);
                                    break;
                                case 29:
                                    il.PushCode(KecaknoahILCodeType.Assign);
                                    break;
                                case 30:
                                    il.PushCode(KecaknoahILCodeType.Jump, reader.ReadInt32());
                                    break;
                                case 31:
                                    il.PushCode(KecaknoahILCodeType.TrueJump, reader.ReadInt32());
                                    break;
                                case 32:
                                    il.PushCode(KecaknoahILCodeType.FalseJump, reader.ReadInt32());
                                    break;
                                case 33:
                                    il.PushCode(KecaknoahILCodeType.Return);
                                    break;
                                case 34:
                                    il.PushCode(KecaknoahILCodeType.Yield);
                                    break;
                                case 35:
                                    il.PushCode(KecaknoahILCodeType.Call, reader.ReadInt32());
                                    break;
                                case 36:
                                    il.PushCode(KecaknoahILCodeType.IndexerCall, reader.ReadInt32());
                                    break;
                                case 37:
                                    il.PushCode(KecaknoahILCodeType.PushArgument, reader.ReadInt32());
                                    break;
                                case 38:
                                    il.PushCode(KecaknoahILCodeType.LoadObject, reader.ReadString());
                                    break;
                                case 39:
                                    il.PushCode(KecaknoahILCodeType.LoadMember, reader.ReadString());
                                    break;
                                case 40:
                                    il.PushCode(KecaknoahILCodeType.AsValue);
                                    break;
                                case 41:
                                    il.PushCode(KecaknoahILCodeType.LoadVarg, reader.ReadInt32());
                                    break;
                                case 42:
                                    var code = new KecaknoahILCode() { Type = KecaknoahILCodeType.StartCoroutine };
                                    code.StringValue = reader.ReadString();
                                    code.IntegerValue = reader.ReadInt32();
                                    il.PushCode(code);
                                    break;
                                case 43:
                                    il.PushCode(new KecaknoahILCode()
                                    {
                                        Type = KecaknoahILCodeType.ResumeCoroutine,
                                        StringValue = reader.ReadString(),
                                        BooleanValue = false
                                    });
                                    break;
                                case 44:
                                    il.PushCode(new KecaknoahILCode()
                                    {
                                        Type = KecaknoahILCodeType.ResumeCoroutine,
                                        StringValue = reader.ReadString(),
                                        BooleanValue = true
                                    });
                                    break;
                                case 45:
                                    il.PushCode(KecaknoahILCodeType.MakeArray, reader.ReadInt32());
                                    break;
                                case 46:
                                    il.PushCode(KecaknoahILCodeType.PlusAssign);
                                    break;
                                case 47:
                                    il.PushCode(KecaknoahILCodeType.MinusAssign);
                                    break;
                                case 48:
                                    il.PushCode(KecaknoahILCodeType.MultiplyAssign);
                                    break;
                                case 49:
                                    il.PushCode(KecaknoahILCodeType.DivideAssign);
                                    break;
                                case 50:
                                    il.PushCode(KecaknoahILCodeType.AndAssign);
                                    break;
                                case 51:
                                    il.PushCode(KecaknoahILCodeType.OrAssign);
                                    break;
                                case 52:
                                    il.PushCode(KecaknoahILCodeType.XorAssign);
                                    break;
                                case 53:
                                    il.PushCode(KecaknoahILCodeType.ModularAssign);
                                    break;
                                case 54:
                                    il.PushCode(KecaknoahILCodeType.LeftBitShiftAssign);
                                    break;
                                case 55:
                                    il.PushCode(KecaknoahILCodeType.RightBitShiftAssign);
                                    break;
                                case 56:
                                    il.PushCode(KecaknoahILCodeType.NilAssign);
                                    break;
                                default:
                                    throw new InvalidDataException("危険オペコードにはダマされない!!近づかない!!");
                            }
                        }

                        return method;
                    default:
                        throw new InvalidDataException("無効なメソッド");
                }
            }
        }
Esempio n. 3
0
 /// <summary>
 /// コードを追加します。
 /// </summary>
 /// <param name="code">コード</param>
 internal void PushCode(KecaknoahILCode code)
 {
     codes.Add(code);
 }