src/share/vm/runtime/reflectionUtils.cpp

changeset 6472
2b8e28fdf503
parent 5848
ac9cb1d5a202
child 6876
710a3c8b516e
     1.1 --- a/src/share/vm/runtime/reflectionUtils.cpp	Wed Oct 16 10:52:41 2013 +0200
     1.2 +++ b/src/share/vm/runtime/reflectionUtils.cpp	Tue Nov 05 17:38:04 2013 -0800
     1.3 @@ -1,5 +1,5 @@
     1.4  /*
     1.5 - * Copyright (c) 1999, 2012, Oracle and/or its affiliates. All rights reserved.
     1.6 + * Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved.
     1.7   * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
     1.8   *
     1.9   * This code is free software; you can redistribute it and/or modify it
    1.10 @@ -27,8 +27,11 @@
    1.11  #include "memory/universe.inline.hpp"
    1.12  #include "runtime/reflectionUtils.hpp"
    1.13  
    1.14 -KlassStream::KlassStream(instanceKlassHandle klass, bool local_only, bool classes_only) {
    1.15 -  _klass = klass;
    1.16 +KlassStream::KlassStream(instanceKlassHandle klass, bool local_only,
    1.17 +                         bool classes_only, bool walk_defaults) {
    1.18 +  _klass = _base_klass = klass;
    1.19 +  _base_class_search_defaults = false;
    1.20 +  _defaults_checked = false;
    1.21    if (classes_only) {
    1.22      _interfaces = Universe::the_empty_klass_array();
    1.23    } else {
    1.24 @@ -37,6 +40,7 @@
    1.25    _interface_index = _interfaces->length();
    1.26    _local_only = local_only;
    1.27    _classes_only = classes_only;
    1.28 +  _walk_defaults = walk_defaults;
    1.29  }
    1.30  
    1.31  bool KlassStream::eos() {
    1.32 @@ -45,7 +49,13 @@
    1.33    if (!_klass->is_interface() && _klass->super() != NULL) {
    1.34      // go up superclass chain (not for interfaces)
    1.35      _klass = _klass->super();
    1.36 +  // Next for method walks, walk default methods
    1.37 +  } else if (_walk_defaults && (_defaults_checked == false)  && (_base_klass->default_methods() != NULL)) {
    1.38 +      _base_class_search_defaults = true;
    1.39 +      _klass = _base_klass;
    1.40 +      _defaults_checked = true;
    1.41    } else {
    1.42 +    // Next walk transitive interfaces
    1.43      if (_interface_index > 0) {
    1.44        _klass = _interfaces->at(--_interface_index);
    1.45      } else {

mercurial