Windows NT 4.0 source code leak
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

279 lines
5.8 KiB

4 years ago
  1. /*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2. Copyright (c) 1989 Microsoft Corporation
  3. Module Name:
  4. btgen.cxx
  5. Abstract:
  6. code generation method implementations for the base type class.
  7. Notes:
  8. History:
  9. Sep-22-1993 VibhasC Created.
  10. ----------------------------------------------------------------------------*/
  11. /****************************************************************************
  12. * include files
  13. ***************************************************************************/
  14. #include "becls.hxx"
  15. #pragma hdrstop
  16. /****************************************************************************
  17. * local definitions
  18. ***************************************************************************/
  19. /****************************************************************************
  20. * local data
  21. ***************************************************************************/
  22. /****************************************************************************
  23. * externs
  24. ***************************************************************************/
  25. /****************************************************************************/
  26. extern CMD_ARG * pCommand;
  27. CG_STATUS
  28. CG_BASETYPE::GenMarshall(
  29. CCB * pCCB )
  30. {
  31. expr_node * pSource = pCCB->GetSourceExpression();
  32. expr_node * pDest = pCCB->GetDestExpression();
  33. STM_ACTION Action;
  34. if( GetType()->GetSize( 0 ) == 0 )
  35. return CG_OK;
  36. // Prepare the marshalling expression.
  37. if( pCCB->IsRefAllocDone() )
  38. {
  39. pSource = MakeDereferentExpressionIfNecessary(
  40. pCCB->GetSourceExpression() );
  41. }
  42. pCCB->Advance( GetWireAlignment(),
  43. &Action,
  44. (RPC_BUF_SIZE_PROPERTY *)0,
  45. (RPC_BUFFER_SIZE *)0
  46. );
  47. Out_AlignmentOrAddAction( pCCB, pDest, Action );
  48. Out_MarshallBaseType( pCCB,
  49. GetType(),
  50. pDest,
  51. pSource
  52. );
  53. return CG_OK;
  54. }
  55. CG_STATUS
  56. CG_BASETYPE::GenUnMarshall(
  57. CCB * pCCB )
  58. {
  59. STM_ACTION Action;
  60. ISTREAM * pStream = pCCB->GetStream();
  61. unsigned long Size = GetType()->GetSize(0);
  62. if( Size == 0 )
  63. return CG_OK;
  64. pCCB->Advance( GetWireAlignment(),
  65. &Action,
  66. (RPC_BUF_SIZE_PROPERTY *)0,
  67. (RPC_BUFFER_SIZE * )0
  68. );
  69. Out_AlignmentOrAddAction( pCCB, pCCB->GetSourceExpression(), Action);
  70. if( pCCB->IsRefAllocDone() )
  71. {
  72. expr_node * pDest = pCCB->GetDestExpression();
  73. pDest = MakeAddressOfPointer( pDest );
  74. Out_IfAllocCopy( pCCB,
  75. pDest,
  76. pCCB->GetSourceExpression(),
  77. new expr_constant( (long) Size ) );
  78. }
  79. else
  80. {
  81. Out_UnMarshallBaseType( pCCB,
  82. GetType(),
  83. pCCB->GetDestExpression(),
  84. pCCB->GetSourceExpression()
  85. );
  86. }
  87. return CG_OK;
  88. }
  89. CG_STATUS
  90. CG_BASETYPE::S_GenInitOutLocals(
  91. CCB * pCCB )
  92. /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  93. Routine Description:
  94. Generate the init call for the locals.
  95. Arguments:
  96. pCCB - The ptr to code gen block.
  97. Return Value:
  98. Notes:
  99. ----------------------------------------------------------------------------*/
  100. {
  101. expr_node * pExpr;
  102. if( !pCCB->IsRefAllocDone() )
  103. {
  104. pExpr = new expr_sizeof( GetType() );
  105. Out_Alloc( pCCB, pCCB->GetSourceExpression(), 0, pExpr );
  106. }
  107. else
  108. {
  109. pExpr = MakeAddressExpressionNoMatterWhat( GetResource() );
  110. Out_Assign( pCCB, pCCB->GetSourceExpression(), pExpr );
  111. }
  112. return CG_OK;
  113. }
  114. FORMAT_CHARACTER
  115. CG_BASETYPE::GetFormatChar( CCB * pCCB )
  116. {
  117. switch ( GetType()->GetBasicType()->NodeKind() )
  118. {
  119. case NODE_BYTE :
  120. return FC_BYTE;
  121. case NODE_CHAR :
  122. return FC_CHAR;
  123. case NODE_SMALL :
  124. case NODE_BOOLEAN :
  125. return FC_SMALL;
  126. case NODE_WCHAR_T :
  127. return FC_WCHAR;
  128. case NODE_SHORT :
  129. return FC_SHORT;
  130. case NODE_LONG :
  131. case NODE_INT :
  132. return FC_LONG;
  133. case NODE_FLOAT :
  134. return FC_FLOAT;
  135. case NODE_HYPER :
  136. case NODE_INT64 :
  137. case NODE_LONGLONG :
  138. return FC_HYPER;
  139. case NODE_DOUBLE :
  140. return FC_DOUBLE;
  141. default:
  142. assert(pCommand->IsHookOleEnabled());
  143. return FC_BLKHOLE;
  144. }
  145. return FC_ZERO;
  146. }
  147. FORMAT_CHARACTER
  148. CG_BASETYPE::GetSignedFormatChar()
  149. {
  150. BOOL IsUnsigned;
  151. IsUnsigned = ((node_base_type *)GetType())->IsUnsigned();
  152. switch ( GetFormatChar() )
  153. {
  154. case FC_BYTE :
  155. // return FC_USMALL;
  156. case FC_SMALL :
  157. case FC_CHAR :
  158. return (IsUnsigned ? FC_USMALL : FC_SMALL);
  159. case FC_WCHAR :
  160. // return FC_USHORT;
  161. case FC_SHORT :
  162. return (IsUnsigned ? FC_USHORT : FC_SHORT);
  163. case FC_LONG :
  164. return (IsUnsigned ? FC_ULONG : FC_LONG);
  165. default :
  166. assert(0);
  167. }
  168. return FC_ZERO;
  169. }
  170. char *
  171. CG_BASETYPE::GetTypeName()
  172. {
  173. return GetType()->GetSymName();
  174. }
  175. void
  176. CG_BASETYPE::IncrementStackOffset( long * pOffset )
  177. {
  178. unsigned short Env;
  179. Env = pCommand->GetEnv();
  180. switch ( GetFormatChar() )
  181. {
  182. case FC_HYPER :
  183. case FC_DOUBLE :
  184. if ( Env == ENV_DOS || Env == ENV_WIN16 )
  185. *pOffset = (*pOffset + 1) & ~ 0x1;
  186. else
  187. *pOffset = (*pOffset + 3) & ~ 0x3;
  188. *pOffset += 8;
  189. break;
  190. case FC_LONG :
  191. case FC_FLOAT :
  192. if ( Env == ENV_DOS || Env == ENV_WIN16 )
  193. *pOffset = (*pOffset + 1) & ~ 0x1;
  194. else
  195. *pOffset = (*pOffset + 3) & ~ 0x3;
  196. *pOffset += 4;
  197. break;
  198. default :
  199. if ( Env == ENV_DOS || Env == ENV_WIN16 )
  200. *pOffset += 2;
  201. else
  202. *pOffset += 4;
  203. break;
  204. }
  205. }
  206. FORMAT_CHARACTER
  207. CG_ENUM::GetFormatChar( CCB * pCCB )
  208. {
  209. return ( IsEnumLong() ? FC_ENUM32 : FC_ENUM16 );
  210. }
  211. FORMAT_CHARACTER
  212. CG_ENUM::GetSignedFormatChar()
  213. {
  214. if ( pCommand->GetEnv() == ENV_MAC ||
  215. pCommand->GetEnv() == ENV_MPPC )
  216. {
  217. return ( IsEnumLong() ? FC_LONG : FC_ENUM16 );
  218. }
  219. else
  220. return ( IsEnumLong() ? FC_LONG : FC_SHORT );
  221. }
  222. FORMAT_CHARACTER
  223. CG_ERROR_STATUS_T::GetFormatChar( CCB * pCCB )
  224. {
  225. return FC_ERROR_STATUS_T;
  226. }