private List<IfTriple> initializeCaches(FrameState frameState, SpecializationGroup group, Collection<CacheExpression> caches, NodeExecutionMode mode, boolean store, boolean forcePersist) { if (mode != NodeExecutionMode.SLOW_PATH || group.getSpecialization() == null) { return Collections.emptyList(); } List<IfTriple> triples = new ArrayList<>(); if (!caches.isEmpty()) { // preinitialize caches for guards in local variables for (CacheExpression cache : caches) { triples.addAll(initializeCasts(frameState, group, cache.getExpression(), mode)); triples.addAll(persistAndInitializeCache(frameState, group.getSpecialization(), cache, store, forcePersist)); } } return triples; }
private List<IfTriple> initializeCasts(FrameState frameState, SpecializationGroup group, DSLExpression expression, NodeExecutionMode specializationExecution) { Set<VariableElement> boundElements = expression.findBoundVariableElements(); if (boundElements.isEmpty()) { return Collections.emptyList(); } List<IfTriple> triples = new ArrayList<>(); for (VariableElement variable : boundElements) { Parameter p = group.getSpecialization().findByVariable(variable); if (p != null) { NodeExecutionData execution = p.getSpecification().getExecution(); if (execution != null) { LocalVariable var = frameState.getValue(execution); if (var == null) { throw new AssertionError(); } IfTriple triple = createTypeCheckOrCast(frameState, group, new TypeGuard(p.getType(), execution.getIndex()), specializationExecution, true, false); if (triple != null) { triples.add(triple); } } } } return triples; }
private List<IfTriple> createAssumptionSlowPathTriples(FrameState frameState, SpecializationGroup group, AssumptionExpression assumption) throws AssertionError { List<IfTriple> triples = new ArrayList<>(); LocalVariable var = frameState.get(assumption.getId()); CodeTree declaration = null; if (var == null) { triples.addAll(initializeCaches(frameState, group, group.getSpecialization().getBoundCaches(assumption.getExpression()), NodeExecutionMode.SLOW_PATH, true, false)); CodeTree assumptionExpressions = DSLExpressionGenerator.write(assumption.getExpression(), null, castBoundTypes(bindExpressionValues(frameState, assumption.getExpression(), group.getSpecialization()))); String name = createAssumptionFieldName(group.getSpecialization(), assumption); var = new LocalVariable(assumption.getExpression().getResolvedType(), name.substring(0, name.length() - 1), null); frameState.set(assumption.getId(), var); declaration = var.createDeclaration(assumptionExpressions); } triples.add(new IfTriple(declaration, createAssumptionGuard(assumption, var.createReference()), null)); return triples; }
boolean guardStateBit = false; List<IfTriple> innerTriples = new ArrayList<>(); if (guardNeedsStateBit(group.getSpecialization(), guard)) { if (group.getSpecialization() == null) { throw new AssertionError(); innerTriples.addAll(initializeSpecializationClass(frameState, group.getSpecialization())); innerTriples.addAll(persistSpecializationClass(frameState, group.getSpecialization())); guardStateBit = true; innerTriples.addAll(initializeCaches(frameState, group, group.getSpecialization().getBoundCaches(guard.getExpression()), mode, !guardStateBit, guardStateBit)); innerTriples.addAll(initializeCasts(frameState, group, guard.getExpression(), mode)); triples.addAll(initializeCasts(frameState, group, guard.getExpression(), mode)); triples.add(createMethodGuardCheck(frameState, group.getSpecialization(), guard, mode));
guards.removeAll(ignoreGuards); SpecializationData specialization = group.getSpecialization(); if (specialization != null && fastPath) { for (ListIterator<GuardExpression> iterator = guards.listIterator(); iterator.hasNext();) {
private boolean isTypeGuardUsedInAnyGuardOrCacheBelow(SpecializationGroup group, LocalContext currentValues, TypeGuard typeGuard, boolean fastPath) { String localName = currentValues.getValue(typeGuard.getSignatureIndex()).getName(); SpecializationData specialization = group.getSpecialization(); for (GuardExpression guard : group.getGuards()) { if (isVariableBoundIn(specialization, guard.getExpression(), localName, currentValues)) { return true; } } if (!fastPath && specialization != null) { for (CacheExpression cache : specialization.getCaches()) { if (isVariableBoundIn(specialization, cache.getExpression(), localName, currentValues)) { return true; } } } for (SpecializationGroup child : group.getChildren()) { if (isTypeGuardUsedInAnyGuardOrCacheBelow(child, currentValues, typeGuard, fastPath)) { return true; } } return false; }
SpecializationData specialization = group.getSpecialization(); CodeTree[] checkAndCast = createTypeCheckAndLocals(specialization, group.getTypeGuards(), castGuards, currentValues, execution);
SpecializationData specialization = group.getSpecialization(); SpecializationData[] specializations = group.collectSpecializations().toArray(new SpecializationData[0]); List<GuardExpression> guardExpressions = new ArrayList<>(group.getGuards());
private CodeTree createDuplicationCheck(CodeTreeBuilder parent, FrameState frameState, SpecializationGroup group, List<GuardExpression> guardExpressions, boolean useDuplicate, String countName, String duplicateFoundName, String specializationLocalName) { SpecializationData specialization = group.getSpecialization();
if (hasFallthrough(group, returnType, originalValues, true, null) || group.getSpecialization().isFallback()) { builder.tree(createCallNext(builder, executableType, node.getGenericExecutableType(executableType), originalValues));