static void DoInfo( any_oc *oc ) { /**************************************/ switch( oc->oc_header.class & INFO_MASK ) { case INFO_LINE: DumpLiteral( "LINE " ); DumpInt( oc->oc_linenum.line ); if( oc->oc_linenum.label_line ) { DumpLiteral( " (Label)" ); } break; case INFO_LDONE: DumpLiteral( "LDONE " ); LblName( oc->oc_handle.handle, false ); break; case INFO_DEAD_JMP: DumpLiteral( "DEAD " ); DumpLiteral( "jmp " ); DoRef( &(oc->oc_handle) ); break; case INFO_DBG_RTN_BEG: DumpLiteral( "RTN BEGIN " ); DumpPtr( oc->oc_debug.ptr ); break; case INFO_DBG_BLK_BEG: DumpLiteral( "BLOCK BEGIN " ); DumpPtr( oc->oc_debug.ptr ); break; case INFO_DBG_PRO_END: DumpLiteral( "PROLOG END " ); DumpPtr( oc->oc_debug.ptr ); break; case INFO_DBG_EPI_BEG: DumpLiteral( "EPILOG BEGIN " ); DumpPtr( oc->oc_debug.ptr ); break; case INFO_DBG_BLK_END: DumpLiteral( "BLOCK END " ); DumpPtr( oc->oc_debug.ptr ); break; case INFO_DBG_RTN_END: DumpLiteral( "RTN END " ); DumpPtr( oc->oc_debug.ptr ); break; case INFO_SELECT: DumpLiteral( "SELECT TABLE " ); if( oc->oc_select.starts ) { DumpLiteral( "STARTS" ); } else { DumpLiteral( "ENDS" ); } break; default: DumpLiteral( "*** unknown info ***" ); break; } }
void VInvocation::CheckDecorateParams(VEmitContext& ec) { guard(VInvocation::CheckDecorateParams); int max_params; int num_needed_params = Func->NumParams; if (Func->Flags & FUNC_VarArgs) { max_params = VMethod::MAX_PARAMS - 1; } else { max_params = Func->NumParams; } if (NumArgs > max_params) { ParseError(Loc, "Incorrect number of arguments, need %d, got %d.", max_params, NumArgs); } for (int i = 0; i < NumArgs; i++) { if (i >= num_needed_params) { continue; } if (!Args[i]) { continue; } switch (Func->ParamTypes[i].Type) { case TYPE_Name: if (Args[i]->IsDecorateSingleName()) { VDecorateSingleName* E = (VDecorateSingleName*)Args[i]; Args[i] = new VNameLiteral(*E->Name, E->Loc); delete E; E = NULL; } else if (Args[i]->IsStrConst()) { VStr Val = Args[i]->GetStrConst(ec.Package); TLocation ALoc = Args[i]->Loc; delete Args[i]; Args[i] = NULL; Args[i] = new VNameLiteral(*Val, ALoc); } break; case TYPE_String: if (Args[i]->IsDecorateSingleName()) { VDecorateSingleName* E = (VDecorateSingleName*)Args[i]; Args[i] = new VStringLiteral(ec.Package->FindString(*E->Name), E->Loc); delete E; E = NULL; } break; case TYPE_Class: if (Args[i]->IsDecorateSingleName()) { VDecorateSingleName* E = (VDecorateSingleName*)Args[i]; Args[i] = new VStringLiteral(ec.Package->FindString(*E->Name), E->Loc); delete E; E = NULL; } if (Args[i]->IsStrConst()) { VStr CName = Args[i]->GetStrConst(ec.Package); TLocation ALoc = Args[i]->Loc; VClass* Cls = VClass::FindClassNoCase(*CName); if (!Cls) { ParseWarning(ALoc, "No such class %s", *CName); delete Args[i]; Args[i] = NULL; Args[i] = new VNoneLiteral(ALoc); } else if (Func->ParamTypes[i].Class && !Cls->IsChildOf(Func->ParamTypes[i].Class)) { ParseWarning(ALoc, "Class %s is not a descendant of %s", *CName, Func->ParamTypes[i].Class->GetName()); delete Args[i]; Args[i] = NULL; Args[i] = new VNoneLiteral(ALoc); } else { delete Args[i]; Args[i] = NULL; Args[i] = new VClassConstant(Cls, ALoc); } } break; case TYPE_State: if (Args[i]->IsIntConst()) { int Offs = Args[i]->GetIntConst(); TLocation ALoc = Args[i]->Loc; if (Offs < 0) { ParseError(ALoc, "Negative state jumps are not allowed"); } else if (Offs == 0) { // 0 means no state delete Args[i]; Args[i] = NULL; Args[i] = new VNoneLiteral(ALoc); } else { check(CallerState); VState* S = CallerState->GetPlus(Offs, true); if (!S) { ParseError(ALoc, "Bad state jump offset"); } else { delete Args[i]; Args[i] = NULL; Args[i] = new VStateConstant(S, ALoc); } } } else if (Args[i]->IsStrConst()) { VStr Lbl = Args[i]->GetStrConst(ec.Package); TLocation ALoc = Args[i]->Loc; int DCol = Lbl.IndexOf("::"); if (DCol >= 0) { // Jump to a specific parent class state, resolve it and // pass value directly. VStr ClassName(Lbl, 0, DCol); VClass* CheckClass; if (ClassName.ICmp("Super")) { CheckClass = ec.SelfClass->ParentClass; } else { CheckClass = VClass::FindClassNoCase(*ClassName); if (!CheckClass) { ParseError(ALoc, "No such class %s", *ClassName); } else if (!ec.SelfClass->IsChildOf(CheckClass)) { ParseError(ALoc, "%s is not a subclass of %s", ec.SelfClass->GetName(), CheckClass->GetName()); CheckClass = NULL; } } if (CheckClass) { VStr LblName(Lbl, DCol + 2, Lbl.Length() - DCol - 2); TArray<VName> Names; VMemberBase::StaticSplitStateLabel(LblName, Names); VStateLabel* StLbl = CheckClass->FindStateLabel(Names, true); if (!StLbl) { ParseError(ALoc, "No such state %s", *Lbl); } else { delete Args[i]; Args[i] = NULL; Args[i] = new VStateConstant(StLbl->State, ALoc); } } } else { // It's a virtual state jump VExpression* TmpArgs[1]; TmpArgs[0] = Args[i]; Args[i] = new VInvocation(NULL, ec.SelfClass->FindMethodChecked("FindJumpState"), NULL, false, false, Args[i]->Loc, 1, TmpArgs); } } break; } } unguard; }