]> git.saurik.com Git - apple/javascriptcore.git/blobdiff - parser/SourceProvider.h
JavaScriptCore-1218.34.tar.gz
[apple/javascriptcore.git] / parser / SourceProvider.h
index 1c59eeda406b1223be80588a5db635085d7cd6f5..4ced9d9c79c58ab4ab545bec609780ed0cb2b79c 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2008, 2009 Apple Inc. All rights reserved.
+ * Copyright (C) 2008, 2009, 2012, 2013 Apple Inc. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
 #ifndef SourceProvider_h
 #define SourceProvider_h
 
-#include "UString.h"
+#include <wtf/PassOwnPtr.h>
 #include <wtf/RefCounted.h>
+#include <wtf/text/TextPosition.h>
+#include <wtf/text/WTFString.h>
 
 namespace JSC {
 
-    enum SourceBOMPresence { SourceHasNoBOMs, SourceCouldHaveBOMs };
-
     class SourceProvider : public RefCounted<SourceProvider> {
     public:
-        SourceProvider(const UString& url, SourceBOMPresence hasBOMs = SourceCouldHaveBOMs)
-            : m_url(url)
-            , m_hasBOMs(hasBOMs)
+        static const intptr_t nullID = 1;
+        
+        JS_EXPORT_PRIVATE SourceProvider(const String& url, const TextPosition& startPosition);
+
+        JS_EXPORT_PRIVATE virtual ~SourceProvider();
+
+        virtual const String& source() const = 0;
+        String getRange(int start, int end) const
         {
+            return source().substringSharingImpl(start, end - start);
         }
-        virtual ~SourceProvider() { }
 
-        virtual UString getRange(int start, int end) const = 0;
-        virtual const UChar* data() const = 0;
-        virtual int length() const = 0;
-        
-        const UString& url() { return m_url; }
-        intptr_t asID() { return reinterpret_cast<intptr_t>(this); }
+        const String& url() { return m_url; }
+        TextPosition startPosition() const { return m_startPosition; }
+        intptr_t asID()
+        {
+            ASSERT(this);
+            if (!this) // Be defensive in release mode.
+                return nullID;
+            if (!m_id)
+                getID();
+            return m_id;
+        }
 
-        SourceBOMPresence hasBOMs() const { return m_hasBOMs; }
+        bool isValid() const { return m_validated; }
+        void setValid() { m_validated = true; }
 
     private:
-        UString m_url;
-        SourceBOMPresence m_hasBOMs;
+
+        JS_EXPORT_PRIVATE void getID();
+        Vector<size_t>& lineStarts();
+
+        String m_url;
+        TextPosition m_startPosition;
+        bool m_validated : 1;
+        uintptr_t m_id : sizeof(uintptr_t) * 8 - 1;
     };
 
-    class UStringSourceProvider : public SourceProvider {
+    class StringSourceProvider : public SourceProvider {
     public:
-        static PassRefPtr<UStringSourceProvider> create(const UString& source, const UString& url)
+        static PassRefPtr<StringSourceProvider> create(const String& source, const String& url, const TextPosition& startPosition = TextPosition::minimumPosition())
         {
-            return adoptRef(new UStringSourceProvider(source, url));
+            return adoptRef(new StringSourceProvider(source, url, startPosition));
         }
 
-        UString getRange(int start, int end) const { return m_source.substr(start, end - start); }
-        const UChar* data() const { return m_source.data(); }
-        int length() const { return m_source.size(); }
+        virtual const String& source() const OVERRIDE
+        {
+            return m_source;
+        }
 
     private:
-        UStringSourceProvider(const UString& source, const UString& url)
-            : SourceProvider(url)
+        StringSourceProvider(const String& source, const String& url, const TextPosition& startPosition)
+            : SourceProvider(url, startPosition)
             , m_source(source)
         {
         }
 
-        UString m_source;
+        String m_source;
     };
     
 } // namespace JSC