winehq.org
Sign In
Sign Up
Sign In
Sign Up
Manage this list
×
Keyboard Shortcuts
Thread View
j
: Next unread message
k
: Previous unread message
j a
: Jump to all threads
j l
: Jump to MailingList overview
2025
July
June
May
April
March
February
January
2024
December
November
October
September
August
July
June
May
April
March
February
January
2023
December
November
October
September
August
July
June
May
April
March
February
January
2022
December
November
October
September
August
July
June
May
April
March
February
January
2021
December
November
October
September
August
July
June
May
April
March
February
January
2020
December
November
October
September
August
July
June
May
April
March
February
January
2019
December
November
October
September
August
July
June
May
April
March
February
January
2018
December
November
October
September
August
July
June
May
April
March
February
January
2017
December
November
October
September
August
July
June
May
April
March
February
January
2016
December
November
October
September
August
July
June
May
April
March
February
January
2015
December
November
October
September
August
July
June
May
April
March
February
January
2014
December
November
October
September
August
July
June
May
April
March
February
January
2013
December
November
October
September
August
July
June
May
April
March
February
January
2012
December
November
October
September
August
July
June
May
April
March
February
January
2011
December
November
October
September
August
July
June
May
April
March
February
January
2010
December
November
October
September
August
July
June
May
April
March
February
January
2009
December
November
October
September
August
July
June
May
April
March
February
January
2008
December
November
October
September
August
July
June
May
April
March
February
January
2007
December
November
October
September
August
July
June
May
April
March
February
January
2006
December
November
October
September
August
July
June
May
April
March
February
January
2005
December
November
October
September
August
July
June
May
April
March
February
January
2004
December
November
October
September
August
July
June
May
April
March
February
January
2003
December
November
October
September
August
July
June
May
April
March
February
January
2002
December
November
October
September
August
July
June
May
April
March
February
January
2001
December
November
October
September
August
July
June
May
April
March
February
List overview
wine-commits
July 2009
----- 2025 -----
July 2025
June 2025
May 2025
April 2025
March 2025
February 2025
January 2025
----- 2024 -----
December 2024
November 2024
October 2024
September 2024
August 2024
July 2024
June 2024
May 2024
April 2024
March 2024
February 2024
January 2024
----- 2023 -----
December 2023
November 2023
October 2023
September 2023
August 2023
July 2023
June 2023
May 2023
April 2023
March 2023
February 2023
January 2023
----- 2022 -----
December 2022
November 2022
October 2022
September 2022
August 2022
July 2022
June 2022
May 2022
April 2022
March 2022
February 2022
January 2022
----- 2021 -----
December 2021
November 2021
October 2021
September 2021
August 2021
July 2021
June 2021
May 2021
April 2021
March 2021
February 2021
January 2021
----- 2020 -----
December 2020
November 2020
October 2020
September 2020
August 2020
July 2020
June 2020
May 2020
April 2020
March 2020
February 2020
January 2020
----- 2019 -----
December 2019
November 2019
October 2019
September 2019
August 2019
July 2019
June 2019
May 2019
April 2019
March 2019
February 2019
January 2019
----- 2018 -----
December 2018
November 2018
October 2018
September 2018
August 2018
July 2018
June 2018
May 2018
April 2018
March 2018
February 2018
January 2018
----- 2017 -----
December 2017
November 2017
October 2017
September 2017
August 2017
July 2017
June 2017
May 2017
April 2017
March 2017
February 2017
January 2017
----- 2016 -----
December 2016
November 2016
October 2016
September 2016
August 2016
July 2016
June 2016
May 2016
April 2016
March 2016
February 2016
January 2016
----- 2015 -----
December 2015
November 2015
October 2015
September 2015
August 2015
July 2015
June 2015
May 2015
April 2015
March 2015
February 2015
January 2015
----- 2014 -----
December 2014
November 2014
October 2014
September 2014
August 2014
July 2014
June 2014
May 2014
April 2014
March 2014
February 2014
January 2014
----- 2013 -----
December 2013
November 2013
October 2013
September 2013
August 2013
July 2013
June 2013
May 2013
April 2013
March 2013
February 2013
January 2013
----- 2012 -----
December 2012
November 2012
October 2012
September 2012
August 2012
July 2012
June 2012
May 2012
April 2012
March 2012
February 2012
January 2012
----- 2011 -----
December 2011
November 2011
October 2011
September 2011
August 2011
July 2011
June 2011
May 2011
April 2011
March 2011
February 2011
January 2011
----- 2010 -----
December 2010
November 2010
October 2010
September 2010
August 2010
July 2010
June 2010
May 2010
April 2010
March 2010
February 2010
January 2010
----- 2009 -----
December 2009
November 2009
October 2009
September 2009
August 2009
July 2009
June 2009
May 2009
April 2009
March 2009
February 2009
January 2009
----- 2008 -----
December 2008
November 2008
October 2008
September 2008
August 2008
July 2008
June 2008
May 2008
April 2008
March 2008
February 2008
January 2008
----- 2007 -----
December 2007
November 2007
October 2007
September 2007
August 2007
July 2007
June 2007
May 2007
April 2007
March 2007
February 2007
January 2007
----- 2006 -----
December 2006
November 2006
October 2006
September 2006
August 2006
July 2006
June 2006
May 2006
April 2006
March 2006
February 2006
January 2006
----- 2005 -----
December 2005
November 2005
October 2005
September 2005
August 2005
July 2005
June 2005
May 2005
April 2005
March 2005
February 2005
January 2005
----- 2004 -----
December 2004
November 2004
October 2004
September 2004
August 2004
July 2004
June 2004
May 2004
April 2004
March 2004
February 2004
January 2004
----- 2003 -----
December 2003
November 2003
October 2003
September 2003
August 2003
July 2003
June 2003
May 2003
April 2003
March 2003
February 2003
January 2003
----- 2002 -----
December 2002
November 2002
October 2002
September 2002
August 2002
July 2002
June 2002
May 2002
April 2002
March 2002
February 2002
January 2002
----- 2001 -----
December 2001
November 2001
October 2001
September 2001
August 2001
July 2001
June 2001
May 2001
April 2001
March 2001
February 2001
wine-commits@winehq.org
4 participants
1067 discussions
Start a n
N
ew thread
Henri Verbeet : wined3d: Avoid destroying contexts that are current in another thread.
by Alexandre Julliard
22 Jul '09
22 Jul '09
Module: wine Branch: master Commit: 377cda97e75588afd8bc4af0a126ae9f8ea2a6a8 URL:
http://source.winehq.org/git/wine.git/?a=commit;h=377cda97e75588afd8bc4af0a…
Author: Henri Verbeet <hverbeet(a)codeweavers.com> Date: Wed Jul 22 10:41:06 2009 +0200 wined3d: Avoid destroying contexts that are current in another thread. --- dlls/wined3d/context.c | 130 ++++++++++++++++++++++++++-------------- dlls/wined3d/wined3d_private.h | 4 +- 2 files changed, 89 insertions(+), 45 deletions(-) diff --git a/dlls/wined3d/context.c b/dlls/wined3d/context.c index 5e43467..777b907 100644 --- a/dlls/wined3d/context.c +++ b/dlls/wined3d/context.c @@ -558,6 +558,59 @@ void context_resource_released(IWineD3DDevice *iface, IWineD3DResource *resource } } +static void context_destroy_gl_resources(struct WineD3DContext *context) +{ + const struct wined3d_gl_info *gl_info = context->gl_info; + struct fbo_entry *entry, *entry2; + BOOL has_glctx; + + has_glctx = pwglMakeCurrent(context->hdc, context->glCtx); + if (!has_glctx) WARN("Failed to activate context. Window already destroyed?\n"); + + ENTER_GL(); + + LIST_FOR_EACH_ENTRY_SAFE(entry, entry2, &context->fbo_list, struct fbo_entry, entry) { + if (!has_glctx) entry->id = 0; + context_destroy_fbo_entry(context, entry); + } + if (has_glctx) + { + if (context->src_fbo) + { + TRACE("Destroy src FBO %d\n", context->src_fbo); + context_destroy_fbo(context, &context->src_fbo); + } + if (context->dst_fbo) + { + TRACE("Destroy dst FBO %d\n", context->dst_fbo); + context_destroy_fbo(context, &context->dst_fbo); + } + if (context->dummy_arbfp_prog) + { + GL_EXTCALL(glDeleteProgramsARB(1, &context->dummy_arbfp_prog)); + } + } + + LEAVE_GL(); + + if (!pwglMakeCurrent(NULL, NULL)) + { + ERR("Failed to disable GL context.\n"); + } + + if (context->isPBuffer) + { + GL_EXTCALL(wglReleasePbufferDCARB(context->pbuffer, context->hdc)); + GL_EXTCALL(wglDestroyPbufferARB(context->pbuffer)); + } + else + { + ReleaseDC(context->win_handle, context->hdc); + } + + pwglDeleteContext(context->glCtx); +} + DWORD context_get_tls_idx(void) { return wined3d_context_tls_idx; @@ -583,6 +636,20 @@ BOOL context_set_current(struct WineD3DContext *ctx) return TRUE; } + if (old) + { + if (old->destroyed) + { + TRACE("Switching away from destroyed context %p.\n", old); + context_destroy_gl_resources(old); + HeapFree(GetProcessHeap(), 0, old); + } + else + { + old->current = 0; + } + } + if (ctx) { TRACE("Switching to D3D context %p, GL context %p, device context %p.\n", ctx, ctx->glCtx, ctx->hdc); @@ -591,6 +658,7 @@ BOOL context_set_current(struct WineD3DContext *ctx) ERR("Failed to make GL context %p current on device context %p.\n", ctx->glCtx, ctx->hdc); return FALSE; } + ctx->current = 1; } else { @@ -1205,7 +1273,6 @@ static void RemoveContextFromArray(IWineD3DDeviceImpl *This, WineD3DContext *con { if (This->contexts[i] == context) { - HeapFree(GetProcessHeap(), 0, context); found = TRUE; break; } @@ -1251,65 +1318,40 @@ static void RemoveContextFromArray(IWineD3DDeviceImpl *This, WineD3DContext *con * context: Context to destroy * *****************************************************************************/ -void DestroyContext(IWineD3DDeviceImpl *This, WineD3DContext *context) { - const struct wined3d_gl_info *gl_info = context->gl_info; - struct fbo_entry *entry, *entry2; - BOOL has_glctx; +void DestroyContext(IWineD3DDeviceImpl *This, WineD3DContext *context) +{ + BOOL destroy; TRACE("Destroying ctx %p\n", context); - /* The correct GL context needs to be active to cleanup the GL resources below */ - has_glctx = pwglMakeCurrent(context->hdc, context->glCtx); - context_set_last_device(NULL); - - if (!has_glctx) WARN("Failed to activate context. Window already destroyed?\n"); + if (context->tid == GetCurrentThreadId() || !context->current) + { + context_destroy_gl_resources(context); + destroy = TRUE; - ENTER_GL(); + context_set_last_device(NULL); - LIST_FOR_EACH_ENTRY_SAFE(entry, entry2, &context->fbo_list, struct fbo_entry, entry) { - if (!has_glctx) entry->id = 0; - context_destroy_fbo_entry(context, entry); - } - if (has_glctx) - { - if (context->src_fbo) - { - TRACE("Destroy src FBO %d\n", context->src_fbo); - context_destroy_fbo(context, &context->src_fbo); - } - if (context->dst_fbo) + if (This->activeContext == context) { - TRACE("Destroy dst FBO %d\n", context->dst_fbo); - context_destroy_fbo(context, &context->dst_fbo); + This->activeContext = NULL; + TRACE("Destroying the active context.\n"); } - if (context->dummy_arbfp_prog) + + if (!context_set_current(NULL)) { - GL_EXTCALL(glDeleteProgramsARB(1, &context->dummy_arbfp_prog)); + ERR("Failed to clear current D3D context.\n"); } } - - LEAVE_GL(); - - if (This->activeContext == context) - { - This->activeContext = NULL; - TRACE("Destroying the active context.\n"); - } - - if (!context_set_current(NULL)) + else { - ERR("Failed to clear current D3D context.\n"); + context->destroyed = 1; + destroy = FALSE; } - if(context->isPBuffer) { - GL_EXTCALL(wglReleasePbufferDCARB(context->pbuffer, context->hdc)); - GL_EXTCALL(wglDestroyPbufferARB(context->pbuffer)); - } else ReleaseDC(context->win_handle, context->hdc); - pwglDeleteContext(context->glCtx); - HeapFree(GetProcessHeap(), 0, context->vshader_const_dirty); HeapFree(GetProcessHeap(), 0, context->pshader_const_dirty); RemoveContextFromArray(This, context); + if (destroy) HeapFree(GetProcessHeap(), 0, context); } /* GL locking is done by the caller */ diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h index 63c71d4..dd170cb 100644 --- a/dlls/wined3d/wined3d_private.h +++ b/dlls/wined3d/wined3d_private.h @@ -1219,7 +1219,9 @@ struct WineD3DContext WORD isPBuffer : 1; WORD fog_enabled : 1; WORD num_untracked_materials : 2; /* Max value 2 */ - WORD padding : 3; + WORD current : 1; + WORD destroyed : 1; + WORD padding : 1; BYTE texShaderBumpMap; /* MAX_TEXTURES, 8 */ BYTE lastWasPow2Texture; /* MAX_TEXTURES, 8 */ DWORD numbered_array_mask;
1
0
0
0
Henri Verbeet : wined3d: Keep track of a thread's wined3d context.
by Alexandre Julliard
22 Jul '09
22 Jul '09
Module: wine Branch: master Commit: 1a43030664e796da843316d12d3bf3300ab66c0f URL:
http://source.winehq.org/git/wine.git/?a=commit;h=1a43030664e796da843316d12…
Author: Henri Verbeet <hverbeet(a)codeweavers.com> Date: Wed Jul 22 14:03:36 2009 +0200 wined3d: Keep track of a thread's wined3d context. --- dlls/wined3d/context.c | 75 ++++++++++++++++++++++++++++----------- dlls/wined3d/directx.c | 5 +++ dlls/wined3d/wined3d_main.c | 32 +++++++++++++++++ dlls/wined3d/wined3d_private.h | 4 ++ 4 files changed, 95 insertions(+), 21 deletions(-) diff --git a/dlls/wined3d/context.c b/dlls/wined3d/context.c index de428cd..5e43467 100644 --- a/dlls/wined3d/context.c +++ b/dlls/wined3d/context.c @@ -35,6 +35,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(d3d); * change the opengl context. This flag allows to keep track which device is active */ static IWineD3DDeviceImpl *last_device; +static DWORD wined3d_context_tls_idx; void context_set_last_device(IWineD3DDeviceImpl *device) { @@ -557,6 +558,53 @@ void context_resource_released(IWineD3DDevice *iface, IWineD3DResource *resource } } +DWORD context_get_tls_idx(void) +{ + return wined3d_context_tls_idx; +} + +void context_set_tls_idx(DWORD idx) +{ + wined3d_context_tls_idx = idx; +} + +struct WineD3DContext *context_get_current(void) +{ + return TlsGetValue(wined3d_context_tls_idx); +} + +BOOL context_set_current(struct WineD3DContext *ctx) +{ + struct WineD3DContext *old = context_get_current(); + + if (old == ctx) + { + TRACE("Already using D3D context %p.\n", ctx); + return TRUE; + } + + if (ctx) + { + TRACE("Switching to D3D context %p, GL context %p, device context %p.\n", ctx, ctx->glCtx, ctx->hdc); + if (!pwglMakeCurrent(ctx->hdc, ctx->glCtx)) + { + ERR("Failed to make GL context %p current on device context %p.\n", ctx->glCtx, ctx->hdc); + return FALSE; + } + } + else + { + TRACE("Clearing current D3D context.\n"); + if (!pwglMakeCurrent(NULL, NULL)) + { + ERR("Failed to clear current GL context.\n"); + return FALSE; + } + } + + return TlsSetValue(wined3d_context_tls_idx, ctx); +} + /***************************************************************************** * Context_MarkStateDirty * @@ -1038,7 +1086,8 @@ WineD3DContext *CreateContext(IWineD3DDeviceImpl *This, IWineD3DSurfaceImpl *tar list_init(&ret->fbo_list); /* Set up the context defaults */ - if(pwglMakeCurrent(hdc, ctx) == FALSE) { + if (!context_set_current(ret)) + { ERR("Cannot activate context to set up defaults\n"); goto out; } @@ -1247,10 +1296,9 @@ void DestroyContext(IWineD3DDeviceImpl *This, WineD3DContext *context) { TRACE("Destroying the active context.\n"); } - /* Cleanup the GL context */ - if (!pwglMakeCurrent(NULL, NULL)) + if (!context_set_current(NULL)) { - ERR("Failed to disable GL context.\n"); + ERR("Failed to clear current D3D context.\n"); } if(context->isPBuffer) { @@ -1779,24 +1827,9 @@ void ActivateContext(IWineD3DDeviceImpl *This, IWineD3DSurface *target, ContextU /* Activate the opengl context */ if(last_device != This || context != This->activeContext) { - BOOL ret; - - /* Prevent an unneeded context switch as those are expensive */ - if(context->glCtx && (context->glCtx == pwglGetCurrentContext())) { - TRACE("Already using gl context %p\n", context->glCtx); - } - else { - TRACE("Switching gl ctx to %p, hdc=%p ctx=%p\n", context, context->hdc, context->glCtx); + if (!context_set_current(context)) ERR("Failed to activate the new context.\n"); + else This->frag_pipe->enable_extension((IWineD3DDevice *)This, !context->last_was_blit); - ret = pwglMakeCurrent(context->hdc, context->glCtx); - if(ret == FALSE) { - ERR("Failed to activate the new context\n"); - } else if(!context->last_was_blit) { - This->frag_pipe->enable_extension((IWineD3DDevice *) This, TRUE); - } else { - This->frag_pipe->enable_extension((IWineD3DDevice *) This, FALSE); - } - } if(This->activeContext->vshader_const_dirty) { memset(This->activeContext->vshader_const_dirty, 1, sizeof(*This->activeContext->vshader_const_dirty) * GL_LIMITS(vshader_constantsF)); diff --git a/dlls/wined3d/directx.c b/dlls/wined3d/directx.c index 3036bfc..9daffaa 100644 --- a/dlls/wined3d/directx.c +++ b/dlls/wined3d/directx.c @@ -274,6 +274,11 @@ static BOOL WineD3D_CreateFakeGLContext(struct wined3d_fake_gl_ctx *ctx) } /* Make it the current GL context. */ + if (!context_set_current(NULL)) + { + ERR_(d3d_caps)("Failed to clear current D3D context.\n"); + } + if (!pwglMakeCurrent(ctx->dc, ctx->gl_ctx)) { ERR_(d3d_caps)("Failed to make fake GL context current.\n"); diff --git a/dlls/wined3d/wined3d_main.c b/dlls/wined3d/wined3d_main.c index f996aec..045eea0 100644 --- a/dlls/wined3d/wined3d_main.c +++ b/dlls/wined3d/wined3d_main.c @@ -97,6 +97,7 @@ static void CDECL wined3d_do_nothing(void) static BOOL wined3d_init(HINSTANCE hInstDLL) { + DWORD wined3d_context_tls_idx; HMODULE mod; char buffer[MAX_PATH+10]; DWORD size = sizeof(buffer); @@ -105,6 +106,15 @@ static BOOL wined3d_init(HINSTANCE hInstDLL) DWORD len, tmpvalue; WNDCLASSA wc; + wined3d_context_tls_idx = TlsAlloc(); + if (wined3d_context_tls_idx == TLS_OUT_OF_INDEXES) + { + DWORD err = GetLastError(); + ERR("Failed to allocate context TLS index, err %#x.\n", err); + return FALSE; + } + context_set_tls_idx(wined3d_context_tls_idx); + /* We need our own window class for a fake window which we use to retrieve GL capabilities */ /* We might need CS_OWNDC in the future if we notice strange things on Windows. * Various articles/posts about OpenGL problems on Windows recommend this. */ @@ -122,6 +132,11 @@ static BOOL wined3d_init(HINSTANCE hInstDLL) if (!RegisterClassA(&wc)) { ERR("Failed to register window class 'WineD3D_OpenGL'!\n"); + if (!TlsFree(wined3d_context_tls_idx)) + { + DWORD err = GetLastError(); + ERR("Failed to free context TLS index, err %#x.\n", err); + } return FALSE; } @@ -322,6 +337,14 @@ static BOOL wined3d_init(HINSTANCE hInstDLL) static BOOL wined3d_destroy(HINSTANCE hInstDLL) { + DWORD wined3d_context_tls_idx = context_get_tls_idx(); + + if (!TlsFree(wined3d_context_tls_idx)) + { + DWORD err = GetLastError(); + ERR("Failed to free context TLS index, err %#x.\n", err); + } + HeapFree(GetProcessHeap(), 0, wined3d_settings.logo); UnregisterClassA(WINED3D_OPENGL_WINDOW_CLASS_NAME, hInstDLL); @@ -341,6 +364,15 @@ BOOL WINAPI DllMain(HINSTANCE hInstDLL, DWORD fdwReason, LPVOID lpv) case DLL_PROCESS_DETACH: return wined3d_destroy(hInstDLL); + case DLL_THREAD_DETACH: + { + if (!context_set_current(NULL)) + { + ERR("Failed to clear current context.\n"); + } + return TRUE; + } + default: return TRUE; } diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h index b7085c5..63c71d4 100644 --- a/dlls/wined3d/wined3d_private.h +++ b/dlls/wined3d/wined3d_private.h @@ -1271,6 +1271,10 @@ void context_attach_depth_stencil_fbo(struct WineD3DContext *context, void context_attach_surface_fbo(const struct WineD3DContext *context, GLenum fbo_target, DWORD idx, IWineD3DSurface *surface); void context_set_last_device(IWineD3DDeviceImpl *device); +struct WineD3DContext *context_get_current(void); +DWORD context_get_tls_idx(void); +BOOL context_set_current(struct WineD3DContext *ctx); +void context_set_tls_idx(DWORD idx); void delete_opengl_contexts(IWineD3DDevice *iface, IWineD3DSwapChain *swapchain); HRESULT create_primary_opengl_context(IWineD3DDevice *iface, IWineD3DSwapChain *swapchain);
1
0
0
0
Piotr Caban : jscript: Throw TypeErrors when _value functions are used as a function.
by Alexandre Julliard
22 Jul '09
22 Jul '09
Module: wine Branch: master Commit: 8dd1d9b92e45ae4d9a4e783251ae4e76d7c86210 URL:
http://source.winehq.org/git/wine.git/?a=commit;h=8dd1d9b92e45ae4d9a4e78325…
Author: Piotr Caban <piotr.caban(a)gmail.com> Date: Wed Jul 22 13:02:30 2009 +0200 jscript: Throw TypeErrors when _value functions are used as a function. --- dlls/jscript/array.c | 2 ++ dlls/jscript/bool.c | 14 ++++++++++++-- dlls/jscript/date.c | 13 +++++++++++-- dlls/jscript/error.c | 13 +++++++++++-- dlls/jscript/number.c | 2 ++ dlls/jscript/object.c | 2 ++ dlls/jscript/regexp.c | 13 +++++++++++-- dlls/jscript/string.c | 2 ++ dlls/jscript/tests/api.js | 2 ++ 9 files changed, 55 insertions(+), 8 deletions(-) diff --git a/dlls/jscript/array.c b/dlls/jscript/array.c index 0af6df1..b2bd5b2 100644 --- a/dlls/jscript/array.c +++ b/dlls/jscript/array.c @@ -770,6 +770,8 @@ static HRESULT Array_value(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS TRACE("\n"); switch(flags) { + case INVOKE_FUNC: + return throw_type_error(dispex->ctx, ei, IDS_NOT_FUNC, NULL); case INVOKE_PROPERTYGET: return array_join(dispex, lcid, ((ArrayInstance*)dispex)->length, default_separatorW, retv, ei, sp); default: diff --git a/dlls/jscript/bool.c b/dlls/jscript/bool.c index 2b5152a..bfacebf 100644 --- a/dlls/jscript/bool.c +++ b/dlls/jscript/bool.c @@ -116,8 +116,18 @@ static HRESULT Bool_isPrototypeOf(DispatchEx *dispex, LCID lcid, WORD flags, DIS static HRESULT Bool_value(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp) { - FIXME("\n"); - return E_NOTIMPL; + TRACE("\n"); + + switch(flags) { + case INVOKE_FUNC: + return throw_type_error(dispex->ctx, ei, IDS_NOT_FUNC, NULL); + default: + FIXME("unimplemented flags %x\n", flags); + return E_NOTIMPL; + } + + return S_OK; + } static const builtin_prop_t Bool_props[] = { diff --git a/dlls/jscript/date.c b/dlls/jscript/date.c index b33be0b..5085f21 100644 --- a/dlls/jscript/date.c +++ b/dlls/jscript/date.c @@ -2040,8 +2040,17 @@ static HRESULT Date_getYear(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAM static HRESULT Date_value(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller) { - FIXME("\n"); - return E_NOTIMPL; + TRACE("\n"); + + switch(flags) { + case INVOKE_FUNC: + return throw_type_error(dispex->ctx, ei, IDS_NOT_FUNC, NULL); + default: + FIXME("unimplemented flags %x\n", flags); + return E_NOTIMPL; + } + + return S_OK; } static const builtin_prop_t Date_props[] = { diff --git a/dlls/jscript/error.c b/dlls/jscript/error.c index 49bdb07..fb37fba 100644 --- a/dlls/jscript/error.c +++ b/dlls/jscript/error.c @@ -141,8 +141,17 @@ static HRESULT Error_isPrototypeOf(DispatchEx *dispex, LCID lcid, WORD flags, static HRESULT Error_value(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp) { - FIXME("\n"); - return E_NOTIMPL; + TRACE("\n"); + + switch(flags) { + case INVOKE_FUNC: + return throw_type_error(dispex->ctx, ei, IDS_NOT_FUNC, NULL); + default: + FIXME("unimplemented flags %x\n", flags); + return E_NOTIMPL; + } + + return S_OK; } static void Error_destructor(DispatchEx *dispex) diff --git a/dlls/jscript/number.c b/dlls/jscript/number.c index 28049a9..0aeeab6 100644 --- a/dlls/jscript/number.c +++ b/dlls/jscript/number.c @@ -241,6 +241,8 @@ static HRESULT Number_value(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAM NumberInstance *number = (NumberInstance*)dispex; switch(flags) { + case INVOKE_FUNC: + return throw_type_error(dispex->ctx, ei, IDS_NOT_FUNC, NULL); case DISPATCH_PROPERTYGET: *retv = number->num; break; diff --git a/dlls/jscript/object.c b/dlls/jscript/object.c index 8e0aad6..737230a 100644 --- a/dlls/jscript/object.c +++ b/dlls/jscript/object.c @@ -120,6 +120,8 @@ static HRESULT Object_value(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAM TRACE("\n"); switch(flags) { + case INVOKE_FUNC: + return throw_type_error(dispex->ctx, ei, IDS_NOT_FUNC, NULL); case DISPATCH_PROPERTYGET: V_VT(retv) = VT_BSTR; V_BSTR(retv) = SysAllocString(default_valueW); diff --git a/dlls/jscript/regexp.c b/dlls/jscript/regexp.c index 9722919..a4d640e 100644 --- a/dlls/jscript/regexp.c +++ b/dlls/jscript/regexp.c @@ -3516,8 +3516,17 @@ static HRESULT RegExp_test(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS static HRESULT RegExp_value(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp) { - FIXME("\n"); - return E_NOTIMPL; + TRACE("\n"); + + switch(flags) { + case INVOKE_FUNC: + return throw_type_error(dispex->ctx, ei, IDS_NOT_FUNC, NULL); + default: + FIXME("unimplemented flags %x\n", flags); + return E_NOTIMPL; + } + + return S_OK; } static void RegExp_destructor(DispatchEx *dispex) diff --git a/dlls/jscript/string.c b/dlls/jscript/string.c index a0ca268..6695bf8 100644 --- a/dlls/jscript/string.c +++ b/dlls/jscript/string.c @@ -1485,6 +1485,8 @@ static HRESULT String_value(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAM TRACE("\n"); switch(flags) { + case INVOKE_FUNC: + return throw_type_error(dispex->ctx, ei, IDS_NOT_FUNC, NULL); case DISPATCH_PROPERTYGET: { BSTR str = SysAllocString(This->str); if(!str) diff --git a/dlls/jscript/tests/api.js b/dlls/jscript/tests/api.js index 2ed8bda..7428413 100644 --- a/dlls/jscript/tests/api.js +++ b/dlls/jscript/tests/api.js @@ -1315,5 +1315,7 @@ exception_test(function() {arr.toString = Number.prototype.toString; arr.toStrin exception_test(function() {(new Number(3)).toString(1);}, "TypeError", -2146828283); exception_test(function() {not_existing_variable.something();}, "TypeError", -2146823279); exception_test(function() {arr.toString = Function.prototype.toString; arr.toString();}, "TypeError", -2146823286); +exception_test(function() {date();}, "TypeError", -2146823286); +exception_test(function() {arr();}, "TypeError", -2146823286); reportSuccess();
1
0
0
0
Piotr Caban : jscript: Throw error in to_primitive function.
by Alexandre Julliard
22 Jul '09
22 Jul '09
Module: wine Branch: master Commit: 412e0af26f05aaad53731fecbd9045e696bb6452 URL:
http://source.winehq.org/git/wine.git/?a=commit;h=412e0af26f05aaad53731fecb…
Author: Piotr Caban <piotr.caban(a)gmail.com> Date: Wed Jul 22 13:02:24 2009 +0200 jscript: Throw error in to_primitive function. --- dlls/jscript/jscript_En.rc | 1 + dlls/jscript/jsutils.c | 8 ++++---- dlls/jscript/resource.h | 1 + 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/dlls/jscript/jscript_En.rc b/dlls/jscript/jscript_En.rc index 5e53f6d..df8ee2f 100644 --- a/dlls/jscript/jscript_En.rc +++ b/dlls/jscript/jscript_En.rc @@ -22,6 +22,7 @@ LANGUAGE LANG_ENGLISH, SUBLANG_DEFAULT STRINGTABLE DISCARDABLE { + IDS_TO_PRIMITIVE "Error converting object to primitive type" IDS_INVALID_CALL_ARG "Invalid procedure call or argument" IDS_NO_PROPERTY "Object doesn't support this property or method" IDS_ARG_NOT_OPT "Argument not optional" diff --git a/dlls/jscript/jsutils.c b/dlls/jscript/jsutils.c index d5ffa7f..10d4f51 100644 --- a/dlls/jscript/jsutils.c +++ b/dlls/jscript/jsutils.c @@ -211,7 +211,7 @@ HRESULT to_primitive(script_ctx_t *ctx, VARIANT *v, jsexcept_t *ei, VARIANT *ret if(SUCCEEDED(hres)) { hres = jsdisp_call(jsdisp, id, ctx->lcid, DISPATCH_METHOD, &dp, ret, ei, NULL /*FIXME*/); if(FAILED(hres)) { - FIXME("throw TypeError\n"); + WARN("call error - forwarding exception\n"); jsdisp_release(jsdisp); return hres; } @@ -227,7 +227,7 @@ HRESULT to_primitive(script_ctx_t *ctx, VARIANT *v, jsexcept_t *ei, VARIANT *ret if(SUCCEEDED(hres)) { hres = jsdisp_call(jsdisp, id, ctx->lcid, DISPATCH_METHOD, &dp, ret, ei, NULL /*FIXME*/); if(FAILED(hres)) { - FIXME("throw TypeError\n"); + WARN("call error - forwarding exception\n"); jsdisp_release(jsdisp); return hres; } @@ -241,8 +241,8 @@ HRESULT to_primitive(script_ctx_t *ctx, VARIANT *v, jsexcept_t *ei, VARIANT *ret jsdisp_release(jsdisp); - FIXME("throw TypeError\n"); - return E_FAIL; + WARN("failed\n"); + return throw_type_error(ctx, ei, IDS_TO_PRIMITIVE, NULL); } default: FIXME("Unimplemented for vt %d\n", V_VT(v)); diff --git a/dlls/jscript/resource.h b/dlls/jscript/resource.h index 91d14d3..0f5af9b 100644 --- a/dlls/jscript/resource.h +++ b/dlls/jscript/resource.h @@ -18,6 +18,7 @@ #include <windef.h> +#define IDS_TO_PRIMITIVE 0x0001 #define IDS_INVALID_CALL_ARG 0x0005 #define IDS_NO_PROPERTY 0x01B6 #define IDS_ARG_NOT_OPT 0x01c1
1
0
0
0
Piotr Caban : jscript: Throw TypeError in Function_toString.
by Alexandre Julliard
22 Jul '09
22 Jul '09
Module: wine Branch: master Commit: fba4e3767ff2b15aad2cf70e19683464c5239ef4 URL:
http://source.winehq.org/git/wine.git/?a=commit;h=fba4e3767ff2b15aad2cf70e1…
Author: Piotr Caban <piotr.caban(a)gmail.com> Date: Wed Jul 22 13:02:19 2009 +0200 jscript: Throw TypeError in Function_toString. --- dlls/jscript/function.c | 6 ++---- dlls/jscript/jscript_En.rc | 1 + dlls/jscript/resource.h | 1 + dlls/jscript/tests/api.js | 1 + 4 files changed, 5 insertions(+), 4 deletions(-) diff --git a/dlls/jscript/function.c b/dlls/jscript/function.c index dac8d3e..6ac668c 100644 --- a/dlls/jscript/function.c +++ b/dlls/jscript/function.c @@ -272,10 +272,8 @@ static HRESULT Function_toString(DispatchEx *dispex, LCID lcid, WORD flags, DISP TRACE("\n"); - if(!is_class(dispex, JSCLASS_FUNCTION)) { - FIXME("throw TypeError\n"); - return E_FAIL; - } + if(!is_class(dispex, JSCLASS_FUNCTION)) + return throw_type_error(dispex->ctx, ei, IDS_NOT_FUNC, NULL); function = (FunctionInstance*)dispex; diff --git a/dlls/jscript/jscript_En.rc b/dlls/jscript/jscript_En.rc index e0825e9..5e53f6d 100644 --- a/dlls/jscript/jscript_En.rc +++ b/dlls/jscript/jscript_En.rc @@ -25,6 +25,7 @@ STRINGTABLE DISCARDABLE IDS_INVALID_CALL_ARG "Invalid procedure call or argument" IDS_NO_PROPERTY "Object doesn't support this property or method" IDS_ARG_NOT_OPT "Argument not optional" + IDS_NOT_FUNC "Function expected" IDS_NOT_DATE "'[object]' is not a date object" IDS_NOT_NUM "Number expected" IDS_UNDEFINED "'|' is undefined" diff --git a/dlls/jscript/resource.h b/dlls/jscript/resource.h index 3aa014e..91d14d3 100644 --- a/dlls/jscript/resource.h +++ b/dlls/jscript/resource.h @@ -21,6 +21,7 @@ #define IDS_INVALID_CALL_ARG 0x0005 #define IDS_NO_PROPERTY 0x01B6 #define IDS_ARG_NOT_OPT 0x01c1 +#define IDS_NOT_FUNC 0x138A #define IDS_NOT_DATE 0x138E #define IDS_NOT_NUM 0x1389 #define IDS_UNDEFINED 0x1391 diff --git a/dlls/jscript/tests/api.js b/dlls/jscript/tests/api.js index b663dad..2ed8bda 100644 --- a/dlls/jscript/tests/api.js +++ b/dlls/jscript/tests/api.js @@ -1314,5 +1314,6 @@ exception_test(function() {arr.test();}, "TypeError", -2146827850); exception_test(function() {arr.toString = Number.prototype.toString; arr.toString();}, "TypeError", -2146823287); exception_test(function() {(new Number(3)).toString(1);}, "TypeError", -2146828283); exception_test(function() {not_existing_variable.something();}, "TypeError", -2146823279); +exception_test(function() {arr.toString = Function.prototype.toString; arr.toString();}, "TypeError", -2146823286); reportSuccess();
1
0
0
0
Piotr Caban : jscript: Throw 'undefined object' error.
by Alexandre Julliard
22 Jul '09
22 Jul '09
Module: wine Branch: master Commit: d8e841ca505ac53ace3374a59204c73d04b8419c URL:
http://source.winehq.org/git/wine.git/?a=commit;h=d8e841ca505ac53ace3374a59…
Author: Piotr Caban <piotr.caban(a)gmail.com> Date: Wed Jul 22 13:01:59 2009 +0200 jscript: Throw 'undefined object' error. --- dlls/jscript/engine.c | 9 ++++----- dlls/jscript/error.c | 6 +++--- dlls/jscript/jscript_En.rc | 1 + dlls/jscript/resource.h | 1 + dlls/jscript/tests/api.js | 1 + 5 files changed, 10 insertions(+), 8 deletions(-) diff --git a/dlls/jscript/engine.c b/dlls/jscript/engine.c index 10004a7..c79c48f 100644 --- a/dlls/jscript/engine.c +++ b/dlls/jscript/engine.c @@ -433,7 +433,7 @@ HRESULT exec_source(exec_ctx_t *ctx, parser_ctx_t *parser, source_elements_t *so } /* ECMA-262 3rd Edition 10.1.4 */ -static HRESULT identifier_eval(exec_ctx_t *ctx, BSTR identifier, DWORD flags, exprval_t *ret) +static HRESULT identifier_eval(exec_ctx_t *ctx, BSTR identifier, DWORD flags, jsexcept_t *ei, exprval_t *ret) { scope_chain_t *scope; named_item_t *item; @@ -518,8 +518,7 @@ static HRESULT identifier_eval(exec_ctx_t *ctx, BSTR identifier, DWORD flags, ex return S_OK; } - WARN("Could not find identifier %s\n", debugstr_w(identifier)); - return E_FAIL; + return throw_type_error(ctx->var_disp->ctx, ei, IDS_UNDEFINED, identifier); } /* ECMA-262 3rd Edition 12.1 */ @@ -855,7 +854,7 @@ HRESULT forin_statement_eval(exec_ctx_t *ctx, statement_t *_stat, return_type_t TRACE("iter %s\n", debugstr_w(str)); if(stat->variable) - hres = identifier_eval(ctx, identifier, 0, &exprval); + hres = identifier_eval(ctx, identifier, 0, NULL, &exprval); else hres = expr_eval(ctx, stat->expr, EXPR_NEWREF, &rt->ei, &exprval); if(SUCCEEDED(hres)) { @@ -1596,7 +1595,7 @@ HRESULT identifier_expression_eval(exec_ctx_t *ctx, expression_t *_expr, DWORD f if(!identifier) return E_OUTOFMEMORY; - hres = identifier_eval(ctx, identifier, flags, ret); + hres = identifier_eval(ctx, identifier, flags, ei, ret); SysFreeString(identifier); return hres; diff --git a/dlls/jscript/error.c b/dlls/jscript/error.c index d160dd6..49bdb07 100644 --- a/dlls/jscript/error.c +++ b/dlls/jscript/error.c @@ -415,17 +415,17 @@ static HRESULT throw_error(script_ctx_t *ctx, jsexcept_t *ei, UINT id, const WCH DispatchEx *err; HRESULT hres; - TRACE("\n"); - LoadStringW(jscript_hinstance, id, buf, sizeof(buf)/sizeof(WCHAR)); if(str) pos = strchrW(buf, '|'); if(pos) { int len = strlenW(str); - memmove(pos+len, pos+1, strlenW(pos+1)*sizeof(WCHAR)); + memmove(pos+len, pos+1, (strlenW(pos+1)+1)*sizeof(WCHAR)); memcpy(pos, str, len*sizeof(WCHAR)); } + WARN("%s\n", debugstr_w(buf)); + id |= 0x800A0000; hres = create_error(ctx, constr, &id, buf, &err); if(FAILED(hres)) diff --git a/dlls/jscript/jscript_En.rc b/dlls/jscript/jscript_En.rc index 8a0a9a9..e0825e9 100644 --- a/dlls/jscript/jscript_En.rc +++ b/dlls/jscript/jscript_En.rc @@ -27,6 +27,7 @@ STRINGTABLE DISCARDABLE IDS_ARG_NOT_OPT "Argument not optional" IDS_NOT_DATE "'[object]' is not a date object" IDS_NOT_NUM "Number expected" + IDS_UNDEFINED "'|' is undefined" IDS_NOT_BOOL "Boolean object expected" IDS_INVALID_LENGTH "Array length must be a finite positive integer" } diff --git a/dlls/jscript/resource.h b/dlls/jscript/resource.h index 8caff6a..3aa014e 100644 --- a/dlls/jscript/resource.h +++ b/dlls/jscript/resource.h @@ -23,5 +23,6 @@ #define IDS_ARG_NOT_OPT 0x01c1 #define IDS_NOT_DATE 0x138E #define IDS_NOT_NUM 0x1389 +#define IDS_UNDEFINED 0x1391 #define IDS_NOT_BOOL 0x1392 #define IDS_INVALID_LENGTH 0x13A5 diff --git a/dlls/jscript/tests/api.js b/dlls/jscript/tests/api.js index c20cd8b..b663dad 100644 --- a/dlls/jscript/tests/api.js +++ b/dlls/jscript/tests/api.js @@ -1313,5 +1313,6 @@ exception_test(function() {date.setTime();}, "TypeError", -2146827839); exception_test(function() {arr.test();}, "TypeError", -2146827850); exception_test(function() {arr.toString = Number.prototype.toString; arr.toString();}, "TypeError", -2146823287); exception_test(function() {(new Number(3)).toString(1);}, "TypeError", -2146828283); +exception_test(function() {not_existing_variable.something();}, "TypeError", -2146823279); reportSuccess();
1
0
0
0
Alexandre Julliard : ole32/tests: Avoid depending on the heap allocation order for the CoGetObjectContext test .
by Alexandre Julliard
22 Jul '09
22 Jul '09
Module: wine Branch: master Commit: d61764299932d09c375758f342d052aaf7abcae0 URL:
http://source.winehq.org/git/wine.git/?a=commit;h=d61764299932d09c375758f34…
Author: Alexandre Julliard <julliard(a)winehq.org> Date: Wed Jul 22 13:26:34 2009 +0200 ole32/tests: Avoid depending on the heap allocation order for the CoGetObjectContext test. --- dlls/ole32/tests/compobj.c | 13 ++++++++----- 1 files changed, 8 insertions(+), 5 deletions(-) diff --git a/dlls/ole32/tests/compobj.c b/dlls/ole32/tests/compobj.c index 1435984..44a2521 100644 --- a/dlls/ole32/tests/compobj.c +++ b/dlls/ole32/tests/compobj.c @@ -1351,18 +1351,18 @@ static void test_CoGetContextToken(void) refs = IUnknown_AddRef((IUnknown *)token); ok(refs == 1, "Expected 1, got %u\n", refs); - refs = IUnknown_Release((IUnknown *)token); - ok(refs == 0, "Expected 0, got %u\n", refs); - hr = pCoGetObjectContext(&IID_IObjContext, (void **)&ctx); ok(hr == S_OK, "Expected S_OK, got 0x%08x\n", hr); todo_wine ok(ctx == (IObjContext *)token, "Expected interface pointers to be the same\n"); refs = IUnknown_AddRef((IUnknown *)ctx); - ok(refs == 2, "Expected 1, got %u\n", refs); + todo_wine ok(refs == 3, "Expected 3, got %u\n", refs); refs = IUnknown_Release((IUnknown *)ctx); - ok(refs == 1, "Expected 0, got %u\n", refs); + todo_wine ok(refs == 2, "Expected 2, got %u\n", refs); + + refs = IUnknown_Release((IUnknown *)token); + todo_wine ok(refs == 1, "Expected 1, got %u\n", refs); /* CoGetContextToken does not add a reference */ token = 0; @@ -1377,6 +1377,9 @@ static void test_CoGetContextToken(void) refs = IUnknown_Release((IUnknown *)ctx); ok(refs == 1, "Expected 0, got %u\n", refs); + refs = IUnknown_Release((IUnknown *)ctx); + ok(refs == 0, "Expected 0, got %u\n", refs); + CoUninitialize(); }
1
0
0
0
Marcus Meissner : winhttp: Check for NULL return from heap_alloc (Coverity) .
by Alexandre Julliard
22 Jul '09
22 Jul '09
Module: wine Branch: master Commit: ee59879da046898c18fcd3a9eaa5cafb3052b607 URL:
http://source.winehq.org/git/wine.git/?a=commit;h=ee59879da046898c18fcd3a9e…
Author: Marcus Meissner <marcus(a)jet.franken.de> Date: Wed Jul 22 09:59:31 2009 +0200 winhttp: Check for NULL return from heap_alloc (Coverity). --- dlls/winhttp/request.c | 3 +++ 1 files changed, 3 insertions(+), 0 deletions(-) diff --git a/dlls/winhttp/request.c b/dlls/winhttp/request.c index 344bb14..83d6117 100644 --- a/dlls/winhttp/request.c +++ b/dlls/winhttp/request.c @@ -765,6 +765,7 @@ static LPWSTR concatenate_string_list( LPCWSTR *list, int len ) len++; str = heap_alloc( len * sizeof(WCHAR) ); + if (!str) return NULL; *str = 0; for( t = list; *t ; t++ ) @@ -789,6 +790,7 @@ static LPWSTR build_header_request_string( request_t *request, LPCWSTR verb, /* allocate space for an array of all the string pointers to be added */ len = (request->num_headers) * 4 + 10; req = heap_alloc( len * sizeof(LPCWSTR) ); + if (!req) return NULL; /* add the verb, path and HTTP version string */ n = 0; @@ -820,6 +822,7 @@ static LPWSTR build_header_request_string( request_t *request, LPCWSTR verb, req[n] = NULL; requestString = concatenate_string_list( req, 4 ); heap_free( req ); + if (!requestString) return NULL; /* * Set (header) termination string for request
1
0
0
0
Paul Vriens : winhttp/tests: Fix a test failure on some W2K/XP systems.
by Alexandre Julliard
22 Jul '09
22 Jul '09
Module: wine Branch: master Commit: 47535030cc999075640562809bdda389798110cd URL:
http://source.winehq.org/git/wine.git/?a=commit;h=47535030cc999075640562809…
Author: Paul Vriens <Paul.Vriens.Wine(a)gmail.com> Date: Wed Jul 22 12:06:41 2009 +0200 winhttp/tests: Fix a test failure on some W2K/XP systems. --- dlls/winhttp/tests/winhttp.c | 3 ++- 1 files changed, 2 insertions(+), 1 deletions(-) diff --git a/dlls/winhttp/tests/winhttp.c b/dlls/winhttp/tests/winhttp.c index 76e08e0..67ac504 100644 --- a/dlls/winhttp/tests/winhttp.c +++ b/dlls/winhttp/tests/winhttp.c @@ -942,7 +942,8 @@ static void test_set_default_proxy_config(void) info.lpszProxy = wideString; SetLastError(0xdeadbeef); ret = WinHttpSetDefaultProxyConfiguration(&info); - ok(!ret && GetLastError() == ERROR_INVALID_PARAMETER, + ok((!ret && GetLastError() == ERROR_INVALID_PARAMETER) || + broken(ret), /* Earlier winhttp versions on W2K/XP */ "expected ERROR_INVALID_PARAMETER, got %d\n", GetLastError()); info.lpszProxy = normalString;
1
0
0
0
Vladimir Pankratov : winecfg: Convert the Russian resources to UTF-8.
by Alexandre Julliard
22 Jul '09
22 Jul '09
Module: wine Branch: master Commit: 43f36486e44998952fd92f71443fe0723a0bc715 URL:
http://source.winehq.org/git/wine.git/?a=commit;h=43f36486e44998952fd92f714…
Author: Vladimir Pankratov <scriptkid(a)mail.ru> Date: Wed Jul 22 15:33:41 2009 +0500 winecfg: Convert the Russian resources to UTF-8. --- programs/winecfg/Ru.rc | 333 ++++++++++++++++++++++++------------------------ 1 files changed, 168 insertions(+), 165 deletions(-) Diff:
http://source.winehq.org/git/wine.git/?a=commitdiff;h=43f36486e44998952fd92…
1
0
0
0
← Newer
1
...
15
16
17
18
19
20
21
...
107
Older →
Jump to page:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
Results per page:
10
25
50
100
200