blob: 08e4a146c20a8489c3f619ae0c014666f34a0521 [file] [log] [blame]
/*
* Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
package jdk.test.lib.jittester.factories;
import java.util.Iterator;
import java.util.LinkedList;
import jdk.test.lib.jittester.IRNode;
import jdk.test.lib.jittester.ProductionFailedException;
import jdk.test.lib.jittester.ProductionParams;
import jdk.test.lib.jittester.Symbol;
import jdk.test.lib.jittester.SymbolTable;
import jdk.test.lib.jittester.Type;
import jdk.test.lib.jittester.TypeList;
import jdk.test.lib.jittester.classes.Interface;
import jdk.test.lib.jittester.functions.FunctionInfo;
import jdk.test.lib.jittester.types.TypeKlass;
import jdk.test.lib.jittester.utils.PseudoRandom;
class InterfaceFactory extends Factory<Interface> {
private final String name;
private final int memberFunctionsLimit;
private final int memberFunctionsArgLimit;
private final int level;
private TypeKlass parent = null;
InterfaceFactory(String name, int memberFunctionsLimit, int memberFuncArgLimit, int lvl) {
this.name = name;
this.memberFunctionsLimit = memberFunctionsLimit;
this.memberFunctionsArgLimit = memberFuncArgLimit;
this.level = lvl;
}
@Override
public Interface produce() throws ProductionFailedException {
TypeKlass thisKlass;
// Do we want to inherit something?
if (!ProductionParams.disableInheritance.value()) {
// Grab all Klasses from the TypeList and select one to be a parent
LinkedList<Type> types = new LinkedList<>(TypeList.getAll());
for (Iterator<Type> i = types.iterator(); i.hasNext();) {
Type klass = i.next();
if (!(klass instanceof TypeKlass) || !((TypeKlass) klass).isInterface()) {
i.remove();
}
}
PseudoRandom.shuffle(types);
if (!types.isEmpty()) {
parent = (TypeKlass) types.getFirst();
}
}
thisKlass = new TypeKlass(name, TypeKlass.INTERFACE);
if (parent != null) {
thisKlass.addParent(parent.getName());
thisKlass.setParent(parent);
parent.addChild(name);
for (Symbol symbol : SymbolTable.getAllCombined(parent, FunctionInfo.class)) {
FunctionInfo functionInfo = (FunctionInfo) symbol.deepCopy();
functionInfo.owner = thisKlass;
functionInfo.argTypes.get(0).type = thisKlass;
SymbolTable.add(functionInfo);
}
}
IRNode functionDeclarations = null;
try {
functionDeclarations = new IRNodeBuilder().setOwnerKlass(thisKlass)
.setMemberFunctionsLimit(memberFunctionsLimit)
.setMemberFunctionsArgLimit(memberFunctionsArgLimit)
.setLevel(level + 1)
.getFunctionDeclarationBlockFactory()
.produce();
} finally {
TypeList.add(thisKlass);
}
return new Interface(parent, name, level, functionDeclarations);
}
}