src/share/vm/compiler/methodMatcher.cpp
Index
Unified diffs
Context diffs
Sdiffs
Patch
New
Old
Previous File
Next File
hotspot Cdiff src/share/vm/compiler/methodMatcher.cpp
src/share/vm/compiler/methodMatcher.cpp
Print this page
rev 9032 : 8137167: JEP165: Compiler Control: Implementation task
Summary: Compiler Control JEP
Reviewed-by: roland, twisti
*** 340,347 ****
--- 340,448 ----
if (signature() != NULL) {
signature()->print_symbol_on(st);
}
}
+ BasicMatcher* BasicMatcher::parse_method_pattern(char* line, const char*& error_msg) {
+ assert(error_msg == NULL, "Don't call here with error_msg already set");
+ BasicMatcher* bm = new BasicMatcher();
+ MethodMatcher::parse_method_pattern(line, error_msg, bm);
+ if (error_msg != NULL) {
+ delete bm;
+ return NULL;
+ }
+ // check for bad trailing characters
+ int bytes_read = 0;
+ sscanf(line, "%*[ \t]%n", &bytes_read);
+ if (line[bytes_read] != '\0') {
+ error_msg = "Unrecognized trailing text after method pattern";
+ delete bm;
+ return NULL;
+ }
+ return bm;
+ }
+ bool BasicMatcher::match(methodHandle method) {
+ for (BasicMatcher* current = this; current != NULL; current = current->next()) {
+ if (current->matches(method)) {
+ return true;
+ }
+ }
+ return false;
+ }
+ void InlineMatcher::print(outputStream* st) {
+ if (_inline_action == InlineMatcher::force_inline) {
+ st->print("+");
+ } else {
+ st->print("-");
+ }
+ print_base(st);
+ }
+
+ InlineMatcher* InlineMatcher::parse_method_pattern(char* line, const char*& error_msg) {
+ assert(error_msg == NULL, "Dont call here with error_msg already set");
+ InlineMatcher* im = new InlineMatcher();
+ MethodMatcher::parse_method_pattern(line, error_msg, im);
+ if (error_msg != NULL) {
+ delete im;
+ return NULL;
+ }
+ return im;
+ }
+
+ bool InlineMatcher::match(methodHandle method, int inline_action) {
+ for (InlineMatcher* current = this; current != NULL; current = current->next()) {
+ if (current->matches(method)) {
+ return (current->_inline_action == inline_action);
+ }
+ }
+ return false;
+ }
+
+ InlineMatcher* InlineMatcher::parse_inline_pattern(char* str, const char*& error_msg) {
+ // check first token is +/-
+ InlineType _inline_action;
+ switch (str[0]) {
+ case '-':
+ _inline_action = InlineMatcher::dont_inline;
+ break;
+ case '+':
+ _inline_action = InlineMatcher::force_inline;
+ break;
+ default:
+ error_msg = "Missing leading inline type (+/-)";
+ return NULL;
+ }
+ str++;
+
+ int bytes_read = 0;
+ assert(error_msg== NULL, "error_msg must not be set yet");
+ InlineMatcher* im = InlineMatcher::parse_method_pattern(str, error_msg);
+ if (im == NULL) {
+ assert(error_msg != NULL, "Must have error message");
+ return NULL;
+ }
+ im->set_action(_inline_action);
+ return im;
+ }
+
+ InlineMatcher* InlineMatcher::clone() {
+ InlineMatcher* m = new InlineMatcher();
+ m->_class_mode = _class_mode;
+ m->_method_mode = _method_mode;
+ m->_inline_action = _inline_action;
+ m->_class_name = _class_name;
+ if(_class_name != NULL) {
+ _class_name->increment_refcount();
+ }
+ m->_method_name = _method_name;
+ if (_method_name != NULL) {
+ _method_name->increment_refcount();
+ }
+ m->_signature = _signature;
+ if (_signature != NULL) {
+ _signature->increment_refcount();
+ }
+ return m;
+ }
src/share/vm/compiler/methodMatcher.cpp
Index
Unified diffs
Context diffs
Sdiffs
Patch
New
Old
Previous File
Next File