Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
PojavLauncherTeam
GitHub Repository: PojavLauncherTeam/openj9
Path: blob/master/runtime/bcutil/ConstantPoolMap.cpp
5985 views
1
/*******************************************************************************
2
* Copyright (c) 2001, 2021 IBM Corp. and others
3
*
4
* This program and the accompanying materials are made available under
5
* the terms of the Eclipse Public License 2.0 which accompanies this
6
* distribution and is available at https://www.eclipse.org/legal/epl-2.0/
7
* or the Apache License, Version 2.0 which accompanies this distribution and
8
* is available at https://www.apache.org/licenses/LICENSE-2.0.
9
*
10
* This Source Code may also be made available under the following
11
* Secondary Licenses when the conditions for such availability set
12
* forth in the Eclipse Public License, v. 2.0 are satisfied: GNU
13
* General Public License, version 2 with the GNU Classpath
14
* Exception [1] and GNU General Public License, version 2 with the
15
* OpenJDK Assembly Exception [2].
16
*
17
* [1] https://www.gnu.org/software/classpath/license.html
18
* [2] http://openjdk.java.net/legal/assembly-exception.html
19
*
20
* SPDX-License-Identifier: EPL-2.0 OR Apache-2.0 OR GPL-2.0 WITH Classpath-exception-2.0 OR LicenseRef-GPL-2.0 WITH Assembly-exception
21
*******************************************************************************/
22
/*
23
* ConstantPoolMap.cpp
24
*
25
* NOTE: See ConstantPoolMap.hpp for an explanation of why and how constant pool mapping is done.
26
*/
27
28
#include "ConstantPoolMap.hpp"
29
30
#include "BufferManager.hpp"
31
#include "ClassFileOracle.hpp"
32
#include "ROMClassCreationContext.hpp"
33
#include "ROMClassVerbosePhase.hpp"
34
#include "VMHelpers.hpp"
35
36
#include "ut_j9bcu.h"
37
38
#define MAX_CALL_SITE_COUNT (1 << 16)
39
#define MAX_LDC_COUNT (1 << 8)
40
#define VARHANDLE_CLASS_NAME "java/lang/invoke/VarHandle"
41
42
ConstantPoolMap::ConstantPoolMap(BufferManager *bufferManager, ROMClassCreationContext *context) :
43
_context(context),
44
_classFileOracle(NULL),
45
_bufferManager(bufferManager),
46
_constantPoolEntries(NULL),
47
_romConstantPoolEntries(NULL),
48
_romConstantPoolTypes(NULL),
49
_staticSplitEntries(NULL),
50
_specialSplitEntries(NULL),
51
#if defined(J9VM_OPT_OPENJDK_METHODHANDLE)
52
_invokeCacheCount(0),
53
#else /* defined(J9VM_OPT_OPENJDK_METHODHANDLE) */
54
_methodTypeCount(0),
55
_varHandleMethodTypeCount(0),
56
_varHandleMethodTypeLookupTable(NULL),
57
#endif /* defined(J9VM_OPT_OPENJDK_METHODHANDLE) */
58
_callSiteCount(0),
59
_ramConstantPoolCount(0),
60
_romConstantPoolCount(0),
61
_staticSplitEntryCount(0),
62
_specialSplitEntryCount(0),
63
_buildResult(OutOfMemory)
64
{
65
}
66
67
ConstantPoolMap::~ConstantPoolMap()
68
{
69
PORT_ACCESS_FROM_PORT(_context->portLibrary());
70
_bufferManager->free(_constantPoolEntries);
71
_bufferManager->free(_romConstantPoolEntries);
72
_bufferManager->free(_romConstantPoolTypes);
73
#if defined(J9VM_OPT_METHOD_HANDLE)
74
j9mem_free_memory(_varHandleMethodTypeLookupTable);
75
#endif /* defined(J9VM_OPT_METHOD_HANDLE) */
76
}
77
78
void
79
ConstantPoolMap::setClassFileOracleAndInitialize(ClassFileOracle *classFileOracle)
80
{
81
ROMClassVerbosePhase v(_context, ConstantPoolMapping, &_buildResult);
82
83
_classFileOracle = classFileOracle;
84
85
UDATA cpCount = classFileOracle->getConstantPoolCount();
86
_constantPoolEntries = (ConstantPoolEntry *) _bufferManager->alloc(cpCount * sizeof(ConstantPoolEntry));
87
if (NULL != _constantPoolEntries) {
88
memset(_constantPoolEntries, 0, cpCount * sizeof(ConstantPoolEntry));
89
_buildResult = OK;
90
}
91
}
92
93
void
94
ConstantPoolMap::computeConstantPoolMapAndSizes()
95
{
96
/* CFR_CONSTANT_* to J9CPTYPE_* map. The remainder of the array maps to 0 (== J9CPTYPE_UNUSED). */
97
static const U_8 cpTypeMap[256] = {
98
J9CPTYPE_UNUSED, /* CFR_CONSTANT_Null */
99
J9CPTYPE_ANNOTATION_UTF8, /* CFR_CONSTANT_Utf8 */
100
J9CPTYPE_UNUSED, /* 2 */
101
J9CPTYPE_INT, /* CFR_CONSTANT_Integer */
102
J9CPTYPE_FLOAT, /* CFR_CONSTANT_Float */
103
J9CPTYPE_LONG, /* CFR_CONSTANT_Long */
104
J9CPTYPE_DOUBLE, /* CFR_CONSTANT_Double */
105
J9CPTYPE_CLASS, /* CFR_CONSTANT_Class */
106
J9CPTYPE_STRING, /* CFR_CONSTANT_String */
107
J9CPTYPE_FIELD, /* CFR_CONSTANT_Fieldref */
108
J9CPTYPE_UNUSED, /* CFR_CONSTANT_Methodref */
109
J9CPTYPE_INTERFACE_METHOD, /* CFR_CONSTANT_InterfaceMethodref */
110
J9CPTYPE_UNUSED, /* CFR_CONSTANT_NameAndType */
111
J9CPTYPE_UNUSED, /* 13 */
112
J9CPTYPE_UNUSED, /* 14 */
113
J9CPTYPE_METHODHANDLE, /* CFR_CONSTANT_MethodHandle */
114
J9CPTYPE_METHOD_TYPE, /* CFR_CONSTANT_MethodType */
115
J9CPTYPE_CONSTANT_DYNAMIC, /* CFR_CONSTANT_Dynamic */
116
J9CPTYPE_UNUSED, /* CFR_CONSTANT_InvokeDynamic */
117
};
118
119
ROMClassVerbosePhase v(_context, ConstantPoolMapping, &_buildResult);
120
121
/* Count entries */
122
UDATA ldcSlotCount = 0;
123
UDATA singleSlotCount = 0;
124
UDATA doubleSlotCount = 0;
125
UDATA cfrCPCount = _classFileOracle->getConstantPoolCount();
126
127
for (U_16 cfrCPIndex = 0; cfrCPIndex < cfrCPCount; cfrCPIndex++) {
128
if (_constantPoolEntries[cfrCPIndex].isUsedByLDC) {
129
ldcSlotCount += 1;
130
} else if (_constantPoolEntries[cfrCPIndex].isReferenced) {
131
switch (getCPTag(cfrCPIndex)) {
132
case CFR_CONSTANT_Double: /* fall through */
133
case CFR_CONSTANT_Long:
134
doubleSlotCount += 1;
135
break;
136
case CFR_CONSTANT_InterfaceMethodref: /* fall through */
137
case CFR_CONSTANT_Methodref:
138
if (isStaticSplit(cfrCPIndex)) {
139
_staticSplitEntryCount += 1;
140
}
141
if (isSpecialSplit(cfrCPIndex)) {
142
_specialSplitEntryCount += 1;
143
}
144
/* fall through */
145
case CFR_CONSTANT_Fieldref: /* fall through */
146
case CFR_CONSTANT_Class:
147
case CFR_CONSTANT_String: /* fall through */
148
case CFR_CONSTANT_Integer: /* fall through */
149
case CFR_CONSTANT_Float: /* fall through */
150
case CFR_CONSTANT_MethodHandle: /* fall through */
151
case CFR_CONSTANT_MethodType:
152
singleSlotCount += 1;
153
break;
154
case CFR_CONSTANT_Dynamic:
155
if (isMarked(cfrCPIndex)) {
156
/*
157
* All Constant Dynamic entries [ldc, ldc_w, ldc2w] are treated as single slot
158
* to always have a RAM constantpool entry created
159
*/
160
singleSlotCount += 1;
161
}
162
break;
163
case CFR_CONSTANT_Utf8:
164
if (isMarked(cfrCPIndex, ANNOTATION)) {
165
singleSlotCount += 1;
166
}
167
break;
168
case CFR_CONSTANT_InvokeDynamic: /* fall through */
169
case CFR_CONSTANT_NameAndType:
170
/* Ignore */
171
break;
172
default:
173
Trc_BCU_Assert_ShouldNeverHappen();
174
break;
175
}
176
}
177
}
178
179
if (_callSiteCount > MAX_CALL_SITE_COUNT) {
180
_buildResult = GenericError;
181
return;
182
}
183
184
if (ldcSlotCount > MAX_LDC_COUNT) {
185
_buildResult = GenericError;
186
return;
187
}
188
189
_ramConstantPoolCount = U_16(singleSlotCount + ldcSlotCount + 1);
190
_romConstantPoolCount = U_16(_ramConstantPoolCount + doubleSlotCount);
191
192
_romConstantPoolEntries = (U_16 *) _bufferManager->alloc(_romConstantPoolCount * sizeof(U_16));
193
_romConstantPoolTypes = (U_8 *) _bufferManager->alloc(_romConstantPoolCount * sizeof(U_8));
194
_staticSplitEntries = (U_16 *) _bufferManager->alloc(_staticSplitEntryCount * sizeof(U_16));
195
_specialSplitEntries = (U_16 *) _bufferManager->alloc(_specialSplitEntryCount * sizeof(U_16));
196
197
if ((NULL == _romConstantPoolEntries)
198
|| (NULL == _romConstantPoolTypes)
199
|| (NULL == _staticSplitEntries)
200
|| (NULL == _specialSplitEntries)
201
) {
202
_buildResult = OutOfMemory;
203
return;
204
}
205
206
/* Skip the zeroth entry. */
207
U_16 ldcCPIndex = 1;
208
U_16 romCPIndex = U_16(ldcCPIndex + ldcSlotCount);
209
U_16 doubleSlotIndex = _ramConstantPoolCount;
210
U_16 currentCallSiteIndex = 0;
211
U_16 staticSplitTableIndex = 0;
212
U_16 specialSplitTableIndex = 0;
213
214
/*
215
* Fill in entries, ignoring InvokeDynamic, Utf8 and NameAndType entries.
216
* These entries take no space in ROMConstant Pool.
217
*/
218
for (U_16 cfrCPIndex = 0; cfrCPIndex < cfrCPCount; cfrCPIndex++) {
219
#define SET_ROM_CP_INDEX(cfrCPIdx, splitIdx, romCPIdx) _constantPoolEntries[(cfrCPIdx)].romCPIndex = (romCPIdx)
220
if (_constantPoolEntries[cfrCPIndex].isUsedByLDC) {
221
U_8 cpTag = getCPTag(cfrCPIndex);
222
U_8 cpType = cpTypeMap[cpTag];
223
224
Trc_BCU_Assert_NotEquals(cpType, J9CPTYPE_UNUSED);
225
226
_romConstantPoolEntries[ldcCPIndex] = cfrCPIndex;
227
_romConstantPoolTypes[ldcCPIndex] = cpType;
228
SET_ROM_CP_INDEX(cfrCPIndex, 0, ldcCPIndex++);
229
} else if (_constantPoolEntries[cfrCPIndex].isReferenced) {
230
U_8 cpTag = getCPTag(cfrCPIndex);
231
switch (cpTag) {
232
case CFR_CONSTANT_Double: /* fall through */
233
case CFR_CONSTANT_Long:
234
_romConstantPoolEntries[doubleSlotIndex] = cfrCPIndex;
235
_romConstantPoolTypes[doubleSlotIndex] = cpTypeMap[cpTag];
236
SET_ROM_CP_INDEX(cfrCPIndex, 0, doubleSlotIndex++);
237
break;
238
case CFR_CONSTANT_InterfaceMethodref: /* fall through */
239
case CFR_CONSTANT_Methodref: {
240
if (isStaticSplit(cfrCPIndex)) {
241
_staticSplitEntries[staticSplitTableIndex] = romCPIndex;
242
_constantPoolEntries[cfrCPIndex].staticSplitTableIndex = staticSplitTableIndex;
243
staticSplitTableIndex += 1;
244
}
245
if (isSpecialSplit(cfrCPIndex)) {
246
_specialSplitEntries[specialSplitTableIndex] = romCPIndex;
247
_constantPoolEntries[cfrCPIndex].specialSplitTableIndex = specialSplitTableIndex;
248
specialSplitTableIndex += 1;
249
}
250
_romConstantPoolEntries[romCPIndex] = cfrCPIndex;
251
if (isMarked(cfrCPIndex, INVOKE_INTERFACE)) {
252
_romConstantPoolTypes[romCPIndex] = J9CPTYPE_INTERFACE_METHOD;
253
} else if (isMarked(cfrCPIndex, INVOKE_SPECIAL)) {
254
if (CFR_CONSTANT_InterfaceMethodref == cpTag) {
255
_romConstantPoolTypes[romCPIndex] = J9CPTYPE_INTERFACE_INSTANCE_METHOD;
256
} else {
257
_romConstantPoolTypes[romCPIndex] = J9CPTYPE_INSTANCE_METHOD;
258
}
259
} else if (isMarked(cfrCPIndex, INVOKE_HANDLEEXACT) || isMarked(cfrCPIndex, INVOKE_HANDLEGENERIC)) {
260
_romConstantPoolTypes[romCPIndex] = J9CPTYPE_HANDLE_METHOD;
261
} else if (isMarked(cfrCPIndex, INVOKE_STATIC)) {
262
if (CFR_CONSTANT_InterfaceMethodref == cpTag) {
263
_romConstantPoolTypes[romCPIndex] = J9CPTYPE_INTERFACE_STATIC_METHOD;
264
} else {
265
_romConstantPoolTypes[romCPIndex] = J9CPTYPE_STATIC_METHOD;
266
}
267
268
} else if (isMarked(cfrCPIndex, INVOKE_VIRTUAL)) {
269
_romConstantPoolTypes[romCPIndex] = J9CPTYPE_INSTANCE_METHOD;
270
} else {
271
Trc_BCU_Assert_ShouldNeverHappen();
272
}
273
SET_ROM_CP_INDEX(cfrCPIndex, 0, romCPIndex++);
274
break;
275
}
276
case CFR_CONSTANT_Fieldref: /* fall through */
277
case CFR_CONSTANT_Class: /* fall through */
278
case CFR_CONSTANT_String: /* fall through */
279
case CFR_CONSTANT_Integer: /* fall through */
280
case CFR_CONSTANT_Float: /* fall through */
281
case CFR_CONSTANT_MethodHandle: /* fall through */
282
case CFR_CONSTANT_MethodType: /* fall through */
283
case CFR_CONSTANT_Dynamic:
284
_romConstantPoolEntries[romCPIndex] = cfrCPIndex;
285
_romConstantPoolTypes[romCPIndex] = cpTypeMap[cpTag];
286
SET_ROM_CP_INDEX(cfrCPIndex, 0, romCPIndex++);
287
break;
288
case CFR_CONSTANT_InvokeDynamic:
289
/*
290
* Update the starting indexing for this InvokeDynamic constant. Index will be used by
291
* the BytecodeFixups in the writeBytecodes when dealing with invokedynamic
292
*/
293
SET_ROM_CP_INDEX(cfrCPIndex, 0, currentCallSiteIndex);
294
currentCallSiteIndex += _constantPoolEntries[cfrCPIndex].callSiteReferenceCount;
295
break;
296
case CFR_CONSTANT_NameAndType:
297
/* Ignore */
298
break;
299
case CFR_CONSTANT_Utf8:
300
if (isMarked(cfrCPIndex, ANNOTATION)) {
301
_romConstantPoolEntries[romCPIndex] = cfrCPIndex;
302
_romConstantPoolTypes[romCPIndex] = cpTypeMap[cpTag];
303
SET_ROM_CP_INDEX(cfrCPIndex, 0, romCPIndex++);
304
}
305
break;
306
default:
307
Trc_BCU_Assert_ShouldNeverHappen();
308
break;
309
}
310
}
311
}
312
313
J9ClassPatchMap *map = _context->patchMap();
314
315
/**
316
* If a valid patchMap structure is passed, this class requires ConstantPool patching.
317
* Record the index mapping from Classfile to J9Class constantpool to allow patching
318
* the RAM CP after it is created by VM.
319
*/
320
if (map != NULL) {
321
Trc_BCU_Assert_Equals(map->size, cfrCPCount);
322
for (U_16 cfrCPIndex = 0; cfrCPIndex < cfrCPCount; cfrCPIndex++) {
323
map->indexMap[cfrCPIndex] = _constantPoolEntries[cfrCPIndex].romCPIndex;
324
}
325
}
326
}
327
328
#if defined(J9VM_OPT_METHOD_HANDLE)
329
void
330
ConstantPoolMap::findVarHandleMethodRefs()
331
{
332
PORT_ACCESS_FROM_PORT(_context->portLibrary());
333
U_16 *varHandleMethodTable = NULL;
334
335
for (U_16 i = 1; i < _romConstantPoolCount; i++) {
336
if ((J9CPTYPE_INSTANCE_METHOD == _romConstantPoolTypes[i])
337
|| (J9CPTYPE_INTERFACE_INSTANCE_METHOD == _romConstantPoolTypes[i])
338
) {
339
U_16 cfrCPIndex = _romConstantPoolEntries[i];
340
U_32 classIndex = getCPSlot1(cfrCPIndex);
341
U_32 classNameIndex = getCPSlot1(classIndex);
342
U_16 classNameLength = _classFileOracle->getUTF8Length(classNameIndex);
343
344
if ((sizeof(VARHANDLE_CLASS_NAME) - 1) == classNameLength) {
345
const U_8 *classNameData = _classFileOracle->getUTF8Data(classNameIndex);
346
if (0 == memcmp(classNameData, VARHANDLE_CLASS_NAME, classNameLength)) {
347
U_32 nasIndex = getCPSlot2(cfrCPIndex);
348
U_32 methodNameIndex = getCPSlot1(nasIndex);
349
U_16 methodNameLength = _classFileOracle->getUTF8Length(methodNameIndex);
350
const U_8 *methodNameData = _classFileOracle->getUTF8Data(methodNameIndex);
351
352
if (VM_VMHelpers::isPolymorphicVarHandleMethod(methodNameData, methodNameLength)) {
353
if (NULL == varHandleMethodTable) {
354
/* Allocate a temporary array for storing indices of VarHandle methodrefs. */
355
varHandleMethodTable = (U_16*) j9mem_allocate_memory(_romConstantPoolCount * sizeof(U_16), OMRMEM_CATEGORY_VM);
356
if (NULL == varHandleMethodTable) {
357
_buildResult = OutOfMemory;
358
break;
359
}
360
}
361
varHandleMethodTable[_varHandleMethodTypeCount] = i;
362
_varHandleMethodTypeCount++;
363
}
364
}
365
}
366
}
367
}
368
369
/* Store trimmed varHandleMethodTable into _varHandleMethodTypeLookupTable. */
370
if (NULL != varHandleMethodTable) {
371
_varHandleMethodTypeLookupTable = (U_16*) j9mem_allocate_memory(_varHandleMethodTypeCount * sizeof(U_16), OMRMEM_CATEGORY_VM);
372
if (NULL == _varHandleMethodTypeLookupTable) {
373
_buildResult = OutOfMemory;
374
} else {
375
memcpy(_varHandleMethodTypeLookupTable, varHandleMethodTable, _varHandleMethodTypeCount * sizeof(U_16));
376
}
377
j9mem_free_memory(varHandleMethodTable);
378
}
379
}
380
#endif /* defined(J9VM_OPT_METHOD_HANDLE) */
381
382
void
383
ConstantPoolMap::constantPoolDo(ConstantPoolVisitor *visitor)
384
{
385
for (UDATA i = 1; i < _romConstantPoolCount; i++) {
386
U_16 cfrCPIndex = _romConstantPoolEntries[i];
387
U_32 slot1 = getCPSlot1(cfrCPIndex);
388
U_32 slot2 = getCPSlot2(cfrCPIndex);
389
390
switch (_romConstantPoolTypes[i]) {
391
case J9CPTYPE_INT: /* fall through */
392
case J9CPTYPE_FLOAT:
393
visitor->visitSingleSlotConstant(slot1);
394
break;
395
case J9CPTYPE_LONG: /* fall through */
396
case J9CPTYPE_DOUBLE:
397
visitor->visitDoubleSlotConstant(slot1, slot2);
398
break;
399
case J9CPTYPE_CLASS:
400
visitor->visitClass(slot1);
401
break;
402
case J9CPTYPE_STRING:
403
if (CFR_CONSTANT_Utf8 == getCPTag(cfrCPIndex)) {
404
visitor->visitString(cfrCPIndex);
405
} else {
406
visitor->visitString(slot1);
407
}
408
break;
409
case J9CPTYPE_ANNOTATION_UTF8:
410
visitor->visitString(cfrCPIndex);
411
break;
412
case J9CPTYPE_FIELD: /* fall through */
413
case J9CPTYPE_INSTANCE_METHOD: /* fall through */
414
case J9CPTYPE_HANDLE_METHOD: /* fall through */
415
case J9CPTYPE_STATIC_METHOD: /* fall through */
416
case J9CPTYPE_INTERFACE_METHOD: /* fall through */
417
case J9CPTYPE_INTERFACE_INSTANCE_METHOD: /* fall through */
418
case J9CPTYPE_INTERFACE_STATIC_METHOD:
419
visitor->visitFieldOrMethod(getROMClassCPIndexForReference(slot1), U_16(slot2));
420
break;
421
case J9CPTYPE_METHOD_TYPE:
422
if (CFR_CONSTANT_Methodref == getCPTag(cfrCPIndex)) {
423
/* Will be a MethodRef { class, nas } - dig out nas->slot2 */
424
U_32 methodTypeOriginFlags = 0;
425
if (_classFileOracle->getUTF8Length(getCPSlot1(slot2)) == (sizeof("invokeExact") - 1)) {
426
methodTypeOriginFlags = J9_METHOD_TYPE_ORIGIN_INVOKE_EXACT;
427
} else {
428
methodTypeOriginFlags = J9_METHOD_TYPE_ORIGIN_INVOKE;
429
}
430
visitor->visitMethodType(getCPSlot2(slot2), methodTypeOriginFlags);
431
} else {
432
visitor->visitMethodType(slot1, J9_METHOD_TYPE_ORIGIN_LDC);
433
}
434
break;
435
case J9CPTYPE_METHODHANDLE:
436
visitor->visitMethodHandle(slot1, slot2);
437
break;
438
case J9CPTYPE_CONSTANT_DYNAMIC:
439
/* Check if the return type of constant dynamic entry is a primitive type
440
* Set the J9DescriptionCpPrimitiveType flag so interpreter know to unbox
441
* the resolved object before returning it.
442
*/
443
{
444
char fieldDescriptor = (char)*_classFileOracle->getUTF8Data(getCPSlot2(slot2));
445
switch (fieldDescriptor) {
446
case 'B':
447
visitor->visitConstantDynamic(slot1, slot2, (J9DescriptionReturnTypeByte << J9DescriptionReturnTypeShift));
448
break;
449
case 'C':
450
visitor->visitConstantDynamic(slot1, slot2, (J9DescriptionReturnTypeChar << J9DescriptionReturnTypeShift));
451
break;
452
case 'D':
453
visitor->visitConstantDynamic(slot1, slot2, (J9DescriptionReturnTypeDouble << J9DescriptionReturnTypeShift));
454
break;
455
case 'F':
456
visitor->visitConstantDynamic(slot1, slot2, (J9DescriptionReturnTypeFloat << J9DescriptionReturnTypeShift));
457
break;
458
case 'I':
459
visitor->visitConstantDynamic(slot1, slot2, (J9DescriptionReturnTypeInt << J9DescriptionReturnTypeShift));
460
break;
461
case 'J':
462
visitor->visitConstantDynamic(slot1, slot2, (J9DescriptionReturnTypeLong << J9DescriptionReturnTypeShift));
463
break;
464
case 'S':
465
visitor->visitConstantDynamic(slot1, slot2, (J9DescriptionReturnTypeShort << J9DescriptionReturnTypeShift));
466
break;
467
case 'Z':
468
visitor->visitConstantDynamic(slot1, slot2, (J9DescriptionReturnTypeBoolean << J9DescriptionReturnTypeShift));
469
break;
470
default:
471
visitor->visitConstantDynamic(slot1, slot2, 0);
472
break;
473
}
474
}
475
break;
476
default:
477
Trc_BCU_Assert_ShouldNeverHappen();
478
break;
479
}
480
}
481
}
482
483