Introduce a simple string pool to speed up lookups.
authorErik Verbruggen <erik.verbruggen@digia.com>
Wed, 28 Nov 2012 12:39:14 +0000 (13:39 +0100)
committerLars Knoll <lars.knoll@digia.com>
Wed, 28 Nov 2012 13:06:06 +0000 (14:06 +0100)
This change uniques string pointers, so the String::isEqualTo will more
often succeed in the pointer-equality case.

Change-Id: I1d4f1a70147c48bc75359642a56a0446b5fbf199
Reviewed-by: Lars Knoll <lars.knoll@digia.com>
qmljs_engine.cpp
qmljs_engine.h

index 6ac7250..7d12df5 100644 (file)
 namespace QQmlJS {
 namespace VM {
 
+struct StringPool
+{
+    QHash<QString, String*> strings;
+
+    String *newString(const QString &s)
+    {
+        QHash<QString, String*>::const_iterator it = strings.find(s);
+        if (it != strings.end())
+            return it.value();
+        String *str = new String(s);
+        strings.insert(s, str);
+        return str;
+    }
+};
+
 ExecutionEngine::ExecutionEngine(EvalISelFactory *factory)
     : iselFactory(factory)
 {
+    stringPool = new StringPool;
+
     rootContext = newContext();
     rootContext->init(this);
 
@@ -213,7 +230,7 @@ FunctionObject *ExecutionEngine::newObjectCtor(ExecutionContext *ctx)
 
 String *ExecutionEngine::newString(const QString &s)
 {
-    return new String(s);
+    return stringPool->newString(s);
 }
 
 Object *ExecutionEngine::newStringObject(const Value &value)
index 9ed8421..54e303c 100644 (file)
@@ -140,6 +140,8 @@ struct ExecutionEngine
     QVector<ExceptionHandler> unwindStack;
     Value exception;
 
+    struct StringPool *stringPool;
+
     ExecutionEngine(EvalISelFactory *iselFactory);
 
     ExecutionContext *newContext();