com.axway.jmb.builders.Fields.java Source code

Java tutorial

Introduction

Here is the source code for com.axway.jmb.builders.Fields.java

Source

// Copyright (c) Axway Inc. All Rights Reserved.
// Please refer to the file "LICENSE" for further important copyright
// and licensing information.  Please also refer to the documentation
// for additional copyright notices.
package com.axway.jmb.builders;

import org.objectweb.asm.ClassVisitor;
import org.objectweb.asm.Type;
import org.objectweb.asm.commons.AdviceAdapter;
import org.objectweb.asm.commons.Method;

import com.axway.jmb.ClassField;
import com.axway.jmb.JMBVariableType;

/**
 * Bytecode generator for java class fields.
 *
 * @author Florin Potera
 */

public class Fields {
    public static void addFieldToClass(int access, ClassField field, AdviceAdapter constructor, ClassVisitor clazz,
            String classFullyQualifiedName) {
        if (field.isArray()) {
            clazz.visitField(access, field.getName(),
                    field.getType().getArrayJvmType(field.getArrayDimension()).getDescriptor(), null, null);

            constructor.push(field.getArrayDimension());
            constructor.newArray(field.getType().getArrayJvmType(field.getArrayDimension()));
            constructor.putField(Type.getType(classFullyQualifiedName), field.getName(),
                    field.getType().getArrayJvmType(field.getArrayDimension()));
        } else {
            if (field.getType() == JMBVariableType.RECORD) {
                clazz.visitField(access, field.getName(), field.getRecordType().getDescriptor(), null, null);

                constructor.newInstance(field.getRecordType());
                constructor.dup();
                constructor.invokeConstructor(field.getRecordType(), Method.getMethod("void <init>()"));

                constructor.putField(Type.getType(classFullyQualifiedName), field.getName(), field.getRecordType());
            } else {
                clazz.visitField(access, field.getName(), field.getType().getJvmType().getDescriptor(), null, null);
            }
            if (field.isInitializationAvailable()) {
                constructor.putField(Type.getType(classFullyQualifiedName), field.getName(),
                        field.getType().getJvmType());
            }
        }
    }
}