widl: Create an explicit structure for the function frame of all generated functions.
Store _StubMsg in the frame structure since it's needed for exception handling.
This commit is contained in:
parent
af78a7bfe4
commit
1218aff94d
|
@ -115,6 +115,7 @@ static void write_function_stubs(type_t *iface, unsigned int *proc_offset)
|
|||
/* write the functions body */
|
||||
fprintf(client, "{\n");
|
||||
indent++;
|
||||
print_client( "struct __client_frame __f, * const __frame = &__f;\n" );
|
||||
|
||||
/* declare return value '_RetVal' */
|
||||
if (!is_void(get_func_return_type(func)))
|
||||
|
@ -128,7 +129,6 @@ static void write_function_stubs(type_t *iface, unsigned int *proc_offset)
|
|||
print_client("RPC_BINDING_HANDLE _Handle = 0;\n");
|
||||
|
||||
print_client("RPC_MESSAGE _RpcMessage;\n");
|
||||
print_client("MIDL_STUB_MESSAGE _StubMsg;\n");
|
||||
if (!is_void(get_func_return_type(func)) && decl_indirect(get_func_return_type(func)))
|
||||
{
|
||||
print_client("void *_p_%s = &%s;\n",
|
||||
|
@ -149,7 +149,7 @@ static void write_function_stubs(type_t *iface, unsigned int *proc_offset)
|
|||
print_client("NdrClientInitializeNew(\n");
|
||||
indent++;
|
||||
print_client("(PRPC_MESSAGE)&_RpcMessage,\n");
|
||||
print_client("(PMIDL_STUB_MESSAGE)&_StubMsg,\n");
|
||||
print_client("(PMIDL_STUB_MESSAGE)&__frame->_StubMsg,\n");
|
||||
print_client("(PMIDL_STUB_DESC)&%s_StubDesc,\n", iface->name);
|
||||
print_client("%d);\n", method_count);
|
||||
indent--;
|
||||
|
@ -207,8 +207,8 @@ static void write_function_stubs(type_t *iface, unsigned int *proc_offset)
|
|||
|
||||
print_client("NdrGetBuffer(\n");
|
||||
indent++;
|
||||
print_client("(PMIDL_STUB_MESSAGE)&_StubMsg,\n");
|
||||
print_client("_StubMsg.BufferLength,\n");
|
||||
print_client("(PMIDL_STUB_MESSAGE)&__frame->_StubMsg,\n");
|
||||
print_client("__frame->_StubMsg.BufferLength,\n");
|
||||
if (implicit_handle || explicit_handle_var || explicit_generic_handle_var || context_handle_var)
|
||||
print_client("_Handle);\n");
|
||||
else
|
||||
|
@ -221,16 +221,16 @@ static void write_function_stubs(type_t *iface, unsigned int *proc_offset)
|
|||
|
||||
/* send/receive message */
|
||||
/* print_client("NdrNsSendReceive(\n"); */
|
||||
/* print_client("(unsigned char *)_StubMsg.Buffer,\n"); */
|
||||
/* print_client("(unsigned char *)__frame->_StubMsg.Buffer,\n"); */
|
||||
/* print_client("(RPC_BINDING_HANDLE *) &%s__MIDL_AutoBindHandle);\n", iface->name); */
|
||||
print_client("NdrSendReceive(\n");
|
||||
indent++;
|
||||
print_client("(PMIDL_STUB_MESSAGE)&_StubMsg,\n");
|
||||
print_client("(unsigned char *)_StubMsg.Buffer);\n\n");
|
||||
print_client("(PMIDL_STUB_MESSAGE)&__frame->_StubMsg,\n");
|
||||
print_client("(unsigned char *)__frame->_StubMsg.Buffer);\n\n");
|
||||
indent--;
|
||||
|
||||
print_client("_StubMsg.BufferStart = (unsigned char *)_RpcMessage.Buffer;\n");
|
||||
print_client("_StubMsg.BufferEnd = _StubMsg.BufferStart + _RpcMessage.BufferLength;\n");
|
||||
print_client("__frame->_StubMsg.BufferStart = (unsigned char *)_RpcMessage.Buffer;\n");
|
||||
print_client("__frame->_StubMsg.BufferEnd = __frame->_StubMsg.BufferStart + _RpcMessage.BufferLength;\n");
|
||||
|
||||
if (has_out_arg_or_return(func))
|
||||
{
|
||||
|
@ -240,7 +240,7 @@ static void write_function_stubs(type_t *iface, unsigned int *proc_offset)
|
|||
indent++;
|
||||
print_client("NdrConvert(\n");
|
||||
indent++;
|
||||
print_client("(PMIDL_STUB_MESSAGE)&_StubMsg,\n");
|
||||
print_client("(PMIDL_STUB_MESSAGE)&__frame->_StubMsg,\n");
|
||||
print_client("(PFORMAT_STRING)&__MIDL_ProcFormatString.Format[%u]);\n", *proc_offset);
|
||||
indent -= 2;
|
||||
}
|
||||
|
@ -282,7 +282,7 @@ static void write_function_stubs(type_t *iface, unsigned int *proc_offset)
|
|||
if (has_full_pointer)
|
||||
write_full_pointer_free(client, indent, func);
|
||||
|
||||
print_client("NdrFreeBuffer((PMIDL_STUB_MESSAGE)&_StubMsg);\n");
|
||||
print_client("NdrFreeBuffer((PMIDL_STUB_MESSAGE)&__frame->_StubMsg);\n");
|
||||
|
||||
if (!implicit_handle && explicit_generic_handle_var)
|
||||
{
|
||||
|
@ -434,7 +434,12 @@ static void init_client(void)
|
|||
print_client("#endif\n");
|
||||
fprintf(client, "\n");
|
||||
print_client("#include \"%s\"\n", header_name);
|
||||
fprintf(client, "\n");
|
||||
print_client( "\n");
|
||||
print_client( "struct __client_frame\n");
|
||||
print_client( "{\n");
|
||||
print_client( " MIDL_STUB_MESSAGE _StubMsg;\n");
|
||||
print_client( "};\n");
|
||||
print_client( "\n");
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -125,15 +125,15 @@ static void init_proxy(const statement_list_t *stmts)
|
|||
print_proxy( " EXCEPTION_REGISTRATION_RECORD frame;\n");
|
||||
print_proxy( " sigjmp_buf jmp;\n");
|
||||
print_proxy( " DWORD code;\n");
|
||||
print_proxy( " MIDL_STUB_MESSAGE *stub;\n");
|
||||
print_proxy( " MIDL_STUB_MESSAGE _StubMsg;\n");
|
||||
print_proxy( " void *this;\n");
|
||||
print_proxy( " int fullptr;\n");
|
||||
print_proxy( "};\n");
|
||||
print_proxy( "\n");
|
||||
print_proxy("static void __proxy_finally_handler( struct __proxy_frame *frame )\n");
|
||||
print_proxy( "{\n");
|
||||
print_proxy( " if (frame->fullptr) NdrFullPointerXlatFree( frame->stub->FullPtrXlatTables );\n");
|
||||
print_proxy( " if (frame->this) NdrProxyFreeBuffer( frame->this, frame->stub );\n" );
|
||||
print_proxy( " if (frame->fullptr) NdrFullPointerXlatFree( frame->_StubMsg.FullPtrXlatTables );\n");
|
||||
print_proxy( " if (frame->this) NdrProxyFreeBuffer( frame->this, &frame->_StubMsg );\n" );
|
||||
print_proxy( "}\n\n");
|
||||
print_proxy( "static DWORD __proxy_exception_handler( EXCEPTION_RECORD *record,\n");
|
||||
print_proxy( " EXCEPTION_REGISTRATION_RECORD *frame,\n");
|
||||
|
@ -148,7 +148,7 @@ static void init_proxy(const statement_list_t *stmts)
|
|||
print_proxy( " __proxy_finally_handler( proxy_frame );\n");
|
||||
print_proxy( " return ExceptionContinueSearch;\n");
|
||||
print_proxy( " }\n" );
|
||||
print_proxy( " if (proxy_frame->stub->dwStubPhase == PROXY_SENDRECEIVE)\n");
|
||||
print_proxy( " if (proxy_frame->_StubMsg.dwStubPhase == PROXY_SENDRECEIVE)\n");
|
||||
print_proxy( " return ExceptionContinueSearch;\n");
|
||||
print_proxy( "\n");
|
||||
print_proxy( " proxy_frame->code = record->ExceptionCode;\n");
|
||||
|
@ -159,35 +159,29 @@ static void init_proxy(const statement_list_t *stmts)
|
|||
print_proxy( "}\n");
|
||||
print_proxy( "\n");
|
||||
print_proxy( "#define RpcTryExcept \\\n");
|
||||
print_proxy( " do { \\\n");
|
||||
print_proxy( " struct __proxy_frame __proxy_frame; \\\n");
|
||||
print_proxy( " __proxy_frame.frame.Handler = __proxy_exception_handler; \\\n");
|
||||
print_proxy( " __proxy_frame.stub = &_StubMsg; \\\n");
|
||||
print_proxy( " if (!sigsetjmp( __proxy_frame.jmp, 0 )) \\\n");
|
||||
print_proxy( " __frame->frame.Handler = __proxy_exception_handler; \\\n");
|
||||
print_proxy( " if (!sigsetjmp( __frame->jmp, 0 )) \\\n");
|
||||
print_proxy( " { \\\n");
|
||||
print_proxy( " __wine_push_frame( &__proxy_frame.frame ); \\\n");
|
||||
print_proxy( " __wine_push_frame( &__frame->frame ); \\\n");
|
||||
print_proxy( " {\n");
|
||||
print_proxy( "\n");
|
||||
print_proxy( "#define RpcExcept(expr) \\\n");
|
||||
print_proxy( " } \\\n");
|
||||
print_proxy( " __wine_pop_frame( &__proxy_frame.frame ); \\\n");
|
||||
print_proxy( " __wine_pop_frame( &__frame->frame ); \\\n");
|
||||
print_proxy( " } \\\n");
|
||||
print_proxy( " else \\\n");
|
||||
print_proxy( " {\n");
|
||||
print_proxy( " else\n");
|
||||
print_proxy( "\n");
|
||||
print_proxy( "#define RpcEndExcept \\\n");
|
||||
print_proxy( " } \\\n");
|
||||
print_proxy( " } while(0);\n");
|
||||
print_proxy( "#define RpcEndExcept\n");
|
||||
print_proxy( "\n");
|
||||
print_proxy( "#define RpcExceptionCode() (__proxy_frame.code)\n");
|
||||
print_proxy( "#define RpcExceptionCode() (__frame->code)\n");
|
||||
print_proxy( "\n");
|
||||
print_proxy( "#define RpcTryFinallyProxy(ptr) \\\n");
|
||||
print_proxy(" __proxy_frame.this = This; \\\n");
|
||||
print_proxy(" __proxy_frame.fullptr = ptr;\n");
|
||||
print_proxy(" __frame->this = This; \\\n");
|
||||
print_proxy(" __frame->fullptr = ptr;\n");
|
||||
print_proxy( "\n");
|
||||
print_proxy( "#define RpcFinallyProxy \\\n");
|
||||
print_proxy(" __proxy_frame.this = 0; \\\n");
|
||||
print_proxy(" __proxy_frame.fullptr = 0;\n");
|
||||
print_proxy(" __frame->this = 0; \\\n");
|
||||
print_proxy(" __frame->fullptr = 0;\n");
|
||||
print_proxy( "\n");
|
||||
print_proxy( "#define RpcTryFinallyStub\n");
|
||||
print_proxy( "\n");
|
||||
|
@ -202,8 +196,18 @@ static void init_proxy(const statement_list_t *stmts)
|
|||
print_proxy( "#define RpcFinallyProxy RpcFinally\n");
|
||||
print_proxy( "#define RpcFinallyStub RpcFinally\n");
|
||||
print_proxy( "\n");
|
||||
print_proxy( "struct __proxy_frame\n");
|
||||
print_proxy( "{\n");
|
||||
print_proxy( " MIDL_STUB_MESSAGE _StubMsg;\n");
|
||||
print_proxy( "};\n");
|
||||
print_proxy( "\n");
|
||||
print_proxy( "#endif /* USE_COMPILER_EXCEPTIONS */\n");
|
||||
print_proxy( "\n");
|
||||
print_proxy( "struct __stub_frame\n");
|
||||
print_proxy( "{\n");
|
||||
print_proxy( " MIDL_STUB_MESSAGE _StubMsg;\n");
|
||||
print_proxy( "};\n");
|
||||
print_proxy( "\n");
|
||||
write_formatstringsdecl(proxy, indent, stmts, need_proxy);
|
||||
write_stubdescproto();
|
||||
}
|
||||
|
@ -293,10 +297,10 @@ static void free_variable( const var_t *arg )
|
|||
|
||||
if (size)
|
||||
{
|
||||
print_proxy( "_StubMsg.MaxCount = " );
|
||||
print_proxy( "__frame->_StubMsg.MaxCount = " );
|
||||
write_expr(proxy, size, 0, 1, NULL, NULL);
|
||||
fprintf(proxy, ";\n\n");
|
||||
print_proxy( "NdrClearOutParameters( &_StubMsg, ");
|
||||
print_proxy( "NdrClearOutParameters( &__frame->_StubMsg, ");
|
||||
fprintf(proxy, "&__MIDL_TypeFormatString.Format[%u], ", type_offset );
|
||||
fprintf(proxy, "(void*)%s );\n", arg->name );
|
||||
return;
|
||||
|
@ -321,11 +325,11 @@ static void free_variable( const var_t *arg )
|
|||
iid = get_attrp( arg->attrs, ATTR_IIDIS );
|
||||
if( iid )
|
||||
{
|
||||
print_proxy( "_StubMsg.MaxCount = (unsigned long) " );
|
||||
print_proxy( "__frame->_StubMsg.MaxCount = (unsigned long) " );
|
||||
write_expr(proxy, iid, 1, 1, NULL, NULL);
|
||||
print_proxy( ";\n\n" );
|
||||
}
|
||||
print_proxy( "NdrClearOutParameters( &_StubMsg, ");
|
||||
print_proxy( "NdrClearOutParameters( &__frame->_StubMsg, ");
|
||||
fprintf(proxy, "&__MIDL_TypeFormatString.Format[%u], ", type_offset );
|
||||
fprintf(proxy, "(void*)%s );\n", arg->name );
|
||||
break;
|
||||
|
@ -364,6 +368,7 @@ static void gen_proxy(type_t *iface, const func_t *cur, int idx,
|
|||
print_proxy( ")\n");
|
||||
print_proxy( "{\n");
|
||||
indent ++;
|
||||
print_proxy( "struct __proxy_frame __f, * const __frame = &__f;\n" );
|
||||
/* local variables */
|
||||
if (has_ret) {
|
||||
print_proxy( "" );
|
||||
|
@ -371,7 +376,6 @@ static void gen_proxy(type_t *iface, const func_t *cur, int idx,
|
|||
print_proxy( " _RetVal;\n");
|
||||
}
|
||||
print_proxy( "RPC_MESSAGE _RpcMessage;\n" );
|
||||
print_proxy( "MIDL_STUB_MESSAGE _StubMsg;\n" );
|
||||
if (has_ret) {
|
||||
if (decl_indirect(get_func_return_type(cur)))
|
||||
print_proxy("void *_p_%s = &%s;\n",
|
||||
|
@ -388,7 +392,7 @@ static void gen_proxy(type_t *iface, const func_t *cur, int idx,
|
|||
print_proxy( "RpcTryExcept\n" );
|
||||
print_proxy( "{\n" );
|
||||
indent++;
|
||||
print_proxy( "NdrProxyInitialize(This, &_RpcMessage, &_StubMsg, &Object_StubDesc, %d);\n", idx);
|
||||
print_proxy( "NdrProxyInitialize(This, &_RpcMessage, &__frame->_StubMsg, &Object_StubDesc, %d);\n", idx);
|
||||
proxy_check_pointers( cur->args );
|
||||
|
||||
print_proxy( "RpcTryFinallyProxy(%d)\n", has_full_pointer );
|
||||
|
@ -397,18 +401,18 @@ static void gen_proxy(type_t *iface, const func_t *cur, int idx,
|
|||
|
||||
write_remoting_arguments(proxy, indent, cur, PASS_IN, PHASE_BUFFERSIZE);
|
||||
|
||||
print_proxy( "NdrProxyGetBuffer(This, &_StubMsg);\n" );
|
||||
print_proxy( "NdrProxyGetBuffer(This, &__frame->_StubMsg);\n" );
|
||||
|
||||
write_remoting_arguments(proxy, indent, cur, PASS_IN, PHASE_MARSHAL);
|
||||
|
||||
print_proxy( "NdrProxySendReceive(This, &_StubMsg);\n" );
|
||||
print_proxy( "NdrProxySendReceive(This, &__frame->_StubMsg);\n" );
|
||||
fprintf(proxy, "\n");
|
||||
print_proxy( "_StubMsg.BufferStart = _RpcMessage.Buffer;\n" );
|
||||
print_proxy( "_StubMsg.BufferEnd = _StubMsg.BufferStart + _RpcMessage.BufferLength;\n\n" );
|
||||
print_proxy( "__frame->_StubMsg.BufferStart = _RpcMessage.Buffer;\n" );
|
||||
print_proxy( "__frame->_StubMsg.BufferEnd = __frame->_StubMsg.BufferStart + _RpcMessage.BufferLength;\n\n" );
|
||||
|
||||
print_proxy("if ((_RpcMessage.DataRepresentation & 0xffff) != NDR_LOCAL_DATA_REPRESENTATION)\n");
|
||||
indent++;
|
||||
print_proxy("NdrConvert( &_StubMsg, &__MIDL_ProcFormatString.Format[%u]);\n", proc_offset );
|
||||
print_proxy("NdrConvert( &__frame->_StubMsg, &__MIDL_ProcFormatString.Format[%u]);\n", proc_offset );
|
||||
indent--;
|
||||
fprintf(proxy, "\n");
|
||||
|
||||
|
@ -430,13 +434,13 @@ static void gen_proxy(type_t *iface, const func_t *cur, int idx,
|
|||
indent++;
|
||||
if (has_full_pointer)
|
||||
write_full_pointer_free(proxy, indent, cur);
|
||||
print_proxy( "NdrProxyFreeBuffer(This, &_StubMsg);\n" );
|
||||
print_proxy( "NdrProxyFreeBuffer(This, &__frame->_StubMsg);\n" );
|
||||
indent--;
|
||||
print_proxy( "}\n");
|
||||
print_proxy( "RpcEndFinally\n" );
|
||||
indent--;
|
||||
print_proxy( "}\n" );
|
||||
print_proxy( "RpcExcept(_StubMsg.dwStubPhase != PROXY_SENDRECEIVE)\n" );
|
||||
print_proxy( "RpcExcept(__frame->_StubMsg.dwStubPhase != PROXY_SENDRECEIVE)\n" );
|
||||
print_proxy( "{\n" );
|
||||
if (has_ret) {
|
||||
indent++;
|
||||
|
@ -473,14 +477,14 @@ static void gen_stub(type_t *iface, const func_t *cur, const char *cas,
|
|||
indent--;
|
||||
print_proxy( "{\n");
|
||||
indent++;
|
||||
print_proxy( "struct __stub_frame __f, * const __frame = &__f;\n" );
|
||||
print_proxy("%s * _This = (%s*)((CStdStubBuffer*)This)->pvServerObject;\n", iface->name, iface->name);
|
||||
print_proxy("MIDL_STUB_MESSAGE _StubMsg;\n");
|
||||
declare_stub_args( proxy, indent, cur );
|
||||
fprintf(proxy, "\n");
|
||||
|
||||
/* FIXME: trace */
|
||||
|
||||
print_proxy("NdrStubInitialize(_pRpcMessage, &_StubMsg, &Object_StubDesc, _pRpcChannelBuffer);\n");
|
||||
print_proxy("NdrStubInitialize(_pRpcMessage, &__frame->_StubMsg, &Object_StubDesc, _pRpcChannelBuffer);\n");
|
||||
fprintf(proxy, "\n");
|
||||
|
||||
write_parameters_init(proxy, indent, cur);
|
||||
|
@ -492,7 +496,7 @@ static void gen_stub(type_t *iface, const func_t *cur, const char *cas,
|
|||
write_full_pointer_init(proxy, indent, cur, TRUE);
|
||||
print_proxy("if ((_pRpcMessage->DataRepresentation & 0xffff) != NDR_LOCAL_DATA_REPRESENTATION)\n");
|
||||
indent++;
|
||||
print_proxy("NdrConvert( &_StubMsg, &__MIDL_ProcFormatString.Format[%u]);\n", proc_offset );
|
||||
print_proxy("NdrConvert( &__frame->_StubMsg, &__MIDL_ProcFormatString.Format[%u]);\n", proc_offset );
|
||||
indent--;
|
||||
fprintf(proxy, "\n");
|
||||
|
||||
|
@ -524,7 +528,7 @@ static void gen_stub(type_t *iface, const func_t *cur, const char *cas,
|
|||
if (!is_void(get_func_return_type(cur)))
|
||||
write_remoting_arguments(proxy, indent, cur, PASS_RETURN, PHASE_BUFFERSIZE);
|
||||
|
||||
print_proxy("NdrStubGetBuffer(This, _pRpcChannelBuffer, &_StubMsg);\n");
|
||||
print_proxy("NdrStubGetBuffer(This, _pRpcChannelBuffer, &__frame->_StubMsg);\n");
|
||||
|
||||
write_remoting_arguments(proxy, indent, cur, PASS_OUT, PHASE_MARSHAL);
|
||||
fprintf(proxy, "\n");
|
||||
|
@ -546,7 +550,7 @@ static void gen_stub(type_t *iface, const func_t *cur, const char *cas,
|
|||
print_proxy("}\n");
|
||||
print_proxy("RpcEndFinally\n");
|
||||
|
||||
print_proxy("_pRpcMessage->BufferLength = _StubMsg.Buffer - (unsigned char *)_pRpcMessage->Buffer;\n");
|
||||
print_proxy("_pRpcMessage->BufferLength = __frame->_StubMsg.Buffer - (unsigned char *)_pRpcMessage->Buffer;\n");
|
||||
indent--;
|
||||
|
||||
print_proxy("}\n");
|
||||
|
|
|
@ -68,11 +68,11 @@ static void write_function_stubs(type_t *iface, unsigned int *proc_offset)
|
|||
/* write the functions body */
|
||||
fprintf(server, "{\n");
|
||||
indent++;
|
||||
print_server( "struct __server_frame __f, * const __frame = &__f;\n" );
|
||||
|
||||
/* Declare arguments */
|
||||
declare_stub_args(server, indent, func);
|
||||
|
||||
print_server("MIDL_STUB_MESSAGE _StubMsg;\n");
|
||||
print_server("RPC_STATUS _Status;\n");
|
||||
fprintf(server, "\n");
|
||||
|
||||
|
@ -81,7 +81,7 @@ static void write_function_stubs(type_t *iface, unsigned int *proc_offset)
|
|||
print_server("NdrServerInitializeNew(\n");
|
||||
indent++;
|
||||
print_server("_pRpcMessage,\n");
|
||||
print_server("&_StubMsg,\n");
|
||||
print_server("&__frame->_StubMsg,\n");
|
||||
print_server("&%s_StubDesc);\n", iface->name);
|
||||
indent--;
|
||||
fprintf(server, "\n");
|
||||
|
@ -110,7 +110,7 @@ static void write_function_stubs(type_t *iface, unsigned int *proc_offset)
|
|||
indent++;
|
||||
print_server("NdrConvert(\n");
|
||||
indent++;
|
||||
print_server("(PMIDL_STUB_MESSAGE)&_StubMsg,\n");
|
||||
print_server("(PMIDL_STUB_MESSAGE)&__frame->_StubMsg,\n");
|
||||
print_server("(PFORMAT_STRING)&__MIDL_ProcFormatString.Format[%u]);\n", *proc_offset);
|
||||
indent -= 2;
|
||||
fprintf(server, "\n");
|
||||
|
@ -119,7 +119,7 @@ static void write_function_stubs(type_t *iface, unsigned int *proc_offset)
|
|||
write_remoting_arguments(server, indent, func, PASS_IN, PHASE_UNMARSHAL);
|
||||
}
|
||||
|
||||
print_server("if (_StubMsg.Buffer > _StubMsg.BufferEnd)\n");
|
||||
print_server("if (__frame->_StubMsg.Buffer > __frame->_StubMsg.BufferEnd)\n");
|
||||
print_server("{\n");
|
||||
indent++;
|
||||
print_server("RpcRaiseException(RPC_X_BAD_STUB_DATA);\n");
|
||||
|
@ -188,7 +188,7 @@ static void write_function_stubs(type_t *iface, unsigned int *proc_offset)
|
|||
if (!is_void(get_func_return_type(func)))
|
||||
write_remoting_arguments(server, indent, func, PASS_RETURN, PHASE_BUFFERSIZE);
|
||||
|
||||
print_server("_pRpcMessage->BufferLength = _StubMsg.BufferLength;\n");
|
||||
print_server("_pRpcMessage->BufferLength = __frame->_StubMsg.BufferLength;\n");
|
||||
fprintf(server, "\n");
|
||||
print_server("_Status = I_RpcGetBuffer(_pRpcMessage);\n");
|
||||
print_server("if (_Status)\n");
|
||||
|
@ -196,7 +196,7 @@ static void write_function_stubs(type_t *iface, unsigned int *proc_offset)
|
|||
print_server("RpcRaiseException(_Status);\n");
|
||||
indent--;
|
||||
fprintf(server, "\n");
|
||||
print_server("_StubMsg.Buffer = (unsigned char *)_pRpcMessage->Buffer;\n");
|
||||
print_server("__frame->_StubMsg.Buffer = (unsigned char *)_pRpcMessage->Buffer;\n");
|
||||
fprintf(server, "\n");
|
||||
}
|
||||
|
||||
|
@ -226,7 +226,7 @@ static void write_function_stubs(type_t *iface, unsigned int *proc_offset)
|
|||
fprintf(server, "\n");
|
||||
print_server("_pRpcMessage->BufferLength =\n");
|
||||
indent++;
|
||||
print_server("(unsigned int)(_StubMsg.Buffer - (unsigned char *)_pRpcMessage->Buffer);\n");
|
||||
print_server("(unsigned int)(__frame->_StubMsg.Buffer - (unsigned char *)_pRpcMessage->Buffer);\n");
|
||||
indent--;
|
||||
indent--;
|
||||
fprintf(server, "}\n");
|
||||
|
@ -382,6 +382,7 @@ static void init_server(void)
|
|||
print_server( "{\n");
|
||||
print_server( " EXCEPTION_REGISTRATION_RECORD frame;\n");
|
||||
print_server( " sigjmp_buf jmp;\n");
|
||||
print_server( " MIDL_STUB_MESSAGE _StubMsg;\n");
|
||||
print_server( "};\n");
|
||||
print_server( "\n");
|
||||
print_server("static DWORD __server_exception_handler( EXCEPTION_RECORD *record,\n");
|
||||
|
@ -405,25 +406,25 @@ static void init_server(void)
|
|||
print_server(" siglongjmp( server_frame->jmp, 1 );\n");
|
||||
print_server("}\n");
|
||||
print_server("#define RpcTryExcept \\\n");
|
||||
print_server(" do { \\\n");
|
||||
print_server(" struct __server_frame __server_frame; \\\n");
|
||||
print_server(" __server_frame.frame.Handler = __server_exception_handler; \\\n");
|
||||
print_server(" if (!sigsetjmp( __server_frame.jmp, 0 )) \\\n");
|
||||
print_server(" __frame->frame.Handler = __server_exception_handler; \\\n");
|
||||
print_server(" if (!sigsetjmp( __frame->jmp, 0 )) \\\n");
|
||||
print_server(" { \\\n");
|
||||
print_server(" __wine_push_frame( &__server_frame.frame ); \\\n");
|
||||
print_server(" {\n");
|
||||
print_server(" __wine_push_frame( &__frame->frame );\n");
|
||||
print_server("\n");
|
||||
print_server("#define RpcExcept(expr) \\\n");
|
||||
print_server(" } \\\n");
|
||||
print_server(" __wine_pop_frame( &__server_frame.frame ); \\\n");
|
||||
print_server(" __wine_pop_frame( &__frame->frame ); \\\n");
|
||||
print_server(" } \\\n");
|
||||
print_server(" else \\\n");
|
||||
print_server(" {\n");
|
||||
print_server(" else\n");
|
||||
print_server("\n");
|
||||
print_server("#define RpcEndExcept \\\n");
|
||||
print_server(" } \\\n");
|
||||
print_server(" } while(0);\n");
|
||||
print_server("#define RpcEndExcept\n");
|
||||
print_server("\n");
|
||||
print_server( "#else /* USE_COMPILER_EXCEPTIONS */\n");
|
||||
print_server( "\n");
|
||||
print_server( "struct __server_frame\n");
|
||||
print_server( "{\n");
|
||||
print_server( " MIDL_STUB_MESSAGE _StubMsg;\n");
|
||||
print_server( "};\n");
|
||||
print_server( "\n");
|
||||
print_server("#endif /* USE_COMPILER_EXCEPTIONS */\n");
|
||||
print_server("\n");
|
||||
}
|
||||
|
|
|
@ -897,14 +897,14 @@ int is_full_pointer_function(const func_t *func)
|
|||
|
||||
void write_full_pointer_init(FILE *file, int indent, const func_t *func, int is_server)
|
||||
{
|
||||
print_file(file, indent, "_StubMsg.FullPtrXlatTables = NdrFullPointerXlatInit(0,%s);\n",
|
||||
print_file(file, indent, "__frame->_StubMsg.FullPtrXlatTables = NdrFullPointerXlatInit(0,%s);\n",
|
||||
is_server ? "XLAT_SERVER" : "XLAT_CLIENT");
|
||||
fprintf(file, "\n");
|
||||
}
|
||||
|
||||
void write_full_pointer_free(FILE *file, int indent, const func_t *func)
|
||||
{
|
||||
print_file(file, indent, "NdrFullPointerXlatFree(_StubMsg.FullPtrXlatTables);\n");
|
||||
print_file(file, indent, "NdrFullPointerXlatFree(__frame->_StubMsg.FullPtrXlatTables);\n");
|
||||
fprintf(file, "\n");
|
||||
}
|
||||
|
||||
|
@ -2656,7 +2656,7 @@ static void print_phase_function(FILE *file, int indent, const char *type,
|
|||
|
||||
print_file(file, indent, "Ndr%s%s(\n", type, function);
|
||||
indent++;
|
||||
print_file(file, indent, "&_StubMsg,\n");
|
||||
print_file(file, indent, "&__frame->_StubMsg,\n");
|
||||
print_file(file, indent, "%s%s%s%s,\n",
|
||||
(phase == PHASE_UNMARSHAL) ? "(unsigned char **)" : "(unsigned char *)",
|
||||
(phase == PHASE_UNMARSHAL || decl_indirect(var->type)) ? "&" : "",
|
||||
|
@ -2728,8 +2728,8 @@ void print_phase_basetype(FILE *file, int indent, enum remoting_phase phase,
|
|||
}
|
||||
|
||||
if (phase == PHASE_MARSHAL)
|
||||
print_file(file, indent, "MIDL_memset(_StubMsg.Buffer, 0, (0x%x - (long)_StubMsg.Buffer) & 0x%x);\n", alignment, alignment - 1);
|
||||
print_file(file, indent, "_StubMsg.Buffer = (unsigned char *)(((long)_StubMsg.Buffer + %u) & ~0x%x);\n",
|
||||
print_file(file, indent, "MIDL_memset(__frame->_StubMsg.Buffer, 0, (0x%x - (long)__frame->_StubMsg.Buffer) & 0x%x);\n", alignment, alignment - 1);
|
||||
print_file(file, indent, "__frame->_StubMsg.Buffer = (unsigned char *)(((long)__frame->_StubMsg.Buffer + %u) & ~0x%x);\n",
|
||||
alignment - 1, alignment - 1);
|
||||
|
||||
if (phase == PHASE_MARSHAL)
|
||||
|
@ -2737,17 +2737,17 @@ void print_phase_basetype(FILE *file, int indent, enum remoting_phase phase,
|
|||
print_file(file, indent, "*(");
|
||||
write_type_decl(file, is_ptr(type) ? type->ref : type, NULL);
|
||||
if (is_ptr(type))
|
||||
fprintf(file, " *)_StubMsg.Buffer = *");
|
||||
fprintf(file, " *)__frame->_StubMsg.Buffer = *");
|
||||
else
|
||||
fprintf(file, " *)_StubMsg.Buffer = ");
|
||||
fprintf(file, " *)__frame->_StubMsg.Buffer = ");
|
||||
fprintf(file, "%s", varname);
|
||||
fprintf(file, ";\n");
|
||||
}
|
||||
else if (phase == PHASE_UNMARSHAL)
|
||||
{
|
||||
print_file(file, indent, "if (_StubMsg.Buffer + sizeof(");
|
||||
print_file(file, indent, "if (__frame->_StubMsg.Buffer + sizeof(");
|
||||
write_type_decl(file, is_ptr(type) ? type->ref : type, NULL);
|
||||
fprintf(file, ") > _StubMsg.BufferEnd)\n");
|
||||
fprintf(file, ") > __frame->_StubMsg.BufferEnd)\n");
|
||||
print_file(file, indent, "{\n");
|
||||
print_file(file, indent + 1, "RpcRaiseException(RPC_X_BAD_STUB_DATA);\n");
|
||||
print_file(file, indent, "}\n");
|
||||
|
@ -2761,10 +2761,10 @@ void print_phase_basetype(FILE *file, int indent, enum remoting_phase phase,
|
|||
else
|
||||
fprintf(file, " = *(");
|
||||
write_type_decl(file, is_ptr(type) ? type->ref : type, NULL);
|
||||
fprintf(file, " *)_StubMsg.Buffer;\n");
|
||||
fprintf(file, " *)__frame->_StubMsg.Buffer;\n");
|
||||
}
|
||||
|
||||
print_file(file, indent, "_StubMsg.Buffer += sizeof(");
|
||||
print_file(file, indent, "__frame->_StubMsg.Buffer += sizeof(");
|
||||
write_type_decl(file, var->type, NULL);
|
||||
fprintf(file, ");\n");
|
||||
}
|
||||
|
@ -2812,14 +2812,14 @@ static void write_parameter_conf_or_var_exprs(FILE *file, int indent,
|
|||
{
|
||||
if (type->size_is)
|
||||
{
|
||||
print_file(file, indent, "_StubMsg.MaxCount = (unsigned long)");
|
||||
print_file(file, indent, "__frame->_StubMsg.MaxCount = (unsigned long)");
|
||||
write_expr(file, type->size_is, 1, 1, NULL, NULL);
|
||||
fprintf(file, ";\n\n");
|
||||
}
|
||||
if (type->length_is)
|
||||
{
|
||||
print_file(file, indent, "_StubMsg.Offset = (unsigned long)0;\n"); /* FIXME */
|
||||
print_file(file, indent, "_StubMsg.ActualCount = (unsigned long)");
|
||||
print_file(file, indent, "__frame->_StubMsg.Offset = (unsigned long)0;\n"); /* FIXME */
|
||||
print_file(file, indent, "__frame->_StubMsg.ActualCount = (unsigned long)");
|
||||
write_expr(file, type->length_is, 1, 1, NULL, NULL);
|
||||
fprintf(file, ";\n\n");
|
||||
}
|
||||
|
@ -2830,7 +2830,7 @@ static void write_parameter_conf_or_var_exprs(FILE *file, int indent,
|
|||
{
|
||||
if (is_conformance_needed_for_phase(phase))
|
||||
{
|
||||
print_file(file, indent, "_StubMsg.MaxCount = (unsigned long)");
|
||||
print_file(file, indent, "__frame->_StubMsg.MaxCount = (unsigned long)");
|
||||
write_expr(file, get_attrp(var->attrs, ATTR_SWITCHIS), 1, 1, NULL, NULL);
|
||||
fprintf(file, ";\n\n");
|
||||
}
|
||||
|
@ -2842,7 +2842,7 @@ static void write_parameter_conf_or_var_exprs(FILE *file, int indent,
|
|||
|
||||
if (is_conformance_needed_for_phase(phase) && (iid = get_attrp( var->attrs, ATTR_IIDIS )))
|
||||
{
|
||||
print_file( file, indent, "_StubMsg.MaxCount = (unsigned long) " );
|
||||
print_file( file, indent, "__frame->_StubMsg.MaxCount = (unsigned long) " );
|
||||
write_expr( file, iid, 1, 1, NULL, NULL );
|
||||
fprintf( file, ";\n\n" );
|
||||
}
|
||||
|
@ -2900,14 +2900,14 @@ static void write_remoting_arg(FILE *file, int indent, const func_t *func,
|
|||
* be direct, otherwise it is a pointer */
|
||||
int is_ch_ptr = is_aliaschain_attr(type, ATTR_CONTEXTHANDLE) ? FALSE : TRUE;
|
||||
print_file(file, indent, "NdrClientContextMarshall(\n");
|
||||
print_file(file, indent + 1, "&_StubMsg,\n");
|
||||
print_file(file, indent + 1, "&__frame->_StubMsg,\n");
|
||||
print_file(file, indent + 1, "(NDR_CCONTEXT)%s%s,\n", is_ch_ptr ? "*" : "", var->name);
|
||||
print_file(file, indent + 1, "%s);\n", in_attr && out_attr ? "1" : "0");
|
||||
}
|
||||
else
|
||||
{
|
||||
print_file(file, indent, "NdrServerContextNewMarshall(\n");
|
||||
print_file(file, indent + 1, "&_StubMsg,\n");
|
||||
print_file(file, indent + 1, "&__frame->_StubMsg,\n");
|
||||
print_file(file, indent + 1, "(NDR_SCONTEXT)%s,\n", var->name);
|
||||
print_file(file, indent + 1, "(NDR_RUNDOWN)%s_rundown,\n", get_context_handle_type_name(var->type));
|
||||
print_file(file, indent + 1, "(PFORMAT_STRING)&__MIDL_TypeFormatString.Format[%d]);\n", start_offset);
|
||||
|
@ -2920,14 +2920,14 @@ static void write_remoting_arg(FILE *file, int indent, const func_t *func,
|
|||
if (!in_attr)
|
||||
print_file(file, indent, "*%s = 0;\n", var->name);
|
||||
print_file(file, indent, "NdrClientContextUnmarshall(\n");
|
||||
print_file(file, indent + 1, "&_StubMsg,\n");
|
||||
print_file(file, indent + 1, "&__frame->_StubMsg,\n");
|
||||
print_file(file, indent + 1, "(NDR_CCONTEXT *)%s,\n", var->name);
|
||||
print_file(file, indent + 1, "_Handle);\n");
|
||||
}
|
||||
else
|
||||
{
|
||||
print_file(file, indent, "%s = NdrServerContextNewUnmarshall(\n", var->name);
|
||||
print_file(file, indent + 1, "&_StubMsg,\n");
|
||||
print_file(file, indent + 1, "&__frame->_StubMsg,\n");
|
||||
print_file(file, indent + 1, "(PFORMAT_STRING)&__MIDL_TypeFormatString.Format[%d]);\n", start_offset);
|
||||
}
|
||||
}
|
||||
|
@ -2989,7 +2989,7 @@ static void write_remoting_arg(FILE *file, int indent, const func_t *func,
|
|||
{
|
||||
print_file(file, indent, "if (%s)\n", var->name);
|
||||
indent++;
|
||||
print_file(file, indent, "_StubMsg.pfnFree(%s);\n", var->name);
|
||||
print_file(file, indent, "__frame->_StubMsg.pfnFree(%s);\n", var->name);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -3031,7 +3031,7 @@ static void write_remoting_arg(FILE *file, int indent, const func_t *func,
|
|||
expr_t *iid;
|
||||
if ((iid = get_attrp( var->attrs, ATTR_IIDIS )))
|
||||
{
|
||||
print_file( file, indent, "_StubMsg.MaxCount = (unsigned long) " );
|
||||
print_file( file, indent, "__frame->_StubMsg.MaxCount = (unsigned long) " );
|
||||
write_expr( file, iid, 1, 1, NULL, NULL );
|
||||
fprintf( file, ";\n\n" );
|
||||
}
|
||||
|
@ -3071,7 +3071,7 @@ void write_remoting_arguments(FILE *file, int indent, const func_t *func,
|
|||
if (phase == PHASE_BUFFERSIZE && pass != PASS_RETURN)
|
||||
{
|
||||
unsigned int size = get_function_buffer_size( func, pass );
|
||||
print_file(file, indent, "_StubMsg.BufferLength = %u;\n", size);
|
||||
print_file(file, indent, "__frame->_StubMsg.BufferLength = %u;\n", size);
|
||||
}
|
||||
|
||||
if (pass == PASS_RETURN)
|
||||
|
@ -3234,7 +3234,7 @@ void assign_stub_out_args( FILE *file, int indent, const func_t *func )
|
|||
if (is_context_handle(var->type))
|
||||
{
|
||||
fprintf(file, " = NdrContextHandleInitialize(\n");
|
||||
print_file(file, indent + 1, "&_StubMsg,\n");
|
||||
print_file(file, indent + 1, "&__frame->_StubMsg,\n");
|
||||
print_file(file, indent + 1, "(PFORMAT_STRING)&__MIDL_TypeFormatString.Format[%d]);\n",
|
||||
var->type->typestring_offset);
|
||||
}
|
||||
|
@ -3243,7 +3243,7 @@ void assign_stub_out_args( FILE *file, int indent, const func_t *func )
|
|||
unsigned int size, align = 0;
|
||||
type_t *type = var->type;
|
||||
|
||||
fprintf(file, " = NdrAllocate(&_StubMsg, ");
|
||||
fprintf(file, " = NdrAllocate(&__frame->_StubMsg, ");
|
||||
for ( ; type->size_is ; type = type->ref)
|
||||
{
|
||||
write_expr(file, type->size_is, TRUE, TRUE, NULL, NULL);
|
||||
|
|
Loading…
Reference in New Issue