mirror of
https://github.com/2003scape/deep-c-rsc.git
synced 2024-03-22 05:49:51 -04:00
237 lines
6.4 KiB
Java
237 lines
6.4 KiB
Java
![]() |
/*
|
||
|
* @(#) $(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);
|
||
|
}
|
||
|
}
|