Skip to content

Commit 28e96e3

Browse files
committed
8359920: Use names for frame types in stackmaps
Reviewed-by: dholmes, jsjolen, matsaave, sspitsyn
1 parent f5201ac commit 28e96e3

File tree

3 files changed

+41
-23
lines changed

3 files changed

+41
-23
lines changed

src/hotspot/share/classfile/stackMapTable.cpp

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -244,7 +244,7 @@ StackMapFrame* StackMapReader::next_helper(TRAPS) {
244244
int offset;
245245
VerificationType* locals = nullptr;
246246
u1 frame_type = _stream->get_u1(CHECK_NULL);
247-
if (frame_type < 64) {
247+
if (frame_type <= SAME_FRAME_END) {
248248
// same_frame
249249
if (_first) {
250250
offset = frame_type;
@@ -266,17 +266,17 @@ StackMapFrame* StackMapReader::next_helper(TRAPS) {
266266
_first = false;
267267
return frame;
268268
}
269-
if (frame_type < 128) {
269+
if (frame_type <= SAME_LOCALS_1_STACK_ITEM_FRAME_END) {
270270
// same_locals_1_stack_item_frame
271271
if (_first) {
272-
offset = frame_type - 64;
272+
offset = frame_type - SAME_LOCALS_1_STACK_ITEM_FRAME_START;
273273
// Can't share the locals array since that is updated by the verifier.
274274
if (_prev_frame->locals_size() > 0) {
275275
locals = NEW_RESOURCE_ARRAY_IN_THREAD(
276276
THREAD, VerificationType, _prev_frame->locals_size());
277277
}
278278
} else {
279-
offset = _prev_frame->offset() + frame_type - 63;
279+
offset = _prev_frame->offset() + frame_type - (SAME_LOCALS_1_STACK_ITEM_FRAME_START - 1);
280280
locals = _prev_frame->locals();
281281
}
282282
VerificationType* stack = NEW_RESOURCE_ARRAY_IN_THREAD(
@@ -340,13 +340,14 @@ StackMapFrame* StackMapReader::next_helper(TRAPS) {
340340
return frame;
341341
}
342342

343-
if (frame_type <= SAME_EXTENDED) {
343+
if (frame_type <= SAME_FRAME_EXTENDED) {
344344
// chop_frame or same_frame_extended
345345
locals = _prev_frame->locals();
346346
int length = _prev_frame->locals_size();
347-
int chops = SAME_EXTENDED - frame_type;
347+
int chops = SAME_FRAME_EXTENDED - frame_type;
348348
int new_length = length;
349349
u1 flags = _prev_frame->flags();
350+
assert(chops == 0 || (frame_type >= CHOP_FRAME_START && frame_type <= CHOP_FRAME_END), "should be");
350351
if (chops != 0) {
351352
new_length = chop(locals, length, chops);
352353
check_verification_type_array_size(
@@ -380,9 +381,10 @@ StackMapFrame* StackMapReader::next_helper(TRAPS) {
380381
}
381382
_first = false;
382383
return frame;
383-
} else if (frame_type < SAME_EXTENDED + 4) {
384+
} else if (frame_type <= APPEND_FRAME_END) {
384385
// append_frame
385-
int appends = frame_type - SAME_EXTENDED;
386+
assert(frame_type >= APPEND_FRAME_START && frame_type <= APPEND_FRAME_END, "should be");
387+
int appends = frame_type - APPEND_FRAME_START + 1;
386388
int real_length = _prev_frame->locals_size();
387389
int new_length = real_length + appends*2;
388390
locals = NEW_RESOURCE_ARRAY_IN_THREAD(THREAD, VerificationType, new_length);
@@ -412,7 +414,7 @@ StackMapFrame* StackMapReader::next_helper(TRAPS) {
412414
_first = false;
413415
return frame;
414416
}
415-
if (frame_type == FULL) {
417+
if (frame_type == FULL_FRAME) {
416418
// full_frame
417419
u1 flags = 0;
418420
u2 locals_size = _stream->get_u2(CHECK_NULL);

src/hotspot/share/classfile/stackMapTable.hpp

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2003, 2023, Oracle and/or its affiliates. All rights reserved.
2+
* Copyright (c) 2003, 2025, Oracle and/or its affiliates. All rights reserved.
33
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
44
*
55
* This code is free software; you can redistribute it and/or modify it
@@ -106,6 +106,7 @@ class StackMapStream : StackObj {
106106
};
107107

108108
class StackMapReader : StackObj {
109+
friend class VM_RedefineClasses;
109110
private:
110111
// information about the class and method
111112
constantPoolHandle _cp;
@@ -148,9 +149,19 @@ class StackMapReader : StackObj {
148149
}
149150

150151
enum {
152+
SAME_FRAME_START = 0,
153+
SAME_FRAME_END = 63,
154+
SAME_LOCALS_1_STACK_ITEM_FRAME_START = 64,
155+
SAME_LOCALS_1_STACK_ITEM_FRAME_END = 127,
156+
RESERVED_START = 128,
157+
RESERVED_END = 246,
151158
SAME_LOCALS_1_STACK_ITEM_EXTENDED = 247,
152-
SAME_EXTENDED = 251,
153-
FULL = 255
159+
CHOP_FRAME_START = 248,
160+
CHOP_FRAME_END = 250,
161+
SAME_FRAME_EXTENDED = 251,
162+
APPEND_FRAME_START = 252,
163+
APPEND_FRAME_END = 254,
164+
FULL_FRAME = 255
154165
};
155166

156167
public:

src/hotspot/share/prims/jvmtiRedefineClasses.cpp

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
#include "classfile/classLoadInfo.hpp"
3030
#include "classfile/javaClasses.inline.hpp"
3131
#include "classfile/metadataOnStackMark.hpp"
32+
#include "classfile/stackMapTable.hpp"
3233
#include "classfile/symbolTable.hpp"
3334
#include "classfile/klassFactory.hpp"
3435
#include "classfile/verifier.hpp"
@@ -3267,21 +3268,23 @@ void VM_RedefineClasses::rewrite_cp_refs_in_stack_map_table(
32673268
// same_frame {
32683269
// u1 frame_type = SAME; /* 0-63 */
32693270
// }
3270-
if (frame_type <= 63) {
3271+
if (frame_type <= StackMapReader::SAME_FRAME_END) {
32713272
// nothing more to do for same_frame
32723273
}
32733274

32743275
// same_locals_1_stack_item_frame {
32753276
// u1 frame_type = SAME_LOCALS_1_STACK_ITEM; /* 64-127 */
32763277
// verification_type_info stack[1];
32773278
// }
3278-
else if (frame_type >= 64 && frame_type <= 127) {
3279+
else if (frame_type >= StackMapReader::SAME_LOCALS_1_STACK_ITEM_FRAME_START &&
3280+
frame_type <= StackMapReader::SAME_LOCALS_1_STACK_ITEM_FRAME_END) {
32793281
rewrite_cp_refs_in_verification_type_info(stackmap_p, stackmap_end,
32803282
calc_number_of_entries, frame_type);
32813283
}
32823284

32833285
// reserved for future use
3284-
else if (frame_type >= 128 && frame_type <= 246) {
3286+
else if (frame_type >= StackMapReader::RESERVED_START &&
3287+
frame_type <= StackMapReader::RESERVED_END) {
32853288
// nothing more to do for reserved frame_types
32863289
}
32873290

@@ -3290,7 +3293,7 @@ void VM_RedefineClasses::rewrite_cp_refs_in_stack_map_table(
32903293
// u2 offset_delta;
32913294
// verification_type_info stack[1];
32923295
// }
3293-
else if (frame_type == 247) {
3296+
else if (frame_type == StackMapReader::SAME_LOCALS_1_STACK_ITEM_EXTENDED) {
32943297
stackmap_p += 2;
32953298
rewrite_cp_refs_in_verification_type_info(stackmap_p, stackmap_end,
32963299
calc_number_of_entries, frame_type);
@@ -3300,28 +3303,30 @@ void VM_RedefineClasses::rewrite_cp_refs_in_stack_map_table(
33003303
// u1 frame_type = CHOP; /* 248-250 */
33013304
// u2 offset_delta;
33023305
// }
3303-
else if (frame_type >= 248 && frame_type <= 250) {
3306+
else if (frame_type >= StackMapReader::CHOP_FRAME_START &&
3307+
frame_type <= StackMapReader::CHOP_FRAME_END) {
33043308
stackmap_p += 2;
33053309
}
33063310

33073311
// same_frame_extended {
3308-
// u1 frame_type = SAME_FRAME_EXTENDED; /* 251*/
3312+
// u1 frame_type = SAME_EXTENDED; /* 251 */
33093313
// u2 offset_delta;
33103314
// }
3311-
else if (frame_type == 251) {
3315+
else if (frame_type == StackMapReader::SAME_FRAME_EXTENDED) {
33123316
stackmap_p += 2;
33133317
}
33143318

33153319
// append_frame {
33163320
// u1 frame_type = APPEND; /* 252-254 */
33173321
// u2 offset_delta;
3318-
// verification_type_info locals[frame_type - 251];
3322+
// verification_type_info locals[frame_type - SAME_EXTENDED];
33193323
// }
3320-
else if (frame_type >= 252 && frame_type <= 254) {
3324+
else if (frame_type >= StackMapReader::APPEND_FRAME_START &&
3325+
frame_type <= StackMapReader::APPEND_FRAME_END) {
33213326
assert(stackmap_p + 2 <= stackmap_end,
33223327
"no room for offset_delta");
33233328
stackmap_p += 2;
3324-
u1 len = frame_type - 251;
3329+
u1 len = frame_type - StackMapReader::APPEND_FRAME_START + 1;
33253330
for (u1 i = 0; i < len; i++) {
33263331
rewrite_cp_refs_in_verification_type_info(stackmap_p, stackmap_end,
33273332
calc_number_of_entries, frame_type);
@@ -3336,7 +3341,7 @@ void VM_RedefineClasses::rewrite_cp_refs_in_stack_map_table(
33363341
// u2 number_of_stack_items;
33373342
// verification_type_info stack[number_of_stack_items];
33383343
// }
3339-
else if (frame_type == 255) {
3344+
else if (frame_type == StackMapReader::FULL_FRAME) {
33403345
assert(stackmap_p + 2 + 2 <= stackmap_end,
33413346
"no room for smallest full_frame");
33423347
stackmap_p += 2;

0 commit comments

Comments
 (0)