Changeset 403 in dev for trunk/abdev/BasicCompiler32
- Timestamp:
- Feb 28, 2008, 9:45:31 PM (17 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/abdev/BasicCompiler32/NumOpe.cpp
r402 r403 157 157 { 158 158 classType = leftType; 159 160 if( classType.IsObject() ) 161 { 162 // 既にuseRegにオブジェクトポインタが格納されており、それに対するインデクサを呼び出す場合 163 // ※「プロパティ値として返ってきたオブジェクトインスタンスのインデクサを呼び出す」場合にここにくる 164 165 //オブジェクトポインタをスタックに入れておく 166 //push useReg 167 compiler.codeGenerator.op_push( useReg ); 168 } 159 169 } 160 170 else 161 171 { 162 172 GetMemberType( leftType, VarName, classType, 0, false ); 163 } 164 if( classType.IsObject() ) 165 { 166 //オブジェクトポインタをecxにコピー 167 compiler.codeGenerator.op_mov_RR( REG_ECX, useReg ); 168 169 RELATIVE_VAR relativeVar; 170 relativeVar.dwKind=VAR_DIRECTMEM; 171 172 if( VarName[0] ) 173 174 if( classType.IsObject() ) 173 175 { 176 // クラス型のメンバに対するインデクサを呼び出す場合 177 178 //オブジェクトポインタをecxにコピー 179 compiler.codeGenerator.op_mov_RR( REG_ECX, useReg ); 180 181 RELATIVE_VAR relativeVar; 182 relativeVar.dwKind=VAR_DIRECTMEM; 183 174 184 if( !_member_offset( 175 185 true, //エラー表示あり … … 190 200 compiler.codeGenerator.op_push( REG_EAX ); 191 201 } 192 else 193 { 194 //オブジェクトポインタをスタックに入れておく 195 //push ecx 196 compiler.codeGenerator.op_push( REG_ECX ); 197 } 198 202 } 203 204 if( classType.IsObject() ) 205 { 199 206 char objectFullName[VN_SIZE], dummyArrayElements[VN_SIZE]; 200 207 GetArrayElement(termFull,objectFullName,dummyArrayElements); … … 244 251 char methodName[VN_SIZE], lpPtrOffset[VN_SIZE], parameter[VN_SIZE], dummy[1]; 245 252 ReferenceKind refType; 253 bool isParameterInBracket = false; 246 254 lstrcpy( methodName, member ); 247 GetVarFormatString( methodName,parameter,lpPtrOffset,dummy,refType);255 GetVarFormatString( methodName, parameter, lpPtrOffset, dummy, refType, &isParameterInBracket ); 248 256 249 257 objClass.EnumDynamicMethodsOrInterfaceMethods( methodName, userProcs ); … … 254 262 if( pUserProc ) 255 263 { 256 // TODO: この判定処理は暫定(特に[]サーチを行うところが) 257 if( pUserProc->Params().size() == 0 && parameter[0] && strstr( termFull, "[" ) ) 264 if( 265 pUserProc->Params().size() == 0 // 仮引数の個数は0 266 && parameter[0] // 実引数は1つ以上 267 && pUserProc->ReturnType().IsObject() // 戻り値がクラス型の場合 268 && isParameterInBracket ) // 実引数は[]で囲まれている 258 269 { 270 // プロパティ値として返ってきたオブジェクトインスタンスのインデクサを呼び出す 271 272 // まずはプロパティ値を取得 259 273 TermMemberOpe( leftType, baseType, resultType, termFull, termLeft, methodName ); 260 274 275 // 戻り値のオブジェクトインスタンスのインデクサを呼び出す 261 276 char temporary[VN_SIZE], temp2[VN_SIZE]; 262 277 sprintf( temporary, "[%s]", parameter );
Note:
See TracChangeset
for help on using the changeset viewer.