1/* 2 * Copyright (C) 2008, 2013 Apple Inc. All rights reserved. 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions 6 * are met: 7 * 8 * 1. Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * 2. Redistributions in binary form must reproduce the above copyright 11 * notice, this list of conditions and the following disclaimer in the 12 * documentation and/or other materials provided with the distribution. 13 * 3. Neither the name of Apple Inc. ("Apple") nor the names of 14 * its contributors may be used to endorse or promote products derived 15 * from this software without specific prior written permission. 16 * 17 * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY 18 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 19 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 20 * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY 21 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 22 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 23 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 24 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27 */ 28 29#ifndef SourceCode_h 30#define SourceCode_h 31 32#include "SourceProvider.h" 33#include <wtf/RefPtr.h> 34 35namespace JSC { 36 37 class SourceCode { 38 public: 39 SourceCode() 40 : m_provider(0) 41 , m_startChar(0) 42 , m_endChar(0) 43 , m_firstLine(0) 44 , m_startColumn(0) 45 { 46 } 47 48 SourceCode(WTF::HashTableDeletedValueType) 49 : m_provider(WTF::HashTableDeletedValue) 50 { 51 } 52 53 SourceCode(PassRefPtr<SourceProvider> provider) 54 : m_provider(provider) 55 , m_startChar(0) 56 , m_endChar(m_provider->source().length()) 57 , m_firstLine(1) 58 , m_startColumn(1) 59 { 60 } 61 62 SourceCode(PassRefPtr<SourceProvider> provider, int firstLine, int startColumn) 63 : m_provider(provider) 64 , m_startChar(0) 65 , m_endChar(m_provider->source().length()) 66 , m_firstLine(std::max(firstLine, 1)) 67 , m_startColumn(std::max(startColumn, 1)) 68 { 69 } 70 71 SourceCode(PassRefPtr<SourceProvider> provider, int start, int end, int firstLine, int startColumn) 72 : m_provider(provider) 73 , m_startChar(start) 74 , m_endChar(end) 75 , m_firstLine(std::max(firstLine, 1)) 76 , m_startColumn(std::max(startColumn, 1)) 77 { 78 } 79 80 bool isHashTableDeletedValue() const { return m_provider.isHashTableDeletedValue(); } 81 82 String toString() const 83 { 84 if (!m_provider) 85 return String(); 86 return m_provider->getRange(m_startChar, m_endChar); 87 } 88 89 CString toUTF8() const; 90 91 intptr_t providerID() const 92 { 93 if (!m_provider) 94 return SourceProvider::nullID; 95 return m_provider->asID(); 96 } 97 98 bool isNull() const { return !m_provider; } 99 SourceProvider* provider() const { return m_provider.get(); } 100 int firstLine() const { return m_firstLine; } 101 int startColumn() const { return m_startColumn; } 102 int startOffset() const { return m_startChar; } 103 int endOffset() const { return m_endChar; } 104 int length() const { return m_endChar - m_startChar; } 105 106 SourceCode subExpression(unsigned openBrace, unsigned closeBrace, int firstLine, int startColumn); 107 108 private: 109 RefPtr<SourceProvider> m_provider; 110 int m_startChar; 111 int m_endChar; 112 int m_firstLine; 113 int m_startColumn; 114 }; 115 116 inline SourceCode makeSource(const String& source, const String& url = String(), const TextPosition& startPosition = TextPosition::minimumPosition()) 117 { 118 return SourceCode(StringSourceProvider::create(source, url, startPosition), startPosition.m_line.oneBasedInt(), startPosition.m_column.oneBasedInt()); 119 } 120 121 inline SourceCode SourceCode::subExpression(unsigned openBrace, unsigned closeBrace, int firstLine, int startColumn) 122 { 123 ASSERT(provider()->source()[openBrace] == '{'); 124 ASSERT(provider()->source()[closeBrace] == '}'); 125 startColumn += 1; // Convert to base 1. 126 return SourceCode(provider(), openBrace, closeBrace + 1, firstLine, startColumn); 127 } 128 129} // namespace JSC 130 131#endif // SourceCode_h 132