Esempio n. 1
0
        public void Compile(CompileManager manager)
        {
            // this class
            short thisClass = manager.AddConstantClass(@class);
            manager.SetThisClass(thisClass);

            // super class
            short superClass = manager.AddConstantClass(@class.Super);
            manager.SetSuperClass(superClass);

            // modifiers
            manager.SetModifiers(@class.Modifiers);

            // interfaces
            CompileInterfaces(manager);

            // fields
            CompileFields(manager);

            // constructors
            CompileConstructors(manager);

            // methods
            CompileMethods(manager);

            //TODO: attributes: SourceFile, Deprecated
        }
        private void CompileBody(CompileManager manager)
        {
            attributes = new List<CompileAttribute>();
            generator = new ByteCodeGenerator(manager, (Method)constructor);

            foreach (Method.Parameter parameter in constructor.Parameters)
            {
                generator.DefineVariable(parameter.Name, parameter.Type);
            }

            new ConstructorBlockCompiler(constructor.Body).Compile(generator);

            attributes.Add(new CompileAttributeCode
            {
                NameIndex = manager.AddConstantUtf8(new CompileAttributeCode().Name),
                Code = generator.GetBytes(),
                Attributes = new List<CompileAttribute>(),
                ExceptionTable = new List<CompileAttributeCode.ExceptionTableEntry>(),
                MaxLocals = generator.MaxVariables,
                MaxStack = generator.MaxStack
            });

            var stackMapTable = generator.StackMapTable;
            if (stackMapTable != null)
            {
                stackMapTable.NameIndex = manager.AddConstantUtf8(stackMapTable.Name);

                attributes.Add(stackMapTable);
            }
        }
Esempio n. 3
0
        private void CompileConstructors(CompileManager manager)
        {
            foreach (Constructor constructor in @class.Constructors)
            {
                CompileMethodInfo methodInfo = new ConstructorCompiler(constructor).Compile(manager);

                manager.AddMethod(methodInfo);
            }
        }
Esempio n. 4
0
        private void CompileFields(CompileManager manager)
        {
            foreach (Field field in @class.Fields)
            {
                var fieldInfo = new CompileFieldInfo();

                short nameIndex = manager.AddConstantUtf8(field.Name);
                short descriptorIndex = manager.AddConstantUtf8(field.ReturnType.GetDescriptor());

                fieldInfo.Modifiers = field.Modifiers;
                fieldInfo.Name = nameIndex;
                fieldInfo.Descriptor = descriptorIndex;
                fieldInfo.Attributes = new List<CompileAttribute>(); //TODO: ConstantValue, Synthetic, Deprecated

                manager.AddField(fieldInfo);
            }
        }
Esempio n. 5
0
        public CompileMethodInfo Compile(CompileManager manager)
        {
            method.Resolve(manager.Imports);

            var methodInfo = new CompileMethodInfo();

            short nameIndex = manager.AddConstantUtf8(method.Name);
            short descriptorIndex = manager.AddConstantUtf8(method.GetDescriptor());

            CompileBody(manager);

            methodInfo.Modifiers = method.Modifiers;
            methodInfo.Name = nameIndex;
            methodInfo.Descriptor = descriptorIndex;
            methodInfo.Attributes = attributes; //TODO: Code, Exceptions, Synthetic, Deprecated

            return methodInfo;
        }
        public byte[] Compile()
        {
            DefinedType type = program.Type;

            var manager = new CompileManager();

            manager.Imports.Add(new Package { Name = type.Package == null || string.IsNullOrEmpty(type.Package.Name) ? "*" : type.Package.Name + ".*" });

            manager.Imports.AddRange(program.Imports);

            if (type is Class)
            {
                new ClassCompiler(type as Class).Compile(manager);
            }
            else
            {
                throw new NotImplementedException();
            }

            return manager.GetBytes();
        }
Esempio n. 7
0
        private void CompileBody(CompileManager manager)
        {
            attributes = new List<CompileAttribute>();
            generator = new ByteCodeGenerator(manager, method);

            foreach (Method.Parameter parameter in method.Parameters)
            {
                generator.DefineVariable(parameter.Name, parameter.Type);
            }

            new BlockCompiler(method.Body).Compile(generator);

            if (method.ReturnType.Name == "void")
            {
                generator.Emit(OpCodeValue.@return);
            }

            var code = new CompileAttributeCode
            {
                NameIndex = manager.AddConstantUtf8(new CompileAttributeCode().Name),
                Code = generator.GetBytes(),
                Attributes = new List<CompileAttribute>(),
                ExceptionTable = new List<CompileAttributeCode.ExceptionTableEntry>(),
                MaxLocals = generator.MaxVariables,
                MaxStack = generator.MaxStack
            };

            var stackMapTable = generator.StackMapTable;
            if (stackMapTable != null)
            {
                stackMapTable.NameIndex = manager.AddConstantUtf8(stackMapTable.Name);

                code.Attributes.Add(stackMapTable);
            }

            attributes.Add(code);
        }
Esempio n. 8
0
        private void CompileMethods(CompileManager manager)
        {
            foreach (Method method in @class.Methods)
            {
                CompileMethodInfo methodInfo = new MethodCompiler(method).Compile(manager);

                manager.AddMethod(methodInfo);
            }
        }
Esempio n. 9
0
        private void CompileInterfaces(CompileManager manager)
        {
            List<short> interfaces = @class.Interfaces.Select(manager.AddConstantClass).ToList();

            manager.SetInterfaces(interfaces);
        }