|
|
/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Copyright (c) 1989-1999 Microsoft Corporation
Module Name: resmgr.cxx
Abstract:
Stub and auxillary routine resource management helper routines.
Notes:
This file has a dependency on the type graph implementation.
History:
Sep-15-1993 VibhasC Created. ----------------------------------------------------------------------------*/
/****************************************************************************
* include files ***************************************************************************/ #include "becls.hxx"
#pragma hdrstop
void GenNdrCorrRes( ANALYSIS_INFO* pAna );
void CG_PROC::C_PreAllocateResources( ANALYSIS_INFO * pAna ) /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Routine Description:
Pre-allocate stub resources like local variables, parameter variables etc for the client side stub.
Arguments:
pAna - A pointer to the analysis block. Return Value: None.
Notes:
1. All parameters are declared as resources for the client stub. 2. Standard client side resources like the stub message, rpc message status etc are local resources. ----------------------------------------------------------------------------*/ { node_id * pRpcMessageType = new node_id( RPC_MESSAGE_VAR_NAME ); node_id * pStubMessageType= new node_id( STUB_MESSAGE_VAR_NAME ); node_id * pStatus = new node_id( RPC_STATUS_VAR_NAME ); CG_ITERATOR ParamList;
// Set up local copies of the stub message and the rpc message.
pRpcMessageType->SetBasicType( (node_skl *) new node_def (RPC_MESSAGE_TYPE_NAME) ); pRpcMessageType->SetEdgeType( EDGE_USE ); pAna->AddLocalResource( RPC_MESSAGE_VAR_NAME, (node_skl *) pRpcMessageType );
pStubMessageType->SetBasicType( (node_skl *) new node_def (STUB_MESSAGE_TYPE_NAME) );
pStubMessageType->SetEdgeType( EDGE_USE ); pAna->AddLocalResource( STUB_MESSAGE_VAR_NAME, (node_skl *) pStubMessageType );
if( HasStatuses() ) { pStatus = new node_id( RPC_STATUS_VAR_NAME ); pStatus->SetBasicType( (node_skl *) new node_def (RPC_STATUS_TYPE_NAME) );
pStatus->SetEdgeType( EDGE_USE ); SetStatusResource( pAna->AddLocalResource( RPC_STATUS_VAR_NAME, (node_skl *) pStatus )); }
// resource for cache
// /deny causes a switch to /Oicf. This code will not be executed
if ( fHasDeny ) { GenNdrCorrRes( pAna ); }
// Add all params as param resources only if necessary (at least one param).
if( GetMembers( ParamList ) ) { CG_PARAM * pParam; node_skl * pType;
ITERATOR_INIT( ParamList );
while( ITERATOR_GETNEXT( ParamList, pParam ) ) { pType = pParam->GetType(); pAna->AddParamResource( (PNAME) pType->GetSymName(), pType->GetChild() //Yes not getbasictype()
); } }
//
// Check for a structure or union return type. If one exists we must
// allocate a local pointer with a munged name for the eventual
// Ndr unmarshall call.
//
CG_RETURN * pReturn;
if ( (pReturn = GetReturnType()) == 0 ) return;
//
// If this is a by-value structure or union then we allocate a
// local which is a pointer to the same type.
//
if ( ((CG_NDR *)pReturn->GetChild())->IsStruct() || ((CG_NDR *)pReturn->GetChild())->IsUnion() || ((CG_NDR *)pReturn->GetChild())->IsXmitRepOrUserMarshal() ) { node_id * pLocalType; char * pName;
pName = LOCAL_NAME_POINTER_MANGLE RETURN_VALUE_VAR_NAME;
pLocalType = MakePtrIDNodeFromTypeName( pName, "void", 0 );
pAna->AddLocalResource( pName, (node_skl *) pLocalType ); } }
void CG_PROC::S_PreAllocateResources( ANALYSIS_INFO * pAna ) /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Routine Description:
Pre-allocate variables that are needed on the server side.
Arguments:
pAna - A pointer to the analysis block. Return Value: None.
Notes:
1. The rpc message is a parameter resource allocated on the server side. 2. All other local variables, are decided during/after the analysis phase. ----------------------------------------------------------------------------*/ { node_id * pStubMessageType= new node_id( STUB_MESSAGE_VAR_NAME ); node_param * pRpcMessageType = new node_param(); node_param * pDWordType = new node_param(); CG_ITERATOR ParamList;
// The local copy of the rpc message pointer.
pRpcMessageType->SetSymName( PRPC_MESSAGE_VAR_NAME ); pRpcMessageType->SetBasicType( (node_skl *) new node_def (PRPC_MESSAGE_TYPE_NAME) ); pRpcMessageType->SetEdgeType( EDGE_USE );
pAna->AddParamResource( PRPC_MESSAGE_VAR_NAME, (node_skl *) pRpcMessageType );
// For object procs , one more param after the rpc message.
if( IsObject() ) { // DWORD * pDwPhase parameter
pDWordType->SetSymName( "_pdwStubPhase" ); pDWordType->SetBasicType( (node_skl *)new node_def( "DWORD *" ) ); pDWordType->SetEdgeType( EDGE_USE ); pAna->AddParamResource( "_pdwStubPhase", pDWordType ); }
// Add the stub message local variable.
pStubMessageType->SetBasicType( (node_skl *) new node_def (STUB_MESSAGE_TYPE_NAME) );
pStubMessageType->SetEdgeType( EDGE_USE ); pAna->AddLocalResource( STUB_MESSAGE_VAR_NAME, (node_skl *) pStubMessageType );
if ( HasNotifyFlag() ) { node_id * pNotifyFlag = new node_id( NOTIFY_FLAG_VAR_NAME );
pNotifyFlag->SetBasicType( (node_skl *) new node_def( "boolean" )); pNotifyFlag->SetEdgeType( EDGE_USE );
pAna->AddLocalResource( NOTIFY_FLAG_VAR_NAME, (node_skl *) pNotifyFlag ); }
// resource for cache
// /deny causes a switch to /Oicf. This code will not be executed
if ( fHasDeny ) { GenNdrCorrRes( pAna ); }
//
// Check for by-value [in] structures and unions. We must allocate
// a local which is a pointer to the same type for these.
//
// Also check for arrays so I can put a hack in until we get their
// allocation figured out.
//
if( GetMembers( ParamList ) ) { CG_PARAM * pParam; node_skl * pType;
while( ITERATOR_GETNEXT( ParamList, pParam ) ) { pType = pParam->GetType();
CG_NDR * pChild = (CG_NDR *)pParam->GetChild(); ID_CG ChildID = pChild->GetCGID();
if ( ChildID == ID_CG_GENERIC_HDL ) { pChild = (CG_NDR *)pChild->GetChild(); ChildID = pChild->GetCGID(); }
//
// If this is a by-value structure or union then we allocate a
// local which is a pointer to the same type.
//
if ( pChild->IsStruct() || pChild->IsUnion() || pChild->IsXmitRepOrUserMarshal() ) { char * pName; node_id * pLocalType; char * pPlainName = pType->GetSymName();
pName = new char[strlen( pPlainName ) + 10];
strcpy( pName, LOCAL_NAME_POINTER_MANGLE ); strcat( pName, (PNAME) pPlainName );
pLocalType = MakePtrIDNodeFromTypeName( pName, "void", 0 ); pAna->AddLocalResource( pName, (node_skl *) pLocalType ); } } } } /****************************************************************************
utility fns ****************************************************************************/ node_id * MakeIDNode( PNAME pName, node_skl * pType, expr_node * pExpr ) { node_id * pID = new node_id( (char *)pName ); pID->SetBasicType( pType ); pID->SetEdgeType( EDGE_USE ); pID->SetExpr( pExpr ); return pID; }
node_id * MakePtrIDNode( PNAME pName, node_skl * pType, expr_node * pExpr ) { node_id * pID = new node_id( (char *)pName ); node_pointer * pP = new node_pointer(); pP->SetBasicType( pType ); pP->SetEdgeType( EDGE_USE ); pID->SetBasicType( pP ); pID->SetEdgeType( EDGE_USE ); pID->SetExpr( pExpr ); return pID; }
node_id * MakePtrIDNodeWithCastedExpr( PNAME pName, node_skl * pType, expr_node * pExpr ) { node_id * pID = new node_id( (char *)pName ); node_pointer * pP = new node_pointer(); pP->SetBasicType( pType ); pP->SetEdgeType( EDGE_USE ); pID->SetBasicType( pP ); pID->SetEdgeType( EDGE_USE ); expr_cast * pCast = new expr_cast( pP, pExpr ); pID->SetExpr( pCast ); return pID; }
node_id * MakeIDNodeFromTypeName( PNAME pName, PNAME pTypeName, expr_node * pExpr ) { node_id * pID = new node_id( pName ); node_def * pDef = new node_def(pTypeName); pID->SetBasicType( pDef ); pID->SetEdgeType( EDGE_USE ); pID->SetExpr( pExpr ); return pID; }
node_id * MakePtrIDNodeFromTypeName( PNAME pName, PNAME pTypeName, expr_node * pExpr ) { node_id * pID = new node_id( pName ); node_def * pDef = new node_def(pTypeName); node_pointer * pPtr = new node_pointer(); pPtr->SetBasicType( pDef ); pPtr->SetEdgeType( EDGE_USE ); pID->SetBasicType( pPtr ); pID->SetEdgeType( EDGE_USE ); pID->SetExpr( pExpr ); return pID; }
node_id * MakePtrIDNodeFromTypeNameWithCastedExpr( PNAME pName, PNAME pTypeName, expr_node * pExpr ) { node_id * pID = new node_id( pName ); node_def * pDef = new node_def(pTypeName); node_pointer * pPtr = new node_pointer(); pPtr->SetBasicType( pDef ); pPtr->SetEdgeType( EDGE_USE ); pID->SetBasicType( pPtr ); pID->SetEdgeType( EDGE_USE ); expr_cast * pCast = new expr_cast( pPtr, pExpr ); pID->SetExpr( pCast ); return pID; }
node_param * MakeParamNode( PNAME pName, node_skl * pType ) { node_param * pID = new node_param(); pID->SetSymName( pName ); pID->SetBasicType( pType ); pID->SetEdgeType( EDGE_USE ); return pID; }
node_param * MakePtrParamNode( PNAME pName, node_skl * pType ) { node_param * pID = new node_param( ); node_pointer * pP = new node_pointer(); pID->SetSymName( pName ); pP->SetBasicType( pType ); pP->SetEdgeType( EDGE_USE ); pID->SetBasicType( pP ); pID->SetEdgeType( EDGE_USE );
return pID; } node_param * MakeParamNodeFromTypeName( PNAME pName, PNAME pTypeName ) { node_param * pID = new node_param(); node_def * pDef = new node_def(pTypeName); pID->SetSymName( pName ); pID->SetBasicType( pDef ); pID->SetEdgeType( EDGE_USE ); return pID; } node_param * MakePtrParamNodeFromTypeName( PNAME pName, PNAME pTypeName ) { node_param * pID = new node_param(); node_def * pDef = new node_def(pTypeName); node_pointer * pPtr = new node_pointer(); pID->SetSymName( pName ); pPtr->SetBasicType( pDef ); pPtr->SetEdgeType( EDGE_USE ); pID->SetBasicType( pPtr ); pID->SetEdgeType( EDGE_USE ); return pID; }
node_proc * MakeProcNodeWithNewName( PNAME pName, node_proc * pProc ) { node_proc * pNewProc = new node_proc( pProc );
pNewProc->SetSymName( pName ); return pNewProc; }
void GenNdrCorrRes ( ANALYSIS_INFO* pAna ) { node_id* pCacheType = new node_id( NDR_CORR_CACHE_VAR_NAME ); expr_node* pExpr = new expr_constant( unsigned long( NDR_CORR_CACHE_SIZE ) ); node_array* pArray = new node_array( 0, pExpr ); node_base_type* pBaseType = new node_base_type( NODE_LONG, ATTR_UNSIGNED );
pBaseType->SetSymName( "long" ); pArray->SetBasicType( pBaseType ); pArray->SetEdgeType( EDGE_USE ); pCacheType->SetBasicType( pArray ); pCacheType->SetEdgeType( EDGE_USE );
pAna->AddLocalResource( NDR_CORR_CACHE_VAR_NAME, pCacheType ); }
|