/// <summary> /// コードを追加します。 /// </summary> /// <param name="code">コード</param> internal void PushCode(KecaknoahILCode code) { codes.Add(code); }
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("無効なメソッド"); } } }