bool AddLibrary(void *Handle, bool IsProcess = false, bool CanClose = true) { #ifdef LLVM_ON_WIN32 assert((Handle == this ? IsProcess : !IsProcess) && "Bad Handle."); #endif if (LLVM_LIKELY(!IsProcess)) { if (Find(Handle) != Handles.end()) { if (CanClose) DLClose(Handle); return false; } Handles.push_back(Handle); } else { #ifndef LLVM_ON_WIN32 if (Process) { if (CanClose) DLClose(Process); if (Process == Handle) return false; } #endif Process = Handle; } return true; }
HandleList::iterator Find(void *Handle) { return std::find(Handles.begin(), Handles.end(), Handle); }
bool Contains(void *Handle) { return Handle == Process || Find(Handle) != Handles.end(); }
static void execute_actions( const HandleList<Action>& actions, const Handle<SpaceObject> original_subject, const Handle<SpaceObject> original_object, Point* offset, bool allowDelay) { bool checkConditions = false; for (auto action: actions) { #ifdef DATA_COVERAGE covered_actions.insert(action.number()); #endif // DATA_COVERAGE if (action->verb == kNoAction) { break; } auto subject = original_subject; if (action->initialSubjectOverride != kNoShip) { subject = GetObjectFromInitialNumber(action->initialSubjectOverride); } auto object = original_object; if (action->initialDirectOverride != kNoShip) { object = GetObjectFromInitialNumber(action->initialDirectOverride); } if ((action->delay > ticks(0)) && allowDelay) { queue_action( {action.number(), (*actions.end()).number()}, action->delay, subject, object, offset); return; } allowDelay = true; auto focus = object; if (action->reflexive || !focus.get()) { focus = subject; } if (object.get() && subject.get()) { if ((action->owner < -1) || ((action->owner == -1) && (object->owner == subject->owner)) || ((action->owner == 1) && (object->owner != subject->owner)) || (action->owner > 1)) { continue; } } if ((action->inclusiveFilter || action->exclusiveFilter) && (!object.get() || !action_filter_applies_to(*action, object))) { continue; } switch (action->verb) { case kCreateObject: case kCreateObjectSetDest: create_object(action, focus, subject, offset); break; case kPlaySound: play_sound(action, focus); break; case kMakeSparks: make_sparks(action, focus); break; case kDie: die(action, focus, subject); break; case kNilTarget: nil_target(action, focus); break; case kLandAt: land_at(action, focus, subject); break; case kEnterWarp: enter_warp(action, focus, subject); break; case kChangeScore: change_score(action, focus); break; case kDeclareWinner: declare_winner(action, focus); break; case kDisplayMessage: display_message(action, focus); break; case kSetDestination: set_destination(action, focus, subject); break; case kActivateSpecial: activate_special(action, focus, subject); break; case kActivatePulse: activate_pulse(action, focus, subject); break; case kActivateBeam: activate_beam(action, focus, subject); break; case kColorFlash: color_flash(action, focus); break; case kEnableKeys: enable_keys(action, focus); break; case kDisableKeys: disable_keys(action, focus); break; case kSetZoom: set_zoom(action, focus); break; case kComputerSelect: computer_select(action, focus); break; case kAssumeInitialObject: assume_initial_object(action, focus); break; case kAlterDamage: alter_damage(action, focus); break; case kAlterVelocity: alter_velocity(action, focus, subject, object); break; case kAlterThrust: alter_thrust(action, focus); break; case kAlterMaxVelocity: alter_max_velocity(action, focus); break; case kAlterLocation: alter_location(action, focus, subject, object); break; case kAlterWeapon1: alter_weapon1(action, focus); break; case kAlterWeapon2: alter_weapon2(action, focus); break; case kAlterSpecial: alter_special(action, focus); break; case kAlterEnergy: alter_energy(action, focus); break; case kAlterOwner: alter_owner(action, focus, subject, object); break; case kAlterHidden: alter_hidden(action); break; case kAlterCloak: alter_cloak(action, focus); break; case kAlterOffline: alter_offline(action, focus); break; case kAlterSpin: alter_spin(action, focus); break; case kAlterBaseType: alter_base_type(action, focus, object); break; case kAlterConditionTrueYet: alter_condition_true_yet(action); break; case kAlterOccupation: alter_occupation(action, focus, subject); break; case kAlterAbsoluteCash: alter_absolute_cash(action, focus); break; case kAlterAge: alter_age(action, focus); break; case kAlterAbsoluteLocation: alter_absolute_location(action, focus); break; case kAlterMaxThrust: case kAlterMaxTurnRate: case kAlterScale: case kAlterAttributes: case kAlterLevelKeyTag: case kAlterOrderKeyTag: case kAlterEngageKeyTag: /* not implemented */ break; } switch (action->verb) { case kChangeScore: case kDisplayMessage: checkConditions = true; break; } } if (checkConditions) { CheckLevelConditions(); } }