[llvm] r224628 - [LIT] Add JSONMetricValue type to wrap types supported by the json encoder.

Eric Fiselier eric at efcs.ca
Fri Dec 19 14:29:12 PST 2014


Author: ericwf
Date: Fri Dec 19 16:29:12 2014
New Revision: 224628

URL: http://llvm.org/viewvc/llvm-project?rev=224628&view=rev
Log:
[LIT] Add JSONMetricValue type to wrap types supported by the json encoder.

Summary:
The following types can be encoded and decoded by the json library:
`dict`, `list`, `tuple`, `str`, `unicode`, `int`, `long`, `float`, `bool`, `NoneType`. 

`JSONMetricValue` can be constructed with any of these types, and used as part of Test.Result.
This patch also adds a toMetricValue function that converts a value into a MetricValue.




Reviewers: ddunbar, EricWF

Reviewed By: EricWF

Subscribers: cfe-commits, llvm-commits

Differential Revision: http://reviews.llvm.org/D6576

Modified:
    llvm/trunk/utils/lit/lit/Test.py

Modified: llvm/trunk/utils/lit/lit/Test.py
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/lit/lit/Test.py?rev=224628&r1=224627&r2=224628&view=diff
==============================================================================
--- llvm/trunk/utils/lit/lit/Test.py (original)
+++ llvm/trunk/utils/lit/lit/Test.py Fri Dec 19 16:29:12 2014
@@ -1,5 +1,6 @@
 import os
 from xml.sax.saxutils import escape
+from json import JSONEncoder
 
 # Test result codes.
 
@@ -73,6 +74,41 @@ class RealMetricValue(MetricValue):
     def todata(self):
         return self.value
 
+class JSONMetricValue(MetricValue):
+    """
+        JSONMetricValue is used for types that are representable in the output
+        but that are otherwise uninterpreted.
+    """
+    def __init__(self, value):
+        # Ensure the value is a serializable by trying to encode it.
+        # WARNING: The value may change before it is encoded again, and may
+        #          not be encodable after the change.
+        try:
+            e = JSONEncoder()
+            e.encode(value)
+        except TypeError:
+            raise
+        self.value = value
+
+    def format(self):
+        return str(self.value)
+
+    def todata(self):
+        return self.value
+
+def toMetricValue(value):
+    if isinstance(value, MetricValue):
+        return value
+    elif isinstance(value, int) or isinstance(value, long):
+        return IntMetricValue(value)
+    elif isinstance(value, float):
+        return RealMetricValue(value)
+    else:
+        # Try to create a JSONMetricValue and let the constructor throw
+        # if value is not a valid type.
+        return JSONMetricValue(value)
+
+
 # Test results.
 
 class Result(object):





More information about the llvm-commits mailing list