ActionBase IActionVisitor <ushort, ActionBase> .Visit(ActionDefineFunction2 action, ushort length) { action.Name = _reader.ReadString(); var args = _reader.ReadUInt16(); action.RegisterCount = _reader.ReadByte(); action.PreloadParent = _reader.ReadBit(); action.PreloadRoot = _reader.ReadBit(); action.SuppressSuper = _reader.ReadBit(); action.PreloadSuper = _reader.ReadBit(); action.SuppressArguments = _reader.ReadBit(); action.PreloadArguments = _reader.ReadBit(); action.SuppressThis = _reader.ReadBit(); action.PreloadThis = _reader.ReadBit(); action.Reserved = (byte)_reader.ReadUnsignedBits(7); action.PreloadGlobal = _reader.ReadBit(); for (var i = 0; i < args; i++) { action.Parameters.Add(new RegisterParam { Register = _reader.ReadByte(), Name = _reader.ReadString() }); } var codeSize = _reader.ReadUInt16(); var pos = _reader.Position; while ((_reader.Position - pos) < codeSize) { var subaction = ReadAction(); action.Actions.Add(subaction); } return(action); }
object IActionVisitor <ISwfStreamWriter, object> .Visit(ActionDefineFunction2 action, ISwfStreamWriter writer) { writer.WriteString(action.Name ?? ""); writer.WriteUInt16((ushort)action.Parameters.Count); writer.WriteByte(action.RegisterCount); writer.WriteBit(action.PreloadParent); writer.WriteBit(action.PreloadRoot); writer.WriteBit(action.SuppressSuper); writer.WriteBit(action.PreloadSuper); writer.WriteBit(action.SuppressArguments); writer.WriteBit(action.PreloadArguments); writer.WriteBit(action.SuppressThis); writer.WriteBit(action.PreloadThis); writer.WriteUnsignedBits(action.Reserved, 7); writer.WriteBit(action.PreloadGlobal); foreach (var arg in action.Parameters) { writer.WriteByte(arg.Register); writer.WriteString(arg.Name); } var mem = new MemoryStream(); var subWriter = new ActionWriter(new SwfStreamWriter(mem)); foreach (var subAction in action.Actions) { subWriter.WriteAction(subAction); } writer.WriteUInt16((ushort)mem.Length); return(mem.ToArray()); }