void ArrayBufferObject::changeContents(JSContext *cx, void *newData) { // Change buffer contents. uint8_t* oldDataPointer = dataPointer(); setNewOwnedData(cx->runtime()->defaultFreeOp(), newData); // Update all views. ArrayBufferViewObject *viewListHead = viewList(); for (ArrayBufferViewObject *view = viewListHead; view; view = view->nextView()) { // Watch out for NULL data pointers in views. This means that the view // is not fully initialized (in which case it'll be initialized later // with the correct pointer). uint8_t *viewDataPointer = view->dataPointer(); if (viewDataPointer) { JS_ASSERT(newData); ptrdiff_t offset = viewDataPointer - oldDataPointer; viewDataPointer = static_cast<uint8_t *>(newData) + offset; view->setPrivate(viewDataPointer); } // Notify compiled jit code that the base pointer has moved. MarkObjectStateChange(cx, view); } }
void ArrayBufferObject::changeContents(JSContext *cx, void *newData) { JS_ASSERT(!isAsmJSArrayBuffer()); JS_ASSERT(!isSharedArrayBuffer()); // Update all views. ArrayBufferViewObject *viewListHead = viewList(); for (ArrayBufferViewObject *view = viewListHead; view; view = view->nextView()) { // Watch out for NULL data pointers in views. This either // means that the view is not fully initialized (in which case // it'll be initialized later with the correct pointer) or // that the view has been neutered. In that case, the buffer // is "en route" to being neutered but the isNeuteredBuffer() // flag may not yet be set. uint8_t *viewDataPointer = view->dataPointer(); if (viewDataPointer) { JS_ASSERT(newData); viewDataPointer += static_cast<uint8_t *>(newData) - dataPointer(); view->setPrivate(viewDataPointer); } // Notify compiled jit code that the base pointer has moved. MarkObjectStateChange(cx, view); } if (ownsData()) releaseData(cx->runtime()->defaultFreeOp()); setDataPointer(static_cast<uint8_t *>(newData), OwnsData); }