blob: 78911bd78d238ff1ed174471a0c712b85142923a [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/**
* @author Mikhail Y. Fursov
*/
#ifndef _EM_METHOD_TABLE_
#define _EM_METHOD_TABLE_
#include "open/vm.h"
#include <vector>
#include <string>
class MTable {
public:
MTable(){}
virtual ~MTable();
bool addMethodFilter(const std::string& configLine);
//both inclusive
void addNumRangeMethodFilter(bool accept, size_t start, size_t end);
void addBCSizeMethodFilter(bool accept, size_t start, size_t end);
void addNameMethodFilter(bool accept, const std::string& className, const std::string& methodName, const std::string& signature);
bool acceptMethod(Method_Handle mh, size_t num) const;
private:
class MethodInfo {
public:
MethodInfo(Method_Handle mh, size_t num);
Method_Handle mh;
std::string className, methodName, signature;
size_t num;
};
class MethodFilter {
public:
enum Mode {MODE_DENY, MODE_ACCEPT};
MethodFilter(Mode _mode) : mode(_mode){}
virtual ~MethodFilter(){}
virtual bool matchMethod(const MethodInfo& mInfo) const = 0;
Mode getMode() const {return mode;}
protected:
Mode mode;
};
class NumRangeMethodFilter : public MethodFilter {
public:
NumRangeMethodFilter(Mode mode, size_t _start, size_t _end)
: MethodFilter(mode), start(_start), end(_end){}
virtual bool matchMethod(const MethodInfo& mInfo) const;
protected:
size_t start, end;
};
class NameMethodFilter : public MethodFilter {
public:
NameMethodFilter(Mode mode, const std::string& _className,
const std::string& _methodName, const std::string _signature)
: MethodFilter(mode), className(_className), methodName(_methodName), signature(_signature){}
virtual bool matchMethod(const MethodInfo& mInfo) const;
protected:
std::string className, methodName, signature;
};
class BCSizeMethodFilter : public MethodFilter {
public:
BCSizeMethodFilter(Mode mode, size_t _start, size_t _end)
: MethodFilter(mode), start(_start), end(_end){}
virtual bool matchMethod(const MethodInfo& mInfo) const;
protected:
size_t start, end;
};
typedef std::vector<MethodFilter*> FiltersQueue;
FiltersQueue methodFilters;
};
bool startsWith(const std::string& str, const std::string& prefix);
bool isNum(const std::string& str);
#endif