Changeset 403 in dev
- Timestamp:
- Feb 28, 2008, 9:45:31 PM (17 years ago)
- Location:
- trunk/abdev
- Files:
-
- 3 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 ); -
trunk/abdev/BasicCompiler_Common/VariableOpe.cpp
r402 r403 290 290 291 291 292 BOOL GetVarFormatString( char *buffer,char *array,char *array2,char *NestMember,ReferenceKind &refType){292 BOOL GetVarFormatString( char *buffer,char *array,char *array2,char *NestMember,ReferenceKind &refType, bool *pIsParameterInBracket ){ 293 293 extern int cp; 294 294 int i,i2,i3; … … 317 317 cPare_Close=')'; 318 318 } 319 320 if( pIsParameterInBracket ) 321 { 322 // []なのか、()なのかを伝える 323 if( cPare_Open == '[' ) 324 { 325 *pIsParameterInBracket = true; 326 } 327 else 328 { 329 *pIsParameterInBracket = false; 330 } 331 } 332 319 333 buffer[i]=0; 320 334 for(i++,i2=0;;i++,i2++){ -
trunk/abdev/BasicCompiler_Common/VariableOpe.h
r402 r403 16 16 Type GetStringTypeInfo(); 17 17 void GetWithName(char *buffer); 18 BOOL GetVarFormatString(char *buffer,char *array,char *array2,char *NestMember, ReferenceKind &refType );18 BOOL GetVarFormatString(char *buffer,char *array,char *array2,char *NestMember, ReferenceKind &refType, bool *pIsParameterInBracket = NULL ); 19 19 void GetArrayElement( const char *buffer,char *variable,char *array_element); 20 20 BOOL CheckVarNameError(char *name,int nowLine);
Note:
See TracChangeset
for help on using the changeset viewer.