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); } }
private void CompileConstructors(CompileManager manager) { foreach (Constructor constructor in @class.Constructors) { CompileMethodInfo methodInfo = new ConstructorCompiler(constructor).Compile(manager); manager.AddMethod(methodInfo); } }
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); } }
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(); }
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); }
private void CompileMethods(CompileManager manager) { foreach (Method method in @class.Methods) { CompileMethodInfo methodInfo = new MethodCompiler(method).Compile(manager); manager.AddMethod(methodInfo); } }
private void CompileInterfaces(CompileManager manager) { List<short> interfaces = @class.Interfaces.Select(manager.AddConstantClass).ToList(); manager.SetInterfaces(interfaces); }