Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,8 @@ public final class LocalPlayerContextAnalyzer {
"GetCameraEyePositionY",
"GetCameraEyePositionZ",
"GetCameraEyePositionLoc",
"GetCameraFieldControlledByInput",
"BlzCameraGetCameraType",

// Localized data may vary with the client's language.
"GetLocalizedString",
Expand All @@ -64,7 +66,24 @@ public final class LocalPlayerContextAnalyzer {
"BlzGetLocalClientHeight",
"BlzIsLocalClientActive",
"BlzGetMouseFocusUnit",
"BlzGetLocale"
"BlzGetLocale",

// Current cinematic and renderer state belongs to the local client.
"BlzGetModelCinematicGameShotCount",
"BlzGetModelCinematicGameCurrentShot",
"BlzGetModelCinematicGameRemainingTime",
"BlzGetMinShadowCastingPointLightCount",

// Polling input and converting viewport coordinates are client-local.
"BlzIsMetaKeyPressed",
"BlzIsKeyPressed",
"BlzIsMouseButtonPressed",
"BlzGetMouseScreenPosX",
"BlzGetMouseScreenPosY",
"BlzPixelToFrameX",
"BlzPixelToFrameY",
"BlzFrameToPixelX",
"BlzFrameToPixelY"
);

private final Set<ImVar> localPlayerDependentVars =
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,12 +22,13 @@ public ImCompressor(ImTranslator translator) {
this.prog = translator.getImProg();
ng = new NameGenerator();
for (ImVar global : prog.getGlobals()) {
if (NamePreservation.isPreserved(global)) {
if (global.getIsBJ() || NamePreservation.isPreserved(global)) {
preservedNames.add(global.getName());
}
}
for (ImFunction function : ImHelper.calculateFunctionsOfProg(prog)) {
if (NamePreservation.isPreserved(function)) {
if (function.isNative() || function.isBj() || function.isExtern()
|| NamePreservation.isPreserved(function)) {
preservedNames.add(function.getName());
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -253,13 +253,25 @@ public static boolean isFunctionPure(String funcName) {
"BlzGetItemRealField", "BlzGetItemStringField", "BlzGetUnitBooleanField", "BlzGetUnitIntegerField",
"BlzGetUnitRealField", "BlzGetUnitStringField", "BlzGetUnitWeaponBooleanField", "BlzGetUnitWeaponIntegerField",
"BlzGetUnitWeaponRealField", "BlzGetUnitWeaponStringField", "BlzGetUnitSkin", "BlzGetItemSkin",
"BlzGetPlayerTownHallCount"
"BlzGetPlayerTownHallCount",
"ConvertFogStyle", "ConvertEquipmentType", "ConvertItemTag", "ConvertLoadoutSlot",
"BlzGetModelCinematicGameShotCount", "BlzGetModelCinematicGameCurrentShot",
"BlzGetModelCinematicGameRemainingTime", "BlzGetMinShadowCastingPointLightCount",
"GetCameraFieldControlledByInput", "BlzCameraGetCameraType", "BlzCameraSetupGetCameraType",
"BlzIsTerrainPathableEx", "BlzGetDoodadX", "BlzGetDoodadY", "BlzGetDoodadZ",
"BlzGetDoodadScaleX", "BlzGetDoodadScaleY", "BlzGetDoodadScaleZ",
"BlzGetDoodadIsUsingModelAxes", "BlzGetDoodadYaw", "BlzGetDoodadPitch", "BlzGetDoodadRoll",
"BlzGetDoodadVariation", "BlzGetDoodadId", "BlzGetNumDoodads",
"BlzGetUnitAbilityCooldownPercent", "BlzIsMetaKeyPressed", "BlzIsKeyPressed",
"BlzIsMouseButtonPressed", "BlzGetMouseScreenPosX", "BlzGetMouseScreenPosY",
"BlzPixelToFrameX", "BlzPixelToFrameY", "BlzFrameToPixelX", "BlzFrameToPixelY"
);

private static final Set<String> pureFunctions = HashSet.of(
"AbilityId", "AbilityId2String", "Acos", "And", "Asin", "Atan",
"Atan2", "ConvertAIDifficulty", "ConvertAllianceType", "ConvertAttackType", "ConvertBlendMode",
"ConvertCameraField", "ConvertDamageType", "ConvertDialogEvent", "ConvertEffectType",
"ConvertFogStyle", "ConvertEquipmentType", "ConvertItemTag", "ConvertLoadoutSlot",
"ConvertFGameState", "ConvertFogState", "ConvertGameDifficulty", "ConvertGameEvent",
"ConvertGameSpeed", "ConvertGameType", "ConvertIGameState", "ConvertItemType", "ConvertLimitOp",
"ConvertMapControl", "ConvertMapDensity", "ConvertMapFlag", "ConvertMapSetting",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
import de.peeeq.wurstscript.jassIm.*;
import de.peeeq.wurstscript.translation.imoptimizer.ImInliner;
import de.peeeq.wurstscript.translation.imoptimizer.ImOptimizer;
import de.peeeq.wurstscript.translation.imoptimizer.UselessFunctionCallsRemover;
import de.peeeq.wurstscript.translation.imtranslation.ImTranslator;
import de.peeeq.wurstscript.translation.imtranslation.FunctionFlagEnum;
import de.peeeq.wurstscript.types.TypesHelper;
Expand Down Expand Up @@ -661,6 +662,57 @@ public void preservedNamesAreReservedBeforeCompression() throws IOException {
"Expected compression to reserve the preserved name.\n" + output);
}

@Test
public void nativeNamesAreReservedBeforeCompression() throws IOException {
test().optimize().lines(
"package test",
" native w()",
" function ordinary()",
" w()",
" init",
" ordinary()",
"endpackage");

String output = Files.toString(
new File("./test-output/OptimizerTests_nativeNamesAreReservedBeforeCompression_opt.j"),
Charsets.UTF_8);
assertFalse(output.contains("function w takes"),
"Compression must not reuse a native API name.\n" + output);
}

@Test
public void reforged3ReadOnlyNativesAreClassified() {
java.util.Set<String> readOnlyNatives = java.util.Set.of(
"ConvertFogStyle", "ConvertEquipmentType", "ConvertItemTag", "ConvertLoadoutSlot",
"BlzGetModelCinematicGameShotCount", "BlzGetModelCinematicGameCurrentShot",
"BlzGetModelCinematicGameRemainingTime", "BlzGetMinShadowCastingPointLightCount",
"GetCameraFieldControlledByInput", "BlzCameraGetCameraType", "BlzCameraSetupGetCameraType",
"BlzIsTerrainPathableEx", "BlzGetDoodadX", "BlzGetDoodadY", "BlzGetDoodadZ",
"BlzGetDoodadScaleX", "BlzGetDoodadScaleY", "BlzGetDoodadScaleZ",
"BlzGetDoodadIsUsingModelAxes", "BlzGetDoodadYaw", "BlzGetDoodadPitch", "BlzGetDoodadRoll",
"BlzGetDoodadVariation", "BlzGetDoodadId", "BlzGetNumDoodads",
"BlzGetUnitAbilityCooldownPercent", "BlzIsMetaKeyPressed", "BlzIsKeyPressed",
"BlzIsMouseButtonPressed", "BlzGetMouseScreenPosX", "BlzGetMouseScreenPosY",
"BlzPixelToFrameX", "BlzPixelToFrameY", "BlzFrameToPixelX", "BlzFrameToPixelY"
);
for (String name : readOnlyNatives) {
assertTrue(UselessFunctionCallsRemover.isFunctionWithoutSideEffect(name),
name + " must be recognized as a side-effect-free Reforged 3 native");
}

for (String name : java.util.Set.of(
"ConvertFogStyle", "ConvertEquipmentType", "ConvertItemTag", "ConvertLoadoutSlot")) {
assertTrue(UselessFunctionCallsRemover.isFunctionPure(name),
name + " must be recognized as a pure conversion native");
}

for (String name : java.util.Set.of(
"ChooseRandomItemExWithFilter", "BlzPreloadModelCinematicGame", "BlzCreateDestructablePitchRoll")) {
assertFalse(UselessFunctionCallsRemover.isFunctionWithoutSideEffect(name),
name + " changes state or consumes randomness and must remain effectful");
}
}

@Test
public void trvePreservesGlobalDespiteLexicalShadow() throws IOException {
test().optimize().lines(
Expand Down Expand Up @@ -2903,7 +2955,22 @@ public void clientLocalNativeValuesAreLocalitySources() {
"BlzGetLocalClientHeight",
"BlzIsLocalClientActive",
"BlzGetMouseFocusUnit",
"BlzGetLocale"
"BlzGetLocale",
"BlzGetModelCinematicGameShotCount",
"BlzGetModelCinematicGameCurrentShot",
"BlzGetModelCinematicGameRemainingTime",
"BlzGetMinShadowCastingPointLightCount",
"GetCameraFieldControlledByInput",
"BlzCameraGetCameraType",
"BlzIsMetaKeyPressed",
"BlzIsKeyPressed",
"BlzIsMouseButtonPressed",
"BlzGetMouseScreenPosX",
"BlzGetMouseScreenPosY",
"BlzPixelToFrameX",
"BlzPixelToFrameY",
"BlzFrameToPixelX",
"BlzFrameToPixelY"
));
java.util.Set<String> intentionallyExcludedSources = new java.util.LinkedHashSet<>(java.util.Arrays.asList(
"BlzGetTriggerPlayerMouseX",
Expand Down
Loading