-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathgnuclasspath.cpp
105 lines (94 loc) · 5.94 KB
/
gnuclasspath.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
/**
* Copyright 2010 by Benjamin J. Land (a.k.a. BenLand100)
*
* This file is part of SJVM the Simple Java Virtual Machine.
*
* SJVM 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 3 of the License, or
* (at your option) any later version.
*
* SJVM 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 for more details.
*
* You should have received a copy of the GNU General Public License
* along with SJVM. If not, see <http://www.gnu.org/licenses/>.
*/
#include <sstream>
#include "jni.h"
#include "Arrays.h"
#include "ClassFile.h"
#include "SJVM.h"
#include <iostream>
#include <string>
//#define DEBUG_OUTPUT
#ifdef DEBUG_OUTPUT
#define debug(v) std::cout << v;
#else
#define debug(v)
#endif
extern "C" void JNICALL Java_gnu_classpath_VMSystemProperties_preInit(JNIEnv* env, jclass type, jobject properties) {
jclass props = env->FindClass("java/util/Properties");
jmethodID set = env->GetMethodID(props, "setProperty", "(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/Object;");
env->CallObjectMethod(properties, set, env->NewStringUTF("java.version"), env->NewStringUTF(""));
env->CallObjectMethod(properties, set, env->NewStringUTF("java.vendor"), env->NewStringUTF(""));
env->CallObjectMethod(properties, set, env->NewStringUTF("java.vendor.url"), env->NewStringUTF(""));
env->CallObjectMethod(properties, set, env->NewStringUTF("java.home"), env->NewStringUTF(""));
env->CallObjectMethod(properties, set, env->NewStringUTF("java.vm.specification.version"), env->NewStringUTF(""));
env->CallObjectMethod(properties, set, env->NewStringUTF("java.vm.specification.vendor"), env->NewStringUTF(""));
env->CallObjectMethod(properties, set, env->NewStringUTF("java.vm.specification.name"), env->NewStringUTF(""));
env->CallObjectMethod(properties, set, env->NewStringUTF("java.vm.version"), env->NewStringUTF(""));
env->CallObjectMethod(properties, set, env->NewStringUTF("java.vm.vendor"), env->NewStringUTF(""));
env->CallObjectMethod(properties, set, env->NewStringUTF("java.vm.name"), env->NewStringUTF(""));
env->CallObjectMethod(properties, set, env->NewStringUTF("java.specification.version"), env->NewStringUTF(""));
env->CallObjectMethod(properties, set, env->NewStringUTF("java.specification.vendor"), env->NewStringUTF(""));
env->CallObjectMethod(properties, set, env->NewStringUTF("java.specification.name"), env->NewStringUTF(""));
env->CallObjectMethod(properties, set, env->NewStringUTF("java.class.version"), env->NewStringUTF(""));
env->CallObjectMethod(properties, set, env->NewStringUTF("java.class.path"), env->NewStringUTF(""));
env->CallObjectMethod(properties, set, env->NewStringUTF("java.library.path"), env->NewStringUTF(""));
env->CallObjectMethod(properties, set, env->NewStringUTF("java.io.tmpdir"), env->NewStringUTF(""));
env->CallObjectMethod(properties, set, env->NewStringUTF("java.compiler"), env->NewStringUTF(""));
env->CallObjectMethod(properties, set, env->NewStringUTF("java.ext.dirs"), env->NewStringUTF(""));
env->CallObjectMethod(properties, set, env->NewStringUTF("os.name"), env->NewStringUTF(""));
env->CallObjectMethod(properties, set, env->NewStringUTF("os.arch"), env->NewStringUTF(""));
env->CallObjectMethod(properties, set, env->NewStringUTF("os.version"), env->NewStringUTF(""));
env->CallObjectMethod(properties, set, env->NewStringUTF("file.separator"), env->NewStringUTF(""));
env->CallObjectMethod(properties, set, env->NewStringUTF("path.separator"), env->NewStringUTF(""));
env->CallObjectMethod(properties, set, env->NewStringUTF("line.separator"), env->NewStringUTF(""));
env->CallObjectMethod(properties, set, env->NewStringUTF("user.name"), env->NewStringUTF(""));
env->CallObjectMethod(properties, set, env->NewStringUTF("user.home"), env->NewStringUTF(""));
env->CallObjectMethod(properties, set, env->NewStringUTF("user.dir"), env->NewStringUTF(""));
env->CallObjectMethod(properties, set, env->NewStringUTF("gnu.cpu.endian"), env->NewStringUTF(""));
}
extern "C" void JNICALL Java_java_lang_VMSystem_arraycopy(JNIEnv* env, jclass type, jobject src, jint sstart, jobject dest, jint dstart, jint length) {
JBYTEARRAY s = (JBYTEARRAY) src;
JBYTEARRAY d = (JBYTEARRAY) dest;
debug(d->elemsz << ' ' << s->elemsz << ' ' << sstart << ' ' << dstart << ' ' << length << '\n');
memcpy(d->array + d->elemsz*dstart, s->array + s->elemsz*sstart, s->elemsz * length);
}
extern "C" jobject JNICALL Java_java_lang_VMObject_clone(JNIEnv* env, jclass type, jobject cloner) {
JOBJECT obj = (JOBJECT)cloner;
JCLASS cls = obj->type;
if (cls->arrayType) {
return (jobject) ((JBYTEARRAY)obj)->clone();
} else {
JOBJECT clone = cls->newInstance((SJVM*) env->functions->reserved0); //No need to add it to the gc, done on return
memcpy(clone->fields,obj->fields,cls->instanceFields*sizeof(Variable));
for (int i = 0; i < cls->objectIndexes.size(); i++)
((SJVM*)env->functions->reserved0)->gc->incrRef(clone->fields[cls->objectIndexes[i]].l);
return (jobject) clone;
}
}
extern "C" jstring JNICALL Java_java_lang_VMDouble_toString(JNIEnv* env, jclass type, jdouble val, jboolean isfloat) {
std::stringstream stream;
stream << val;
return env->NewStringUTF(stream.str().c_str());
}
extern "C" jclass JNICALL Java_java_lang_VMObject_getClass(JNIEnv* env, jclass type, jobject obj) {
return (jclass) ((JOBJECT)obj)->type;
}
extern "C" jstring JNICALL Java_java_lang_VMClass_getName(JNIEnv* env, jclass type, jclass cls) {
return env->NewStringUTF(((JCLASS)cls)->name.c_str());
}