/*
 * Copyright (c) 2010, 2013, 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.  Oracle designates this
 * particular file as subject to the "Classpath" exception as provided
 * by Oracle in the LICENSE file that accompanied this code.
 *
 * 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.nashorn.internal.ir;

import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Deque;
import java.util.List;
import jdk.nashorn.internal.codegen.types.Type;

Lexical context that keeps track of optimistic assumptions (if any) made during code generation. Used from Attr and FinalizeTypes
/** * Lexical context that keeps track of optimistic assumptions (if any) * made during code generation. Used from Attr and FinalizeTypes */
public class OptimisticLexicalContext extends LexicalContext { private final boolean isEnabled; class Assumption { Symbol symbol; Type type; Assumption(final Symbol symbol, final Type type) { this.symbol = symbol; this.type = type; } @Override public String toString() { return symbol.getName() + "=" + type; } }
Optimistic assumptions that could be made per function
/** Optimistic assumptions that could be made per function */
private final Deque<List<Assumption>> optimisticAssumptions = new ArrayDeque<>();
Constructor
Params:
  • isEnabled – are optimistic types enabled?
/** * Constructor * @param isEnabled are optimistic types enabled? */
public OptimisticLexicalContext(final boolean isEnabled) { super(); this.isEnabled = isEnabled; }
Are optimistic types enabled
Returns:true if optimistic types
/** * Are optimistic types enabled * @return true if optimistic types */
public boolean isEnabled() { return isEnabled; }
Log an optimistic assumption during codegen TODO : different parameters and more info about the assumption for future profiling needs
Params:
  • symbol – symbol
  • type – type
/** * Log an optimistic assumption during codegen * TODO : different parameters and more info about the assumption for future profiling * needs * @param symbol symbol * @param type type */
public void logOptimisticAssumption(final Symbol symbol, final Type type) { if (isEnabled) { final List<Assumption> peek = optimisticAssumptions.peek(); peek.add(new Assumption(symbol, type)); } }
Get the list of optimistic assumptions made
Returns:optimistic assumptions
/** * Get the list of optimistic assumptions made * @return optimistic assumptions */
public List<Assumption> getOptimisticAssumptions() { return Collections.unmodifiableList(optimisticAssumptions.peek()); }
Does this method have optimistic assumptions made during codegen?
Returns:true if optimistic assumptions were made
/** * Does this method have optimistic assumptions made during codegen? * @return true if optimistic assumptions were made */
public boolean hasOptimisticAssumptions() { return !optimisticAssumptions.isEmpty() && !getOptimisticAssumptions().isEmpty(); } @Override public <T extends LexicalContextNode> T push(final T node) { if (isEnabled) { if(node instanceof FunctionNode) { optimisticAssumptions.push(new ArrayList<Assumption>()); } } return super.push(node); } @Override public <T extends Node> T pop(final T node) { final T popped = super.pop(node); if (isEnabled) { if(node instanceof FunctionNode) { optimisticAssumptions.pop(); } } return popped; } }