Changeset 64 in dev for BasicCompiler32/Compile_CallProc.cpp
- Timestamp:
- Mar 8, 2007, 2:49:34 AM (18 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
BasicCompiler32/Compile_CallProc.cpp
r63 r64 94 94 } 95 95 96 void Opcode_CallProc(c har *Parameter,SUBINFO *psi,DWORD dwFlags,char *ObjectName,int RefType){96 void Opcode_CallProc(const char *Parameter,SUBINFO *psi,DWORD dwFlags,char *ObjectName,int RefType){ 97 97 int i2; 98 98 … … 206 206 207 207 /////////////////////////////////////////////////////////////// 208 // _System_LocalThis 、_System_ReturnObjectのダミーをセット208 // _System_LocalThisのダミーをセット 209 209 /////////////////////////////////////////////////////////////// 210 210 … … 215 215 } 216 216 217 if(psi->ReturnType==DEF_OBJECT && psi->isReturnRef == false ){218 //_System_ReturnObject(第一または第二パラメータのダミーを作成)219 sprintf(temporary+lstrlen(temporary),"%c%c0,",1,ESC_BYVAL);220 }221 222 217 if(Parameter[0]=='\0'&&temporary[0]) 223 218 temporary[lstrlen(temporary)-1]=0; … … 246 241 247 242 //一時オブジェクトを生成 248 pobj_parameter->NewTempParameters( psi->name,psi->pRealParmInfo,psi->RealParmNum,psi->RealSecondParmNum );243 int tempSize = pobj_parameter->NewTempParameters( psi->name,psi->pRealParmInfo,psi->RealParmNum,psi->RealSecondParmNum ); 249 244 250 245 //レジスタ、スタックフレームにセット … … 252 247 ParmSize=pobj_parameter->SetParameter(psi->name,psi->pRealParmInfo,psi->RealParmNum,psi->RealSecondParmNum); 253 248 254 255 if(psi->ReturnType==DEF_OBJECT && psi->isReturnRef == false){ 249 if(psi->ReturnType==DEF_STRUCT && psi->isReturnRef == false){ 256 250 ////////////////////////////////////////////////////// 257 // 戻り値に オブジェクトインスタンスを持つ場合258 // ※ByRef _System_Return Objectパラメータをセット251 // 戻り値に構造体インスタンスを持つ場合 252 // ※ByRef _System_ReturnValue パラメータをセット 259 253 ////////////////////////////////////////////////////// 260 254 … … 294 288 SetVarPtrToEax(&RelativeVar); 295 289 296 //参照タイプが "->" の場合 297 if(RefType==DEF_PTR_OBJECT){ 298 //mov eax,dword ptr[eax] 299 OpBuffer[obp++]=(char)0x8B; 300 OpBuffer[obp++]=(char)0x00; 301 } 302 303 //mov ecx,eax 304 OpBuffer[obp++]=(char)0x8B; 305 OpBuffer[obp++]=(char)0xC8; 290 // 参照を実体ポインタにする 291 op_mov_RM( sizeof(long), REG_ECX, REG_EAX, 0, MOD_BASE ); 306 292 } 307 293 } … … 310 296 if(dwFlags&PROCFLAG_NEW){ 311 297 //New演算子によるコンストラクタ呼び出しの場合 298 312 299 //mov ecx,dword ptr[esp+ParmSize] 313 OpBuffer[obp++]=(char)0x8B; 314 OpBuffer[obp++]=(char)0x8C; 315 OpBuffer[obp++]=(char)0x24; 316 *((long *)(OpBuffer+obp))=ParmSize; 317 obp+=sizeof(long); 300 op_mov_RM( sizeof(long), REG_ECX, REG_ESP, ParmSize + tempSize, MOD_BASE_DISP32 ); 318 301 } 319 302 else{
Note:
See TracChangeset
for help on using the changeset viewer.