コード例 #1
0
ファイル: HFlash.cs プロジェクト: SirJamal/Sulakore
        protected void InsertEarlyReturnLocal(ASMethod method, byte local)
        {
            OPCode getLocal = (local + OPCode.GetLocal_0);

            ASCode code = method.Body.Code;
            if (code[0] == (byte)getLocal &&
                code[1] == (byte)OPCode.ReturnValue)
                return;

            method.Body.Code.InsertInstruction(0, getLocal);
            method.Body.Code.InsertInstruction(1, OPCode.ReturnValue);
        }
コード例 #2
0
ファイル: HFlash.cs プロジェクト: SirJamal/Sulakore
        protected void RemoveHostSuffix(ABCFile abc, ASMethod connectMethod)
        {
            ASCode connectCode = connectMethod.Body.Code;
            using (var inCode = new FlashReader(connectCode.ToArray()))
            using (var outCode = new FlashWriter(inCode.Length))
            {
                int ifNeCount = 0;
                while (inCode.Position != inCode.Length)
                {
                    OPCode op = inCode.ReadOP();
                    outCode.WriteOP(op);
                    if (op == OPCode.IfNe && ++ifNeCount == 2)
                    {
                        var iFNeJumpCount = (int)inCode.ReadS24();
                        outCode.WriteS24(iFNeJumpCount + 6);
                        continue;
                    }
                    else if (op != OPCode.PushInt) continue;

                    int pushIntIndex = inCode.Read7BitEncodedInt();
                    int integerValue = abc.Constants.Integers[pushIntIndex];
                    switch (integerValue)
                    {
                        case 65244:
                        case 65185:
                        case 65191:
                        case 65189:
                        case 65188:
                        case 65174:
                        case 65238:
                        case 65184:
                        case 65171:
                        case 65172:
                        {
                            pushIntIndex = abc.Constants.PushInteger(65290);
                            break;
                        }
                    }
                    outCode.Write7BitEncodedInt(pushIntIndex);
                }
                connectCode.Clear();
                connectCode.AddRange(outCode.ToArray());
            }
            RemoveDeadFalseConditions(connectCode);
        }
コード例 #3
0
ファイル: HFlash.cs プロジェクト: SirJamal/Sulakore
        protected void InsertEarlyReturnTrue(ASMethod method)
        {
            ASCode code = method.Body.Code;
            if (code[0] == (byte)OPCode.PushTrue &&
                code[1] == (byte)OPCode.ReturnValue)
                return;

            method.Body.Code.InsertInstruction(0, OPCode.PushTrue);
            method.Body.Code.InsertInstruction(1, OPCode.ReturnValue);
        }
コード例 #4
0
ファイル: ShockwaveFlash.cs プロジェクト: SirJamal/Sulakore
        private void WriteMethod(BinaryWriter writer, ASMethod method)
        {
            ASMethodBody body = method.Body;
            writer.Write(body.Traits.Count);
            writer.Write(body.Exceptions.Count);
            writer.Write(body.MaxStack);
            writer.Write(body.LocalCount);
            writer.Write(body.MaxScopeDepth);
            writer.Write(body.InitialScopeDepth);
            writer.Write(body.Method.Parameters.Count);

            foreach (ASParameter parameter in body.Method.Parameters)
            {
                switch (parameter.Type.ObjName)
                {
                    case "int":
                    case "Class":
                    case "Array":
                    case "String":
                    case "Boolean":
                    case "Function":
                    {
                        writer.Write(parameter.Type.ObjName);
                        break;
                    }
                }

                writer.Write(parameter.IsOptional);
                if (parameter.IsOptional)
                    writer.Write((byte)parameter.ValueType);
            }

            ASCode code = body.Code;
            writer.Write("OPERATIONS");
            using (var inCode = new FlashReader(code.ToArray()))
            {
                string instructions = string.Empty;
                while (inCode.Position != inCode.Length)
                {
                    OPCode op = inCode.ReadOP();
                    inCode.ReadValues(op);

                    instructions += (op + "\r\n");
                    writer.Write((byte)op);
                }
            }
        }