Change evaluation test to track instances better.

This commit is contained in:
Frederich Munch 2017-06-05 19:33:27 -04:00 committed by sftnight
parent 5837cc3005
commit 2d141ff840

View File

@ -113,14 +113,17 @@ V // CHECK: (cling::Value &) boxes [(long double) 17.42{{[0-9]*}}L]
extern "C" int printf(const char*,...);
struct Tracer {
std::string Content;
int Instance;
static int InstanceCount;
Tracer(const char* str): Content(str) { ++InstanceCount; dump("ctor"); }
Tracer(const Tracer& o): Content(o.Content + "+") {
++InstanceCount; dump("copy");
Tracer(const char* str): Content(str), Instance(++InstanceCount) {
dump("ctor");
}
~Tracer() {--InstanceCount; dump("dtor");}
Tracer(const Tracer& o): Content(o.Content + "+"), Instance(++InstanceCount) {
dump("copy");
}
~Tracer() { dump("dtor");}
std::string asStr() const {
return Content + "{" + (char)('0' + InstanceCount) + "}";
return Content + "{" + std::to_string(Instance) + "}";
}
void dump(const char* tag) { printf("%s:%s\n", asStr().c_str(), tag); }
};
@ -176,32 +179,32 @@ Tracer RT("VAR"); // CHECK-NEXT: VAR{3}:ctor
gCling->evaluate("RT", V); // should not call any ctor!
printf("RT done\n"); //CHECK-NEXT: RT done
V // CHECK-NEXT: (cling::Value &) boxes [(Tracer &) @{{.*}}]
dumpTracerSVR(V); // CHECK-NEXT: VAR{2}:dump
dumpTracerSVR(V); // CHECK-NEXT: VAR{3}:dump
// The following creates a copy, explicitly. This temporary object is then put
// into the Value.
//
gCling->evaluate("(Tracer)RT", V);
// Copies RT:
//CHECK-NEXT: VAR+{3}:copy
//CHECK-NEXT: VAR+{4}:copy
printf("(Tracer)RT done\n"); //CHECK-NEXT: RT done
V // CHECK-NEXT: (cling::Value &) boxes [(Tracer) @{{.*}}]
dumpTracerSVR(V); // CHECK-NEXT: VAR+{3}:dump
dumpTracerSVR(V); // CHECK-NEXT: VAR+{4}:dump
// Check eval of array var
Tracer arrV[] = {ObjMaker(), ObjMaker(), ObjMaker()};
// The array is built:
//CHECK-NEXT: MADE{4}:ctor
//CHECK-NEXT: MADE{5}:ctor
//CHECK-NEXT: MADE{6}:ctor
//CHECK-NEXT: MADE{7}:ctor
gCling->evaluate("arrV", V);
// Now V gets destructed...
//CHECK-NEXT: VAR+{5}:dtor
//CHECK-NEXT: VAR+{4}:dtor
// ...and the elements are copied:
//CHECK-NEXT: MADE+{6}:copy
//CHECK-NEXT: MADE+{7}:copy
//CHECK-NEXT: MADE+{8}:copy
//CHECK-NEXT: MADE+{9}:copy
//CHECK-NEXT: MADE+{10}:copy
V // CHECK-NEXT: (cling::Value &) boxes [(Tracer [3]) { @{{.*}}, @{{.*}}, @{{.*}} }]
@ -211,9 +214,10 @@ V // CHECK-NEXT: (cling::Value &) boxes [(Tracer [3]) { @{{.*}}, @{{.*}}, @{{.*}
//CHECK-NEXT: MADE{6}:dtor
//CHECK-NEXT: MADE{5}:dtor
// CHECK-NEXT: VAR{4}:dtor
// CHECK-NEXT: REF{3}:dtor
// CHECK-NEXT: VAR{3}:dtor
// CHECK-NEXT: REF{1}:dtor
//CHECK-NEXT: MADE+{8}:dtor
//CHECK-NEXT: MADE+{9}:dtor
//CHECK-NEXT: MADE+{10}:dtor
//CHECK-NEXT: MADE+{2}:dtor
//CHECK-NEXT: MADE+{1}:dtor
//CHECK-NEXT: MADE+{0}:dtor