/*
* Copyright (c) 2009, 2011, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
package com.sun.max.vm;
import static com.sun.max.vm.VMOptions.*;
import java.util.*;
import com.sun.max.annotate.*;
import com.sun.max.unsafe.*;
import com.sun.max.util.*;
/**
* Implements the VM options controlling assertions.
*/
public class AssertionsVMOption extends VMOption {
public static AssertionsVMOption ASSERTIONS = register(new AssertionsVMOption(), MaxineVM.Phase.STARTING);
/**
* The following fields match those in {@link java.lang.AssertionStatusDirectives}.
*/
public static ArrayList<String> packages = new ArrayList<String>();
public static ArrayList<Boolean> packageEnabled = new ArrayList<Boolean>();
public static ArrayList<String> classes = new ArrayList<String>();
public static ArrayList<Boolean> classEnabled = new ArrayList<Boolean>();
public static boolean deflt;
// extra field for system class special case
public static boolean systemDeflt;
@HOSTED_ONLY
public AssertionsVMOption() {
super("-ea", "");
}
@Override
public boolean matches(Pointer arg) {
return isEnabling(arg) || isDisabling(arg) || isSystemEnabling(arg) || isSystemDisabling(arg);
}
@Override
public boolean parseValue(Pointer optionValue) {
// Since there are many variants we have to parse from VMOption.optionStart
if (isSystemEnabling(optionStart)) {
systemDeflt = true;
} else if (isSystemDisabling(optionStart)) {
systemDeflt = false;
} else {
boolean enabling = isEnabling(optionStart);
if (optionValue.getByte() == 0) {
// easy case, no value provided
deflt = enabling;
} else {
// [:<package name>"..." | :<class name> ]
char ch = (char) optionValue.getByte();
if (ch != ':') {
return false;
}
Pointer ptr = optionValue.plus(1);
Pointer valueStart = ptr;
int count = 0;
while (true) {
ch = (char) ptr.getByte();
if (ch == 0) {
break;
}
ptr = ptr.plus(1);
count++;
}
// ptr now pointing at the 0
boolean isPackage = false;
if (count >= 3) {
// check for ...
if (isWild(ptr.minus(3))) {
// if (count == 3) denotes default package (empty string)
ptr = ptr.minus(3);
ptr.setByte((byte) 0);
isPackage = true;
} // else denotes a class
}
try {
String name = CString.utf8ToJava(valueStart);
if (isPackage) {
// ClassLoader.desiredAssertionStatus denotes default package with null not the empty string!
if (name.length() == 0) {
name = null;
}
packages.add(name);
packageEnabled.add(enabling);
} else {
classes.add(name);
classEnabled.add(enabling);
}
} catch (Utf8Exception ex) {
return false;
}
}
}
return true;
}
private static boolean isWild(Pointer ptr) {
return ptr.getByte(0) == '.' && ptr.getByte(1) == '.' && ptr.getByte(2) == '.';
}
private static boolean isSystemEnabling(Pointer arg) {
return CString.equals(arg, "-esa") || CString.equals(arg, "-enablesystemassertions");
}
private static boolean isSystemDisabling(Pointer arg) {
return CString.equals(arg, "-dsa") || CString.equals(arg, "-disablesystemassertions");
}
private static boolean isEnabling(Pointer arg) {
return CString.startsWith(arg, "-ea") || CString.startsWith(arg, "-enableassertions");
}
private static boolean isDisabling(Pointer arg) {
return CString.startsWith(arg, "-da") || CString.startsWith(arg, "-disableassertions");
}
@Override
public void printHelp() {
VMOptions.printHelpForOption(category(), "-ea[:<packagename>...|:<classname>]", "", null);
VMOptions.printHelpForOption(category(), "-enableassertions[:<packagename>...|:<classname>]", "", "enable assertions");
VMOptions.printHelpForOption(category(), "-da[:<packagename>...|:<classname>]", "", null);
VMOptions.printHelpForOption(category(), "-disableassertions[:<packagename>...|:<classname>]", "", "disable assertions");
VMOptions.printHelpForOption(category(), "-esa | -enablesystemassertions", "", "enable system assertions");
VMOptions.printHelpForOption(category(), "-dsa | -disablesystemassertions", "", "disable system assertions");
}
}