Changeset 209 in dev for trunk/abdev/BasicCompiler_Common/Subroutine.cpp
- Timestamp:
- Jul 13, 2007, 4:22:02 AM (17 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/abdev/BasicCompiler_Common/Subroutine.cpp
r206 r209 277 277 } 278 278 279 280 void AddDeclareData(const NamespaceScopes &namespaceScopes, char *buffer,int nowLine){ 281 extern HANDLE hHeap; 282 int i2; 283 284 int i=0; 285 286 //Sub/Function 287 Procedure::Kind kind = Procedure::Sub; 288 if(buffer[i]==ESC_SUB){ 289 } 290 else if(buffer[i]==ESC_FUNCTION){ 291 kind = Procedure::Function; 292 } 293 else{ 294 SetError(1,NULL,nowLine); 295 return; 296 } 297 i++; 298 299 //プロシージャ名 300 char procName[VN_SIZE]; 301 bool isCdecl = false; 302 for(i2=0;;i++,i2++){ 303 if(buffer[i]==1&&buffer[i+1]==ESC_CDECL){ 304 isCdecl = true; 305 306 i+=2; 307 procName[i2]=0; 308 break; 309 } 310 if(buffer[i]==','){ 311 procName[i2]=0; 312 break; 313 } 314 if(buffer[i]=='\0'){ 315 SetError(1,NULL,nowLine); 316 return; 317 } 318 procName[i2]=buffer[i]; 319 } 320 i++; 321 322 //ユーザー定義関数との重複チェック 323 if(GetSubHash(procName)){ 324 SetError(15,procName,nowLine); 325 return; 326 } 327 328 329 //ライブラリ 330 char dllFileName[MAX_PATH]; 331 i = GetOneParameter( buffer, i, dllFileName ); 332 Type resultType; 333 _int64 i64data; 334 if( !StaticCalculation( true, dllFileName, 0, &i64data, resultType ) ){ 335 return; 336 } 337 if( resultType.GetBasicType() != typeOfPtrChar ){ 338 SetError(1,NULL,nowLine); 339 return; 340 } 341 lstrcpy( dllFileName, (char *)i64data ); 342 CharUpper(dllFileName); 343 if(!strstr(dllFileName,".")){ 344 lstrcat(dllFileName,".DLL"); 345 if(lstrlen(dllFileName)>=16){ 346 SetError(7,NULL,nowLine); 347 return; 348 } 349 } 350 351 //エイリアス 352 char alias[VN_SIZE]; 353 i = GetOneParameter( buffer, i, alias ); 354 if( alias[0] ){ 355 if( !StaticCalculation( true, alias, 0, &i64data, resultType ) ){ 356 return; 357 } 358 if( resultType.GetBasicType() != typeOfPtrChar ){ 359 SetError(1,NULL,nowLine); 360 return; 361 } 362 lstrcpy( alias, (char *)i64data ); 363 } 364 else{ 365 //省略されたときは関数名 366 lstrcpy( alias, procName ); 367 } 368 369 370 // オブジェクトを生成 371 DllProc *pDllProc = new DllProc( namespaceScopes, procName, kind, isCdecl, dllFileName, alias ); 372 373 // パラメータを解析 374 // ※第1パラメータにに指定するデータの例:"( s As String ) As String" 375 pDllProc->SetParamsAndReturnType( buffer + i, nowLine ); 376 377 // パラメータのエラーチェック 378 BOOST_FOREACH( const Parameter *pParam, pDllProc->Params() ){ 379 if( pParam->IsObject() ){ 380 SetError(25,pParam->GetVarName(),nowLine); 381 } 382 if( !pParam->IsRef() ){ 383 if( pParam->IsStruct() ){ 384 SetError(28,pParam->GetVarName(),nowLine); 385 } 386 } 387 } 388 389 //戻り値のエラーチェック 390 if( pDllProc->IsFunction() ){ 391 // Function定義 392 393 if( pDllProc->ReturnType().IsObject() ){ 394 // DLL関数ではオブジェクトを戻り値にできない 395 SetError(40,pDllProc->GetName(),nowLine); 396 } 397 } 398 399 400 ///////////////////////////////// 401 // 格納位置を計算してppDeclareHashにセット 402 ///////////////////////////////// 403 404 //ハッシュ値を取得 405 int key; 406 key=hash_default(procName); 407 408 extern DllProc **ppDeclareHash; 409 if(ppDeclareHash[key]){ 410 DllProc *pTempProc = ppDeclareHash[key]; 411 while(1){ 412 if( pTempProc->IsEqualSymbol( pDllProc->GetNamespaceScopes(), pDllProc->GetName() ) ){ 413 //重複エラー 414 SetError(15,procName,nowLine); 415 return; 416 } 417 418 if(pTempProc->pNextData==0){ 419 pTempProc->pNextData=pDllProc; 420 break; 421 } 422 pTempProc=pTempProc->pNextData; 423 } 424 pTempProc=pTempProc->pNextData; 425 } 426 else{ 427 ppDeclareHash[key]=pDllProc; 428 } 429 } 430 431 void UserProcs::CollectUserProcs( const BasicSource &source, UserProcs &userProcs ) 279 void CollectProcedures( const BasicSource &source, UserProcs &userProcs, DllProcs &dllProcs ) 432 280 { 433 281 extern HANDLE hHeap; … … 435 283 char temporary[8192]; 436 284 437 //Declare(DLL関数)情報を初期化438 extern DllProc **ppDeclareHash;439 ppDeclareHash=(DllProc **)HeapAlloc(hHeap,HEAP_ZERO_MEMORY,MAX_HASH*sizeof(DllProc *));440 441 285 //サブルーチン(ユーザー定義)情報を初期化 442 286 userProcs.Clear(); 287 288 //Declare(DLL関数)情報を初期化 289 dllProcs.Clear(); 443 290 444 291 // 名前空間管理 … … 522 369 if(source[i]=='\0') break; 523 370 } 524 AddDeclareData(namespaceScopes,temporary,i);371 dllProcs.Add(namespaceScopes,temporary,i); 525 372 526 373 continue; … … 600 447 delete pDllProc; 601 448 } 602 void DeleteDeclareInfo(void){603 //DLL情報を解放604 extern DllProc **ppDeclareHash;605 int i;606 for(i=0;i<MAX_HASH;i++){607 if(!ppDeclareHash[i]) continue;608 609 Delete_di(ppDeclareHash[i]);610 }611 HeapDefaultFree(ppDeclareHash);612 }613 449 614 450 bool IsNeedProcCompile(){
Note:
See TracChangeset
for help on using the changeset viewer.