--- a/hotspot/src/share/vm/ci/ciStreams.hpp Wed Oct 09 11:05:17 2013 -0700
+++ b/hotspot/src/share/vm/ci/ciStreams.hpp Wed Oct 09 16:32:21 2013 +0200
@@ -277,11 +277,14 @@
class ciSignatureStream : public StackObj {
private:
ciSignature* _sig;
- int _pos;
+ int _pos;
+ // holder is a method's holder
+ ciKlass* _holder;
public:
- ciSignatureStream(ciSignature* signature) {
+ ciSignatureStream(ciSignature* signature, ciKlass* holder = NULL) {
_sig = signature;
_pos = 0;
+ _holder = holder;
}
bool at_return_type() { return _pos == _sig->count(); }
@@ -301,6 +304,23 @@
return _sig->type_at(_pos);
}
}
+
+ // next klass in the signature
+ ciKlass* next_klass() {
+ ciKlass* sig_k;
+ if (_holder != NULL) {
+ sig_k = _holder;
+ _holder = NULL;
+ } else {
+ while (!type()->is_klass()) {
+ next();
+ }
+ assert(!at_return_type(), "passed end of signature");
+ sig_k = type()->as_klass();
+ next();
+ }
+ return sig_k;
+ }
};