static HRESULT WINAPI RegExp2_put_Pattern(IRegExp2 *iface, BSTR pattern) { RegExp2 *This = impl_from_IRegExp2(iface); WCHAR *p; DWORD size; TRACE("(%p)->(%s)\n", This, wine_dbgstr_w(pattern)); if(!pattern) { heap_free(This->pattern); if(This->regexp) { regexp_destroy(This->regexp); This->regexp = NULL; } This->pattern = NULL; return S_OK; } size = (SysStringLen(pattern)+1) * sizeof(WCHAR); p = heap_alloc(size); if(!p) return E_OUTOFMEMORY; heap_free(This->pattern); This->pattern = p; memcpy(p, pattern, size); if(This->regexp) { regexp_destroy(This->regexp); This->regexp = NULL; } return S_OK; }
static void RegExp_destructor(jsdisp_t *dispex) { RegExpInstance *This = (RegExpInstance*)dispex; if(This->jsregexp) regexp_destroy(This->jsregexp); jsval_release(This->last_index_val); jsstr_release(This->str); heap_free(This); }
static ULONG WINAPI RegExp2_Release(IRegExp2 *iface) { RegExp2 *This = impl_from_IRegExp2(iface); LONG ref = InterlockedDecrement(&This->ref); TRACE("(%p) ref=%d\n", This, ref); if(!ref) { heap_free(This->pattern); if(This->regexp) regexp_destroy(This->regexp); heap_pool_free(&This->pool); heap_free(This); } return ref; }