Mercurial > hg > graal-compiler
diff graal/com.oracle.truffle.codegen.processor/src/com/oracle/truffle/codegen/processor/node/SpecializationData.java @ 8251:cb70ed101b5f
Added automatic generation of generic specialization which throws unsupported operation if reached.
author | Christian Humer <christian.humer@gmail.com> |
---|---|
date | Wed, 13 Mar 2013 11:32:43 +0100 |
parents | d81ff782fa1a |
children | 0905d796944a |
line wrap: on
line diff
--- a/graal/com.oracle.truffle.codegen.processor/src/com/oracle/truffle/codegen/processor/node/SpecializationData.java Tue Mar 12 11:38:52 2013 +0100 +++ b/graal/com.oracle.truffle.codegen.processor/src/com/oracle/truffle/codegen/processor/node/SpecializationData.java Wed Mar 13 11:32:43 2013 +0100 @@ -25,6 +25,7 @@ import java.util.*; import com.oracle.truffle.api.codegen.*; +import com.oracle.truffle.codegen.processor.*; import com.oracle.truffle.codegen.processor.template.*; public class SpecializationData extends TemplateMethod { @@ -38,11 +39,14 @@ private boolean useSpecializationsForGeneric = true; private NodeData node; + private final boolean synthetic; + public SpecializationData(TemplateMethod template, int order, List<SpecializationThrowsData> exceptions) { super(template); this.order = order; this.generic = false; this.uninitialized = false; + this.synthetic = false; this.exceptions = exceptions; for (SpecializationThrowsData exception : exceptions) { @@ -50,13 +54,34 @@ } } - public SpecializationData(TemplateMethod template, boolean generic, boolean uninitialized) { + public SpecializationData(TemplateMethod template, boolean generic, boolean uninitialized, boolean synthetic) { super(template); this.order = Specialization.DEFAULT_ORDER; this.generic = generic; this.uninitialized = uninitialized; this.exceptions = Collections.emptyList(); this.guards = new SpecializationGuardData[0]; + this.synthetic = synthetic; + } + + public boolean hasRewrite(ProcessorContext context) { + if (getExceptions().size() > 0) { + return true; + } + if (getGuards().length > 0) { + return true; + } + for (ActualParameter parameter : getParameters()) { + NodeFieldData field = getNode().findField(parameter.getSpecification().getName()); + if (field == null) { + continue; + } + ExecutableTypeData type = field.getNodeData().findExecutableType(parameter.getActualTypeData(field.getNodeData().getTypeSystem())); + if (type.hasUnexpectedValue(context)) { + return true; + } + } + return false; } public NodeData getNode() { @@ -71,6 +96,10 @@ this.guards = guards; } + public boolean isSynthetic() { + return synthetic; + } + public int getOrder() { return order; }