deep-c-rsc/JCGO/goclsp/vm/java/lang/VMSystem.java

237 lines
6.4 KiB
Java
Raw Normal View History

2021-07-16 17:12:20 -05:00
/*
* @(#) $(JCGO)/goclsp/vm/java/lang/VMSystem.java --
* VM specific methods for Java "System" class.
**
* Project: JCGO (http://www.ivmaisoft.com/jcgo/)
* Copyright (C) 2001-2009 Ivan Maidanski <ivmai@ivmaisoft.com>
* All rights reserved.
**
* Class specification origin: GNU Classpath v0.93 vm/reference
*/
/*
* This is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2, or (at your option)
* any later version.
**
* This software 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 (GPL) for more details.
**
* Linking this library statically or dynamically with other modules is
* making a combined work based on this library. Thus, the terms and
* conditions of the GNU General Public License cover the whole
* combination.
**
* As a special exception, the copyright holders of this library give you
* permission to link this library with independent modules to produce an
* executable, regardless of the license terms of these independent
* modules, and to copy and distribute the resulting executable under
* terms of your choice, provided that you also meet, for each linked
* independent module, the terms and conditions of the license of that
* module. An independent module is a module which is not derived from
* or based on this library. If you modify this library, you may extend
* this exception to your version of the library, but you are not
* obligated to do so. If you do not wish to do so, delete this
* exception statement from your version.
*/
package java.lang;
import gnu.classpath.SystemProperties;
import gnu.classpath.VMAccessorGnuClasspath;
import java.lang.reflect.Field;
import java.lang.reflect.VMAccessorJavaLangReflect;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileDescriptor;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintStream;
import java.io.UnsupportedEncodingException;
import java.io.VMAccessorJavaIo;
import java.security.AccessController;
import java.security.PrivilegedAction;
import java.util.LinkedList;
import java.util.List;
final class VMSystem /* hard-coded class name */
{
private VMSystem() {}
static native void arraycopy(Object src, int srcStart, Object dest,
int destStart, int len); /* JVM-core */ /* hard-coded method signature */
static native int identityHashCode(Object obj); /* JVM-core */
static void setIn(InputStream in)
{
if (System.in != in && in != null)
{
try
{
setFinalStaticField(System.class.getDeclaredField("in"), in); /* hack */
}
catch (Exception e)
{
throw (Error) (new InternalError("VMSystem")).initCause(e);
}
}
}
static void setOut(PrintStream out)
{
if (System.out != out && out != null)
{
try
{
setFinalStaticField(System.class.getDeclaredField("out"), out); /* hack */
}
catch (Exception e)
{
throw (Error) (new InternalError("VMSystem")).initCause(e);
}
VMThread.setSystemOut(out);
}
}
static void setErr(PrintStream err)
{
if (System.err != err && err != null)
{
try
{
setFinalStaticField(System.class.getDeclaredField("err"), err); /* hack */
}
catch (Exception e)
{
throw (Error) (new InternalError("VMSystem")).initCause(e);
}
}
}
static long currentTimeMillis()
{
return VMAccessorJavaIo.currentTimeVMFile(false);
}
static long nanoTime()
{
return VMAccessorJavaIo.currentTimeVMFile(true);
}
static InputStream makeStandardInputStream()
{
return new BufferedInputStream(new FileInputStream(FileDescriptor.in));
}
static PrintStream makeStandardOutputStream()
{
PrintStream out = makePrintStream(new BufferedOutputStream(
new FileOutputStream(FileDescriptor.out), 512));
VMThread.setSystemOut(out);
return out;
}
static PrintStream makeStandardErrorStream()
{
PrintStream err = makePrintStream(new FileOutputStream(FileDescriptor.err));
VMThread.initSystemErr();
return err;
}
static String getenv(String name)
{
if (name == null)
throw new NullPointerException();
name = toUpperCaseLatin(name);
String value = VMAccessorJavaIo.getenvPlatformVMFile(name);
if (value != null)
{
if (name.equals("HOME") || name.equals("HOMEPATH") || name.equals("PWD") ||
name.equals("TEMP") || name.equals("TMP") || name.endsWith("_HOME") ||
name.endsWith("DIR") || name.startsWith("DIR_"))
value = VMAccessorJavaIo.normPlatformPathVMFile(value);
else if (name.equals("JAVA_FONTS") || name.endsWith("PATH") ||
name.startsWith("PATH"))
value = VMAccessorJavaIo.normPlatformListOfPathsVMFile(value);
}
else if (name.equals("PWD"))
value = SystemProperties.getProperty("user.dir", ".");
return value;
}
static List environ()
{
/* not implemented */
return new LinkedList();
}
static final String concat0X(String str,
String str2) /* hard-coded method signature */
{ /* called from native code */
if (str == null)
str = "null";
if (str2 == null)
str2 = "null";
return str.concat(str2);
}
static final String toUpperCaseLatin(String str)
{ /* used by VM classes only */
char[] chars = str.toCharArray();
int i = chars.length;
boolean replaced = false;
char ch;
while (i-- > 0)
if ((ch = chars[i]) >= 'a' && ch <= 'z')
{
chars[i] = (char) (ch - ('a' - 'A'));
replaced = true;
}
return replaced ? new String(chars, 0, chars.length, true) : str;
}
private static PrintStream makePrintStream(OutputStream out)
{
try
{
return new PrintStream(out, true,
VMAccessorGnuClasspath.getConsoleEncodingVMSystemProperties(out));
}
catch (UnsupportedEncodingException e) {}
try
{
return new PrintStream(out, true, "ISO8859_1");
}
catch (UnsupportedEncodingException e)
{
throw (Error) (new InternalError("VMSystem")).initCause(e);
}
}
private static void setFinalStaticField(final Field field, Object value)
throws IllegalAccessException
{
Field nonFinalField = (Field) AccessController.doPrivileged(
new PrivilegedAction()
{
public Object run()
{
return VMAccessorJavaLangReflect.createNonFinalAccessibleVMField(field);
}
});
nonFinalField.set(null, value);
}
}