///*******************************************************************************
// * Copyright (c) 2005, 2009 IBM Corporation and others.
// * All rights reserved. This program and the accompanying materials
// * are made available under the terms of the Eclipse Public License v1.0
// * which accompanies this distribution, and is available at
// * http://www.eclipse.org/legal/epl-v10.html
// *
// * Contributors:
// * IBM Corporation - initial API and implementation
// *******************************************************************************/
//package org.eclipse.jdt.core.tests.compiler.regression;
//
//import java.io.BufferedReader;
//import java.io.BufferedWriter;
//import java.io.File;
//import java.io.FileOutputStream;
//import java.io.IOException;
//import java.io.PrintWriter;
//import java.util.HashMap;
//import java.util.Iterator;
//import java.util.Map;
//import java.util.SortedMap;
//import java.util.TreeMap;
//
//import org.eclipse.jdt.core.tests.compiler.regression.NullReferenceImplTests.State;
//import org.eclipse.jdt.internal.compiler.flow.UnconditionalFlowInfo;
//public class NullReferenceImplTransformations {
// public static final Transformation
// markAsComparedEqualToNonNull =
// // markAsComparedEqualToNonNull DEFINITION START
// // start => prot. non null
// // prot. non null => prot. non null
// // prot. null => prot. non null
// // pot. unknown => pot. nn & prot. nn
// // pot. non null => pot. nn & prot. nn
// // pot. nn & prot. nn => pot. nn & prot. nn
// // pot. nn & pot. un => pot. nn & prot. nn
// // pot. null => prot. non null
// // pot. n & prot. n => prot. non null
// // pot. n & pot. un => pot. nn & prot. nn
// // pot. n & pot. nn => pot. nn & prot. nn
// // def. unknown => def. non null
// // def. non null => def. non null
// // def. null => prot. non null
// // markAsComparedEqualToNonNull DEFINITION END
// new TwoDimensionalTransformation("markAsComparedEqualToNonNull",
// new byte[][] {
// // markAsComparedEqualToNonNull INITIALIZER START
// {0x00,0x3C},
// {0x04,0x2C},
// {0x08,0x2C},
// {0x0C,0x2C},
// {0x10,0x3C},
// {0x14,0x2C},
// {0x18,0x2C},
// {0x24,0x28},
// {0x28,0x28},
// {0x2C,0x2C},
// {0x30,0x3C},
// {0x34,0x3C},
// {0x38,0x3C},
// {0x3C,0x3C},
// // markAsComparedEqualToNonNull INITIALIZER END
// }) {
// UnconditionalFlowInfo output(UnconditionalFlowInfo input,
// TestLocalVariableBinding local) {
// UnconditionalFlowInfo result = (UnconditionalFlowInfo)input.copy();
// result.markAsComparedEqualToNonNull(local);
// return result;
// }
// },
// markAsComparedEqualToNull =
// // markAsComparedEqualToNull DEFINITION START
// // start => prot. null
// // prot. non null => prot. null
// // prot. null => prot. null
// // pot. unknown => pot. n & prot. n
// // pot. non null => prot. null
// // pot. nn & prot. nn => prot. null
// // pot. nn & pot. un => pot. n & prot. n
// // pot. null => pot. n & prot. n
// // pot. n & prot. n => pot. n & prot. n
// // pot. n & pot. un => pot. n & prot. n
// // pot. n & pot. nn => pot. n & prot. n
// // def. unknown => def. null
// // def. non null => prot. null
// // def. null => def. null
// // markAsComparedEqualToNull DEFINITION END
// new TwoDimensionalTransformation("markAsComparedEqualToNull",
// new byte[][] {
// // markAsComparedEqualToNull INITIALIZER START
// {0x00,0x38},
// {0x04,0x34},
// {0x08,0x38},
// {0x0C,0x34},
// {0x10,0x34},
// {0x14,0x34},
// {0x18,0x34},
// {0x24,0x30},
// {0x28,0x38},
// {0x2C,0x38},
// {0x30,0x30},
// {0x34,0x34},
// {0x38,0x38},
// {0x3C,0x38},
// // markAsComparedEqualToNull INITIALIZER END
// }) {
// UnconditionalFlowInfo output(UnconditionalFlowInfo input,
// TestLocalVariableBinding local) {
// UnconditionalFlowInfo result = (UnconditionalFlowInfo)input.copy();
// result.markAsComparedEqualToNull(local);
// return result;
// }
// },
// markAsDefinitelyNonNull =
// // markAsDefinitelyNonNull DEFINITION START
// // start => def. non null
// // prot. non null => def. non null
// // prot. null => def. non null
// // pot. unknown => def. non null
// // pot. non null => def. non null
// // pot. nn & prot. nn => def. non null
// // pot. nn & pot. un => def. non null
// // pot. null => def. non null
// // pot. n & prot. n => def. non null
// // pot. n & pot. un => def. non null
// // pot. n & pot. nn => def. non null
// // def. unknown => def. non null
// // def. non null => def. non null
// // def. null => def. non null
// // markAsDefinitelyNonNull DEFINITION END
// new TwoDimensionalTransformation("markAsDefinitelyNonNull",
// new byte[][] {
// // markAsDefinitelyNonNull INITIALIZER START
// {0x00,0x28},
// {0x04,0x28},
// {0x08,0x28},
// {0x0C,0x28},
// {0x10,0x28},
// {0x14,0x28},
// {0x18,0x28},
// {0x24,0x28},
// {0x28,0x28},
// {0x2C,0x28},
// {0x30,0x28},
// {0x34,0x28},
// {0x38,0x28},
// {0x3C,0x28},
// // markAsDefinitelyNonNull INITIALIZER END
// }) {
// UnconditionalFlowInfo output(UnconditionalFlowInfo input,
// TestLocalVariableBinding local) {
// UnconditionalFlowInfo result = (UnconditionalFlowInfo)input.copy();
// result.markAsDefinitelyNonNull(local);
// return result;
// }
// },
// markAsDefinitelyNull =
// // markAsDefinitelyNull DEFINITION START
// // start => def. null
// // prot. non null => def. null
// // prot. null => def. null
// // pot. unknown => def. null
// // pot. non null => def. null
// // pot. nn & prot. nn => def. null
// // pot. nn & pot. un => def. null
// // pot. null => def. null
// // pot. n & prot. n => def. null
// // pot. n & pot. un => def. null
// // pot. n & pot. nn => def. null
// // def. unknown => def. null
// // def. non null => def. null
// // def. null => def. null
// // markAsDefinitelyNull DEFINITION END
// // PREMATURE add 'catch rules'
// new TwoDimensionalTransformation("markAsDefinitelyNull",
// new byte[][] {
// // markAsDefinitelyNull INITIALIZER START
// {0x00,0x30},
// {0x04,0x30},
// {0x08,0x30},
// {0x0C,0x30},
// {0x10,0x30},
// {0x14,0x30},
// {0x18,0x30},
// {0x24,0x30},
// {0x28,0x30},
// {0x2C,0x30},
// {0x30,0x30},
// {0x34,0x30},
// {0x38,0x30},
// {0x3C,0x30},
// // markAsDefinitelyNull INITIALIZER END
// }) {
// UnconditionalFlowInfo output(UnconditionalFlowInfo input,
// TestLocalVariableBinding local) {
// UnconditionalFlowInfo result = (UnconditionalFlowInfo)input.copy();
// result.markAsDefinitelyNull(local);
// return result;
// }
// },
// markAsDefinitelyUnknown =
// // markAsDefinitelyUnknown DEFINITION START
// // start => def. unknown
// // prot. non null => def. unknown
// // prot. null => def. unknown
// // pot. unknown => def. unknown
// // pot. non null => def. unknown
// // pot. nn & prot. nn => def. unknown
// // pot. nn & pot. un => def. unknown
// // pot. null => def. unknown
// // pot. n & prot. n => def. unknown
// // pot. n & pot. un => def. unknown
// // pot. n & pot. nn => def. unknown
// // def. unknown => def. unknown
// // def. non null => def. unknown
// // def. null => def. unknown
// // markAsDefinitelyUnknown DEFINITION END
// new TwoDimensionalTransformation("markAsDefinitelyUnknown",
// new byte[][] {
// // markAsDefinitelyUnknown INITIALIZER START
// {0x00,0x24},
// {0x04,0x24},
// {0x08,0x24},
// {0x0C,0x24},
// {0x10,0x24},
// {0x14,0x24},
// {0x18,0x24},
// {0x24,0x24},
// {0x28,0x24},
// {0x2C,0x24},
// {0x30,0x24},
// {0x34,0x24},
// {0x38,0x24},
// {0x3C,0x24},
// // markAsDefinitelyUnknown INITIALIZER END
// }) {
// UnconditionalFlowInfo output(UnconditionalFlowInfo input,
// TestLocalVariableBinding local) {
// UnconditionalFlowInfo result = (UnconditionalFlowInfo)input.copy();
// result.markAsDefinitelyUnknown(local);
// return result;
// }
// },
// addInitializationsFrom =
// // addInitializationsFrom DEFINITION START
// // def. non null + def. non null => def. non null
// // def. non null + def. null => def. null
// // def. non null + def. unknown => def. unknown
// // def. non null + pot. n & pot. nn => pot. n & pot. nn
// // def. non null + pot. n & pot. un => pot. n & pot. nn
// // def. non null + pot. n & prot. n => pot. n & prot. n
// // def. non null + pot. nn & pot. un => def. unknown
// // def. non null + pot. nn & prot. nn => def. non null
// // def. non null + pot. non null => def. non null
// // def. non null + pot. null => pot. n & pot. nn
// // def. non null + pot. unknown => def. unknown // priv.
// // def. non null + prot. non null => def. non null
// // def. non null + prot. null => prot. null
// // def. non null + start => def. non null
// // def. null + def. non null => def. non null
// // def. null + def. null => def. null
// // def. null + def. unknown => def. unknown
// // def. null + pot. n & pot. nn => pot. n & pot. nn
// // def. null + pot. n & pot. un => pot. n & pot. un
// // def. null + pot. n & prot. n => def. null
// // def. null + pot. nn & pot. un => pot. n & pot. nn
// // def. null + pot. nn & prot. nn => pot. nn & prot. nn
// // def. null + pot. non null => pot. n & pot. nn
// // def. null + pot. null => def. null
// // def. null + pot. unknown => pot. n & pot. un // pot. null privileged over def. unknown
// // def. null + prot. non null => prot. non null
// // def. null + prot. null => def. null
// // def. null + start => def. null
// // def. unknown + def. non null => def. non null
// // def. unknown + def. null => def. null
// // def. unknown + def. unknown => def. unknown
// // def. unknown + pot. n & pot. nn => pot. n & pot. nn
// // def. unknown + pot. n & pot. un => pot. n & pot. un // we loose the def here, but we need the pot. null
// // def. unknown + pot. n & prot. n => def. null
// // def. unknown + pot. nn & pot. un => def. unknown // priv.
// // def. unknown + pot. nn & prot. nn => def. non null
// // def. unknown + pot. non null => def. unknown // privileging over pot. nn & pot. un
// // def. unknown + pot. null => pot. n & pot. un
// // def. unknown + pot. unknown => def. unknown
// // def. unknown + prot. non null => def. non null
// // def. unknown + prot. null => def. null
// // def. unknown + start => def. unknown
// // pot. n & pot. nn + def. non null => def. non null
// // pot. n & pot. nn + def. null => def. null
// // pot. n & pot. nn + def. unknown => def. unknown
// // pot. n & pot. nn + pot. n & pot. nn => pot. n & pot. nn
// // pot. n & pot. nn + pot. n & pot. un => pot. n & pot. nn
// // pot. n & pot. nn + pot. n & prot. n => pot. n & prot. n
// // pot. n & pot. nn + pot. nn & pot. un => pot. n & pot. nn
// // pot. n & pot. nn + pot. nn & prot. nn => pot. nn & prot. nn
// // pot. n & pot. nn + pot. non null => pot. n & pot. nn
// // pot. n & pot. nn + pot. null => pot. n & pot. nn
// // pot. n & pot. nn + pot. unknown => pot. n & pot. nn
// // pot. n & pot. nn + prot. non null => pot. nn & prot. nn
// // pot. n & pot. nn + prot. null => pot. n & prot. n
// // pot. n & pot. nn + start => pot. n & pot. nn
// // pot. n & pot. un + def. non null => def. non null
// // pot. n & pot. un + def. null => def. null
// // pot. n & pot. un + def. unknown => def. unknown
// // pot. n & pot. un + pot. n & pot. nn => pot. n & pot. nn
// // pot. n & pot. un + pot. n & pot. un => pot. n & pot. un
// // pot. n & pot. un + pot. n & prot. n => pot. n & prot. n
// // pot. n & pot. un + pot. nn & pot. un => pot. n & pot. nn
// // pot. n & pot. un + pot. nn & prot. nn => pot. nn & prot. nn
// // pot. n & pot. un + pot. non null => pot. n & pot. nn
// // pot. n & pot. un + pot. null => pot. n & pot. un
// // pot. n & pot. un + pot. unknown => pot. n & pot. un
// // pot. n & pot. un + prot. non null => pot. nn & prot. nn
// // pot. n & pot. un + prot. null => pot. n & prot. n
// // pot. n & pot. un + start => pot. n & pot. un
// // pot. n & prot. n + def. non null => def. non null
// // pot. n & prot. n + def. null => def. null
// // pot. n & prot. n + def. unknown => def. unknown
// // pot. n & prot. n + pot. n & pot. nn => pot. n & pot. nn
// // pot. n & prot. n + pot. n & pot. un => pot. n & pot. un
// // pot. n & prot. n + pot. n & prot. n => pot. n & prot. n
// // pot. n & prot. n + pot. nn & pot. un => pot. n & pot. nn
// // pot. n & prot. n + pot. nn & prot. nn => pot. nn & prot. nn
// // pot. n & prot. n + pot. non null => pot. n & pot. nn
// // pot. n & prot. n + pot. null => pot. n & prot. n
// // pot. n & prot. n + pot. unknown => pot. n & pot. un
// // pot. n & prot. n + prot. non null => prot. non null
// // pot. n & prot. n + prot. null => pot. n & prot. n
// // pot. n & prot. n + start => pot. n & prot. n
// // pot. nn & pot. un + def. non null => def. non null
// // pot. nn & pot. un + def. null => def. null
// // pot. nn & pot. un + def. unknown => def. unknown
// // pot. nn & pot. un + pot. n & pot. nn => pot. n & pot. nn
// // pot. nn & pot. un + pot. n & pot. un => pot. n & pot. nn
// // pot. nn & pot. un + pot. n & prot. n => pot. n & prot. n
// // pot. nn & pot. un + pot. nn & pot. un => pot. nn & pot. un
// // pot. nn & pot. un + pot. nn & prot. nn => pot. nn & prot. nn
// // pot. nn & pot. un + pot. non null => pot. nn & pot. un
// // pot. nn & pot. un + pot. null => pot. n & pot. nn
// // pot. nn & pot. un + pot. unknown => pot. nn & pot. un
// // pot. nn & pot. un + prot. non null => pot. nn & prot. nn
// // pot. nn & pot. un + prot. null => pot. n & prot. n
// // pot. nn & pot. un + start => pot. nn & pot. un
// // pot. nn & prot. nn + def. non null => def. non null
// // pot. nn & prot. nn + def. null => def. null
// // pot. nn & prot. nn + def. unknown => def. unknown
// // pot. nn & prot. nn + pot. n & pot. nn => pot. n & pot. nn
// // pot. nn & prot. nn + pot. n & pot. un => pot. n & pot. nn
// // pot. nn & prot. nn + pot. n & prot. n => pot. n & prot. n
// // pot. nn & prot. nn + pot. nn & pot. un => pot. nn & pot. un
// // pot. nn & prot. nn + pot. nn & prot. nn => pot. nn & prot. nn
// // pot. nn & prot. nn + pot. non null => pot. nn & prot. nn
// // pot. nn & prot. nn + pot. null => pot. n & pot. nn
// // pot. nn & prot. nn + pot. unknown => pot. nn & pot. un
// // pot. nn & prot. nn + prot. non null => pot. nn & prot. nn
// // pot. nn & prot. nn + prot. null => prot. null
// // pot. nn & prot. nn + start => pot. nn & prot. nn
// // pot. non null + def. non null => def. non null
// // pot. non null + def. null => def. null
// // pot. non null + def. unknown => def. unknown
// // pot. non null + pot. n & pot. nn => pot. n & pot. nn
// // pot. non null + pot. n & pot. un => pot. n & pot. nn
// // pot. non null + pot. n & prot. n => pot. n & prot. n
// // pot. non null + pot. nn & pot. un => pot. nn & pot. un
// // pot. non null + pot. nn & prot. nn => pot. nn & prot. nn
// // pot. non null + pot. non null => pot. non null
// // pot. non null + pot. null => pot. n & pot. nn
// // pot. non null + pot. unknown => pot. nn & pot. un
// // pot. non null + prot. non null => pot. nn & prot. nn
// // pot. non null + prot. null => prot. null
// // pot. non null + start => pot. non null
// // pot. null + def. non null => def. non null
// // pot. null + def. null => def. null
// // pot. null + def. unknown => def. unknown
// // pot. null + pot. n & pot. nn => pot. n & pot. nn
// // pot. null + pot. n & pot. un => pot. n & pot. un
// // pot. null + pot. n & prot. n => pot. n & prot. n
// // pot. null + pot. nn & pot. un => pot. n & pot. nn
// // pot. null + pot. nn & prot. nn => pot. nn & prot. nn
// // pot. null + pot. non null => pot. n & pot. nn
// // pot. null + pot. null => pot. null
// // pot. null + pot. unknown => pot. n & pot. un
// // pot. null + prot. non null => prot. non null
// // pot. null + prot. null => pot. n & prot. n
// // pot. null + start => pot. null
// // pot. unknown + def. non null => def. non null
// // pot. unknown + def. null => def. null
// // pot. unknown + def. unknown => def. unknown
// // pot. unknown + pot. n & pot. nn => pot. n & pot. nn
// // pot. unknown + pot. n & pot. un => pot. n & pot. un
// // pot. unknown + pot. n & prot. n => pot. n & prot. n
// // pot. unknown + pot. nn & pot. un => pot. nn & pot. un
// // pot. unknown + pot. nn & prot. nn => pot. nn & prot. nn
// // pot. unknown + pot. non null => pot. nn & pot. un
// // pot. unknown + pot. null => pot. n & pot. un
// // pot. unknown + pot. unknown => pot. unknown
// // pot. unknown + prot. non null => pot. nn & prot. nn
// // pot. unknown + prot. null => pot. n & prot. n
// // pot. unknown + start => pot. unknown
// // prot. non null + def. non null => def. non null
// // prot. non null + def. null => def. null
// // prot. non null + def. unknown => def. unknown
// // prot. non null + pot. n & pot. nn => pot. n & pot. nn
// // prot. non null + pot. n & pot. un => pot. n & pot. un
// // prot. non null + pot. n & prot. n => pot. n & prot. n
// // prot. non null + pot. nn & pot. un => pot. nn & pot. un
// // prot. non null + pot. nn & prot. nn => pot. nn & prot. nn
// // prot. non null + pot. non null => pot. nn & prot. nn
// // prot. non null + pot. null => pot. null
// // prot. non null + pot. unknown => pot. unknown
// // prot. non null + prot. non null => prot. non null
// // prot. non null + prot. null => prot. null
// // prot. non null + start => prot. non null
// // prot. null + def. non null => def. non null
// // prot. null + def. null => def. null
// // prot. null + def. unknown => def. unknown
// // prot. null + pot. n & pot. nn => pot. n & pot. nn
// // prot. null + pot. n & pot. un => pot. n & pot. un
// // prot. null + pot. n & prot. n => pot. n & prot. n
// // prot. null + pot. nn & pot. un => pot. nn & pot. un
// // prot. null + pot. nn & prot. nn => pot. nn & prot. nn
// // prot. null + pot. non null => pot. non null
// // prot. null + pot. null => pot. n & prot. n
// // prot. null + pot. unknown => pot. unknown
// // prot. null + prot. non null => prot. non null
// // prot. null + prot. null => prot. null
// // prot. null + start => prot. null
// // start + def. non null => def. non null
// // start + def. null => def. null
// // start + def. unknown => def. unknown
// // start + pot. n & pot. nn => pot. n & pot. nn
// // start + pot. n & pot. un => pot. n & pot. un
// // start + pot. n & prot. n => pot. n & prot. n
// // start + pot. nn & pot. un => pot. nn & pot. un
// // start + pot. nn & prot. nn => pot. nn & prot. nn
// // start + pot. non null => pot. non null
// // start + pot. null => pot. null
// // start + pot. unknown => pot. unknown
// // start + prot. non null => prot. non null
// // start + prot. null => prot. null
// // start + start => start
// // addInitializationsFrom DEFINITION END
// new ThreeDimensionalTransformation("addInitializationsFrom",
// new byte[][] {
// // addInitializationsFrom INITIALIZER START
// {0x00,0x00,0x00},
// {0x00,0x04,0x04},
// {0x00,0x08,0x08},
// {0x00,0x0C,0x0C},
// {0x00,0x10,0x10},
// {0x00,0x14,0x14},
// {0x00,0x18,0x18},
// {0x00,0x24,0x24},
// {0x00,0x28,0x28},
// {0x00,0x2C,0x2C},
// {0x00,0x30,0x30},
// {0x00,0x34,0x34},
// {0x00,0x38,0x38},
// {0x00,0x3C,0x3C},
// {0x04,0x00,0x04},
// {0x04,0x04,0x04},
// {0x04,0x08,0x0C},
// {0x04,0x0C,0x0C},
// {0x04,0x10,0x14},
// {0x04,0x14,0x14},
// {0x04,0x18,0x18},
// {0x04,0x24,0x24},
// {0x04,0x28,0x28},
// {0x04,0x2C,0x2C},
// {0x04,0x30,0x30},
// {0x04,0x34,0x34},
// {0x04,0x38,0x34},
// {0x04,0x3C,0x2C},
// {0x08,0x00,0x08},
// {0x08,0x04,0x0C},
// {0x08,0x08,0x08},
// {0x08,0x0C,0x0C},
// {0x08,0x10,0x18},
// {0x08,0x14,0x18},
// {0x08,0x18,0x18},
// {0x08,0x24,0x24},
// {0x08,0x28,0x28},
// {0x08,0x2C,0x2C},
// {0x08,0x30,0x30},
// {0x08,0x34,0x34},
// {0x08,0x38,0x38},
// {0x08,0x3C,0x2C},
// {0x0C,0x00,0x0C},
// {0x0C,0x04,0x0C},
// {0x0C,0x08,0x0C},
// {0x0C,0x0C,0x0C},
// {0x0C,0x10,0x18},
// {0x0C,0x14,0x18},
// {0x0C,0x18,0x18},
// {0x0C,0x24,0x24},
// {0x0C,0x28,0x28},
// {0x0C,0x2C,0x2C},
// {0x0C,0x30,0x30},
// {0x0C,0x34,0x34},
// {0x0C,0x38,0x34},
// {0x0C,0x3C,0x2C},
// {0x10,0x00,0x10},
// {0x10,0x04,0x14},
// {0x10,0x08,0x18},
// {0x10,0x0C,0x18},
// {0x10,0x10,0x10},
// {0x10,0x14,0x14},
// {0x10,0x18,0x18},
// {0x10,0x24,0x24},
// {0x10,0x28,0x28},
// {0x10,0x2C,0x2C},
// {0x10,0x30,0x30},
// {0x10,0x34,0x34},
// {0x10,0x38,0x34},
// {0x10,0x3C,0x3C},
// {0x14,0x00,0x14},
// {0x14,0x04,0x14},
// {0x14,0x08,0x18},
// {0x14,0x0C,0x18},
// {0x14,0x10,0x14},
// {0x14,0x14,0x14},
// {0x14,0x18,0x18},
// {0x14,0x24,0x24},
// {0x14,0x28,0x28},
// {0x14,0x2C,0x2C},
// {0x14,0x30,0x30},
// {0x14,0x34,0x34},
// {0x14,0x38,0x34},
// {0x14,0x3C,0x2C},
// {0x18,0x00,0x18},
// {0x18,0x04,0x18},
// {0x18,0x08,0x18},
// {0x18,0x0C,0x18},
// {0x18,0x10,0x18},
// {0x18,0x14,0x18},
// {0x18,0x18,0x18},
// {0x18,0x24,0x24},
// {0x18,0x28,0x28},
// {0x18,0x2C,0x2C},
// {0x18,0x30,0x30},
// {0x18,0x34,0x34},
// {0x18,0x38,0x34},
// {0x18,0x3C,0x2C},
// {0x24,0x00,0x24},
// {0x24,0x04,0x24},
// {0x24,0x08,0x24},
// {0x24,0x0C,0x24},
// {0x24,0x10,0x14},
// {0x24,0x14,0x14},
// {0x24,0x18,0x18},
// {0x24,0x24,0x24},
// {0x24,0x28,0x28},
// {0x24,0x2C,0x28},
// {0x24,0x30,0x30},
// {0x24,0x34,0x30},
// {0x24,0x38,0x30},
// {0x24,0x3C,0x28},
// {0x28,0x00,0x28},
// {0x28,0x04,0x24},
// {0x28,0x08,0x28},
// {0x28,0x0C,0x24},
// {0x28,0x10,0x18},
// {0x28,0x14,0x18},
// {0x28,0x18,0x18},
// {0x28,0x24,0x24},
// {0x28,0x28,0x28},
// {0x28,0x2C,0x28},
// {0x28,0x30,0x30},
// {0x28,0x34,0x34},
// {0x28,0x38,0x38},
// {0x28,0x3C,0x28},
// {0x2C,0x00,0x2C},
// {0x2C,0x04,0x0C},
// {0x2C,0x08,0x2C},
// {0x2C,0x0C,0x0C},
// {0x2C,0x10,0x18},
// {0x2C,0x14,0x18},
// {0x2C,0x18,0x18},
// {0x2C,0x24,0x24},
// {0x2C,0x28,0x28},
// {0x2C,0x2C,0x2C},
// {0x2C,0x30,0x30},
// {0x2C,0x34,0x34},
// {0x2C,0x38,0x38},
// {0x2C,0x3C,0x2C},
// {0x30,0x00,0x30},
// {0x30,0x04,0x14},
// {0x30,0x08,0x18},
// {0x30,0x0C,0x18},
// {0x30,0x10,0x30},
// {0x30,0x14,0x14},
// {0x30,0x18,0x18},
// {0x30,0x24,0x24},
// {0x30,0x28,0x28},
// {0x30,0x2C,0x2C},
// {0x30,0x30,0x30},
// {0x30,0x34,0x30},
// {0x30,0x38,0x30},
// {0x30,0x3C,0x3C},
// {0x34,0x00,0x34},
// {0x34,0x04,0x14},
// {0x34,0x08,0x18},
// {0x34,0x0C,0x18},
// {0x34,0x10,0x34},
// {0x34,0x14,0x14},
// {0x34,0x18,0x18},
// {0x34,0x24,0x24},
// {0x34,0x28,0x28},
// {0x34,0x2C,0x2C},
// {0x34,0x30,0x30},
// {0x34,0x34,0x34},
// {0x34,0x38,0x34},
// {0x34,0x3C,0x3C},
// {0x38,0x00,0x38},
// {0x38,0x04,0x04},
// {0x38,0x08,0x08},
// {0x38,0x0C,0x0C},
// {0x38,0x10,0x34},
// {0x38,0x14,0x14},
// {0x38,0x18,0x18},
// {0x38,0x24,0x24},
// {0x38,0x28,0x28},
// {0x38,0x2C,0x2C},
// {0x38,0x30,0x30},
// {0x38,0x34,0x34},
// {0x38,0x38,0x38},
// {0x38,0x3C,0x3C},
// {0x3C,0x00,0x3C},
// {0x3C,0x04,0x04},
// {0x3C,0x08,0x2C},
// {0x3C,0x0C,0x0C},
// {0x3C,0x10,0x10},
// {0x3C,0x14,0x14},
// {0x3C,0x18,0x18},
// {0x3C,0x24,0x24},
// {0x3C,0x28,0x28},
// {0x3C,0x2C,0x2C},
// {0x3C,0x30,0x30},
// {0x3C,0x34,0x34},
// {0x3C,0x38,0x38},
// {0x3C,0x3C,0x3C},
// // addInitializationsFrom INITIALIZER END
// }) {
// UnconditionalFlowInfo output(UnconditionalFlowInfo input1,
// UnconditionalFlowInfo input2) {
// return (UnconditionalFlowInfo)
// input1.copy().addInitializationsFrom(input2);
// }
// },
// // addPotentialInitializationsFrom DEFINITION START
// // def. non null + def. non null => def. non null
// // def. non null + def. null => pot. n & pot. nn
// // def. non null + def. unknown => def. unknown
// // def. non null + pot. n & pot. nn => pot. n & pot. nn
// // def. non null + pot. n & pot. un => pot. n & pot. nn
// // def. non null + pot. n & prot. n => pot. n & pot. nn
// // def. non null + pot. nn & pot. un => def. unknown
// // def. non null + pot. nn & prot. nn => def. non null
// // def. non null + pot. non null => def. non null
// // def. non null + pot. null => pot. n & pot. nn
// // def. non null + pot. unknown => def. unknown
// // def. non null + prot. non null => def. non null
// // def. non null + prot. null => def. non null
// // def. non null + start => def. non null
// // def. null + def. non null => pot. n & pot. nn
// // def. null + def. null => def. null
// // def. null + def. unknown => pot. n & pot. un
// // def. null + pot. n & pot. nn => pot. n & pot. nn
// // def. null + pot. n & pot. un => pot. n & pot. un
// // def. null + pot. n & prot. n => def. null
// // def. null + pot. nn & pot. un => pot. n & pot. nn
// // def. null + pot. nn & prot. nn => pot. n & pot. nn
// // def. null + pot. non null => pot. n & pot. nn
// // def. null + pot. null => def. null
// // def. null + pot. unknown => pot. n & pot. un
// // def. null + prot. non null => def. null
// // def. null + prot. null => def. null
// // def. null + start => def. null
// // def. unknown + def. non null => def. unknown
// // def. unknown + def. null => pot. n & pot. un
// // def. unknown + def. unknown => def. unknown
// // def. unknown + pot. n & pot. nn => pot. n & pot. nn
// // def. unknown + pot. n & pot. un => pot. n & pot. un
// // def. unknown + pot. n & prot. n => pot. n & pot. un
// // def. unknown + pot. nn & pot. un => def. unknown
// // def. unknown + pot. nn & prot. nn => def. unknown
// // def. unknown + pot. non null => def. unknown
// // def. unknown + pot. null => pot. n & pot. un
// // def. unknown + pot. unknown => def. unknown
// // def. unknown + prot. non null => def. unknown
// // def. unknown + prot. null => def. unknown
// // def. unknown + start => def. unknown
// // pot. n & pot. nn + def. non null => pot. n & pot. nn
// // pot. n & pot. nn + def. null => pot. n & pot. nn
// // pot. n & pot. nn + def. unknown => pot. n & pot. nn
// // pot. n & pot. nn + pot. n & pot. nn => pot. n & pot. nn
// // pot. n & pot. nn + pot. n & pot. un => pot. n & pot. nn
// // pot. n & pot. nn + pot. n & prot. n => pot. n & pot. nn
// // pot. n & pot. nn + pot. nn & pot. un => pot. n & pot. nn
// // pot. n & pot. nn + pot. nn & prot. nn => pot. n & pot. nn
// // pot. n & pot. nn + pot. non null => pot. n & pot. nn
// // pot. n & pot. nn + pot. null => pot. n & pot. nn
// // pot. n & pot. nn + pot. unknown => pot. n & pot. nn
// // pot. n & pot. nn + prot. non null => pot. n & pot. nn
// // pot. n & pot. nn + prot. null => pot. n & pot. nn
// // pot. n & pot. nn + start => pot. n & pot. nn
// // pot. n & pot. un + def. non null => pot. n & pot. nn
// // pot. n & pot. un + def. null => pot. n & pot. un
// // pot. n & pot. un + def. unknown => pot. n & pot. un
// // pot. n & pot. un + pot. n & pot. nn => pot. n & pot. nn
// // pot. n & pot. un + pot. n & pot. un => pot. n & pot. un
// // pot. n & pot. un + pot. n & prot. n => pot. n & pot. un
// // pot. n & pot. un + pot. nn & pot. un => pot. n & pot. nn
// // pot. n & pot. un + pot. nn & prot. nn => pot. n & pot. nn
// // pot. n & pot. un + pot. non null => pot. n & pot. nn
// // pot. n & pot. un + pot. null => pot. n & pot. un
// // pot. n & pot. un + pot. unknown => pot. n & pot. un
// // pot. n & pot. un + prot. non null => pot. n & pot. un
// // pot. n & pot. un + prot. null => pot. n & pot. un
// // pot. n & pot. un + start => pot. n & pot. un
// // pot. n & prot. n + def. non null => pot. n & pot. nn
// // pot. n & prot. n + def. null => pot. n & prot. n
// // pot. n & prot. n + def. unknown => pot. n & pot. un
// // pot. n & prot. n + pot. n & pot. nn => pot. n & pot. nn
// // pot. n & prot. n + pot. n & pot. un => pot. n & pot. un
// // pot. n & prot. n + pot. n & prot. n => pot. n & prot. n
// // pot. n & prot. n + pot. nn & pot. un => pot. n & pot. nn
// // pot. n & prot. n + pot. nn & prot. nn => pot. n & pot. nn
// // pot. n & prot. n + pot. non null => pot. n & pot. nn
// // pot. n & prot. n + pot. null => pot. n & prot. n
// // pot. n & prot. n + pot. unknown => pot. n & pot. un
// // pot. n & prot. n + prot. non null => pot. n & prot. n
// // pot. n & prot. n + prot. null => pot. n & prot. n
// // pot. n & prot. n + start => pot. n & prot. n
// // pot. nn & pot. un + def. non null => pot. nn & pot. un
// // pot. nn & pot. un + def. null => pot. n & pot. nn
// // pot. nn & pot. un + def. unknown => pot. nn & pot. un
// // pot. nn & pot. un + pot. n & pot. nn => pot. n & pot. nn
// // pot. nn & pot. un + pot. n & pot. un => pot. n & pot. nn
// // pot. nn & pot. un + pot. n & prot. n => pot. n & pot. nn
// // pot. nn & pot. un + pot. nn & pot. un => pot. nn & pot. un
// // pot. nn & pot. un + pot. nn & prot. nn => pot. nn & pot. un
// // pot. nn & pot. un + pot. non null => pot. nn & pot. un
// // pot. nn & pot. un + pot. null => pot. n & pot. nn
// // pot. nn & pot. un + pot. unknown => pot. nn & pot. un
// // pot. nn & pot. un + prot. non null => pot. nn & pot. un
// // pot. nn & pot. un + prot. null => pot. nn & pot. un
// // pot. nn & pot. un + start => pot. nn & pot. un
// // pot. nn & prot. nn + def. non null => pot. nn & prot. nn
// // pot. nn & prot. nn + def. null => pot. n & pot. nn
// // pot. nn & prot. nn + def. unknown => pot. nn & pot. un
// // pot. nn & prot. nn + pot. n & pot. nn => pot. n & pot. nn
// // pot. nn & prot. nn + pot. n & pot. un => pot. n & pot. nn
// // pot. nn & prot. nn + pot. n & prot. n => pot. n & pot. nn
// // pot. nn & prot. nn + pot. nn & pot. un => pot. nn & pot. un // see test1501
// // pot. nn & prot. nn + pot. nn & prot. nn => pot. nn & prot. nn
// // pot. nn & prot. nn + pot. non null => pot. nn & prot. nn
// // pot. nn & prot. nn + pot. null => pot. n & pot. nn
// // pot. nn & prot. nn + pot. unknown => pot. nn & pot. un
// // pot. nn & prot. nn + prot. non null => pot. nn & prot. nn
// // pot. nn & prot. nn + prot. null => pot. nn & prot. nn
// // pot. nn & prot. nn + start => pot. nn & prot. nn
// // pot. non null + def. non null => pot. non null
// // pot. non null + def. null => pot. n & pot. nn
// // pot. non null + def. unknown => pot. nn & pot. un
// // pot. non null + pot. n & pot. nn => pot. n & pot. nn
// // pot. non null + pot. n & pot. un => pot. n & pot. nn
// // pot. non null + pot. n & prot. n => pot. n & pot. nn
// // pot. non null + pot. nn & pot. un => pot. nn & pot. un
// // pot. non null + pot. nn & prot. nn => pot. non null
// // pot. non null + pot. non null => pot. non null
// // pot. non null + pot. null => pot. n & pot. nn
// // pot. non null + pot. unknown => pot. nn & pot. un
// // pot. non null + prot. non null => pot. non null
// // pot. non null + prot. null => pot. non null
// // pot. non null + start => pot. non null
// // pot. null + def. non null => pot. n & pot. nn
// // pot. null + def. null => pot. null
// // pot. null + def. unknown => pot. n & pot. un
// // pot. null + pot. n & pot. nn => pot. n & pot. nn
// // pot. null + pot. n & pot. un => pot. n & pot. un
// // pot. null + pot. n & prot. n => pot. null
// // pot. null + pot. nn & pot. un => pot. n & pot. nn
// // pot. null + pot. nn & prot. nn => pot. n & pot. nn
// // pot. null + pot. non null => pot. n & pot. nn
// // pot. null + pot. null => pot. null
// // pot. null + pot. unknown => pot. n & pot. un
// // pot. null + prot. non null => pot. null
// // pot. null + prot. null => pot. null
// // pot. null + start => pot. null
// // pot. unknown + def. non null => pot. nn & pot. un
// // pot. unknown + def. null => pot. n & pot. un
// // pot. unknown + def. unknown => pot. unknown
// // pot. unknown + pot. n & pot. nn => pot. n & pot. nn
// // pot. unknown + pot. n & pot. un => pot. n & pot. un
// // pot. unknown + pot. n & prot. n => pot. n & pot. un
// // pot. unknown + pot. nn & pot. un => pot. nn & pot. un
// // pot. unknown + pot. nn & prot. nn => pot. nn & pot. un
// // pot. unknown + pot. non null => pot. nn & pot. un
// // pot. unknown + pot. null => pot. n & pot. un
// // pot. unknown + pot. unknown => pot. unknown
// // pot. unknown + prot. non null => pot. unknown
// // pot. unknown + prot. null => pot. unknown
// // pot. unknown + start => pot. unknown
// // prot. non null + def. non null => pot. nn & prot. nn
// // prot. non null + def. null => pot. null
// // prot. non null + def. unknown => pot. unknown
// // prot. non null + pot. n & pot. nn => pot. n & pot. nn
// // prot. non null + pot. n & pot. un => pot. n & pot. un
// // prot. non null + pot. n & prot. n => pot. null
// // prot. non null + pot. nn & pot. un => pot. nn & pot. un // see test1500
// // prot. non null + pot. nn & prot. nn => pot. nn & prot. nn
// // prot. non null + pot. non null => pot. nn & prot. nn
// // prot. non null + pot. null => pot. null
// // prot. non null + pot. unknown => pot. unknown
// // prot. non null + prot. non null => prot. non null
// // prot. non null + prot. null => prot. non null
// // prot. non null + start => prot. non null
// // prot. null + def. non null => pot. non null
// // prot. null + def. null => pot. n & prot. n
// // prot. null + def. unknown => pot. unknown
// // prot. null + pot. n & pot. nn => pot. n & pot. nn
// // prot. null + pot. n & pot. un => pot. n & pot. un
// // prot. null + pot. n & prot. n => pot. n & prot. n
// // prot. null + pot. nn & pot. un => pot. nn & pot. un
// // prot. null + pot. nn & prot. nn => pot. non null
// // prot. null + pot. non null => pot. non null
// // prot. null + pot. null => pot. n & prot. n
// // prot. null + pot. unknown => pot. unknown
// // prot. null + prot. non null => prot. null
// // prot. null + prot. null => prot. null
// // prot. null + start => prot. null
// // start + def. non null => pot. non null
// // start + def. null => pot. null
// // start + def. unknown => pot. unknown
// // start + pot. n & pot. nn => pot. n & pot. nn
// // start + pot. n & pot. un => pot. n & pot. un
// // start + pot. n & prot. n => pot. null
// // start + pot. nn & pot. un => pot. nn & pot. un
// // start + pot. nn & prot. nn => pot. non null
// // start + pot. non null => pot. non null
// // start + pot. null => pot. null
// // start + pot. unknown => pot. unknown
// // start + prot. non null => start // PREMATURE may need to be tainted?
// // start + prot. null => start // PREMATURE may need to be tainted?
// // start + start => start
// // addPotentialInitializationsFrom DEFINITION END
// addPotentialInitializationsFrom =
// new ThreeDimensionalTransformation("addPotentialInitializationsFrom",
// new byte[][] {
// // addPotentialInitializationsFrom INITIALIZER START
// {0x00,0x00,0x00},
// {0x00,0x04,0x04},
// {0x00,0x08,0x08},
// {0x00,0x0C,0x0C},
// {0x00,0x10,0x10},
// {0x00,0x14,0x14},
// {0x00,0x18,0x18},
// {0x00,0x24,0x04},
// {0x00,0x28,0x08},
// {0x00,0x2C,0x08},
// {0x00,0x30,0x10},
// {0x00,0x34,0x10},
// {0x00,0x38,0x00},
// {0x00,0x3C,0x00},
// {0x04,0x00,0x04},
// {0x04,0x04,0x04},
// {0x04,0x08,0x0C},
// {0x04,0x0C,0x0C},
// {0x04,0x10,0x14},
// {0x04,0x14,0x14},
// {0x04,0x18,0x18},
// {0x04,0x24,0x04},
// {0x04,0x28,0x0C},
// {0x04,0x2C,0x0C},
// {0x04,0x30,0x14},
// {0x04,0x34,0x14},
// {0x04,0x38,0x04},
// {0x04,0x3C,0x04},
// {0x08,0x00,0x08},
// {0x08,0x04,0x0C},
// {0x08,0x08,0x08},
// {0x08,0x0C,0x0C},
// {0x08,0x10,0x18},
// {0x08,0x14,0x18},
// {0x08,0x18,0x18},
// {0x08,0x24,0x0C},
// {0x08,0x28,0x08},
// {0x08,0x2C,0x08},
// {0x08,0x30,0x18},
// {0x08,0x34,0x18},
// {0x08,0x38,0x08},
// {0x08,0x3C,0x08},
// {0x0C,0x00,0x0C},
// {0x0C,0x04,0x0C},
// {0x0C,0x08,0x0C},
// {0x0C,0x0C,0x0C},
// {0x0C,0x10,0x18},
// {0x0C,0x14,0x18},
// {0x0C,0x18,0x18},
// {0x0C,0x24,0x0C},
// {0x0C,0x28,0x0C},
// {0x0C,0x2C,0x0C},
// {0x0C,0x30,0x18},
// {0x0C,0x34,0x18},
// {0x0C,0x38,0x0C},
// {0x0C,0x3C,0x0C},
// {0x10,0x00,0x10},
// {0x10,0x04,0x14},
// {0x10,0x08,0x18},
// {0x10,0x0C,0x18},
// {0x10,0x10,0x10},
// {0x10,0x14,0x14},
// {0x10,0x18,0x18},
// {0x10,0x24,0x14},
// {0x10,0x28,0x18},
// {0x10,0x2C,0x18},
// {0x10,0x30,0x10},
// {0x10,0x34,0x10},
// {0x10,0x38,0x10},
// {0x10,0x3C,0x10},
// {0x14,0x00,0x14},
// {0x14,0x04,0x14},
// {0x14,0x08,0x18},
// {0x14,0x0C,0x18},
// {0x14,0x10,0x14},
// {0x14,0x14,0x14},
// {0x14,0x18,0x18},
// {0x14,0x24,0x14},
// {0x14,0x28,0x18},
// {0x14,0x2C,0x18},
// {0x14,0x30,0x14},
// {0x14,0x34,0x14},
// {0x14,0x38,0x14},
// {0x14,0x3C,0x14},
// {0x18,0x00,0x18},
// {0x18,0x04,0x18},
// {0x18,0x08,0x18},
// {0x18,0x0C,0x18},
// {0x18,0x10,0x18},
// {0x18,0x14,0x18},
// {0x18,0x18,0x18},
// {0x18,0x24,0x18},
// {0x18,0x28,0x18},
// {0x18,0x2C,0x18},
// {0x18,0x30,0x18},
// {0x18,0x34,0x18},
// {0x18,0x38,0x18},
// {0x18,0x3C,0x18},
// {0x24,0x00,0x24},
// {0x24,0x04,0x24},
// {0x24,0x08,0x24},
// {0x24,0x0C,0x24},
// {0x24,0x10,0x14},
// {0x24,0x14,0x14},
// {0x24,0x18,0x18},
// {0x24,0x24,0x24},
// {0x24,0x28,0x24},
// {0x24,0x2C,0x24},
// {0x24,0x30,0x14},
// {0x24,0x34,0x14},
// {0x24,0x38,0x24},
// {0x24,0x3C,0x24},
// {0x28,0x00,0x28},
// {0x28,0x04,0x24},
// {0x28,0x08,0x28},
// {0x28,0x0C,0x24},
// {0x28,0x10,0x18},
// {0x28,0x14,0x18},
// {0x28,0x18,0x18},
// {0x28,0x24,0x24},
// {0x28,0x28,0x28},
// {0x28,0x2C,0x28},
// {0x28,0x30,0x18},
// {0x28,0x34,0x18},
// {0x28,0x38,0x28},
// {0x28,0x3C,0x28},
// {0x2C,0x00,0x2C},
// {0x2C,0x04,0x0C},
// {0x2C,0x08,0x2C},
// {0x2C,0x0C,0x0C},
// {0x2C,0x10,0x18},
// {0x2C,0x14,0x18},
// {0x2C,0x18,0x18},
// {0x2C,0x24,0x0C},
// {0x2C,0x28,0x2C},
// {0x2C,0x2C,0x2C},
// {0x2C,0x30,0x18},
// {0x2C,0x34,0x18},
// {0x2C,0x38,0x2C},
// {0x2C,0x3C,0x2C},
// {0x30,0x00,0x30},
// {0x30,0x04,0x14},
// {0x30,0x08,0x18},
// {0x30,0x0C,0x18},
// {0x30,0x10,0x30},
// {0x30,0x14,0x14},
// {0x30,0x18,0x18},
// {0x30,0x24,0x14},
// {0x30,0x28,0x18},
// {0x30,0x2C,0x18},
// {0x30,0x30,0x30},
// {0x30,0x34,0x30},
// {0x30,0x38,0x30},
// {0x30,0x3C,0x30},
// {0x34,0x00,0x34},
// {0x34,0x04,0x14},
// {0x34,0x08,0x18},
// {0x34,0x0C,0x18},
// {0x34,0x10,0x34},
// {0x34,0x14,0x14},
// {0x34,0x18,0x18},
// {0x34,0x24,0x14},
// {0x34,0x28,0x18},
// {0x34,0x2C,0x18},
// {0x34,0x30,0x34},
// {0x34,0x34,0x34},
// {0x34,0x38,0x34},
// {0x34,0x3C,0x34},
// {0x38,0x00,0x38},
// {0x38,0x04,0x04},
// {0x38,0x08,0x08},
// {0x38,0x0C,0x0C},
// {0x38,0x10,0x34},
// {0x38,0x14,0x14},
// {0x38,0x18,0x18},
// {0x38,0x24,0x04},
// {0x38,0x28,0x08},
// {0x38,0x2C,0x08},
// {0x38,0x30,0x34},
// {0x38,0x34,0x34},
// {0x38,0x38,0x38},
// {0x38,0x3C,0x38},
// {0x3C,0x00,0x3C},
// {0x3C,0x04,0x04},
// {0x3C,0x08,0x2C},
// {0x3C,0x0C,0x0C},
// {0x3C,0x10,0x10},
// {0x3C,0x14,0x14},
// {0x3C,0x18,0x18},
// {0x3C,0x24,0x04},
// {0x3C,0x28,0x2C},
// {0x3C,0x2C,0x2C},
// {0x3C,0x30,0x10},
// {0x3C,0x34,0x10},
// {0x3C,0x38,0x3C},
// {0x3C,0x3C,0x3C},
// // addPotentialInitializationsFrom INITIALIZER END
// }) {
// UnconditionalFlowInfo output(UnconditionalFlowInfo input1,
// UnconditionalFlowInfo input2) {
// return (UnconditionalFlowInfo)
// input1.copy().addPotentialInitializationsFrom(input2);
// }
// },
// mergedWith =
// // mergedWith DEFINITION START
// // def. non null + def. non null => def. non null
// // def. non null + def. null => pot. n & pot. nn
// // def. null + def. null => def. null
// // def. unknown + def. non null => def. unknown
// // def. unknown + def. null => pot. n & pot. un // pot. n priv. over def. unknown
// // def. unknown + def. unknown => def. unknown
// // pot. n & pot. nn + def. non null => pot. n & pot. nn
// // pot. n & pot. nn + def. null => pot. n & pot. nn
// // pot. n & pot. nn + def. unknown => pot. n & pot. nn
// // pot. n & pot. nn + pot. n & pot. nn => pot. n & pot. nn
// // pot. n & pot. un + def. non null => pot. n & pot. nn
// // pot. n & pot. un + def. null => pot. n & pot. un
// // pot. n & pot. un + def. unknown => pot. n & pot. un
// // pot. n & pot. un + pot. n & pot. nn => pot. n & pot. nn
// // pot. n & pot. un + pot. n & pot. un => pot. n & pot. un
// // pot. n & prot. n + def. non null => pot. n & pot. nn
// // pot. n & prot. n + def. null => pot. n & prot. n
// // pot. n & prot. n + def. unknown => pot. n & pot. un
// // pot. n & prot. n + pot. n & pot. nn => pot. n & pot. nn
// // pot. n & prot. n + pot. n & pot. un => pot. n & pot. un
// // pot. n & prot. n + pot. n & prot. n => pot. n & prot. n
// // pot. nn & pot. un + def. non null => pot. nn & pot. un
// // pot. nn & pot. un + def. null => pot. n & pot. nn
// // pot. nn & pot. un + def. unknown => pot. nn & pot. un
// // pot. nn & pot. un + pot. n & pot. nn => pot. n & pot. nn
// // pot. nn & pot. un + pot. n & pot. un => pot. n & pot. nn
// // pot. nn & pot. un + pot. n & prot. n => pot. n & pot. nn
// // pot. nn & pot. un + pot. nn & pot. un => pot. nn & pot. un
// // pot. nn & pot. un + pot. null => pot. n & pot. nn
// // pot. nn & prot. nn + def. non null => pot. nn & prot. nn
// // pot. nn & prot. nn + def. null => pot. n & pot. nn
// // pot. nn & prot. nn + def. unknown => pot. nn & pot. un
// // pot. nn & prot. nn + pot. n & pot. nn => pot. n & pot. nn
// // pot. nn & prot. nn + pot. n & pot. un => pot. n & pot. nn
// // pot. nn & prot. nn + pot. n & prot. n => pot. n & pot. nn
// // pot. nn & prot. nn + pot. nn & pot. un => pot. nn & pot. un
// // pot. nn & prot. nn + pot. nn & prot. nn => pot. nn & prot. nn
// // pot. nn & prot. nn + pot. null => pot. n & pot. nn
// // pot. non null + def. non null => pot. non null
// // pot. non null + def. null => pot. n & pot. nn
// // pot. non null + def. unknown => pot. nn & pot. un
// // pot. non null + pot. n & pot. nn => pot. n & pot. nn
// // pot. non null + pot. n & pot. un => pot. n & pot. nn
// // pot. non null + pot. n & prot. n => pot. n & pot. nn
// // pot. non null + pot. nn & pot. un => pot. nn & pot. un
// // pot. non null + pot. nn & prot. nn => pot. non null
// // pot. non null + pot. non null => pot. non null
// // pot. non null + pot. null => pot. n & pot. nn
// // pot. null + def. non null => pot. n & pot. nn
// // pot. null + def. null => pot. null
// // pot. null + def. unknown => pot. n & pot. un
// // pot. null + pot. n & pot. nn => pot. n & pot. nn
// // pot. null + pot. n & pot. un => pot. n & pot. un
// // pot. null + pot. n & prot. n => pot. null
// // pot. null + pot. null => pot. null
// // pot. unknown + def. non null => pot. nn & pot. un
// // pot. unknown + def. null => pot. n & pot. un
// // pot. unknown + def. unknown => pot. unknown
// // pot. unknown + pot. n & pot. nn => pot. n & pot. nn
// // pot. unknown + pot. n & pot. un => pot. n & pot. un
// // pot. unknown + pot. n & prot. n => pot. n & pot. un
// // pot. unknown + pot. nn & pot. un => pot. nn & pot. un
// // pot. unknown + pot. nn & prot. nn => pot. nn & pot. un
// // pot. unknown + pot. non null => pot. nn & pot. un
// // pot. unknown + pot. null => pot. n & pot. un
// // pot. unknown + pot. unknown => pot. unknown
// // prot. non null + def. non null => pot. nn & prot. nn
// // prot. non null + def. null => pot. null
// // prot. non null + def. unknown => def. unknown // test726
// // prot. non null + pot. n & pot. nn => pot. n & pot. nn
// // prot. non null + pot. n & pot. un => pot. n & pot. un
// // prot. non null + pot. n & prot. n => pot. null
// // prot. non null + pot. nn & pot. un => pot. nn & pot. un
// // prot. non null + pot. nn & prot. nn => pot. nn & prot. nn
// // prot. non null + pot. non null => pot. non null
// // prot. non null + pot. null => pot. null
// // prot. non null + pot. unknown => pot. unknown
// // prot. non null + prot. non null => prot. non null
// // prot. non null + prot. null => pot. null // PREMATURE use tainted instead
// // prot. null + def. non null => pot. non null // PREMATURE should become tainted null & pot. nn... not really, depends on the three way merge... or even on the conditions that got there (pb with no contrib prot. null branch)
// // prot. null + def. null => pot. n & prot. n
// // prot. null + def. unknown => pot. unknown // PREMATURE possibly wrong, but no test case yet
// // prot. null + pot. n & pot. nn => pot. n & pot. nn
// // prot. null + pot. n & pot. un => pot. n & pot. un
// // prot. null + pot. n & prot. n => pot. n & prot. n
// // prot. null + pot. nn & pot. un => pot. n & pot. nn
// // prot. null + pot. nn & prot. nn => pot. n & pot. nn
// // prot. null + pot. non null => pot. n & pot. nn
// // prot. null + pot. null => pot. null
// // prot. null + pot. unknown => pot. unknown // PREMATURE possibly wrong, but no test case yet
// // prot. null + prot. null => prot. null
// // start + def. non null => pot. non null
// // start + def. null => pot. null
// // start + def. unknown => pot. unknown
// // start + pot. n & pot. nn => pot. n & pot. nn
// // start + pot. n & pot. un => pot. n & pot. un
// // start + pot. n & prot. n => pot. null
// // start + pot. nn & pot. un => pot. nn & pot. un
// // start + pot. nn & prot. nn => pot. non null
// // start + pot. non null => pot. non null
// // start + pot. null => pot. null
// // start + pot. unknown => pot. unknown
// // start + prot. non null => start // PREMATURE should it taint?
// // start + prot. null => start
// // start + start => start
// // mergedWith DEFINITION END
// new SymmetricalThreeDimensionalTransformation("mergedWith",
// new byte[][] {
// // mergedWith INITIALIZER START
// {0x00,0x00,0x00},
// {0x00,0x04,0x04},
// {0x00,0x08,0x08},
// {0x00,0x0C,0x0C},
// {0x00,0x10,0x10},
// {0x00,0x14,0x14},
// {0x00,0x18,0x18},
// {0x00,0x24,0x04},
// {0x00,0x28,0x08},
// {0x00,0x2C,0x08},
// {0x00,0x30,0x10},
// {0x00,0x34,0x10},
// {0x00,0x38,0x00},
// {0x00,0x3C,0x00},
// {0x04,0x04,0x04},
// {0x04,0x08,0x0C},
// {0x04,0x0C,0x0C},
// {0x04,0x10,0x14},
// {0x04,0x14,0x14},
// {0x04,0x18,0x18},
// {0x04,0x24,0x04},
// {0x04,0x28,0x0C},
// {0x04,0x2C,0x0C},
// {0x04,0x30,0x14},
// {0x04,0x34,0x14},
// {0x08,0x08,0x08},
// {0x08,0x0C,0x0C},
// {0x08,0x10,0x18},
// {0x08,0x14,0x18},
// {0x08,0x18,0x18},
// {0x08,0x24,0x0C},
// {0x08,0x28,0x08},
// {0x08,0x2C,0x08},
// {0x08,0x30,0x18},
// {0x08,0x34,0x18},
// {0x0C,0x0C,0x0C},
// {0x0C,0x10,0x18},
// {0x0C,0x14,0x18},
// {0x0C,0x18,0x18},
// {0x0C,0x24,0x0C},
// {0x0C,0x28,0x0C},
// {0x0C,0x30,0x18},
// {0x0C,0x34,0x18},
// {0x10,0x10,0x10},
// {0x10,0x14,0x14},
// {0x10,0x18,0x18},
// {0x10,0x24,0x14},
// {0x10,0x28,0x18},
// {0x10,0x30,0x10},
// {0x10,0x34,0x10},
// {0x14,0x14,0x14},
// {0x14,0x18,0x18},
// {0x14,0x24,0x14},
// {0x14,0x28,0x18},
// {0x14,0x30,0x14},
// {0x18,0x18,0x18},
// {0x18,0x24,0x18},
// {0x18,0x28,0x18},
// {0x18,0x30,0x18},
// {0x24,0x24,0x24},
// {0x24,0x28,0x24},
// {0x24,0x30,0x14},
// {0x28,0x28,0x28},
// {0x28,0x30,0x18},
// {0x2C,0x0C,0x0C},
// {0x2C,0x10,0x18},
// {0x2C,0x14,0x18},
// {0x2C,0x18,0x18},
// {0x2C,0x24,0x0C},
// {0x2C,0x28,0x2C},
// {0x2C,0x2C,0x2C},
// {0x2C,0x30,0x18},
// {0x2C,0x34,0x18},
// {0x30,0x30,0x30},
// {0x34,0x14,0x14},
// {0x34,0x18,0x18},
// {0x34,0x24,0x14},
// {0x34,0x28,0x18},
// {0x34,0x30,0x34},
// {0x34,0x34,0x34},
// {0x38,0x04,0x04},
// {0x38,0x08,0x18},
// {0x38,0x0C,0x18},
// {0x38,0x10,0x10},
// {0x38,0x14,0x14},
// {0x38,0x18,0x18},
// {0x38,0x24,0x04},
// {0x38,0x28,0x08},
// {0x38,0x2C,0x18},
// {0x38,0x30,0x34},
// {0x38,0x34,0x34},
// {0x38,0x38,0x38},
// {0x3C,0x04,0x04},
// {0x3C,0x08,0x08},
// {0x3C,0x0C,0x0C},
// {0x3C,0x10,0x10},
// {0x3C,0x14,0x14},
// {0x3C,0x18,0x18},
// {0x3C,0x24,0x24},
// {0x3C,0x28,0x2C},
// {0x3C,0x2C,0x2C},
// {0x3C,0x30,0x10},
// {0x3C,0x34,0x10},
// {0x3C,0x38,0x10},
// {0x3C,0x3C,0x3C},
// // mergedWith INITIALIZER END
// }) {
// UnconditionalFlowInfo output(UnconditionalFlowInfo input1,
// UnconditionalFlowInfo input2) {
// return input1.copy().mergedWith(input2);
// }
// },
// newNullInfoRegistry =
// // newNullInfoRegistry DEFINITION START
// // start => start
// // prot. non null => start
// // prot. null => start
// // pot. unknown => start
// // pot. non null => start
// // pot. nn & prot. nn => start
// // pot. nn & pot. un => start
// // pot. null => start
// // pot. n & prot. n => start
// // pot. n & pot. un => start
// // pot. n & pot. nn => start
// // def. unknown => pot. unknown
// // def. non null => pot. non null
// // def. null => pot. null
// // newNullInfoRegistry DEFINITION END
// new CreationalTransformation("newNullInfoRegistry",
// new byte[][] {
// // newNullInfoRegistry INITIALIZER START
// {0x00,0x00},
// {0x04,0x00},
// {0x08,0x00},
// {0x0C,0x00},
// {0x10,0x00},
// {0x14,0x00},
// {0x18,0x00},
// {0x24,0x04},
// {0x28,0x08},
// {0x2C,0x00},
// {0x30,0x10},
// {0x34,0x00},
// {0x38,0x00},
// {0x3C,0x00},
// // newNullInfoRegistry INITIALIZER END
// }) {
// UnconditionalFlowInfo output(UnconditionalFlowInfo input) {
// return NullInfoRegistryTestHarness.
// testNullInfoRegistry((UnconditionalFlowInfoTestHarness) input);
// }
// };
// public static final Transformation[] transformations = {
// markAsComparedEqualToNonNull,
// markAsComparedEqualToNull,
// markAsDefinitelyNonNull,
// markAsDefinitelyNull,
// markAsDefinitelyUnknown,
// addInitializationsFrom,
// addPotentialInitializationsFrom,
// mergedWith,
// newNullInfoRegistry
// };
//public abstract static class Transformation {
// public String name;
// String definitionStartMarker, definitionEndMarker,
// initializerStartMarker, initializerEndMarker;
// int dimension;
// public Map initializedTransitions, computedTransitions;
// // PREMATURE limit public access
// int failuresNb; // transient
//// PREMATURE complete the test coverage for NullInfoRegistry (need to consider several classes
//// of transitions so as to avoid considering NullInfoRegistry states and
//// UnconditionalFlowInfo states into the same pool; moreover, cross classes
//// transformations exist.
//Transformation(String name) {
// this.name = name;
// this.definitionStartMarker = "// " + name + " " + CodeAnalysis.definitionStartMarker;
// this.definitionEndMarker = "// " + name + " " + CodeAnalysis.definitionEndMarker;
// this.initializerStartMarker = "// " + name + " " + CodeAnalysis.initializerStartMarker;
// this.initializerEndMarker = "// " + name + " " + CodeAnalysis.initializerEndMarker;
//}
//abstract State[] computeOutputs(State[] inputs);
//abstract void hydrate();
//void fail() {
// if (this.failuresNb == 0) {
// System.out.println(this.name + " failures: ");
// }
// this.failuresNb++;
//}
//abstract void printTruthTables(File outputDirectory);
//
//static boolean checkContiguity(String a, String b) {
// int aLength;
// if ((aLength = a.length()) != b.length()) {
// System.out.println("inappropriate string length: " + a + " vs " + b);
// return false;
// }
// int status = 0;
// for (int i = 0; i < aLength; i++) {
// if (a.charAt(i) != b.charAt(i)) {
// status++;
// }
// }
// if (status != 1) {
// System.out.println("non contiguous strings: " + a + " vs " + b);
// return false;
// }
// return true;
//}
//
//final static String truthTableRowNames[] = { // need a specific order to yield simplication opportunities
// "000000",
// "000100",
// "001100",
// "001000",
// "011000",
// "011100",
// "010100",
// "010000",
// "110000",
// "110100",
// "111100",
// "111000",
// "101000",
// "101100",
// "100100",
// "100000",
// // PREMATURE cheated to group first four bits... reconsider
// "000001",
// "000011",
// "000010",
// "000110",
// "000111",
// "000101",
// "001101",
// "001111",
// "001110",
// "001010",
// "001011",
// "001001",
// "011001",
// "011011",
// "011010",
// "011110",
// "011111",
// "011101",
// "010101",
// "010111",
// "010110",
// "010010",
// "010011",
// "010001",
// "110001",
// "110011",
// "110010",
// "110110",
// "110111",
// "110101",
// "111101",
// "111111",
// "111110",
// "111010",
// "111011",
// "111001",
// "101001",
// "101011",
// "101010",
// "101110",
// "101111",
// "101101",
// "100101",
// "100111",
// "100110",
// "100010",
// "100011",
// "100001",
// };
//
//private static Map ranksForStates;
//int rankForState(State state) {
// int length;
// if (ranksForStates == null) {
// ranksForStates = new HashMap(length = truthTableRowNames.length);
// for (int i = 0; i < length; i++) {
// ranksForStates.put(truthTableRowNames[i], new Integer(i));
// }
// }
// Integer rank;
// if ((rank = (Integer) ranksForStates.get(state.printableBitsField)) != null) {
// return rank.intValue();
// }
// return 0;
//}
//
//abstract void reinitializeFromComments(BufferedReader input, BufferedWriter output);
//abstract void reinitializeFromComputedValues(BufferedReader input, BufferedWriter output,
// State[] consideredStates);
///**
// * Run a test against UnconditionalFlowInfo by comparing the transitions as memorized
// * into the initializer and as delivered by UnconditionalFlowInfo for various positions
// * in the encoding and return the number of failures.
// * @return the number of failures, that is 0 if the results match the expectations
// */
//abstract int test();
//}
//abstract static class TwoDimensionalTransformation extends Transformation {
//TwoDimensionalTransformation(String name, byte[][] transitions) {
// super(name);
// this.dimension = 2;
// int length;
// this.initializedTransitions = new HashMap(length = transitions.length);
// State input1;
// for (int i = 0; i < length; i++) {
// if (transitions[i].length != 2) {
// throw new IllegalArgumentException("transitions should have two entries");
// }
// input1 = State.states[transitions[i][0]]; // array out of bounds exception if broken
// if (this.initializedTransitions.get(input1) != null) {
// throw new IllegalArgumentException("duplicate entry");
// }
// this.initializedTransitions.put(input1, State.states[transitions[i][1]]);
// }
//}
//State[] computeOutputs(State[] inputs) {
// Map resultAccumulator = new HashMap(State.stateMaxValue + 1);
// hydrate(); // pre-compute all possible combinations, then cache them
// for (int i = 0, inputsLength = inputs.length; i < inputsLength; i++) {
// resultAccumulator.put(this.computedTransitions.get(inputs[i]), null);
// }
// int length;
// State[] result = new State[length = resultAccumulator.size()];
// Iterator resultIterator = resultAccumulator.keySet().iterator();
// for (int j = 0; j < length; j++) {
// result[j] = (State) resultIterator.next();
// }
// return result;
//}
//void hydrate() {
// if (this.computedTransitions == null) {
// State input, output;
// this.computedTransitions = new HashMap(State.stateMaxValue + 1);
// for (int i = 0, length = State.states.length; i < length; i++) {
// output = ((UnconditionalFlowInfoTestHarness)
// output(UnconditionalFlowInfoTestHarness.
// testUnconditionalFlowInfo(input = State.states[i]),
// TestLocalVariableBinding.local0)).asState();
// if (input.symbolic && !output.symbolic) {
// System.err.println(this.name + " generates non-symbolic state " +
// output + " upon entry: " + input);
// }
// this.computedTransitions.put(input, output);
// }
// }
//}
//abstract UnconditionalFlowInfo output(UnconditionalFlowInfo input, TestLocalVariableBinding local);
//
//void printTruthTables(File outputDirectory) {
// try {
// String outputFileName = outputDirectory.getPath() + File.separator + this.name + ".txt";
// PrintWriter out = new PrintWriter(new FileOutputStream(
// new File(outputFileName)));
// System.out.println("Printing " + outputFileName);
// out.println("======================================================");
// out.println("Truth table for " + this.name );
// char truthValues[][] = new char[State.statesNb][State.stateWidth];
// int row, column;
// for (row = 0; row < State.statesNb; row++) {
// for (column = 0; column < State.stateWidth; column++) {
// truthValues[row][column] = '.';
// }
// }
// boolean keepRow[] = new boolean[State.statesNb];
// Iterator i1 = this.initializedTransitions.entrySet().iterator();
// while (i1.hasNext()) {
// Map.Entry transitionsSet = (Map.Entry) i1.next();
// State input = (State) transitionsSet.getKey();
// keepRow[row = rankForState(input)] = true;
// for (int bit = 0; bit < State.stateWidth; bit++) {
// truthValues[row][bit] =
// ((State) transitionsSet.getValue()).printableBitsField.charAt(bit);
// }
// }
// StringBuffer line;
// line = new StringBuffer(140);
// line.append(" ");
// for (int i = 1; i <= State.stateWidth; i++) {
// line.append(i);
// line.append(' ');
// }
// out.println(line);
// line = new StringBuffer(140);
// line.append(" ---------------------");
// out.println(line);
// for (row = 0; row < State.statesNb; row++) {
// if (keepRow[row]) {
// line = new StringBuffer(140);
// line.append(truthTableRowNames[row]);
// line.append(" | ");
// for (int i = 0; i < State.stateWidth; i++) {
// line.append(truthValues[row][i]);
// line.append(' ');
// }
// out.println(line);
// }
// }
// out.println("======================================================");
// out.flush();
// out.close();
// }
// catch (Throwable t) {
// // PREMATURE improve error handling
// }
//}
//
//void reinitializeFromComments(BufferedReader input, BufferedWriter output) {
// String line, tab = "";
// int cursor;
// char c;
// this.initializedTransitions = new HashMap(State.stateMaxValue);
// int lineNumber = 0;
// try {
// while ((line = input.readLine()) != null) {
// lineNumber++;
// output.write(line);
// output.write('\n');
// if ((cursor = line.indexOf(definitionStartMarker)) != -1) {
// // check the line format
// boolean reachedStart = true;
// for (int i = 0; i < cursor; i++) {
// if (!Character.isWhitespace(c = line.charAt(i))) {
// reachedStart = false;
// break;
// }
// else {
// tab += c;
// }
// }
// if (reachedStart) {
// while ((line = input.readLine()) != null &&
// line.indexOf(definitionEndMarker) == -1) {
// lineNumber++;
// final int
// start = 0,
// commentStart = 1,
// commentFound = 2,
// firstState = 10,
// firstStateWS = 11,
// implies = 20,
// impliesWS = 21,
// secondState = 30,
// secondStateWS = 31, // caveat, multi-state
// error = 99;
// int state = start,
// firstStateStart = 0, firstStateEnd = 0, firstStateWhiteSpace = 0,
// secondStateStart = 0, secondStateEnd = 0, secondStateWhiteSpace = 0;
// char current;
// analysis: for (int i = 0, length = line.length(); i < length; i++) {
// current = line.charAt(i);
// switch (state) {
// case start:
// if (current == '/') {
// state = commentStart;
// } else if (! Character.isWhitespace(current)) {
// state = error;
// break analysis;
// }
// break;
// case commentStart:
// if (current == '/') {
// state = commentFound;
// } else {
// state = error;
// break analysis;
// }
// break;
// case commentFound:
// if (! Character.isWhitespace(current)) {
// firstStateStart = firstStateEnd = i;
// state = firstState;
// }
// break;
// case firstState:
// if (Character.isWhitespace(current)) {
// state = firstStateWS;
// firstStateWhiteSpace = 1;
// } else {
// firstStateEnd++;
// }
// break;
// case firstStateWS:
// if (current == '=') {
// state = implies;
// } else if (Character.isWhitespace(current)) {
// firstStateWhiteSpace++;
// } else {
// state = firstState;
// firstStateEnd += firstStateWhiteSpace + 1;
// }
// break;
// case implies:
// if (current == '>') {
// state = impliesWS;
// } else {
// state = error;
// break analysis;
// }
// break;
// case impliesWS:
// if (! Character.isWhitespace(current)) {
// secondStateStart = secondStateEnd = i;
// state = secondState;
// }
// break;
// case secondState:
// if (current == '/') {
// break analysis;
// } else if (Character.isWhitespace(current)) {
// state = secondStateWS;
// secondStateWhiteSpace = 1;
// } else {
// secondStateEnd++;
// }
// break;
// case secondStateWS:
// if (current == '/') {
// state = secondState;
// break analysis;
// } else if (current == 'C') {
// state++;
// } else if (Character.isWhitespace(current)) {
// secondStateWhiteSpace++;
// } else {
// state = secondState;
// secondStateEnd += secondStateWhiteSpace + 1;
// }
// break;
// case secondStateWS + 1:
// if (current == '/') {
// state = secondState;
// break analysis;
// } else if (current == 'H') {
// state++;
// } else {
// state = secondState;
// secondStateEnd += secondStateWhiteSpace + 2;
// }
// break;
// case secondStateWS + 2:
// if (current == '/') {
// state = secondState;
// break analysis;
// } else if (current == 'E') {
// state++;
// } else {
// state = secondState;
// secondStateEnd += secondStateWhiteSpace + 3;
// }
// break;
// case secondStateWS + 3:
// if (current == '/') {
// state = secondState;
// break analysis;
// } else if (current == 'C') {
// state++;
// } else {
// state = secondState;
// secondStateEnd += secondStateWhiteSpace + 4;
// }
// break;
// case secondStateWS + 4:
// if (current == '/' || current == 'K') {
// state = secondState;
// break analysis;
// } else {
// state = secondState;
// secondStateEnd += secondStateWhiteSpace + 5;
// }
// break;
//
// }
// }
// if (state == error || state < secondState) {
// System.err.println("Could not interpret comment definition"); // PREMATURE improve diagnostic
// } else {
// if (state > secondStateWS) {
// secondStateEnd += (state - secondState);
// }
// String stateName;
// State first, second;
// if ((first = State.fromSymbolicName(
// stateName = line.substring(firstStateStart, firstStateEnd + 1)))
// == null) {
// System.err.println("Could not find state: " + stateName); // PREMATURE improve diagnostic
// }
// if ((second = State.fromSymbolicName(
// stateName = line.substring(secondStateStart, secondStateEnd + 1)))
// == null) {
// System.err.println("Could not find state: " + stateName); // PREMATURE improve diagnostic
// }
// if (first != null && second != null) {
// if (this.initializedTransitions.get(first) != null) {
// System.err.println("Line " + lineNumber + ": Skipping duplicate entry for state: " + first); // PREMATURE improve diagnostic
// } else {
// this.initializedTransitions.put(first, second);
// }
// }
// }
// output.write(line);
// output.write('\n');
// }
// Iterator firsts = State.symbolicStates();
// State first;
// while (firsts.hasNext()) {
// first = (State) firsts.next();
// if (this.initializedTransitions.get(first) == null) {
// System.err.println("Adding missing transition for state: " + first);
// output.write(tab);
// output.write("// ");
// output.write(first.toString());
// output.write(" => start\t\t CHECK\n");
// }
// }
// }
// output.write(tab + definitionEndMarker + "\n");
// }
// if (line != null && (cursor = line.indexOf(initializerStartMarker)) != -1) {
// // check the line format
// boolean reachedStart = true;
// tab = "";
// for (int i = 0; i < cursor; i++) {
// if (!Character.isWhitespace(c = line.charAt(i))) {
// reachedStart = false;
// break;
// }
// else {
// tab += c;
// }
// }
// if (reachedStart) {
// while ((line = input.readLine()) != null &&
// line.indexOf(initializerEndMarker) == -1) {
// // loop
// }
// SortedMap sorted = new TreeMap(this.initializedTransitions);
// Iterator transitions = sorted.entrySet().iterator();
// Map.Entry transition;
// while (transitions.hasNext()) {
// transition = (Map.Entry) transitions.next();
// output.write(tab);
// output.write('{');
// output.write(((State)transition.getKey()).hexString);
// output.write(',');
// output.write(((State)transition.getValue()).hexString);
// output.write("},");
// output.write('\n');
// }
// output.write(tab + initializerEndMarker + "\n");
// }
// }
// }
// output.flush();
// } catch (IOException e) {
// throw new RuntimeException(e);
// }
//}
//
//void reinitializeFromComputedValues(BufferedReader input, BufferedWriter output,
// State[] consideredStates) {
// String line, tab = "";
// int cursor;
// char c;
// State result;
// try {
// while ((line = input.readLine()) != null) {
// output.write(line);
// output.write('\n');
// if ((cursor = line.indexOf(definitionStartMarker)) != -1) {
// // check the line format
// boolean reachedStart = true;
// for (int i = 0; i < cursor; i++) {
// if (!Character.isWhitespace(c = line.charAt(i))) {
// reachedStart = false;
// break;
// }
// else {
// tab += c;
// }
// }
// if (reachedStart) {
// while ((line = input.readLine()) != null &&
// line.indexOf(definitionEndMarker) == -1) {
// // loop
// }
// int i, length;
// for (i = 0, length = consideredStates.length; i < length; i++) {
// output.write(tab);
// output.write("// ");
// output.write(consideredStates[i].name);
// output.write(" => ");
// output.write(
// (result = (State) this.computedTransitions.get(consideredStates[i])).name);
// if (!result.symbolic ||
// result != this.initializedTransitions.get(consideredStates[i])) {
// output.write("\t\t CHECK");
// }
// output.write('\n');
// }
// output.write(tab + definitionEndMarker + "\n");
// }
// }
// if (line != null && (cursor = line.indexOf(initializerStartMarker)) != -1) {
// // check the line format
// boolean reachedStart = true;
// tab = "";
// for (int i = 0; i < cursor; i++) {
// if (!Character.isWhitespace(c = line.charAt(i))) {
// reachedStart = false;
// break;
// }
// else {
// tab += c;
// }
// }
// if (reachedStart) {
// while ((line = input.readLine()) != null &&
// line.indexOf(initializerEndMarker) == -1) {
// // loop
// }
// int i, length;
// for (i = 0, length = consideredStates.length; i < length; i++) {
// output.write(tab);
// output.write('{');
// output.write(consideredStates[i].hexString);
// output.write(',');
// output.write(
// ((State) this.computedTransitions.get(consideredStates[i])).hexString);
// output.write("},");
// output.write('\n');
// }
// output.write(tab + initializerEndMarker + "\n");
// }
// }
// }
// output.flush();
// } catch (IOException e) {
// throw new RuntimeException(e);
// }
//}
//int test() {
// Iterator transitions = this.initializedTransitions.entrySet().iterator();
// State input, expectedOutput, effectiveOutput;
// Map.Entry transition;
// this.failuresNb = 0; // reset
// while (transitions.hasNext()) {
// transition = (Map.Entry) transitions.next();
// input = (State) transition.getKey();
// expectedOutput = (State) transition.getValue();
// effectiveOutput = ((UnconditionalFlowInfoTestHarness)
// output(UnconditionalFlowInfoTestHarness.
// testUnconditionalFlowInfo(input),
// TestLocalVariableBinding.local0)).asState();
// if (effectiveOutput != expectedOutput) {
// fail();
// System.out.println("\t\t" + input.printableBitsField +
// " => " + effectiveOutput.printableBitsField +
// " instead of: " + expectedOutput.printableBitsField);
// }
// }
// transitions = this.initializedTransitions.entrySet().iterator();
// while (transitions.hasNext()) {
// transition = (Map.Entry) transitions.next();
// input = (State) transition.getKey();
// expectedOutput = (State) transition.getValue();
// effectiveOutput = ((UnconditionalFlowInfoTestHarness)
// output(UnconditionalFlowInfoTestHarness.
// testUnconditionalFlowInfo(input, 64),
// TestLocalVariableBinding.local64)).asState(64);
// if (effectiveOutput != expectedOutput) {
// fail();
// System.out.println("\t\t" + input.printableBitsField +
// " => " + effectiveOutput.printableBitsField +
// " (64) instead of: " + expectedOutput.printableBitsField);
// }
// if (input == State.start) {
// effectiveOutput = ((UnconditionalFlowInfoTestHarness)
// output(UnconditionalFlowInfoTestHarness.
// testUnconditionalFlowInfo(expectedOutput),
// TestLocalVariableBinding.local64)).asState(64);
// if (effectiveOutput != expectedOutput) {
// fail();
// System.out.println("\t\t" + input.printableBitsField +
// " => " + effectiveOutput.printableBitsField +
// " (zero 64) instead of: " + expectedOutput.printableBitsField);
// }
// }
// }
// transitions = this.initializedTransitions.entrySet().iterator();
// while (transitions.hasNext()) {
// transition = (Map.Entry) transitions.next();
// input = (State) transition.getKey();
// if (input == State.start) {
// expectedOutput = (State) transition.getValue();
// effectiveOutput = ((UnconditionalFlowInfoTestHarness)
// output(UnconditionalFlowInfoTestHarness.
// testUnconditionalFlowInfo(expectedOutput, 64),
// TestLocalVariableBinding.local128)).asState(128);
// if (effectiveOutput != expectedOutput) {
// fail();
// System.out.println("\t\t" + input.printableBitsField +
// " => " + effectiveOutput.printableBitsField +
// " (zero 128) instead of: " + expectedOutput.printableBitsField);
// }
// }
// }
// return this.failuresNb;
//}
//}
//abstract static class CreationalTransformation extends TwoDimensionalTransformation {
//CreationalTransformation(String name, byte[][] transitions) {
// super(name, transitions);
//}
//void hydrate() {
// if (this.computedTransitions == null) {
// State input, output;
// this.computedTransitions = new HashMap(State.stateMaxValue + 1);
// for (int i = 0, length = State.states.length; i < length; i++) {
// output = ((NullInfoRegistryTestHarness)
// output(UnconditionalFlowInfoTestHarness.
// testUnconditionalFlowInfo(input = State.states[i]),
// TestLocalVariableBinding.local0)).asState();
// if (input.symbolic && !output.symbolic) {
// System.err.println(this.name + " generates non-symbolic state " +
// output + " upon entry: " + input);
// }
// this.computedTransitions.put(input, output);
// }
// }
//}
//UnconditionalFlowInfo output(UnconditionalFlowInfo input, TestLocalVariableBinding local) {
// return output(input);
//}
//abstract UnconditionalFlowInfo output(UnconditionalFlowInfo input);
//int test() {
// Iterator transitions = this.initializedTransitions.entrySet().iterator();
// State input, expectedOutput, effectiveOutput;
// Map.Entry transition;
// this.failuresNb = 0; // reset
// while (transitions.hasNext()) {
// transition = (Map.Entry) transitions.next();
// input = (State) transition.getKey();
// expectedOutput = (State) transition.getValue();
// effectiveOutput = ((NullInfoRegistryTestHarness)
// output(UnconditionalFlowInfoTestHarness.
// testUnconditionalFlowInfo(input),
// TestLocalVariableBinding.local0)).asState();
// if (effectiveOutput != expectedOutput) {
// fail();
// System.out.println("\t\t" + input.printableBitsField +
// " => " + effectiveOutput.printableBitsField +
// " instead of: " + expectedOutput.printableBitsField);
// }
// }
// transitions = this.initializedTransitions.entrySet().iterator();
// while (transitions.hasNext()) {
// transition = (Map.Entry) transitions.next();
// input = (State) transition.getKey();
// expectedOutput = (State) transition.getValue();
// effectiveOutput = ((NullInfoRegistryTestHarness)
// output(UnconditionalFlowInfoTestHarness.
// testUnconditionalFlowInfo(input, 64))).asState(64);
// if (effectiveOutput != expectedOutput) {
// fail();
// System.out.println("\t\t" + input.printableBitsField +
// " => " + effectiveOutput.printableBitsField +
// " (64) instead of: " + expectedOutput.printableBitsField);
// }
// }
// return this.failuresNb;
//}
//}
//public abstract static class ThreeDimensionalTransformation extends Transformation {
//ThreeDimensionalTransformation(String name) {
// super(name);
// this.dimension = 3;
//}
//ThreeDimensionalTransformation(String name, byte[][] transitions) {
// super(name);
// this.dimension = 3;
// int length;
// this.initializedTransitions = new HashMap(length = transitions.length);
// State input1, input2;
// for (int i = 0; i < length; i++) {
// if (transitions[i].length != 3) {
// throw new IllegalArgumentException("transitions should have three entries");
// }
// input1 = State.states[transitions[i][0]]; // array out of bounds exception if broken
// input2 = State.states[transitions[i][1]];
// Map transitionsForInput1 = (Map) this.initializedTransitions.get(input1);
// if (transitionsForInput1 == null) {
// transitionsForInput1 = new HashMap(length);
// this.initializedTransitions.put(input1, transitionsForInput1);
// }
// if (transitionsForInput1.get(input2) != null) {
// throw new IllegalArgumentException("duplicate entry");
// }
// transitionsForInput1.put(input2, State.states[transitions[i][2]]);
// }
//}
//State[] computeOutputs(State[] inputs) {
// Map resultAccumulator = new HashMap(State.stateMaxValue + 1);
// hydrate(); // pre-compute all possible combinations, then cache them
// for (int i = 0, inputsLength = inputs.length; i < inputsLength; i++) {
// for (int i2 = 0; i2 < inputsLength; i2++) {
// resultAccumulator.put(
// ((Map) this.computedTransitions.get(inputs[i])).get(inputs[i2]), null);
// }
// }
// int length;
// State[] result = new State[length = resultAccumulator.size()];
// Iterator resultIterator = resultAccumulator.keySet().iterator();
// for (int j = 0; j < length; j++) {
// result[j] = (State) resultIterator.next();
// }
// return result;
//}
//void hydrate() {
// if (this.computedTransitions == null) {
// State input1, input2, output;
// this.computedTransitions = new HashMap(State.stateMaxValue + 1);
// Map entry;
// for (int i = 0, length = State.states.length; i < length; i++) {
// entry = new HashMap(State.stateMaxValue + 1);
// this.computedTransitions.put(input1 = State.states[i], entry);
// for (int j = 0; j < length; j++) {
// output = ((UnconditionalFlowInfoTestHarness)
// output(UnconditionalFlowInfoTestHarness.
// testUnconditionalFlowInfo(input1),
// UnconditionalFlowInfoTestHarness.
// testUnconditionalFlowInfo(input2 = State.states[j]))).asState();
// if (input1.symbolic && input2.symbolic && !output.symbolic) {
// System.err.println(this.name + " generates non-symbolic state " +
// output + " upon entry: " + input1 + " + " + input2);
// }
// entry.put(input2, output);
// }
// }
// }
//}
//abstract UnconditionalFlowInfo output(UnconditionalFlowInfo input1, UnconditionalFlowInfo input2);
//void printDefinitions(BufferedWriter output, State[] consideredStates, String tab)
// throws IOException {
// int i, j, length;
// State result;
// for (i = 0, length = consideredStates.length; i < length; i++) {
// for (j = 0; j < length; j++) {
// output.write(tab);
// output.write("// ");
// output.write(consideredStates[i].name);
// output.write(" + ");
// output.write(consideredStates[j].name);
// output.write(" => ");
// output.write(
// (result = (State)
// ((Map) this.computedTransitions.get(consideredStates[i])).get(consideredStates[j])).name);
// if (!result.symbolic ||
// result != this.initializedTransitions.get(consideredStates[i])) {
// output.write("\t\t CHECK");
// }
// output.write('\n');
// }
// }
//}
//void printInitializers(BufferedWriter output, State[] consideredStates, String tab)
// throws IOException {
// int i, j, length;
// for (i = 0, length = consideredStates.length; i < length; i++) {
// for (j = 0; j < length; j++) {
// output.write(tab);
// output.write('{');
// output.write(consideredStates[i].hexString);
// output.write(',');
// output.write(consideredStates[j].hexString);
// output.write(',');
// output.write(
// ((State)
// ((Map) this.computedTransitions.get(consideredStates[i])).get(consideredStates[j])).hexString);
// output.write("},");
// output.write('\n');
// }
// }
//}
//void printMissingEntries(BufferedWriter output, String tab) throws IOException {
// Iterator firsts = State.symbolicStates(), seconds;
// State first, second;
// Map transitions;
// while (firsts.hasNext()) {
// first = (State) firsts.next();
// seconds = State.symbolicStates();
// if ((transitions = (Map) this.initializedTransitions.get(first))
// == null) {
// while (seconds.hasNext()) {
// second = (State) seconds.next();
// System.err.println("Adding missing transition for states (" + first + ", " + second + ")");
// output.write(tab);
// output.write("// ");
// output.write(first.toString());
// output.write(" + ");
// output.write(second.toString());
// output.write(" => start\t\t CHECK\n");
// }
// } else {
// while (seconds.hasNext()) {
// second = (State) seconds.next();
// if (transitions.get(second) == null) {
// System.err.println("Adding missing transition for states (" + first + ", " + second + ")");
// output.write(tab);
// output.write("// ");
// output.write(first.toString());
// output.write(" + ");
// output.write(second.toString());
// output.write(" => start\t\t CHECK\n");
// }
// }
// }
// }
//}
//void printTruthTables(File outputDirectory) {
// for (int bit = 1; bit <= State.stateWidth; bit++) {
// try {
// String outputFileName = outputDirectory.getPath() + File.separator + this.name + "_" + bit + ".txt";
// PrintWriter out = new PrintWriter(new FileOutputStream(
// new File(outputFileName)));
// System.out.println("Printing " + outputFileName);
// out.println("======================================================");
// out.println("Truth table for " + this.name + " null bit " + bit);
// char truthValues[][] = new char[State.statesNb][State.statesNb];
// int row, column;
// for (row = 0; row < State.statesNb; row++) {
// for (column = 0; column < State.statesNb; column++) {
// truthValues[row][column] = '.';
// }
// }
// if (false) { // checking row names
// boolean gotProblem = false;
// if (truthTableRowNames.length > State.statesNb) {
// System.out.println("row names table contains too many rows");
// gotProblem = true;
// }
// else if (truthTableRowNames.length < State.statesNb) {
// System.out.println("row names table contains too few rows");
// gotProblem = true;
// }
// Map check = new HashMap(State.statesNb);
// for (row = 0; row < truthTableRowNames.length; row++) {
// if (check.containsKey(truthTableRowNames[row])) {
// System.out.println("duplicate row: " + truthTableRowNames[row]);
// gotProblem = true;
// }
// else {
// check.put(truthTableRowNames[row], null);
// }
// if (row > 0 && !checkContiguity(truthTableRowNames[row - 1], truthTableRowNames[row])) {
// gotProblem = true;
// }
// }
// // assertFalse("invalid rows table", gotProblem);
// }
// boolean keepRow[] = new boolean[State.statesNb],
// keepColumn[] = new boolean[State.statesNb];
// Iterator i1 = this.initializedTransitions.entrySet().iterator();
// while (i1.hasNext()) {
// Map.Entry transitionsSet = (Map.Entry) i1.next();
// State first = (State) transitionsSet.getKey();
// Iterator i2 = ((Map) transitionsSet.getValue()).entrySet().iterator();
// while (i2.hasNext()) {
// Map.Entry transition = (Map.Entry) i2.next();
// mark(truthValues, keepRow, keepColumn, rankForState(first),
// rankForState((State) transition.getKey()),
// ((State) transition.getValue()).printableBitsField.charAt(bit - 1));
// }
// }
// for (row = 0; row < State.statesNb; row += 2) {
// if (keepRow[row]) {
// keepRow[row + 1] = true;
// }
// else if (keepRow[row + 1]) {
// keepRow[row] = true;
// }
// if (keepColumn[row]) {
// keepColumn[row + 1] = true;
// }
// else if (keepColumn[row + 1]) {
// keepColumn[row] = true;
// }
// }
// StringBuffer line;
// for (int i = 0; i < State.stateWidth; i++) {
// line = new StringBuffer(140);
// line.append(" ");
// for (column = 0; column < State.statesNb; column++) {
// if (keepColumn[column]) {
// line.append(truthTableRowNames[column].charAt(i));
// line.append(' ');
// }
// }
// out.println(line);
// }
// line = new StringBuffer(140);
// line.append(" --");
// for (column = 0; column < State.statesNb; column++) {
// if (keepColumn[column]) {
// line.append('-');
// line.append('-');
// }
// }
// out.println(line);
// for (row = 0; row < State.statesNb; row++) {
// if (keepRow[row]) {
// line = new StringBuffer(140);
// line.append(truthTableRowNames[row]);
// line.append(" | ");
// for (column = 0; column < State.statesNb; column++) {
// if (keepColumn[column]) {
// line.append(truthValues[row][column]);
// line.append(' ');
// }
// }
// out.println(line);
// }
// }
// out.println("======================================================");
// out.flush();
// out.close();
// }
// catch (Throwable t) {
// // PREMATURE improve error handling
// }
// }
//}
//
//void mark(char truthValues[][], boolean keepRow[], boolean keepColumn[],
// int row, int column, char value) {
// truthValues[row][column] = value;
// keepRow[row] = true;
// keepColumn[column] = true;
//}
//
//void reinitializeFromComments(BufferedReader input, BufferedWriter output) {
// String line, tab = "";
// int cursor;
// char c;
// this.initializedTransitions = new HashMap(State.stateMaxValue);
// int lineNumber = 0;
// try {
// while ((line = input.readLine()) != null) {
// lineNumber++;
// output.write(line);
// output.write('\n');
// if ((cursor = line.indexOf(definitionStartMarker)) != -1) {
// // check the line format
// boolean reachedStart = true;
// for (int i = 0; i < cursor; i++) {
// if (!Character.isWhitespace(c = line.charAt(i))) {
// reachedStart = false;
// break;
// }
// else {
// tab += c;
// }
// }
// if (reachedStart) {
// while ((line = input.readLine()) != null &&
// line.indexOf(definitionEndMarker) == -1) {
// lineNumber++;
// final int
// start = 0,
// commentStart = 1,
// commentFound = 2,
// firstState = 10,
// firstStateWS = 11,
// plus = 20,
// secondState = 30,
// secondStateWS = 31,
// implies = 40,
// impliesWS = 41,
// thirdState = 50,
// thirdStateWS = 51, // caveat, multi-state
// error = 99;
// int state = start,
// firstStateStart = 0, firstStateEnd = 0, firstStateWhiteSpace = 0,
// secondStateStart = 0, secondStateEnd = 0, secondStateWhiteSpace = 0,
// thirdStateStart = 0, thirdStateEnd = 0, thirdStateWhiteSpace = 0;
// char current;
// analysis: for (int i = 0, length = line.length(); i < length; i++) {
// current = line.charAt(i);
// switch (state) {
// case start:
// if (current == '/') {
// state = commentStart;
// } else if (! Character.isWhitespace(current)) {
// state = error;
// break analysis;
// }
// break;
// case commentStart:
// if (current == '/') {
// state = commentFound;
// } else {
// state = error;
// break analysis;
// }
// break;
// case commentFound:
// if (! Character.isWhitespace(current)) {
// firstStateStart = firstStateEnd = i;
// state = firstState;
// }
// break;
// case firstState:
// if (Character.isWhitespace(current)) {
// state = firstStateWS;
// firstStateWhiteSpace = 1;
// } else {
// firstStateEnd++;
// }
// break;
// case firstStateWS:
// if (current == '+') {
// state = plus;
// } else if (Character.isWhitespace(current)) {
// firstStateWhiteSpace++;
// } else {
// state = firstState;
// firstStateEnd += firstStateWhiteSpace + 1;
// }
// break;
// case plus:
// if (! Character.isWhitespace(current)) {
// secondStateStart = secondStateEnd = i;
// state = secondState;
// }
// break;
// case secondState:
// if (Character.isWhitespace(current)) {
// state = secondStateWS;
// secondStateWhiteSpace = 1;
// } else {
// secondStateEnd++;
// }
// break;
// case secondStateWS:
// if (current == '=') {
// state = implies;
// } else if (Character.isWhitespace(current)) {
// secondStateWhiteSpace++;
// } else {
// state = secondState;
// secondStateEnd += secondStateWhiteSpace + 1;
// }
// break;
// case implies:
// if (current == '>') {
// state = impliesWS;
// } else {
// state = error;
// break analysis;
// }
// break;
// case impliesWS:
// if (! Character.isWhitespace(current)) {
// thirdStateStart = thirdStateEnd = i;
// state = thirdState;
// }
// break;
// case thirdState:
// if (current == '/') {
// break analysis;
// } else if (Character.isWhitespace(current)) {
// state = thirdStateWS;
// thirdStateWhiteSpace = 1;
// } else {
// thirdStateEnd++;
// }
// break;
// case thirdStateWS:
// if (current == '/') {
// state = thirdState;
// break analysis;
// } else if (current == 'C') {
// state++;
// } else if (Character.isWhitespace(current)) {
// thirdStateWhiteSpace++;
// } else {
// state = thirdState;
// thirdStateEnd += thirdStateWhiteSpace + 1;
// }
// break;
// case thirdStateWS + 1:
// if (current == '/') {
// state = thirdState;
// break analysis;
// } else if (current == 'H') {
// state++;
// } else {
// state = thirdState;
// thirdStateEnd += thirdStateWhiteSpace + 2;
// }
// break;
// case thirdStateWS + 2:
// if (current == '/') {
// state = thirdState;
// break analysis;
// } else if (current == 'E') {
// state++;
// } else {
// state = thirdState;
// thirdStateEnd += thirdStateWhiteSpace + 3;
// }
// break;
// case thirdStateWS + 3:
// if (current == '/') {
// state = thirdState;
// break analysis;
// } else if (current == 'C') {
// state++;
// } else {
// state = thirdState;
// thirdStateEnd += thirdStateWhiteSpace + 4;
// }
// break;
// case thirdStateWS + 4:
// if (current == '/' || current == 'K') {
// state = thirdState;
// break analysis;
// } else {
// state = thirdState;
// thirdStateEnd += thirdStateWhiteSpace + 5;
// }
// break;
//
// }
// }
// if (state == error || state < thirdState) {
// System.err.println("Could not interpret comment definition"); // PREMATURE improve diagnostic
// } else {
// if (state > thirdStateWS) {
// thirdStateEnd += (state - thirdState);
// }
// String stateName;
// State first, second, third;
// if ((first = State.fromSymbolicName(
// stateName = line.substring(firstStateStart, firstStateEnd + 1)))
// == null) {
// System.err.println("Could not find state: " + stateName); // PREMATURE improve diagnostic
// }
// if ((second = State.fromSymbolicName(
// stateName = line.substring(secondStateStart, secondStateEnd + 1)))
// == null) {
// System.err.println("Could not find state: " + stateName); // PREMATURE improve diagnostic
// }
// if ((third = State.fromSymbolicName(
// stateName = line.substring(thirdStateStart, thirdStateEnd + 1)))
// == null) {
// System.err.println("Could not find state: " + stateName); // PREMATURE improve diagnostic
// }
// if (first != null && second != null && third != null) {
// Map transitions;
// if ((transitions = (Map) this.initializedTransitions.get(first)) == null) {
// transitions = new HashMap(State.stateMaxValue + 1);
// this.initializedTransitions.put(first, transitions);
// }
// if (transitions.get(second) != null) {
// System.err.println("Line " + lineNumber + ": Skipping duplicate entry for states: (" + first
// + ", " + second + ")"); // PREMATURE improve diagnostic
// } else {
// transitions.put(second, third);
// }
// }
// }
// output.write(line);
// output.write('\n');
// }
// }
// printMissingEntries(output, tab);
// output.write(tab + definitionEndMarker + "\n");
// }
// if (line != null && (cursor = line.indexOf(initializerStartMarker)) != -1) {
// // check the line format
// boolean reachedStart = true;
// tab = "";
// for (int i = 0; i < cursor; i++) {
// if (!Character.isWhitespace(c = line.charAt(i))) {
// reachedStart = false;
// break;
// }
// else {
// tab += c;
// }
// }
// if (reachedStart) {
// while ((line = input.readLine()) != null &&
// line.indexOf(initializerEndMarker) == -1) {
// // loop
// }
// SortedMap sortedTransitionsSet = new TreeMap(this.initializedTransitions);
// Iterator transitionsSets = sortedTransitionsSet.entrySet().iterator();
// Map.Entry transitionsSet;
// while (transitionsSets.hasNext()) {
// transitionsSet = (Map.Entry) transitionsSets.next();
// SortedMap sortedTransitions = new TreeMap((Map) transitionsSet.getValue());
// Iterator transitions = sortedTransitions.entrySet().iterator();
// Map.Entry transition;
// while (transitions.hasNext()) {
// transition = (Map.Entry) transitions.next();
// output.write(tab);
// output.write('{');
// output.write(((State)transitionsSet.getKey()).hexString);
// output.write(',');
// output.write(((State)transition.getKey()).hexString);
// output.write(',');
// output.write(((State)transition.getValue()).hexString);
// output.write("},");
// output.write('\n');
// }
// }
// output.write(tab + initializerEndMarker + "\n");
// }
// }
// }
// output.flush();
// } catch (IOException e) {
// throw new RuntimeException(e);
// }
//}
//void reinitializeFromComputedValues(BufferedReader input, BufferedWriter output,
// State[] consideredStates) {
// String line, tab = "";
// int cursor;
// char c;
// try {
// while ((line = input.readLine()) != null) {
// output.write(line);
// output.write('\n');
// if ((cursor = line.indexOf(definitionStartMarker)) != -1) {
// // check the line format
// boolean reachedStart = true;
// for (int i = 0; i < cursor; i++) {
// if (!Character.isWhitespace(c = line.charAt(i))) {
// reachedStart = false;
// break;
// }
// else {
// tab += c;
// }
// }
// if (reachedStart) {
// while ((line = input.readLine()) != null &&
// line.indexOf(definitionEndMarker) == -1) {
// // loop
// }
// printDefinitions(output, consideredStates, tab);
// output.write(tab + definitionEndMarker + "\n");
// }
// }
// if (line != null && (cursor = line.indexOf(initializerStartMarker)) != -1) {
// // check the line format
// boolean reachedStart = true;
// tab = "";
// for (int i = 0; i < cursor; i++) {
// if (!Character.isWhitespace(c = line.charAt(i))) {
// reachedStart = false;
// break;
// }
// else {
// tab += c;
// }
// }
// if (reachedStart) {
// while ((line = input.readLine()) != null &&
// line.indexOf(initializerEndMarker) == -1) {
// // loop
// }
// printInitializers(output, consideredStates, tab);
// output.write(tab + initializerEndMarker + "\n");
// }
// }
// }
// output.flush();
// } catch (IOException e) {
// throw new RuntimeException(e);
// }
//}
//int test() {
// return test(1, false);
//}
//int test(int combinationTestsLoopsNb, boolean skipHighOrderBits) {
// Iterator transitionsSetsIterator, transitionsIterator;
// State input1, input2, expectedOutput, effectiveOutput;
// Map.Entry transition, transitionsSet;
// this.failuresNb = 0; // reset
// this.failuresNb = 0; // reset
// long start = 0;
// if (combinationTestsLoopsNb > 1) {
// start = System.currentTimeMillis();
// }
// for (int l = 0; l < combinationTestsLoopsNb ; l++) {
// transitionsSetsIterator = this.initializedTransitions.entrySet().iterator();
// while (transitionsSetsIterator.hasNext()) {
// transitionsSet = (Map.Entry) transitionsSetsIterator.next();
// input1 = (State) transitionsSet.getKey();
// transitionsIterator = ((Map) transitionsSet.getValue()).
// entrySet().iterator();
// while (transitionsIterator.hasNext()) {
// transition = (Map.Entry) transitionsIterator.next();
// input2 = (State) transition.getKey();
// expectedOutput = (State) transition.getValue();
// effectiveOutput = ((UnconditionalFlowInfoTestHarness) output(
// UnconditionalFlowInfoTestHarness.testUnconditionalFlowInfo(input1),
// UnconditionalFlowInfoTestHarness.testUnconditionalFlowInfo(input2)))
// .asState();
// if (effectiveOutput != expectedOutput) {
// fail();
// System.out.println("\t\t" + input1.printableBitsField +
// " + " + input2.printableBitsField +
// " => " + effectiveOutput.printableBitsField +
// " instead of: " + expectedOutput.printableBitsField);
// }
// }
// }
// }
// if (combinationTestsLoopsNb > 1) {
// System.out.println(this.name + "...\t\t" + combinationTestsLoopsNb + "\t" +
// (System.currentTimeMillis() - start));
// }
// // PREMATURE optimize test (extraneous allocations and copies)
// // PREMATURE optimize test (extraneous iterations - undup)
// if (!skipHighOrderBits) {
// UnconditionalFlowInfoTestHarness
// zero = UnconditionalFlowInfoTestHarness.
// testUnconditionalFlowInfo(State.start),
// left, right, left64, right64, left128, right128,
// special = (UnconditionalFlowInfoTestHarness) zero.copy();
// special.grow(64); // allocates one extra without adding null info
// transitionsSetsIterator = this.initializedTransitions.entrySet().iterator();
// while (transitionsSetsIterator.hasNext()) {
// transitionsSet = (Map.Entry) transitionsSetsIterator.next();
// input1 = (State) transitionsSet.getKey();
// transitionsIterator = ((Map) transitionsSet.getValue()).
// entrySet().iterator();
// while (transitionsIterator.hasNext()) {
// transition = (Map.Entry) transitionsIterator.next();
// input2 = (State) transition.getKey();
// expectedOutput = (State) transition.getValue();
// left = UnconditionalFlowInfoTestHarness.
// testUnconditionalFlowInfo(input1);
// left64 = UnconditionalFlowInfoTestHarness.
// testUnconditionalFlowInfo(input1, 64);
// left128 = UnconditionalFlowInfoTestHarness.
// testUnconditionalFlowInfo(input1, 128);
// right = UnconditionalFlowInfoTestHarness.
// testUnconditionalFlowInfo(input2);
// right64 = UnconditionalFlowInfoTestHarness.
// testUnconditionalFlowInfo(input2, 64);
// right128 = UnconditionalFlowInfoTestHarness.
// testUnconditionalFlowInfo(input2, 128);
// if ((effectiveOutput = ((UnconditionalFlowInfoTestHarness)
// output(left64, right64)).asState(64)) !=
// expectedOutput) {
// fail();
// System.out.println("\t\t" + input1.printableBitsField +
// " + " + input2.printableBitsField +
// " => " + effectiveOutput.printableBitsField +
// " (64, 64) - instead of: " + expectedOutput.printableBitsField);
// }
// if (input1 == State.start) {
// if ((effectiveOutput = ((UnconditionalFlowInfoTestHarness)
// output(right128, right)).asState()) != expectedOutput) {
// fail();
// System.out.println("\t\t" + input1.printableBitsField +
// " + " + input2.printableBitsField +
// " => " + effectiveOutput.printableBitsField +
// " (zero 128, 1) - instead of: " + expectedOutput.printableBitsField);
// }
// if ((effectiveOutput = ((UnconditionalFlowInfoTestHarness)
// output(zero, right64)).asState(64)) != expectedOutput) {
// fail();
// System.out.println("\t\t" + input1.printableBitsField +
// " + " + input2.printableBitsField +
// " => " + effectiveOutput.printableBitsField +
// " (zero, 64) - instead of: " + expectedOutput.printableBitsField);
// }
// if ((effectiveOutput = ((UnconditionalFlowInfoTestHarness)
// output(right128, right64)).asState(64)) != expectedOutput) {
// fail();
// System.out.println("\t\t" + input1.printableBitsField +
// " + " + input2.printableBitsField +
// " => " + effectiveOutput.printableBitsField +
// " (zero 128, 64) - instead of: " + expectedOutput.printableBitsField);
// }
// if ((effectiveOutput = ((UnconditionalFlowInfoTestHarness)
// output(zero, right128)).asState(128)) != expectedOutput) {
// fail();
// System.out.println("\t\t" + input1.printableBitsField +
// " + " + input2.printableBitsField +
// " => " + effectiveOutput.printableBitsField +
// " (zero, 128) - instead of: " + expectedOutput.printableBitsField);
// }
// if ((effectiveOutput = ((UnconditionalFlowInfoTestHarness)
// output(right64, right128)).asState(128)) != expectedOutput) {
// fail();
// System.out.println("\t\t" + input1.printableBitsField +
// " + " + input2.printableBitsField +
// " => " + effectiveOutput.printableBitsField +
// " (zero 64, 128) - instead of: " + expectedOutput.printableBitsField);
// }
// if ((effectiveOutput = ((UnconditionalFlowInfoTestHarness)
// output(special, right128)).asState(128)) != expectedOutput) {
// fail();
// System.out.println("\t\t" + input1.printableBitsField +
// " + " + input2.printableBitsField +
// " => " + effectiveOutput.printableBitsField +
// " (special zero, 128) - instead of: " + expectedOutput.printableBitsField);
// }
// }
// if (input2 == State.start) {
// if ((effectiveOutput = ((UnconditionalFlowInfoTestHarness)
// output(left, left128)).asState()) != expectedOutput) {
// fail();
// System.out.println("\t\t" + input1.printableBitsField +
// " + " + input2.printableBitsField +
// " => " + effectiveOutput.printableBitsField +
// " (1, zero 128) - instead of: " + expectedOutput.printableBitsField);
// }
// if ((effectiveOutput = ((UnconditionalFlowInfoTestHarness)
// output(left64, zero)).asState(64)) != expectedOutput) {
// fail();
// System.out.println("\t\t" + input1.printableBitsField +
// " + " + input2.printableBitsField +
// " => " + effectiveOutput.printableBitsField +
// " (64, zero) - instead of: " + expectedOutput.printableBitsField);
// }
// if ((effectiveOutput = ((UnconditionalFlowInfoTestHarness)
// output(left64, left128)).asState(64)) != expectedOutput) {
// fail();
// System.out.println("\t\t" + input1.printableBitsField +
// " + " + input2.printableBitsField +
// " => " + effectiveOutput.printableBitsField +
// " (64, zero 128) - instead of: " + expectedOutput.printableBitsField);
// }
// if ((effectiveOutput = ((UnconditionalFlowInfoTestHarness)
// output(left128, zero)).asState(128)) != expectedOutput) {
// fail();
// System.out.println("\t\t" + input1.printableBitsField +
// " + " + input2.printableBitsField +
// " => " + effectiveOutput.printableBitsField +
// " (128, zero) - instead of: " + expectedOutput.printableBitsField);
// }
// if ((effectiveOutput = ((UnconditionalFlowInfoTestHarness)
// output(left128, left64)).asState(128)) != expectedOutput) {
// fail();
// System.out.println("\t\t" + input1.printableBitsField +
// " + " + input2.printableBitsField +
// " => " + effectiveOutput.printableBitsField +
// " (128, zero 64) - instead of: " + expectedOutput.printableBitsField);
// }
// }
// }
// }
// }
// return this.failuresNb;
//}
//}
//
//public abstract static class SymmetricalThreeDimensionalTransformation
// extends ThreeDimensionalTransformation{
//SymmetricalThreeDimensionalTransformation(String name, byte[][] transitions) {
// super(name);
// int length;
// this.initializedTransitions = new HashMap((length = transitions.length) * 2 - 1);
// State input1, input2;
// for (int i = 0; i < length; i++) {
// if (transitions[i].length != 3) {
// throw new IllegalArgumentException("transitions should have three entries");
// }
// if (transitions[i][0] <= transitions[i][1]) {
// input1 = State.states[transitions[i][0]]; // array out of bounds exception if broken
// input2 = State.states[transitions[i][1]];
// }
// else {
// input1 = State.states[transitions[i][1]];
// input2 = State.states[transitions[i][0]];
// }
// Map transitionsForInput1 = (Map) this.initializedTransitions.get(input1);
// if (transitionsForInput1 == null) {
// transitionsForInput1 = new HashMap(length);
// this.initializedTransitions.put(input1, transitionsForInput1);
// }
// if (transitionsForInput1.get(input2) != null) {
// throw new IllegalArgumentException("duplicate entry");
// }
// transitionsForInput1.put(input2, State.states[transitions[i][2]]);
// }
//}
//void hydrate() {
// super.hydrate();
// checkSymmetry(this.computedTransitions);
//}
//private void checkSymmetry(Map map) {
// State input1, input2, result;
// Map.Entry entry1, entry2;
// Map transition;
// Iterator transitions1 = map.entrySet().iterator(), transitions2;
// while (transitions1.hasNext()) {
// entry1 = (Map.Entry) transitions1.next();
// input1 = (State) entry1.getKey();
// transition = (Map) entry1.getValue();
// transitions2 = transition.entrySet().iterator();
// while (transitions2.hasNext()) {
// entry2 = (Map.Entry) transitions2.next();
// input2 = (State) entry2.getKey();
// result = (State) entry2.getValue();
// if (result != ((Map) map.get(input2)).get(input1) && input1.symbolic && input2.symbolic) {
// System.err.println("symmetry mismatch: " + input1 + " + " +
// input2 + " -> " + result + "/" + ((Map) map.get(input2)).get(input1));
// }
// }
// }
//}
//void mark(char truthValues[][], boolean keepRow[], boolean keepColumn[],
// int row, int column, char value) {
// truthValues[row][column] = truthValues[column][row] = value;
// keepRow[row] = true;
// keepColumn[column] = true;
// keepRow[column] = true;
// keepColumn[row] = true;
//}
//void printDefinitions(BufferedWriter output, State[] consideredStates, String tab)
// throws IOException {
// // only difference with parent is that we print only half of possible
// // combinations
// int i, j, length;
// State result;
// for (i = 0, length = consideredStates.length; i < length; i++) {
// for (j = i; j < length; j++) {
// output.write(tab);
// output.write("// ");
// output.write(consideredStates[i].name);
// output.write(" + ");
// output.write(consideredStates[j].name);
// output.write(" => ");
// output.write(
// (result = (State)
// ((Map) this.computedTransitions.get(consideredStates[i])).get(consideredStates[j])).name);
// if (!result.symbolic ||
// result != this.initializedTransitions.get(consideredStates[i])) {
// output.write("\t\t CHECK");
// }
// output.write('\n');
// }
// }
//}
//void printInitializers(BufferedWriter output, State[] consideredStates, String tab)
// throws IOException {
// // only difference with parent is that we print only half of possible
// // combinations
// int i, j, length;
// for (i = 0, length = consideredStates.length; i < length; i++) {
// for (j = i; j < length; j++) {
// output.write(tab);
// output.write('{');
// output.write(consideredStates[i].hexString);
// output.write(',');
// output.write(consideredStates[j].hexString);
// output.write(',');
// output.write(
// ((State)
// ((Map) this.computedTransitions.get(consideredStates[i])).get(consideredStates[j])).hexString);
// output.write("},");
// output.write('\n');
// }
// }
//}
//void printMissingEntries(BufferedWriter output, String tab) throws IOException {
// Iterator firsts = State.symbolicStates(), seconds;
// State first, second;
// while (firsts.hasNext()) {
// first = (State) firsts.next();
// seconds = State.symbolicStates();
// while (seconds.hasNext()) {
// second = (State) seconds.next();
// if (!checkPair(first, second)) {
// addPair(first, second);
// System.err.println("Adding missing transition for states (" + first + ", " + second + ")");
// output.write(tab);
// output.write("// ");
// output.write(first.toString());
// output.write(" + ");
// output.write(second.toString());
// output.write(" => start\t\t CHECK\n");
// }
// }
// }
//}
//private boolean checkPair(State s1, State s2) {
// Map transitions;
// if ((transitions = (Map) this.initializedTransitions.get(s1)) != null) {
// if (transitions.get(s2) != null) {
// return true;
// }
// }
// if ((transitions = (Map) this.initializedTransitions.get(s2)) != null) {
// if (transitions.get(s1) != null) {
// return true;
// }
// }
// return false;
//}
//private void addPair(State s1, State s2) {
// Map transitions;
// if ((transitions = (Map) this.initializedTransitions.get(s1)) == null) {
// transitions = new HashMap();
// this.initializedTransitions.put(s1, transitions);
// }
// transitions.put(s2, s2); // dummy, non null value
//}
//// PREMATURE factorize upward
//int test(int combinationTestsLoopsNb, boolean skipHighOrderBits) {
// Iterator transitionsSetsIterator, transitionsIterator;
// State input1, input2, expectedOutput, effectiveOutput;
// Map.Entry transition, transitionsSet;
// this.failuresNb = 0; // reset
// this.failuresNb = 0; // reset
// long start = 0;
// if (combinationTestsLoopsNb > 1) {
// start = System.currentTimeMillis();
// }
// for (int l = 0; l < combinationTestsLoopsNb ; l++) {
// transitionsSetsIterator = this.initializedTransitions.entrySet().iterator();
// while (transitionsSetsIterator.hasNext()) {
// transitionsSet = (Map.Entry) transitionsSetsIterator.next();
// input1 = (State) transitionsSet.getKey();
// transitionsIterator = ((Map) transitionsSet.getValue()).
// entrySet().iterator();
// while (transitionsIterator.hasNext()) {
// transition = (Map.Entry) transitionsIterator.next();
// input2 = (State) transition.getKey();
// expectedOutput = (State) transition.getValue();
// effectiveOutput = ((UnconditionalFlowInfoTestHarness) output(
// UnconditionalFlowInfoTestHarness.testUnconditionalFlowInfo(input1),
// UnconditionalFlowInfoTestHarness.testUnconditionalFlowInfo(input2)))
// .asState();
// if (effectiveOutput != expectedOutput) {
// fail();
// System.out.println("\t\t" + input1.printableBitsField +
// " + " + input2.printableBitsField +
// " => " + effectiveOutput.printableBitsField +
// " instead of: " + expectedOutput.printableBitsField);
// }
// effectiveOutput = ((UnconditionalFlowInfoTestHarness) output(
// UnconditionalFlowInfoTestHarness.testUnconditionalFlowInfo(input2),
// UnconditionalFlowInfoTestHarness.testUnconditionalFlowInfo(input1)))
// .asState();
// if (effectiveOutput != expectedOutput) {
// fail();
// System.out.println("\t\t" + input2.printableBitsField +
// " + " + input1.printableBitsField +
// " => " + effectiveOutput.printableBitsField +
// " instead of: " + expectedOutput.printableBitsField);
// }
// }
// }
// }
// if (combinationTestsLoopsNb > 1) {
// System.out.println(this.name + "...\t\t" + combinationTestsLoopsNb + "\t" +
// (System.currentTimeMillis() - start));
// }
// // PREMATURE optimize test (extraneous allocations and copies)
// // PREMATURE optimize test (extraneous iterations - undup)
// if (!skipHighOrderBits) {
// UnconditionalFlowInfoTestHarness
// zero = UnconditionalFlowInfoTestHarness.
// testUnconditionalFlowInfo(State.start),
// right, left64, right64, right128;
// transitionsSetsIterator = this.initializedTransitions.entrySet().iterator();
// while (transitionsSetsIterator.hasNext()) {
// transitionsSet = (Map.Entry) transitionsSetsIterator.next();
// input1 = (State) transitionsSet.getKey();
// transitionsIterator = ((Map) transitionsSet.getValue()).
// entrySet().iterator();
// while (transitionsIterator.hasNext()) {
// transition = (Map.Entry) transitionsIterator.next();
// input2 = (State) transition.getKey();
// expectedOutput = (State) transition.getValue();
// left64 = UnconditionalFlowInfoTestHarness.
// testUnconditionalFlowInfo(input1, 64);
// right = UnconditionalFlowInfoTestHarness.
// testUnconditionalFlowInfo(input2);
// right64 = UnconditionalFlowInfoTestHarness.
// testUnconditionalFlowInfo(input2, 64);
// right128 = UnconditionalFlowInfoTestHarness.
// testUnconditionalFlowInfo(input2, 128);
// if ((effectiveOutput = ((UnconditionalFlowInfoTestHarness)
// output(left64, right64)).asState(64)) !=
// expectedOutput) {
// fail();
// System.out.println("\t\t" + input1.printableBitsField +
// " + " + input2.printableBitsField +
// " => " + effectiveOutput.printableBitsField +
// " (64, 64) - instead of: " + expectedOutput.printableBitsField);
// }
// if ((effectiveOutput = ((UnconditionalFlowInfoTestHarness)
// output(right64, left64)).asState(64)) !=
// expectedOutput) {
// fail();
// System.out.println("\t\t" + input2.printableBitsField +
// " + " + input1.printableBitsField +
// " => " + effectiveOutput.printableBitsField +
// " (64, 64) - instead of: " + expectedOutput.printableBitsField);
// }
// if (input1 == State.start) {
// if ((effectiveOutput = ((UnconditionalFlowInfoTestHarness)
// output(right128, right)).asState()) != expectedOutput) {
// fail();
// System.out.println("\t\t" + input1.printableBitsField +
// " + " + input2.printableBitsField +
// " => " + effectiveOutput.printableBitsField +
// " (zero 128, 1) - instead of: " + expectedOutput.printableBitsField);
// }
// if ((effectiveOutput = ((UnconditionalFlowInfoTestHarness)
// output(zero, right64)).asState(64)) != expectedOutput) {
// fail();
// System.out.println("\t\t" + input1.printableBitsField +
// " + " + input2.printableBitsField +
// " => " + effectiveOutput.printableBitsField +
// " (zero, 64) - instead of: " + expectedOutput.printableBitsField);
// }
// if ((effectiveOutput = ((UnconditionalFlowInfoTestHarness)
// output(right128, right64)).asState(64)) != expectedOutput) {
// fail();
// System.out.println("\t\t" + input1.printableBitsField +
// " + " + input2.printableBitsField +
// " => " + effectiveOutput.printableBitsField +
// " (zero 128, 64) - instead of: " + expectedOutput.printableBitsField);
// }
// if ((effectiveOutput = ((UnconditionalFlowInfoTestHarness)
// output(zero, right128)).asState(128)) != expectedOutput) {
// fail();
// System.out.println("\t\t" + input1.printableBitsField +
// " + " + input2.printableBitsField +
// " => " + effectiveOutput.printableBitsField +
// " (zero, 128) - instead of: " + expectedOutput.printableBitsField);
// }
// if ((effectiveOutput = ((UnconditionalFlowInfoTestHarness)
// output(right64, right128)).asState(128)) != expectedOutput) {
// fail();
// System.out.println("\t\t" + input1.printableBitsField +
// " + " + input2.printableBitsField +
// " => " + effectiveOutput.printableBitsField +
// " (zero 64, 128) - instead of: " + expectedOutput.printableBitsField);
// }
// if ((effectiveOutput = ((UnconditionalFlowInfoTestHarness)
// output(right, right128)).asState()) != expectedOutput) {
// fail();
// System.out.println("\t\t" + input2.printableBitsField +
// " + " + input1.printableBitsField +
// " => " + effectiveOutput.printableBitsField +
// " (1, zero 128) - instead of: " + expectedOutput.printableBitsField);
// }
// if ((effectiveOutput = ((UnconditionalFlowInfoTestHarness)
// output(right64, zero)).asState(64)) != expectedOutput) {
// fail();
// System.out.println("\t\t" + input2.printableBitsField +
// " + " + input1.printableBitsField +
// " => " + effectiveOutput.printableBitsField +
// " (64, zero) - instead of: " + expectedOutput.printableBitsField);
// }
// if ((effectiveOutput = ((UnconditionalFlowInfoTestHarness)
// output(right64, right128)).asState(64)) != expectedOutput) {
// fail();
// System.out.println("\t\t" + input2.printableBitsField +
// " + " + input1.printableBitsField +
// " => " + effectiveOutput.printableBitsField +
// " (64, zero 128) - instead of: " + expectedOutput.printableBitsField);
// }
// if ((effectiveOutput = ((UnconditionalFlowInfoTestHarness)
// output(right128, zero)).asState(128)) != expectedOutput) {
// fail();
// System.out.println("\t\t" + input2.printableBitsField +
// " + " + input1.printableBitsField +
// " => " + effectiveOutput.printableBitsField +
// " (128, zero) - instead of: " + expectedOutput.printableBitsField);
// }
// if ((effectiveOutput = ((UnconditionalFlowInfoTestHarness)
// output(right128, right64)).asState(128)) != expectedOutput) {
// fail();
// System.out.println("\t\t" + input2.printableBitsField +
// " + " + input1.printableBitsField +
// " => " + effectiveOutput.printableBitsField +
// " (128, zero 64) - instead of: " + expectedOutput.printableBitsField);
// }
// }
// }
// }
// }
// return this.failuresNb;
//}
//}
//}