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); }
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); }
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); }
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); } } }