aboutsummaryrefslogtreecommitdiff
path: root/src/jdk/nashorn/internal/ir/OptimisticLexicalContext.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/jdk/nashorn/internal/ir/OptimisticLexicalContext.java')
-rw-r--r--src/jdk/nashorn/internal/ir/OptimisticLexicalContext.java128
1 files changed, 128 insertions, 0 deletions
diff --git a/src/jdk/nashorn/internal/ir/OptimisticLexicalContext.java b/src/jdk/nashorn/internal/ir/OptimisticLexicalContext.java
new file mode 100644
index 00000000..9d97a438
--- /dev/null
+++ b/src/jdk/nashorn/internal/ir/OptimisticLexicalContext.java
@@ -0,0 +1,128 @@
+/*
+ * 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
+ */
+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 */
+ private final Deque<List<Assumption>> optimisticAssumptions = new ArrayDeque<>();
+
+ /**
+ * Constructor
+ * @param isEnabled are optimistic types enabled?
+ */
+ public OptimisticLexicalContext(final boolean isEnabled) {
+ super();
+ this.isEnabled = isEnabled;
+ }
+
+ /**
+ * 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
+ * @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
+ * @return optimistic assumptions
+ */
+ public List<Assumption> getOptimisticAssumptions() {
+ return Collections.unmodifiableList(optimisticAssumptions.peek());
+ }
+
+ /**
+ * 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 LexicalContextNode> T pop(final T node) {
+ final T popped = super.pop(node);
+ if (isEnabled) {
+ if(node instanceof FunctionNode) {
+ optimisticAssumptions.pop();
+ }
+ }
+ return popped;
+ }
+
+}