357 public static final int innerClassInnerNameOffset = 2; |
357 public static final int innerClassInnerNameOffset = 2; |
358 public static final int innerClassAccessFlagsOffset = 3; |
358 public static final int innerClassAccessFlagsOffset = 3; |
359 public static final int innerClassNextOffset = 4; |
359 public static final int innerClassNextOffset = 4; |
360 }; |
360 }; |
361 |
361 |
|
362 public static interface EnclosingMethodAttributeOffset { |
|
363 public static final int enclosing_method_class_index_offset = 0; |
|
364 public static final int enclosing_method_method_index_offset = 1; |
|
365 public static final int enclosing_method_attribute_size = 2; |
|
366 }; |
|
367 |
362 // refer to compute_modifier_flags in VM code. |
368 // refer to compute_modifier_flags in VM code. |
363 public long computeModifierFlags() { |
369 public long computeModifierFlags() { |
364 long access = getAccessFlags(); |
370 long access = getAccessFlags(); |
365 // But check if it happens to be member class. |
371 // But check if it happens to be member class. |
366 TypeArray innerClassList = getInnerClasses(); |
372 TypeArray innerClassList = getInnerClasses(); |
367 int length = ( innerClassList == null)? 0 : (int) innerClassList.getLength(); |
373 int length = ( innerClassList == null)? 0 : (int) innerClassList.getLength(); |
368 if (length > 0) { |
374 if (length > 0) { |
369 if (Assert.ASSERTS_ENABLED) { |
375 if (Assert.ASSERTS_ENABLED) { |
370 Assert.that(length % InnerClassAttributeOffset.innerClassNextOffset == 0, "just checking"); |
376 Assert.that(length % InnerClassAttributeOffset.innerClassNextOffset == 0 || |
|
377 length % InnerClassAttributeOffset.innerClassNextOffset == EnclosingMethodAttributeOffset.enclosing_method_attribute_size, |
|
378 "just checking"); |
371 } |
379 } |
372 for (int i = 0; i < length; i += InnerClassAttributeOffset.innerClassNextOffset) { |
380 for (int i = 0; i < length; i += InnerClassAttributeOffset.innerClassNextOffset) { |
|
381 if (i == length - EnclosingMethodAttributeOffset.enclosing_method_attribute_size) { |
|
382 break; |
|
383 } |
373 int ioff = innerClassList.getShortAt(i + |
384 int ioff = innerClassList.getShortAt(i + |
374 InnerClassAttributeOffset.innerClassInnerClassInfoOffset); |
385 InnerClassAttributeOffset.innerClassInnerClassInfoOffset); |
375 // 'ioff' can be zero. |
386 // 'ioff' can be zero. |
376 // refer to JVM spec. section 4.7.5. |
387 // refer to JVM spec. section 4.7.5. |
377 if (ioff != 0) { |
388 if (ioff != 0) { |
417 private boolean isInInnerClasses(Symbol sym, boolean includeLocals) { |
428 private boolean isInInnerClasses(Symbol sym, boolean includeLocals) { |
418 TypeArray innerClassList = getInnerClasses(); |
429 TypeArray innerClassList = getInnerClasses(); |
419 int length = ( innerClassList == null)? 0 : (int) innerClassList.getLength(); |
430 int length = ( innerClassList == null)? 0 : (int) innerClassList.getLength(); |
420 if (length > 0) { |
431 if (length > 0) { |
421 if (Assert.ASSERTS_ENABLED) { |
432 if (Assert.ASSERTS_ENABLED) { |
422 Assert.that(length % InnerClassAttributeOffset.innerClassNextOffset == 0, "just checking"); |
433 Assert.that(length % InnerClassAttributeOffset.innerClassNextOffset == 0 || |
|
434 length % InnerClassAttributeOffset.innerClassNextOffset == EnclosingMethodAttributeOffset.enclosing_method_attribute_size, |
|
435 "just checking"); |
423 } |
436 } |
424 for (int i = 0; i < length; i += InnerClassAttributeOffset.innerClassNextOffset) { |
437 for (int i = 0; i < length; i += InnerClassAttributeOffset.innerClassNextOffset) { |
|
438 if (i == length - EnclosingMethodAttributeOffset.enclosing_method_attribute_size) { |
|
439 break; |
|
440 } |
425 int ioff = innerClassList.getShortAt(i + |
441 int ioff = innerClassList.getShortAt(i + |
426 InnerClassAttributeOffset.innerClassInnerClassInfoOffset); |
442 InnerClassAttributeOffset.innerClassInnerClassInfoOffset); |
427 // 'ioff' can be zero. |
443 // 'ioff' can be zero. |
428 // refer to JVM spec. section 4.7.5. |
444 // refer to JVM spec. section 4.7.5. |
429 if (ioff != 0) { |
445 if (ioff != 0) { |