Changeset 45545 in webkit for trunk/JavaScriptCore/runtime
- Timestamp:
- Jul 4, 2009, 7:21:30 AM (16 years ago)
- Location:
- trunk/JavaScriptCore/runtime
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/JavaScriptCore/runtime/RegExp.cpp
r44224 r45545 2 2 * Copyright (C) 1999-2001, 2004 Harri Porten ([email protected]) 3 3 * Copyright (c) 2007, 2008 Apple Inc. All rights reserved. 4 * Copyright (C) 2009 Torch Mobile, Inc. 4 5 * 5 6 * This library is free software; you can redistribute it and/or … … 111 112 } 112 113 113 int RegExp::match(const UString& s, int startOffset, OwnArrayPtr<int>* ovector)114 int RegExp::match(const UString& s, int startOffset, Vector<int, 32>* ovector) 114 115 { 115 116 if (startOffset < 0) … … 127 128 #endif 128 129 int offsetVectorSize = (m_numSubpatterns + 1) * 3; // FIXME: should be 2 - but adding temporary fallback to pcre. 129 int* offsetVector = new int [offsetVectorSize]; 130 int* offsetVector; 131 Vector<int, 32> nonReturnedOvector; 132 if (ovector) { 133 ovector->resize(offsetVectorSize); 134 offsetVector = ovector->data(); 135 } else { 136 nonReturnedOvector.resize(offsetVectorSize); 137 offsetVector = nonReturnedOvector.data(); 138 } 139 130 140 ASSERT(offsetVector); 131 141 for (int j = 0; j < offsetVectorSize; ++j) 132 142 offsetVector[j] = -1; 133 143 134 OwnArrayPtr<int> nonReturnedOvector;135 if (!ovector)136 nonReturnedOvector.set(offsetVector);137 else138 ovector->set(offsetVector);139 144 140 145 #if ENABLE(YARR_JIT) … … 178 183 } 179 184 180 int RegExp::match(const UString& s, int startOffset, OwnArrayPtr<int>* ovector)185 int RegExp::match(const UString& s, int startOffset, Vector<int, 32>* ovector) 181 186 { 182 187 if (startOffset < 0) … … 191 196 if (m_wrecFunction) { 192 197 int offsetVectorSize = (m_numSubpatterns + 1) * 2; 193 int* offsetVector = new int [offsetVectorSize]; 198 int* offsetVector; 199 Vector<int, 32> nonReturnedOvector; 200 if (ovector) { 201 ovector->resize(offsetVectorSize); 202 offsetVector = ovector->data(); 203 } else { 204 nonReturnedOvector.resize(offsetVectorSize); 205 offsetVector = nonReturnedOvector.data(); 206 } 194 207 ASSERT(offsetVector); 195 208 for (int j = 0; j < offsetVectorSize; ++j) 196 209 offsetVector[j] = -1; 197 198 OwnArrayPtr<int> nonReturnedOvector;199 if (!ovector)200 nonReturnedOvector.set(offsetVector);201 else202 ovector->set(offsetVector);203 210 204 211 int result = m_wrecFunction(s.data(), startOffset, s.size(), offsetVector); … … 227 234 } else { 228 235 offsetVectorSize = (m_numSubpatterns + 1) * 3; 229 o ffsetVector = new int [offsetVectorSize];230 o vector->set(offsetVector);236 ovector->resize(offsetVectorSize); 237 offsetVector = ovector->data(); 231 238 } 232 239 -
trunk/JavaScriptCore/runtime/RegExp.h
r44224 r45545 2 2 * Copyright (C) 1999-2000 Harri Porten ([email protected]) 3 3 * Copyright (C) 2007, 2008, 2009 Apple Inc. All rights reserved. 4 * Copyright (C) 2009 Torch Mobile, Inc. 4 5 * 5 6 * This library is free software; you can redistribute it and/or … … 54 55 const char* errorMessage() const { return m_constructionError; } 55 56 56 int match(const UString&, int startOffset, OwnArrayPtr<int>* ovector = 0);57 int match(const UString&, int startOffset, Vector<int, 32>* ovector = 0); 57 58 unsigned numSubpatterns() const { return m_numSubpatterns; } 58 59 -
trunk/JavaScriptCore/runtime/RegExpConstructor.cpp
r45269 r45545 2 2 * Copyright (C) 1999-2000 Harri Porten ([email protected]) 3 3 * Copyright (C) 2003, 2007, 2008 Apple Inc. All Rights Reserved. 4 * Copyright (C) 2009 Torch Mobile, Inc. 4 5 * 5 6 * This library is free software; you can redistribute it and/or … … 94 95 : lastNumSubPatterns(0) 95 96 , multiline(false) 97 , lastOvectorIndex(0) 96 98 { 97 99 } 100 101 const Vector<int, 32>& lastOvector() const { return ovector[lastOvectorIndex]; } 102 Vector<int, 32>& lastOvector() { return ovector[lastOvectorIndex]; } 103 Vector<int, 32>& tempOvector() { return ovector[lastOvectorIndex ? 0 : 1]; } 104 void changeLastOvector() { lastOvectorIndex = lastOvectorIndex ? 0 : 1; } 98 105 99 106 UString input; 100 107 UString lastInput; 101 OwnArrayPtr<int> lastOvector;102 unsigned lastNumSubPatterns : 3 1;108 Vector<int, 32> ovector[2]; 109 unsigned lastNumSubPatterns : 30; 103 110 bool multiline : 1; 111 unsigned lastOvectorIndex : 1; 104 112 }; 105 113 … … 122 130 void RegExpConstructor::performMatch(RegExp* r, const UString& s, int startOffset, int& position, int& length, int** ovector) 123 131 { 124 OwnArrayPtr<int> tmpOvector; 125 position = r->match(s, startOffset, &tmpOvector); 132 position = r->match(s, startOffset, &d->tempOvector()); 126 133 127 134 if (ovector) 128 *ovector = tmpOvector.get();135 *ovector = d->tempOvector().data(); 129 136 130 137 if (position != -1) { 131 ASSERT( tmpOvector);132 133 length = tmpOvector[1] - tmpOvector[0];138 ASSERT(!d->tempOvector().isEmpty()); 139 140 length = d->tempOvector()[1] - d->tempOvector()[0]; 134 141 135 142 d->input = s; 136 143 d->lastInput = s; 137 d-> lastOvector.set(tmpOvector.release());144 d->changeLastOvector(); 138 145 d->lastNumSubPatterns = r->numSubpatterns(); 139 146 } … … 148 155 d->lastNumSubPatterns = data->lastNumSubPatterns; 149 156 unsigned offsetVectorSize = (data->lastNumSubPatterns + 1) * 2; // only copying the result part of the vector 150 d->lastOvector .set(new int[offsetVectorSize]);151 memcpy(d->lastOvector .get(), data->lastOvector.get(), offsetVectorSize * sizeof(int));157 d->lastOvector().resize(offsetVectorSize); 158 memcpy(d->lastOvector().data(), data->lastOvector().data(), offsetVectorSize * sizeof(int)); 152 159 // d->multiline is not needed, and remains uninitialized 153 160 … … 168 175 169 176 for (unsigned i = 0; i <= lastNumSubpatterns; ++i) { 170 int start = d->lastOvector [2 * i];177 int start = d->lastOvector()[2 * i]; 171 178 if (start >= 0) 172 JSArray::put(exec, i, jsSubstring(exec, d->lastInput, start, d->lastOvector [2 * i + 1] - start));179 JSArray::put(exec, i, jsSubstring(exec, d->lastInput, start, d->lastOvector()[2 * i + 1] - start)); 173 180 } 174 181 175 182 PutPropertySlot slot; 176 JSArray::put(exec, exec->propertyNames().index, jsNumber(exec, d->lastOvector [0]), slot);183 JSArray::put(exec, exec->propertyNames().index, jsNumber(exec, d->lastOvector()[0]), slot); 177 184 JSArray::put(exec, exec->propertyNames().input, jsString(exec, d->input), slot); 178 185 … … 188 195 JSValue RegExpConstructor::getBackref(ExecState* exec, unsigned i) const 189 196 { 190 if ( d->lastOvector&& i <= d->lastNumSubPatterns) {191 int start = d->lastOvector [2 * i];197 if (!d->lastOvector().isEmpty() && i <= d->lastNumSubPatterns) { 198 int start = d->lastOvector()[2 * i]; 192 199 if (start >= 0) 193 return jsSubstring(exec, d->lastInput, start, d->lastOvector [2 * i + 1] - start);200 return jsSubstring(exec, d->lastInput, start, d->lastOvector()[2 * i + 1] - start); 194 201 } 195 202 return jsEmptyString(exec); … … 201 208 if (i > 0) { 202 209 ASSERT(d->lastOvector); 203 int start = d->lastOvector [2 * i];210 int start = d->lastOvector()[2 * i]; 204 211 if (start >= 0) 205 return jsSubstring(exec, d->lastInput, start, d->lastOvector [2 * i + 1] - start);212 return jsSubstring(exec, d->lastInput, start, d->lastOvector()[2 * i + 1] - start); 206 213 } 207 214 return jsEmptyString(exec); … … 210 217 JSValue RegExpConstructor::getLeftContext(ExecState* exec) const 211 218 { 212 if ( d->lastOvector)213 return jsSubstring(exec, d->lastInput, 0, d->lastOvector [0]);219 if (!d->lastOvector().isEmpty()) 220 return jsSubstring(exec, d->lastInput, 0, d->lastOvector()[0]); 214 221 return jsEmptyString(exec); 215 222 } … … 217 224 JSValue RegExpConstructor::getRightContext(ExecState* exec) const 218 225 { 219 if ( d->lastOvector)220 return jsSubstring(exec, d->lastInput, d->lastOvector [1], d->lastInput.size() - d->lastOvector[1]);226 if (!d->lastOvector().isEmpty()) 227 return jsSubstring(exec, d->lastInput, d->lastOvector()[1], d->lastInput.size() - d->lastOvector()[1]); 221 228 return jsEmptyString(exec); 222 229 } -
trunk/JavaScriptCore/runtime/StringPrototype.cpp
r44216 r45545 2 2 * Copyright (C) 1999-2001 Harri Porten ([email protected]) 3 3 * Copyright (C) 2004, 2005, 2006, 2007, 2008 Apple Inc. All rights reserved. 4 * Copyright (C) 2009 Torch Mobile, Inc. 4 5 * 5 6 * This library is free software; you can redistribute it and/or … … 576 577 int pos = 0; 577 578 while (i != limit && pos < s.size()) { 578 OwnArrayPtr<int> ovector;579 Vector<int, 32> ovector; 579 580 int mpos = reg->match(s, pos, &ovector); 580 581 if (mpos < 0)
Note:
See TracChangeset
for help on using the changeset viewer.