Changeset 34118 in webkit for trunk/JavaScriptCore/kjs/regexp_object.cpp
- Timestamp:
- May 25, 2008, 12:15:42 AM (17 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/JavaScriptCore/kjs/regexp_object.cpp
r33979 r34118 315 315 } 316 316 317 class RegExpMatchesArray : public ArrayInstance { 318 public: 319 RegExpMatchesArray(ExecState*, RegExpObjectImpPrivate*); 320 321 virtual ~RegExpMatchesArray(); 322 323 virtual bool getOwnPropertySlot(ExecState* exec, const Identifier& propertyName, PropertySlot& slot) { if (!lazyCreationData()) fillArrayInstance(exec); return ArrayInstance::getOwnPropertySlot(exec, propertyName, slot); } 324 virtual bool getOwnPropertySlot(ExecState* exec, unsigned propertyName, PropertySlot& slot) { if (!lazyCreationData()) fillArrayInstance(exec); return ArrayInstance::getOwnPropertySlot(exec, propertyName, slot); } 325 virtual void put(ExecState* exec, const Identifier& propertyName, JSValue* v) { if (!lazyCreationData()) fillArrayInstance(exec); ArrayInstance::put(exec, propertyName, v); } 326 virtual void put(ExecState* exec, unsigned propertyName, JSValue* v) { if (!lazyCreationData()) fillArrayInstance(exec); ArrayInstance::put(exec, propertyName, v); } 327 virtual bool deleteProperty(ExecState* exec, const Identifier& propertyName) { if (!lazyCreationData()) fillArrayInstance(exec); return ArrayInstance::deleteProperty(exec, propertyName); } 328 virtual bool deleteProperty(ExecState* exec, unsigned propertyName) { if (!lazyCreationData()) fillArrayInstance(exec); return ArrayInstance::deleteProperty(exec, propertyName); } 329 virtual void getPropertyNames(ExecState* exec, PropertyNameArray& arr) { if (!lazyCreationData()) fillArrayInstance(exec); ArrayInstance::getPropertyNames(exec, arr); } 330 331 private: 332 void fillArrayInstance(ExecState*); 333 }; 334 335 RegExpMatchesArray::RegExpMatchesArray(ExecState* exec, RegExpObjectImpPrivate* data) 336 : ArrayInstance(exec->lexicalGlobalObject()->arrayPrototype(), data->lastNumSubPatterns + 1) 337 { 338 RegExpObjectImpPrivate* d = new RegExpObjectImpPrivate; 339 d->lastInput = data->lastInput; 340 d->lastNumSubPatterns = data->lastNumSubPatterns; 341 unsigned offsetVectorSize = (data->lastNumSubPatterns + 1) * 2; // only copying the result part of the vector 342 d->lastOvector.set(new int[offsetVectorSize]); 343 memcpy(d->lastOvector.get(), data->lastOvector.get(), offsetVectorSize * sizeof(int)); 344 // d->multiline is not needed, and remains uninitialized 345 346 setLazyCreationData(d); 347 } 348 349 RegExpMatchesArray::~RegExpMatchesArray() 350 { 351 delete static_cast<RegExpObjectImpPrivate*>(lazyCreationData()); 352 } 353 354 void RegExpMatchesArray::fillArrayInstance(ExecState* exec) 355 { 356 RegExpObjectImpPrivate* d = static_cast<RegExpObjectImpPrivate*>(lazyCreationData()); 357 ASSERT(d); 358 359 unsigned lastNumSubpatterns = d->lastNumSubPatterns; 360 361 for (unsigned i = 0; i <= lastNumSubpatterns; ++i) { 362 int start = d->lastOvector[2 * i]; 363 if (start >= 0) 364 ArrayInstance::put(exec, i, jsString(d->lastInput.substr(start, d->lastOvector[2 * i + 1] - start))); 365 } 366 ArrayInstance::put(exec, exec->propertyNames().index, jsNumber(d->lastOvector[0])); 367 ArrayInstance::put(exec, exec->propertyNames().input, jsString(d->lastInput)); 368 369 delete d; 370 setLazyCreationData(0); 371 } 372 317 373 JSObject* RegExpObjectImp::arrayOfMatches(ExecState* exec) const 318 374 { 319 unsigned lastNumSubpatterns = d->lastNumSubPatterns; 320 ArrayInstance* arr = new ArrayInstance(exec->lexicalGlobalObject()->arrayPrototype(), lastNumSubpatterns + 1); 321 for (unsigned i = 0; i <= lastNumSubpatterns; ++i) { 322 int start = d->lastOvector[2 * i]; 323 if (start >= 0) 324 arr->put(exec, i, jsString(d->lastInput.substr(start, d->lastOvector[2 * i + 1] - start))); 325 } 326 arr->put(exec, exec->propertyNames().index, jsNumber(d->lastOvector[0])); 327 arr->put(exec, exec->propertyNames().input, jsString(d->lastInput)); 328 return arr; 375 return new RegExpMatchesArray(exec, d.get()); 329 376 } 330 377
Note:
See TracChangeset
for help on using the changeset viewer.