* The MethodEntry class now handles closing the called method or block instrumentation in the destructor. The cost is a slightly more complicated code block for the instrumentation but the benefit is assuring that all "leave()" calls match all "enter()" calls. * The profiler will only output 45 lines unless the configuration option -Xrbx.profiler.full_report is set. * A macro, TEST_CLASS(cls), was added to declare the test class as a friend of the implementation class. This enables the test class to access the implementation class's private data members directly and avoids the necessity of defining extraneous accessors on the implementation class merely for use in the tests. * Method id's in the profiler are now represented as uint64_t values constructed from the method name, its receiver class, and the method kind (i.e. instance method, class/module method, block). This ensures that the method id is unique among all threads (each thread has its own profiler instance) so that the results from different profilers can be merged. * The MethodEntry class holds the timers for methods and their callees. In the scenario where "a" calls "b" calls "a", there will be concurrent timers for both invocations of "a". As a result, the cumulative time in "a" may exceed the elapsed wall clock time during profiling. This scenario would also exists when "a" is called from two concurrently executing threads (assuming no GIL). The "self_seconds" time, which is the total time spent in a method less the time spent in any callees, should be consistent with wall clock time since any callees would be accumulating time concurrently if called from an invocation of its caller that was re-entered.