source: webkit/trunk/JavaScriptCore/runtime/UStringImpl.cpp@ 52856

Last change on this file since 52856 was 52856, checked in by [email protected], 15 years ago

https://bugs.webkit.org/show_bug.cgi?id=33236
Remove m_identifierTable pointer from UString

Reviewed by Sam Weinig.

JavaScriptCore:

Currently every string holds a pointer so that during destruction,
if a string has been used as an identifier, it can remove itself
from the table. By instead accessing the identifierTable via a
thread specific tracking the table associated with the current
globaldata, we can save the memory cost of this pointer.

  • API/APIShims.h:

(JSC::APIEntryShimWithoutLock::APIEntryShimWithoutLock):
(JSC::APIEntryShimWithoutLock::~APIEntryShimWithoutLock):
(JSC::APICallbackShim::APICallbackShim):
(JSC::APICallbackShim::~APICallbackShim):

  • change the API shims to track the identifierTable of the current JSGlobalData.
  • API/JSContextRef.cpp:

(JSContextGroupCreate):

  • update creation of JSGlobalData for API usage to use new create method.
  • fix shim instanciation bug in JSGlobalContextCreateInGroup.

(JSC::checkSyntax):
(JSC::evaluate):

  • add asserts to check the identifierTable is being tracked correctly.
  • runtime/Identifier.cpp:

(JSC::IdentifierTable::~IdentifierTable):
(JSC::IdentifierTable::add):
(JSC::Identifier::remove):
(JSC::Identifier::checkSameIdentifierTable):
(JSC::createIdentifierTableSpecificCallback):
(JSC::createIdentifierTableSpecific):
(JSC::createDefaultDataSpecific):

  • Use currentIdentifierTable() instead of UStringImpl::m_identifierTable.
  • Define methods to access the thread specific identifier tables.
  • runtime/Identifier.h:

(JSC::ThreadIdentifierTableData::ThreadIdentifierTableData):
(JSC::defaultIdentifierTable):
(JSC::setDefaultIdentifierTable):
(JSC::currentIdentifierTable):
(JSC::setCurrentIdentifierTable):
(JSC::resetCurrentIdentifierTable):

  • Declare methods to access the thread specific identifier tables.
  • runtime/JSGlobalData.cpp:

(JSC::JSGlobalData::createNonDefault):
(JSC::JSGlobalData::create):
(JSC::JSGlobalData::sharedInstance):

  • creation of JSGlobalData objects, other than for API usage, associate themselves with the current thread.
  • runtime/JSGlobalData.h:
  • runtime/UStringImpl.cpp:

(JSC::UStringImpl::destroy):

  • destroy() method should be using isIdentifier().
  • runtime/UStringImpl.h:

(JSC::UStringImpl::isIdentifier):
(JSC::UStringImpl::setIsIdentifier):
(JSC::UStringImpl::checkConsistency):
(JSC::UStringImpl::UStringImpl):

  • replace m_identifierTable with a single m_isIdentifier bit.
  • wtf/StringHashFunctions.h:

(WTF::stringHash):

  • change string hash result from 32-bit to 31-bit, to free a bit in UStringImpl for m_isIdentifier.

JavaScriptGlue:

Add API shims similar to those used in the JSC API to track the current identifierTable.

  • JSBase.cpp:

(JSBase::Release):

  • JSUtils.cpp:

(JSObjectKJSValue):
(KJSValueToCFTypeInternal):
(unprotectGlobalObject):
(JSGlueAPIEntry::JSGlueAPIEntry):
(JSGlueAPIEntry::~JSGlueAPIEntry):
(JSGlueAPICallback::JSGlueAPICallback):
(JSGlueAPICallback::~JSGlueAPICallback):

  • JSUtils.h:
  • JSValueWrapper.cpp:

(JSValueWrapper::JSObjectCopyPropertyNames):
(JSValueWrapper::JSObjectCopyProperty):
(JSValueWrapper::JSObjectSetProperty):
(JSValueWrapper::JSObjectCallFunction):
(JSValueWrapper::JSObjectCopyCFValue):

  • JavaScriptGlue.cpp:

(JSRunCreate):
(JSRunEvaluate):
(JSRunCheckSyntax):
(JSCollect):

  • JavaScriptGlue.xcodeproj/project.pbxproj:
  • UserObjectImp.cpp:

(UserObjectImp::callAsFunction):

File size: 2.7 KB
Line 
1/*
2 * Copyright (C) 2009 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 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 *
13 * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
14 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR
17 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24 */
25
26#include "config.h"
27#include "UStringImpl.h"
28
29#include "Identifier.h"
30#include "UString.h"
31#include <wtf/unicode/UTF8.h>
32
33using namespace WTF::Unicode;
34using namespace std;
35
36namespace JSC {
37
38SharedUChar* UStringImpl::baseSharedBuffer()
39{
40 ASSERT((bufferOwnership() == BufferShared)
41 || ((bufferOwnership() == BufferOwned) && !m_dataBuffer.asPtr<void*>()));
42
43 if (bufferOwnership() != BufferShared)
44 m_dataBuffer = UntypedPtrAndBitfield(SharedUChar::create(new OwnFastMallocPtr<UChar>(m_data)).releaseRef(), BufferShared);
45
46 return m_dataBuffer.asPtr<SharedUChar*>();
47}
48
49SharedUChar* UStringImpl::sharedBuffer()
50{
51 if (m_length < s_minLengthToShare)
52 return 0;
53 ASSERT(!isStatic());
54
55 UStringImpl* owner = bufferOwnerString();
56 if (owner->bufferOwnership() == BufferInternal)
57 return 0;
58
59 return owner->baseSharedBuffer();
60}
61
62void UStringImpl::destroy()
63{
64 ASSERT(!isStatic());
65 checkConsistency();
66
67 if (isIdentifier())
68 Identifier::remove(this);
69
70 if (bufferOwnership() != BufferInternal) {
71 if (bufferOwnership() == BufferOwned)
72 fastFree(m_data);
73 else if (bufferOwnership() == BufferSubstring)
74 m_dataBuffer.asPtr<UStringImpl*>()->deref();
75 else {
76 ASSERT(bufferOwnership() == BufferShared);
77 m_dataBuffer.asPtr<SharedUChar*>()->deref();
78 }
79 }
80
81 delete this;
82}
83
84}
Note: See TracBrowser for help on using the repository browser.