#include "../common.h" #ifdef _AMD64_ #include "../../BasicCompiler64/opcode.h" #else #include "../../BasicCompiler32/opcode.h" #endif #include CMember::CMember( CClass *pobj_c, DWORD access, bool isConst, bool isRef, char *buffer, int nowLine ){ extern int cp; //構文を解析 char VarName[VN_SIZE]; char init_buf[VN_SIZE]; char constract_parameter[VN_SIZE]; GetDimentionFormat(buffer,VarName,SubScripts,*this,init_buf,constract_parameter); //重複チェック if(pobj_c->DupliCheckAll(VarName)){ SetError(15,VarName,cp); } //メンバ名 name = VarName; //アクセス権 dwAccess=access; //定数扱いかどうか this->isConst = isConst; //初期データ InitBuf=(char *)HeapAlloc(hHeap,0,lstrlen(init_buf)+1); lstrcpy(InitBuf,init_buf); //コンストラクタ用のパラメータ ConstractParameter=(char *)HeapAlloc(hHeap,0,lstrlen(constract_parameter)+1); lstrcpy(ConstractParameter,constract_parameter); //ソースコードの位置 source_code_address=nowLine; } CMember::CMember(CMember &member): Type( member ) { //name name = member.name; //定数扱いかどうか isConst = member.isConst; //SubScripts memcpy(SubScripts,member.SubScripts,MAX_ARRAYDIM*sizeof(int)); //ソースコードの位置 source_code_address=member.source_code_address; } CMember::~CMember(){ if(InitBuf) HeapDefaultFree(InitBuf); if(ConstractParameter) HeapDefaultFree(ConstractParameter); } void CMember::InitStaticMember(void){ //静的メンバをグローバル領域に作成 //イテレータをリセット extern CDBClass *pobj_DBClass; pobj_DBClass->Iterator_Reset(); int back_cp=cp; while(pobj_DBClass->Iterator_HasNext()){ CClass &objClass = *pobj_DBClass->Iterator_GetNext(); // 名前空間をセット Smoothie::Lexical::liveingNamespaceScopes = objClass.GetNamespaceScopes(); int i=0; foreach( CMember *member, objClass.staticMembers ){ char temporary[VN_SIZE]; sprintf(temporary,"%s.%s",objClass.GetName().c_str(),member->GetName().c_str()); dim( temporary, member->SubScripts, *member, member->InitBuf, member->ConstractParameter, 0); //ネイティブコードバッファの再確保 ReallocNativeCodeBuffer(); i++; } } Smoothie::Lexical::liveingNamespaceScopes.clear(); cp=back_cp; }