public override void Write(JavaWriter wtr)
            {
                wtr.Where.Push(tag);
                wtr.Write16(wtr.ConstUtf8(tag));
                wtr.Fork();
                wtr.Write16(maxStack);
                wtr.Write16(maxLocals);
                wtr.Write32((uint)code.Length);
                wtr.WriteBlock(code);

                if (exceptions == null)
                {
                    wtr.Write16(0);
                }
                else
                {
                    wtr.Write16(exceptions.Length);
                    for (int i = 0; i < exceptions.Length; i++)
                    {
                        wtr.Write16(exceptions[i].start);
                        wtr.Write16(exceptions[i].endPlus1);
                        wtr.Write16(exceptions[i].handler);
                        wtr.Write16((exceptions[i].catchType == null) ? 0 :
                                    wtr.ConstClass(exceptions[i].catchType));
                    }
                }

                attributes.Write(wtr);
                wtr.Join();
                wtr.Where.Pop();
            }
            public override void Write(JavaWriter wtr)
            {
                int numLines = lines.Length;

                Write(wtr, tag, sizeof(ushort) * (1 + 2 * numLines));
                wtr.Write16(numLines);
                for (int i = 0; i < numLines; i++)
                {
                    wtr.Write16(lines[i].offset);
                    wtr.Write16(lines[i].lineNumber);
                }
            }
            public override void Write(JavaWriter wtr)
            {
                int length = sizeof(ushort) // classes.Length
                             + classes.Length * sizeof(ushort);

                Write(wtr, tag, length);
                wtr.Write16(classes.Length);
                for (int i = 0; i < classes.Length; i++)
                {
                    wtr.Write16(wtr.ConstClass(classes[i]));
                }
            }
            public override void Write(JavaWriter wtr)
            {
                wtr.Write16(wtr.ConstUtf8(tag));
                wtr.Fork();
                wtr.Write16(frames.Length);

                for (int i = 0; i < frames.Length; i++)
                {
                    byte type = frames[i].type;
                    wtr.Write8(type);
                    if (type >= 247)
                    {
                        wtr.Write16(frames[i].deltaOffset);
                    }

                    var locals = frames[i].locals;
                    if (locals == null)
                    {
                        wtr.Write16(0);
                    }
                    else
                    {
                        wtr.Write16(locals.Length);
                        for (int j = 0; j < locals.Length; j++)
                        {
                            byte localType = locals[j].type;
                            wtr.Write8(localType);
                            if (localType >= 7 && localType <= 8)
                            {
                                wtr.Write16(locals[j].extra);
                            }
                        }
                    }

                    var stack = frames[i].stack;
                    if (stack == null)
                    {
                        wtr.Write16(0);
                    }
                    else
                    {
                        wtr.Write16(stack.Length);
                        for (int j = 0; j < stack.Length; j++)
                        {
                            byte stackType = stack[j].type;
                            wtr.Write8(stackType);
                            if (stackType >= 7 && stackType <= 8)
                            {
                                wtr.Write16(stack[j].extra);
                            }
                        }
                    }
                }

                wtr.Join();
            }
            public override void Write(JavaWriter wtr)
            {
                Write(wtr, tag, sizeof(ushort));
                ushort constantIndex;

                if (value is int intValue)
                {
                    constantIndex = wtr.ConstInteger(intValue);
                }
                else if (value is float floatValue)
                {
                    constantIndex = wtr.ConstFloat(floatValue);
                }
                else if (value is long longValue)
                {
                    constantIndex = wtr.ConstLong(longValue);
                }
                else if (value is double doubleValue)
                {
                    constantIndex = wtr.ConstDouble(doubleValue);
                }
                else if (value is string stringValue)
                {
                    constantIndex = wtr.ConstString(stringValue);
                }
                else
                {
                    throw wtr.Where.Exception($"invalid constant value");
                }
                wtr.Write16(constantIndex);
            }
            public override void Write(JavaWriter wtr)
            {
                int length = sizeof(ushort) // classes.Length
                             + classes.Length * sizeof(ushort) * 4;

                Write(wtr, tag, length);
                wtr.Write16(classes.Length);
                for (int i = 0; i < classes.Length; i++)
                {
                    wtr.Write16(wtr.ConstClass(classes[i].InnerLongName));
                    ushort v = (classes[i].OuterLongName == null) ? (ushort)0
                             : wtr.ConstClass(classes[i].OuterLongName);
                    wtr.Write16(v);
                    v = (classes[i].InnerShortName == null) ? (ushort)0
                      : wtr.ConstUtf8(classes[i].InnerShortName);
                    wtr.Write16(v);
                    wtr.Write16((ushort)classes[i].Flags);
                }
            }
Exemple #7
0
 public void Write(JavaWriter wtr)
 {
     wtr.Write16(set.Count);
     foreach (var attr in set)
     {
         wtr.Where.Push($"attribute '{attr.GetType().Name}'");
         attr.Write(wtr);
         wtr.Where.Pop();
     }
 }
Exemple #8
0
        /*
         * JavaFieldWriter
         */



        public void Write(JavaWriter wtr)
        {
            wtr.Where.Push($"field '{Name}'");

            wtr.Write16((ushort)Flags);
            wtr.Write16(wtr.ConstUtf8(Name));
            wtr.Write16(wtr.ConstUtf8(Type.ToDescriptor()));

            if (Constant != null)
            {
                var attributes = new JavaAttributeSet();
                attributes.Put(new JavaAttribute.ConstantValue(Constant));
                attributes.Write(wtr);
            }
            else
            {
                wtr.Write16(0); // attributes
            }
            wtr.Where.Pop();
        }
        public void Write(JavaWriter wtr)
        {
            int n = pool.Count;

            wtr.Write16((ushort)n);
            for (int i = 1; i < n; i++)
            {
                pool[i]?.Write(wtr);
            }
            editable = false;
        }
Exemple #10
0
        public void Write(JavaWriter wtr)
        {
            wtr.Where.Push($"method '{Name}'");

            wtr.Write16((ushort)Flags);
            wtr.Write16(wtr.ConstUtf8(Name));
            wtr.Write16(wtr.ConstUtf8(ToDescriptor()));

            var attributes = new JavaAttributeSet();

            if (Code != null)
            {
                var codeAttr = new JavaAttribute.Code();
                Code.Write(wtr, codeAttr);
                attributes.Put(codeAttr);
            }

            attributes.Write(wtr);

            wtr.Where.Pop();
        }
            public override void Write(JavaWriter wtr)
            {
                int length = sizeof(ushort) // number of entries
                             + vars.Length * sizeof(ushort) * 5;

                Write(wtr, tag, length);
                wtr.Write16(vars.Length);
                for (int i = 0; i < vars.Length; i++)
                {
                    wtr.Write16(vars[i].offset);
                    wtr.Write16(vars[i].length);
                    wtr.Write16(wtr.ConstUtf8(vars[i].nameAndType.Name));
                    wtr.Write16(wtr.ConstUtf8(vars[i].nameAndType.Type.ToDescriptor()));
                    wtr.Write16(vars[i].index);
                }
            }
 public override void Write(JavaWriter wtr)
 {
     Write(wtr, tag, sizeof(ushort));
     wtr.Write16(wtr.ConstUtf8(fileName));
 }
        public void Write(JavaWriter wtr)
        {
            wtr.Where.Push($"writing class '{Name}'");

            if (Name == null)
            {
                throw wtr.Where.Exception("missing class name");
            }

            wtr.Write16((ushort)Flags);
            wtr.Write16(wtr.ConstClass(Name));
            wtr.Write16(wtr.ConstClass(Super));

            if (Interfaces == null)
            {
                wtr.Write16(0);
            }
            else
            {
                wtr.Write16(Interfaces.Count);
                for (int i = 0; i < Interfaces.Count; i++)
                {
                    wtr.Write16(wtr.ConstClass(Interfaces[i]));
                }
            }

            if (Fields == null)
            {
                wtr.Write16(0);
            }
            else
            {
                wtr.Write16(Fields.Count);
                for (int i = 0; i < Fields.Count; i++)
                {
                    Fields[i].Write(wtr);
                }
            }

            if (Methods == null)
            {
                wtr.Write16(0);
            }
            else
            {
                wtr.Write16(Methods.Count);
                for (int i = 0; i < Methods.Count; i++)
                {
                    Methods[i].Write(wtr);
                }
            }

            var attributes = new JavaAttributeSet();

            if (SourceFile != null)
            {
                attributes.Put(new JavaAttribute.SourceFile(SourceFile));
            }

            if (Signature != null)
            {
                attributes.Put(new JavaAttribute.Signature(Signature));
            }

            WriteInnerClasses(attributes);

            if (wtr.bootstrapMethods != null)
            {
                attributes.Put(wtr.bootstrapMethods);
            }

            attributes.Write(wtr);

            wtr.Where.Pop();
        }
 public override void Write(JavaWriter wtr)
 {
     wtr.Write8(tag);
     wtr.Write16(bootstrapMethodIndex);
     wtr.Write16(nameAndTypeIndex);
 }
 public override void Write(JavaWriter wtr)
 {
     wtr.Write8(tag);
     wtr.Write16(descriptorIndex);
 }
 public override void Write(JavaWriter wtr)
 {
     wtr.Write8(tag);
     wtr.Write8(referenceKind);
     wtr.Write16(referenceIndex);
 }
 public void Write(JavaWriter wtr, byte tag)
 {
     wtr.Write8(tag);
     wtr.Write16(classIndex);
     wtr.Write16(nameAndTypeIndex);
 }
 public void Write(JavaWriter wtr, byte tag)
 {
     wtr.Write8(tag);
     wtr.Write16(stringIndex);
 }
 public override void Write(JavaWriter wtr)
 {
     Write(wtr, tag, sizeof(ushort));
     wtr.Write16(wtr.ConstUtf8(descriptor));
 }
            public override void Write(JavaWriter wtr)
            {
                wtr.Write16(wtr.ConstUtf8(tag));
                wtr.Fork();
                wtr.Write16(methods.Length);
                for (int i = 0; i < methods.Length; i++)
                {
                    wtr.Write16(wtr.ConstMethodHandle(methods[i].mh));
                    var args = methods[i].args;
                    wtr.Write16(args.Length);
                    for (int j = 0; j < args.Length; j++)
                    {
                        ushort constantIndex;
                        var    value = args[j];

                        if (value is int intValue)
                        {
                            constantIndex = wtr.ConstInteger(intValue);
                        }

                        else if (value is float floatValue)
                        {
                            constantIndex = wtr.ConstFloat(floatValue);
                        }

                        else if (value is long longValue)
                        {
                            constantIndex = wtr.ConstLong(longValue);
                        }

                        else if (value is double doubleValue)
                        {
                            constantIndex = wtr.ConstDouble(doubleValue);
                        }

                        else if (value is JavaType classValue)
                        {
                            constantIndex = wtr.ConstClass(classValue);
                        }

                        else if (value is string stringValue)
                        {
                            constantIndex = wtr.ConstString(stringValue);
                        }

                        else if (value is JavaMethodHandle methodHandleValue)
                        {
                            constantIndex = wtr.ConstMethodHandle(methodHandleValue);
                        }

                        else if (value is JavaMethodType methodTypeValue)
                        {
                            constantIndex = wtr.ConstMethodType(methodTypeValue);
                        }
                        else
                        {
                            throw wtr.Where.Exception($"invalid constant value");
                        }

                        wtr.Write16(constantIndex);
                    }
                }
                wtr.Join();
            }
 public override void Write(JavaWriter wtr)
 {
     Write(wtr, tag, sizeof(ushort) * 2);
     wtr.Write16(wtr.ConstClass(className));
     wtr.Write16(methodConst);
 }
 public static void Write(JavaWriter wtr, string name, int length)
 {
     wtr.Write16(wtr.ConstUtf8(name));
     wtr.Write32((uint)length);
 }