Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
PojavLauncherTeam
GitHub Repository: PojavLauncherTeam/openjdk-multiarch-jdk8u
Path: blob/aarch64-shenandoah-jdk8u272-b10/jdk/src/share/native/java/io/ObjectInputStream.c
38829 views
1
/*
2
* Copyright (c) 1996, 2011, Oracle and/or its affiliates. All rights reserved.
3
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4
*
5
* This code is free software; you can redistribute it and/or modify it
6
* under the terms of the GNU General Public License version 2 only, as
7
* published by the Free Software Foundation. Oracle designates this
8
* particular file as subject to the "Classpath" exception as provided
9
* by Oracle in the LICENSE file that accompanied this code.
10
*
11
* This code is distributed in the hope that it will be useful, but WITHOUT
12
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14
* version 2 for more details (a copy is included in the LICENSE file that
15
* accompanied this code).
16
*
17
* You should have received a copy of the GNU General Public License version
18
* 2 along with this work; if not, write to the Free Software Foundation,
19
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20
*
21
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22
* or visit www.oracle.com if you need additional information or have any
23
* questions.
24
*/
25
26
#include "jni.h"
27
#include "jvm.h"
28
#include "jni_util.h"
29
#include "jlong.h"
30
31
#include "java_lang_Float.h"
32
#include "java_lang_Double.h"
33
#include "java_io_ObjectInputStream.h"
34
35
36
/*
37
* Class: java_io_ObjectInputStream
38
* Method: bytesToFloats
39
* Signature: ([BI[FII)V
40
*
41
* Reconstitutes nfloats float values from their byte representations. Byte
42
* values are read from array src starting at offset srcpos; the resulting
43
* float values are written to array dst starting at dstpos.
44
*/
45
JNIEXPORT void JNICALL
46
Java_java_io_ObjectInputStream_bytesToFloats(JNIEnv *env,
47
jclass this,
48
jbyteArray src,
49
jint srcpos,
50
jfloatArray dst,
51
jint dstpos,
52
jint nfloats)
53
{
54
union {
55
int i;
56
float f;
57
} u;
58
jfloat *floats;
59
jbyte *bytes;
60
jsize dstend;
61
jint ival;
62
63
if (nfloats == 0)
64
return;
65
66
/* fetch source array */
67
if (src == NULL) {
68
JNU_ThrowNullPointerException(env, NULL);
69
return;
70
}
71
bytes = (*env)->GetPrimitiveArrayCritical(env, src, NULL);
72
if (bytes == NULL) /* exception thrown */
73
return;
74
75
/* fetch dest array */
76
if (dst == NULL) {
77
(*env)->ReleasePrimitiveArrayCritical(env, src, bytes, JNI_ABORT);
78
JNU_ThrowNullPointerException(env, NULL);
79
return;
80
}
81
floats = (*env)->GetPrimitiveArrayCritical(env, dst, NULL);
82
if (floats == NULL) { /* exception thrown */
83
(*env)->ReleasePrimitiveArrayCritical(env, src, bytes, JNI_ABORT);
84
return;
85
}
86
87
/* do conversion */
88
dstend = dstpos + nfloats;
89
for ( ; dstpos < dstend; dstpos++) {
90
ival = ((bytes[srcpos + 0] & 0xFF) << 24) +
91
((bytes[srcpos + 1] & 0xFF) << 16) +
92
((bytes[srcpos + 2] & 0xFF) << 8) +
93
((bytes[srcpos + 3] & 0xFF) << 0);
94
u.i = (long) ival;
95
floats[dstpos] = (jfloat) u.f;
96
srcpos += 4;
97
}
98
99
(*env)->ReleasePrimitiveArrayCritical(env, src, bytes, JNI_ABORT);
100
(*env)->ReleasePrimitiveArrayCritical(env, dst, floats, 0);
101
}
102
103
/*
104
* Class: java_io_ObjectInputStream
105
* Method: bytesToDoubles
106
* Signature: ([BI[DII)V
107
*
108
* Reconstitutes ndoubles double values from their byte representations.
109
* Byte values are read from array src starting at offset srcpos; the
110
* resulting double values are written to array dst starting at dstpos.
111
*/
112
JNIEXPORT void JNICALL
113
Java_java_io_ObjectInputStream_bytesToDoubles(JNIEnv *env,
114
jclass this,
115
jbyteArray src,
116
jint srcpos,
117
jdoubleArray dst,
118
jint dstpos,
119
jint ndoubles)
120
121
{
122
union {
123
jlong l;
124
double d;
125
} u;
126
jdouble *doubles;
127
jbyte *bytes;
128
jsize dstend;
129
jlong lval;
130
131
if (ndoubles == 0)
132
return;
133
134
/* fetch source array */
135
if (src == NULL) {
136
JNU_ThrowNullPointerException(env, NULL);
137
return;
138
}
139
bytes = (*env)->GetPrimitiveArrayCritical(env, src, NULL);
140
if (bytes == NULL) /* exception thrown */
141
return;
142
143
/* fetch dest array */
144
if (dst == NULL) {
145
(*env)->ReleasePrimitiveArrayCritical(env, src, bytes, JNI_ABORT);
146
JNU_ThrowNullPointerException(env, NULL);
147
return;
148
}
149
doubles = (*env)->GetPrimitiveArrayCritical(env, dst, NULL);
150
if (doubles == NULL) { /* exception thrown */
151
(*env)->ReleasePrimitiveArrayCritical(env, src, bytes, JNI_ABORT);
152
return;
153
}
154
155
/* do conversion */
156
dstend = dstpos + ndoubles;
157
for ( ; dstpos < dstend; dstpos++) {
158
lval = (((jlong) bytes[srcpos + 0] & 0xFF) << 56) +
159
(((jlong) bytes[srcpos + 1] & 0xFF) << 48) +
160
(((jlong) bytes[srcpos + 2] & 0xFF) << 40) +
161
(((jlong) bytes[srcpos + 3] & 0xFF) << 32) +
162
(((jlong) bytes[srcpos + 4] & 0xFF) << 24) +
163
(((jlong) bytes[srcpos + 5] & 0xFF) << 16) +
164
(((jlong) bytes[srcpos + 6] & 0xFF) << 8) +
165
(((jlong) bytes[srcpos + 7] & 0xFF) << 0);
166
jlong_to_jdouble_bits(&lval);
167
u.l = lval;
168
doubles[dstpos] = (jdouble) u.d;
169
srcpos += 8;
170
}
171
172
(*env)->ReleasePrimitiveArrayCritical(env, src, bytes, JNI_ABORT);
173
(*env)->ReleasePrimitiveArrayCritical(env, dst, doubles, 0);
174
}
175
176
177