Revision | 8c377d2f469a3d4e710077d64a44833e64f0f2d6 (tree) |
---|---|
Time | 2016-01-28 19:56:47 |
Author | Christoph Oelckers <c.oelckers@zdoo...> |
Commiter | Christoph Oelckers |
- fixed: The ACS String garbage collector only looked at the active script's stack but never considered a recursive call from another script.
Fixing this required adding an external list of active stack objects that the garbage collector can access.
A nice side effect: It's no longer necessary to pass around the stack info to various functions that might end up triggering a garbage collection.
@@ -361,7 +361,7 @@ | ||
361 | 361 | pPlayer = &players[ulPlayer]; |
362 | 362 | |
363 | 363 | // [CK] Trigger events if a medal is received |
364 | - GAMEMODE_HandleEvent ( GAMEEVENT_MEDALS, pPlayer->mo, ACS_PushAndReturnDynamicString ( g_Medals[ulMedal].szAnnouncerEntry, NULL, 0 ) ); | |
364 | + GAMEMODE_HandleEvent ( GAMEEVENT_MEDALS, pPlayer->mo, ACS_PushAndReturnDynamicString ( g_Medals[ulMedal].szAnnouncerEntry ) ); | |
365 | 365 | |
366 | 366 | // Increase the player's count of this type of medal. |
367 | 367 | pPlayer->ulMedalCount[ulMedal]++; |
@@ -323,6 +323,52 @@ | ||
323 | 323 | SDWORD ACS_GlobalVars[NUM_GLOBALVARS]; |
324 | 324 | FWorldGlobalArray ACS_GlobalArrays[NUM_GLOBALVARS]; |
325 | 325 | |
326 | +//---------------------------------------------------------------------------- | |
327 | +// | |
328 | +// ACS stack management | |
329 | +// | |
330 | +// This is needed so that the garbage collector has access to all active | |
331 | +// script stacks | |
332 | +// | |
333 | +//---------------------------------------------------------------------------- | |
334 | + | |
335 | +struct FACSStack | |
336 | +{ | |
337 | + SDWORD buffer[STACK_SIZE]; | |
338 | + int sp; | |
339 | + FACSStack *next; | |
340 | + FACSStack *prev; | |
341 | + static FACSStack *head; | |
342 | + | |
343 | + FACSStack(); | |
344 | + ~FACSStack(); | |
345 | +}; | |
346 | + | |
347 | +FACSStack *FACSStack::head; | |
348 | + | |
349 | +FACSStack::FACSStack() | |
350 | +{ | |
351 | + sp = 0; | |
352 | + next = head; | |
353 | + prev = NULL; | |
354 | + head = this; | |
355 | + | |
356 | + Printf("Adding stack %08d\n", this); | |
357 | +} | |
358 | + | |
359 | +FACSStack::~FACSStack() | |
360 | +{ | |
361 | + if (next != NULL) next->prev = prev; | |
362 | + if (prev == NULL) | |
363 | + { | |
364 | + head = next; | |
365 | + } | |
366 | + else | |
367 | + { | |
368 | + prev->next = next; | |
369 | + } | |
370 | + Printf("Removing stack %08d\n", this); | |
371 | +} | |
326 | 372 | |
327 | 373 | //---------------------------------------------------------------------------- |
328 | 374 | // |
@@ -367,9 +413,9 @@ | ||
367 | 413 | ACSStringPool GlobalACSStrings; |
368 | 414 | |
369 | 415 | // [BB] Extracted from PCD_SAVESTRING. |
370 | -int ACS_PushAndReturnDynamicString ( const FString &Work, const SDWORD *stack, int stackdepth ) | |
371 | -{ | |
372 | - return GlobalACSStrings.AddString(strbin1(Work), stack, stackdepth); | |
416 | +int ACS_PushAndReturnDynamicString ( const FString &Work ) | |
417 | +{ | |
418 | + return GlobalACSStrings.AddString(strbin1(Work)); | |
373 | 419 | } |
374 | 420 | |
375 | 421 | ACSStringPool::ACSStringPool() |
@@ -402,7 +448,7 @@ | ||
402 | 448 | // |
403 | 449 | //============================================================================ |
404 | 450 | |
405 | -int ACSStringPool::AddString(const char *str, const SDWORD *stack, int stackdepth) | |
451 | +int ACSStringPool::AddString(const char *str) | |
406 | 452 | { |
407 | 453 | size_t len = strlen(str); |
408 | 454 | unsigned int h = SuperFastHash(str, len); |
@@ -413,10 +459,10 @@ | ||
413 | 459 | return i | STRPOOL_LIBRARYID_OR; |
414 | 460 | } |
415 | 461 | FString fstr(str); |
416 | - return InsertString(fstr, h, bucketnum, stack, stackdepth); | |
417 | -} | |
418 | - | |
419 | -int ACSStringPool::AddString(FString &str, const SDWORD *stack, int stackdepth) | |
462 | + return InsertString(fstr, h, bucketnum); | |
463 | +} | |
464 | + | |
465 | +int ACSStringPool::AddString(FString &str) | |
420 | 466 | { |
421 | 467 | unsigned int h = SuperFastHash(str.GetChars(), str.Len()); |
422 | 468 | unsigned int bucketnum = h % NUM_BUCKETS; |
@@ -425,7 +471,7 @@ | ||
425 | 471 | { |
426 | 472 | return i | STRPOOL_LIBRARYID_OR; |
427 | 473 | } |
428 | - return InsertString(str, h, bucketnum, stack, stackdepth); | |
474 | + return InsertString(str, h, bucketnum); | |
429 | 475 | } |
430 | 476 | |
431 | 477 | //============================================================================ |
@@ -695,12 +741,12 @@ | ||
695 | 741 | // |
696 | 742 | //============================================================================ |
697 | 743 | |
698 | -int ACSStringPool::InsertString(FString &str, unsigned int h, unsigned int bucketnum, const SDWORD *stack, int stackdepth) | |
744 | +int ACSStringPool::InsertString(FString &str, unsigned int h, unsigned int bucketnum) | |
699 | 745 | { |
700 | 746 | unsigned int index = FirstFreeEntry; |
701 | 747 | if (index >= MIN_GC_SIZE && index == Pool.Max()) |
702 | 748 | { // We will need to grow the array. Try a garbage collection first. |
703 | - P_CollectACSGlobalStrings(stack, stackdepth); | |
749 | + P_CollectACSGlobalStrings(); | |
704 | 750 | index = FirstFreeEntry; |
705 | 751 | } |
706 | 752 | if (FirstFreeEntry >= STRPOOL_LIBRARYID_OR) |
@@ -909,11 +955,11 @@ | ||
909 | 955 | // |
910 | 956 | //============================================================================ |
911 | 957 | |
912 | -void P_CollectACSGlobalStrings(const SDWORD *stack, int stackdepth) | |
913 | -{ | |
914 | - if (stack != NULL && stackdepth != 0) | |
915 | - { | |
916 | - GlobalACSStrings.MarkStringArray(stack, stackdepth); | |
958 | +void P_CollectACSGlobalStrings() | |
959 | +{ | |
960 | + for (FACSStack *stack = FACSStack::head; stack != NULL; stack = stack->next) | |
961 | + { | |
962 | + GlobalACSStrings.MarkStringArray(stack->buffer, stack->sp); | |
917 | 963 | } |
918 | 964 | FBehavior::StaticMarkLevelVarStrings(); |
919 | 965 | P_MarkWorldVarStrings(); |
@@ -924,7 +970,7 @@ | ||
924 | 970 | #ifdef _DEBUG |
925 | 971 | CCMD(acsgc) |
926 | 972 | { |
927 | - P_CollectACSGlobalStrings(NULL, 0); | |
973 | + P_CollectACSGlobalStrings(); | |
928 | 974 | } |
929 | 975 | CCMD(globstr) |
930 | 976 | { |
@@ -1507,7 +1553,7 @@ | ||
1507 | 1553 | // Returns some information of a team |
1508 | 1554 | // |
1509 | 1555 | //============================================================================ |
1510 | -static int GetTeamProperty (unsigned int team, int prop, const SDWORD *stack, int stackdepth) { | |
1556 | +static int GetTeamProperty (unsigned int team, int prop) { | |
1511 | 1557 | switch (prop) { |
1512 | 1558 | case TPROP_NumLivePlayers: |
1513 | 1559 | return TEAM_CountLivingAndRespawnablePlayers (team); |
@@ -1571,7 +1617,7 @@ | ||
1571 | 1617 | } |
1572 | 1618 | |
1573 | 1619 | // [Dusk] |
1574 | - res = ACS_PushAndReturnDynamicString ( work, stack, stackdepth ); | |
1620 | + res = ACS_PushAndReturnDynamicString ( work ); | |
1575 | 1621 | |
1576 | 1622 | STRINGBUILDER_FINISH(work); |
1577 | 1623 | return res; |
@@ -2274,7 +2320,7 @@ | ||
2274 | 2320 | const char *str = LookupString(MapVarStore[chunk[i+2]]); |
2275 | 2321 | if (str != NULL) |
2276 | 2322 | { |
2277 | - MapVarStore[chunk[i+2]] = GlobalACSStrings.AddString(str, NULL, 0); | |
2323 | + MapVarStore[chunk[i+2]] = GlobalACSStrings.AddString(str); | |
2278 | 2324 | } |
2279 | 2325 | } |
2280 | 2326 | } |
@@ -2294,7 +2340,7 @@ | ||
2294 | 2340 | const char *str = LookupString(*elems); |
2295 | 2341 | if (str != NULL) |
2296 | 2342 | { |
2297 | - *elems = GlobalACSStrings.AddString(str, NULL, 0); | |
2343 | + *elems = GlobalACSStrings.AddString(str); | |
2298 | 2344 | } |
2299 | 2345 | } |
2300 | 2346 | } |
@@ -2328,7 +2374,7 @@ | ||
2328 | 2374 | const char *str = LookupString(*elems); |
2329 | 2375 | if (str != NULL) |
2330 | 2376 | { |
2331 | - *elems = GlobalACSStrings.AddString(str, NULL, 0); | |
2377 | + *elems = GlobalACSStrings.AddString(str); | |
2332 | 2378 | } |
2333 | 2379 | } |
2334 | 2380 | } |
@@ -4407,7 +4453,7 @@ | ||
4407 | 4453 | } |
4408 | 4454 | } |
4409 | 4455 | |
4410 | -int DLevelScript::GetActorProperty (int tid, int property, const SDWORD *stack, int stackdepth) | |
4456 | +int DLevelScript::GetActorProperty (int tid, int property) | |
4411 | 4457 | { |
4412 | 4458 | AActor *actor = SingleActorFromTID (tid, activator); |
4413 | 4459 |
@@ -4491,13 +4537,13 @@ | ||
4491 | 4537 | return 0; |
4492 | 4538 | } |
4493 | 4539 | |
4494 | - case APROP_SeeSound: return GlobalACSStrings.AddString(actor->SeeSound, stack, stackdepth); | |
4495 | - case APROP_AttackSound: return GlobalACSStrings.AddString(actor->AttackSound, stack, stackdepth); | |
4496 | - case APROP_PainSound: return GlobalACSStrings.AddString(actor->PainSound, stack, stackdepth); | |
4497 | - case APROP_DeathSound: return GlobalACSStrings.AddString(actor->DeathSound, stack, stackdepth); | |
4498 | - case APROP_ActiveSound: return GlobalACSStrings.AddString(actor->ActiveSound, stack, stackdepth); | |
4499 | - case APROP_Species: return GlobalACSStrings.AddString(actor->GetSpecies(), stack, stackdepth); | |
4500 | - case APROP_NameTag: return GlobalACSStrings.AddString(actor->GetTag(), stack, stackdepth); | |
4540 | + case APROP_SeeSound: return GlobalACSStrings.AddString(actor->SeeSound); | |
4541 | + case APROP_AttackSound: return GlobalACSStrings.AddString(actor->AttackSound); | |
4542 | + case APROP_PainSound: return GlobalACSStrings.AddString(actor->PainSound); | |
4543 | + case APROP_DeathSound: return GlobalACSStrings.AddString(actor->DeathSound); | |
4544 | + case APROP_ActiveSound: return GlobalACSStrings.AddString(actor->ActiveSound); | |
4545 | + case APROP_Species: return GlobalACSStrings.AddString(actor->GetSpecies()); | |
4546 | + case APROP_NameTag: return GlobalACSStrings.AddString(actor->GetTag()); | |
4501 | 4547 | case APROP_StencilColor:return actor->fillcolor; |
4502 | 4548 | |
4503 | 4549 | default: return 0; |
@@ -4546,7 +4592,7 @@ | ||
4546 | 4592 | case APROP_ViewHeight: |
4547 | 4593 | case APROP_AttackZOffset: |
4548 | 4594 | case APROP_StencilColor: |
4549 | - return (GetActorProperty(tid, property, NULL, 0) == value); | |
4595 | + return (GetActorProperty(tid, property) == value); | |
4550 | 4596 | |
4551 | 4597 | // Boolean values need to compare to a binary version of value |
4552 | 4598 | case APROP_Ambush: |
@@ -4558,7 +4604,7 @@ | ||
4558 | 4604 | case APROP_Notarget: |
4559 | 4605 | case APROP_Notrigger: |
4560 | 4606 | case APROP_Dormant: |
4561 | - return (GetActorProperty(tid, property, NULL, 0) == (!!value)); | |
4607 | + return (GetActorProperty(tid, property) == (!!value)); | |
4562 | 4608 | |
4563 | 4609 | // Strings are covered by GetActorProperty, but they're fairly |
4564 | 4610 | // heavy-duty, so make the check here. |
@@ -5111,14 +5157,14 @@ | ||
5111 | 5157 | } |
5112 | 5158 | |
5113 | 5159 | // Converts floating- to fixed-point as required. |
5114 | -static int DoGetCVar(FBaseCVar *cvar, bool is_string, const SDWORD *stack, int stackdepth) | |
5160 | +static int DoGetCVar(FBaseCVar *cvar, bool is_string) | |
5115 | 5161 | { |
5116 | 5162 | UCVarValue val; |
5117 | 5163 | |
5118 | 5164 | if (is_string) |
5119 | 5165 | { |
5120 | 5166 | val = cvar->GetGenericRep(CVAR_String); |
5121 | - return GlobalACSStrings.AddString(val.String, stack, stackdepth); | |
5167 | + return GlobalACSStrings.AddString(val.String); | |
5122 | 5168 | } |
5123 | 5169 | else if (cvar->GetRealType() == CVAR_Float) |
5124 | 5170 | { |
@@ -5132,7 +5178,7 @@ | ||
5132 | 5178 | } |
5133 | 5179 | } |
5134 | 5180 | |
5135 | -static int GetUserCVar(int playernum, const char *cvarname, bool is_string, const SDWORD *stack, int stackdepth) | |
5181 | +static int GetUserCVar(int playernum, const char *cvarname, bool is_string) | |
5136 | 5182 | { |
5137 | 5183 | if ((unsigned)playernum >= MAXPLAYERS || !playeringame[playernum]) |
5138 | 5184 | { |
@@ -5144,10 +5190,10 @@ | ||
5144 | 5190 | { |
5145 | 5191 | return 0; |
5146 | 5192 | } |
5147 | - return DoGetCVar(cvar, is_string, stack, stackdepth); | |
5148 | -} | |
5149 | - | |
5150 | -static int GetCVar(AActor *activator, const char *cvarname, bool is_string, const SDWORD *stack, int stackdepth) | |
5193 | + return DoGetCVar(cvar, is_string); | |
5194 | +} | |
5195 | + | |
5196 | +static int GetCVar(AActor *activator, const char *cvarname, bool is_string) | |
5151 | 5197 | { |
5152 | 5198 | FBaseCVar *cvar = FindCVar(cvarname, NULL); |
5153 | 5199 | // Either the cvar doesn't exist, or it's for a mod that isn't loaded, so return 0. |
@@ -5165,13 +5211,13 @@ | ||
5165 | 5211 | // [BB] Compatibility with Zandronum 2.x: In CLIENTSIDE scripts, |
5166 | 5212 | // return the value belonging to the consoleplayer |
5167 | 5213 | if ( NETWORK_InClientMode() ) |
5168 | - return GetUserCVar(consoleplayer, cvarname, is_string, stack, stackdepth); | |
5214 | + return GetUserCVar(consoleplayer, cvarname, is_string); | |
5169 | 5215 | |
5170 | 5216 | return 0; |
5171 | 5217 | } |
5172 | - return GetUserCVar(int(activator->player - players), cvarname, is_string, stack, stackdepth); | |
5173 | - } | |
5174 | - return DoGetCVar(cvar, is_string, stack, stackdepth); | |
5218 | + return GetUserCVar(int(activator->player - players), cvarname, is_string); | |
5219 | + } | |
5220 | + return DoGetCVar(cvar, is_string); | |
5175 | 5221 | } |
5176 | 5222 | } |
5177 | 5223 |
@@ -5314,7 +5360,7 @@ | ||
5314 | 5360 | |
5315 | 5361 | |
5316 | 5362 | |
5317 | -int DLevelScript::CallFunction(int argCount, int funcIndex, SDWORD *args, const SDWORD *stack, int stackdepth) | |
5363 | +int DLevelScript::CallFunction(int argCount, int funcIndex, SDWORD *args) | |
5318 | 5364 | { |
5319 | 5365 | AActor *actor; |
5320 | 5366 | switch(funcIndex) |
@@ -5489,7 +5535,7 @@ | ||
5489 | 5535 | switch(args[0]) |
5490 | 5536 | { |
5491 | 5537 | case ARMORINFO_CLASSNAME: |
5492 | - return GlobalACSStrings.AddString(equippedarmor->ArmorType.GetChars(), stack, stackdepth); | |
5538 | + return GlobalACSStrings.AddString(equippedarmor->ArmorType.GetChars()); | |
5493 | 5539 | |
5494 | 5540 | case ARMORINFO_SAVEAMOUNT: |
5495 | 5541 | return equippedarmor->MaxAmount; |
@@ -5507,7 +5553,7 @@ | ||
5507 | 5553 | return 0; |
5508 | 5554 | } |
5509 | 5555 | } |
5510 | - return args[0] == ARMORINFO_CLASSNAME ? GlobalACSStrings.AddString("None", stack, stackdepth) : 0; | |
5556 | + return args[0] == ARMORINFO_CLASSNAME ? GlobalACSStrings.AddString("None") : 0; | |
5511 | 5557 | } |
5512 | 5558 | |
5513 | 5559 | case ACSF_SpawnSpotForced: |
@@ -5626,7 +5672,7 @@ | ||
5626 | 5672 | case ACSF_GetActorClass: |
5627 | 5673 | { |
5628 | 5674 | AActor *a = SingleActorFromTID(args[0], activator); |
5629 | - return GlobalACSStrings.AddString(a == NULL ? "None" : a->GetClass()->TypeName.GetChars(), stack, stackdepth); | |
5675 | + return GlobalACSStrings.AddString(a == NULL ? "None" : a->GetClass()->TypeName.GetChars()); | |
5630 | 5676 | } |
5631 | 5677 | |
5632 | 5678 | case ACSF_SoundSequenceOnActor: |
@@ -5803,7 +5849,7 @@ | ||
5803 | 5849 | case ACSF_GetCVarString: |
5804 | 5850 | if (argCount == 1) |
5805 | 5851 | { |
5806 | - return GetCVar(activator, FBehavior::StaticLookupString(args[0]), true, stack, stackdepth); | |
5852 | + return GetCVar(activator, FBehavior::StaticLookupString(args[0]), true); | |
5807 | 5853 | } |
5808 | 5854 | break; |
5809 | 5855 |
@@ -5824,14 +5870,14 @@ | ||
5824 | 5870 | case ACSF_GetUserCVar: |
5825 | 5871 | if (argCount == 2) |
5826 | 5872 | { |
5827 | - return GetUserCVar(args[0], FBehavior::StaticLookupString(args[1]), false, stack, stackdepth); | |
5873 | + return GetUserCVar(args[0], FBehavior::StaticLookupString(args[1]), false); | |
5828 | 5874 | } |
5829 | 5875 | break; |
5830 | 5876 | |
5831 | 5877 | case ACSF_GetUserCVarString: |
5832 | 5878 | if (argCount == 2) |
5833 | 5879 | { |
5834 | - return GetUserCVar(args[0], FBehavior::StaticLookupString(args[1]), true, stack, stackdepth); | |
5880 | + return GetUserCVar(args[0], FBehavior::StaticLookupString(args[1]), true); | |
5835 | 5881 | } |
5836 | 5882 | break; |
5837 | 5883 |
@@ -6007,7 +6053,7 @@ | ||
6007 | 6053 | const char *oldstr = FBehavior::StaticLookupString(args[0]); |
6008 | 6054 | if (oldstr == NULL || *oldstr == '\0') |
6009 | 6055 | { |
6010 | - return GlobalACSStrings.AddString("", stack, stackdepth); | |
6056 | + return GlobalACSStrings.AddString(""); | |
6011 | 6057 | } |
6012 | 6058 | size_t oldlen = strlen(oldstr); |
6013 | 6059 | size_t newlen = args[1]; |
@@ -6017,7 +6063,7 @@ | ||
6017 | 6063 | newlen = oldlen; |
6018 | 6064 | } |
6019 | 6065 | FString newstr(funcIndex == ACSF_StrLeft ? oldstr : oldstr + oldlen - newlen, newlen); |
6020 | - return GlobalACSStrings.AddString(newstr, stack, stackdepth); | |
6066 | + return GlobalACSStrings.AddString(newstr); | |
6021 | 6067 | } |
6022 | 6068 | break; |
6023 | 6069 |
@@ -6027,7 +6073,7 @@ | ||
6027 | 6073 | const char *oldstr = FBehavior::StaticLookupString(args[0]); |
6028 | 6074 | if (oldstr == NULL || *oldstr == '\0') |
6029 | 6075 | { |
6030 | - return GlobalACSStrings.AddString("", stack, stackdepth); | |
6076 | + return GlobalACSStrings.AddString(""); | |
6031 | 6077 | } |
6032 | 6078 | size_t oldlen = strlen(oldstr); |
6033 | 6079 | size_t pos = args[1]; |
@@ -6035,13 +6081,13 @@ | ||
6035 | 6081 | |
6036 | 6082 | if (pos >= oldlen) |
6037 | 6083 | { |
6038 | - return GlobalACSStrings.AddString("", stack, stackdepth); | |
6084 | + return GlobalACSStrings.AddString(""); | |
6039 | 6085 | } |
6040 | 6086 | if (pos + newlen > oldlen || pos + newlen < pos) |
6041 | 6087 | { |
6042 | 6088 | newlen = oldlen - pos; |
6043 | 6089 | } |
6044 | - return GlobalACSStrings.AddString(FString(oldstr + pos, newlen), stack, stackdepth); | |
6090 | + return GlobalACSStrings.AddString(FString(oldstr + pos, newlen)); | |
6045 | 6091 | } |
6046 | 6092 | break; |
6047 | 6093 |
@@ -6049,11 +6095,11 @@ | ||
6049 | 6095 | if (activator == NULL || activator->player == NULL || // Non-players do not have weapons |
6050 | 6096 | activator->player->ReadyWeapon == NULL) |
6051 | 6097 | { |
6052 | - return GlobalACSStrings.AddString("None", stack, stackdepth); | |
6098 | + return GlobalACSStrings.AddString("None"); | |
6053 | 6099 | } |
6054 | 6100 | else |
6055 | 6101 | { |
6056 | - return GlobalACSStrings.AddString(activator->player->ReadyWeapon->GetClass()->TypeName.GetChars(), stack, stackdepth); | |
6102 | + return GlobalACSStrings.AddString(activator->player->ReadyWeapon->GetClass()->TypeName.GetChars()); | |
6057 | 6103 | } |
6058 | 6104 | |
6059 | 6105 | case ACSF_SpawnDecal: |
@@ -6542,7 +6588,7 @@ | ||
6542 | 6588 | // [Dusk] |
6543 | 6589 | case ACSF_GetTeamProperty: |
6544 | 6590 | { |
6545 | - return GetTeamProperty (args[0], args[1], stack, stackdepth); | |
6591 | + return GetTeamProperty (args[0], args[1]); | |
6546 | 6592 | } |
6547 | 6593 | |
6548 | 6594 | case ACSF_GetPlayerLivesLeft: |
@@ -6607,7 +6653,7 @@ | ||
6607 | 6653 | // [BB] |
6608 | 6654 | case ACSF_GetDBEntryString: |
6609 | 6655 | { |
6610 | - return ACS_PushAndReturnDynamicString ( DATABASE_SaveGetEntry ( FBehavior::StaticLookupString(args[0]), FBehavior::StaticLookupString(args[1]) ), stack, stackdepth ); | |
6656 | + return ACS_PushAndReturnDynamicString ( DATABASE_SaveGetEntry ( FBehavior::StaticLookupString(args[0]), FBehavior::StaticLookupString(args[1]) ) ); | |
6611 | 6657 | } |
6612 | 6658 | |
6613 | 6659 | // [BB] |
@@ -6637,7 +6683,7 @@ | ||
6637 | 6683 | { |
6638 | 6684 | work = SERVER_GetClient( ulPlayer )->GetAccountName(); |
6639 | 6685 | } |
6640 | - return ACS_PushAndReturnDynamicString ( work, stack, stackdepth ); | |
6686 | + return ACS_PushAndReturnDynamicString ( work ); | |
6641 | 6687 | } |
6642 | 6688 | |
6643 | 6689 | case ACSF_SortDBEntries: |
@@ -6689,7 +6735,7 @@ | ||
6689 | 6735 | } |
6690 | 6736 | else |
6691 | 6737 | work = "Invalid handle"; |
6692 | - return ACS_PushAndReturnDynamicString ( work, stack, stackdepth ); | |
6738 | + return ACS_PushAndReturnDynamicString ( work ); | |
6693 | 6739 | } |
6694 | 6740 | |
6695 | 6741 | case ACSF_GetDBResultValue: |
@@ -6780,7 +6826,7 @@ | ||
6780 | 6826 | if ( strftime( buffer, sizeof buffer, format, timeinfo ) == 0 ) |
6781 | 6827 | buffer[0] = '\0'; // Zero the result if strftime fails |
6782 | 6828 | |
6783 | - return ACS_PushAndReturnDynamicString( buffer, stack, stackdepth ); | |
6829 | + return ACS_PushAndReturnDynamicString( buffer ); | |
6784 | 6830 | } |
6785 | 6831 | |
6786 | 6832 | case ACSF_SetDeadSpectator: |
@@ -6867,11 +6913,11 @@ | ||
6867 | 6913 | auto a = SingleActorFromTID(args[0], activator); |
6868 | 6914 | if (a != nullptr) |
6869 | 6915 | { |
6870 | - return GlobalACSStrings.AddString(TexMan[a->floorpic]->Name, stack, stackdepth); | |
6916 | + return GlobalACSStrings.AddString(TexMan[a->floorpic]->Name); | |
6871 | 6917 | } |
6872 | 6918 | else |
6873 | 6919 | { |
6874 | - return GlobalACSStrings.AddString("", stack, stackdepth); | |
6920 | + return GlobalACSStrings.AddString(""); | |
6875 | 6921 | } |
6876 | 6922 | break; |
6877 | 6923 | } |
@@ -6978,8 +7024,10 @@ | ||
6978 | 7024 | break; |
6979 | 7025 | } |
6980 | 7026 | |
6981 | - SDWORD Stack[STACK_SIZE]; | |
6982 | - int sp = 0; | |
7027 | + FACSStack stackobj; | |
7028 | + SDWORD *Stack = stackobj.buffer; | |
7029 | + int &sp = stackobj.sp; | |
7030 | + | |
6983 | 7031 | int *pc = this->pc; |
6984 | 7032 | ACSFormat fmt = activeBehavior->GetFormat(); |
6985 | 7033 | unsigned int runaway = 0; // used to prevent infinite loops |
@@ -7035,7 +7083,7 @@ | ||
7035 | 7083 | |
7036 | 7084 | case PCD_TAGSTRING: |
7037 | 7085 | //Stack[sp-1] |= activeBehavior->GetLibraryID(); |
7038 | - Stack[sp-1] = GlobalACSStrings.AddString(activeBehavior->LookupString(Stack[sp-1]), Stack, sp); | |
7086 | + Stack[sp-1] = GlobalACSStrings.AddString(activeBehavior->LookupString(Stack[sp-1])); | |
7039 | 7087 | break; |
7040 | 7088 | |
7041 | 7089 | case PCD_PUSHNUMBER: |
@@ -7233,7 +7281,7 @@ | ||
7233 | 7281 | int argCount = NEXTBYTE; |
7234 | 7282 | int funcIndex = NEXTSHORT; |
7235 | 7283 | |
7236 | - int retval = CallFunction(argCount, funcIndex, &STACK(argCount), Stack, sp); | |
7284 | + int retval = CallFunction(argCount, funcIndex, &STACK(argCount)); | |
7237 | 7285 | sp -= argCount-1; |
7238 | 7286 | STACK(1) = retval; |
7239 | 7287 | } |
@@ -10024,7 +10072,7 @@ | ||
10024 | 10072 | break; |
10025 | 10073 | |
10026 | 10074 | case PCD_GETACTORPROPERTY: |
10027 | - STACK(2) = GetActorProperty (STACK(2), STACK(1), Stack, sp); | |
10075 | + STACK(2) = GetActorProperty (STACK(2), STACK(1)); | |
10028 | 10076 | sp -= 1; |
10029 | 10077 | break; |
10030 | 10078 |
@@ -10156,7 +10204,7 @@ | ||
10156 | 10204 | break; |
10157 | 10205 | |
10158 | 10206 | case PCD_GETCVAR: |
10159 | - STACK(1) = GetCVar(activator, FBehavior::StaticLookupString(STACK(1)), false, Stack, sp); | |
10207 | + STACK(1) = GetCVar(activator, FBehavior::StaticLookupString(STACK(1)), false); | |
10160 | 10208 | break; |
10161 | 10209 | |
10162 | 10210 | case PCD_SETHUDSIZE: |
@@ -10536,7 +10584,7 @@ | ||
10536 | 10584 | case PCD_SAVESTRING: |
10537 | 10585 | // Saves the string |
10538 | 10586 | { |
10539 | - const int str = GlobalACSStrings.AddString(work, Stack, sp); | |
10587 | + const int str = GlobalACSStrings.AddString(work); | |
10540 | 10588 | PushToStack(str); |
10541 | 10589 | STRINGBUILDER_FINISH(work); |
10542 | 10590 | } |
@@ -88,8 +88,8 @@ | ||
88 | 88 | { |
89 | 89 | public: |
90 | 90 | ACSStringPool(); |
91 | - int AddString(const char *str, const SDWORD *stack, int stackdepth); | |
92 | - int AddString(FString &str, const SDWORD *stack, int stackdepth); | |
91 | + int AddString(const char *str); | |
92 | + int AddString(FString &str); | |
93 | 93 | const char *GetString(int strnum); |
94 | 94 | void LockString(int strnum); |
95 | 95 | void UnlockString(int strnum); |
@@ -107,7 +107,7 @@ | ||
107 | 107 | |
108 | 108 | private: |
109 | 109 | int FindString(const char *str, size_t len, unsigned int h, unsigned int bucketnum); |
110 | - int InsertString(FString &str, unsigned int h, unsigned int bucketnum, const SDWORD *stack, int stackdepth); | |
110 | + int InsertString(FString &str, unsigned int h, unsigned int bucketnum); | |
111 | 111 | void FindFirstFreeEntry(unsigned int base); |
112 | 112 | |
113 | 113 | enum { NUM_BUCKETS = 251 }; |
@@ -127,7 +127,7 @@ | ||
127 | 127 | }; |
128 | 128 | extern ACSStringPool GlobalACSStrings; |
129 | 129 | |
130 | -void P_CollectACSGlobalStrings(const SDWORD *stack, int stackdepth); | |
130 | +void P_CollectACSGlobalStrings(); | |
131 | 131 | void P_ReadACSVars(PNGHandle *); |
132 | 132 | void P_WriteACSVars(FILE*); |
133 | 133 | void P_ClearACSVars(bool); |
@@ -929,7 +929,7 @@ | ||
929 | 929 | int DoSpawnSpot (int type, int spot, int tid, int angle, bool forced); |
930 | 930 | int DoSpawnSpotFacing (int type, int spot, int tid, bool forced); |
931 | 931 | int DoClassifyActor (int tid); |
932 | - int CallFunction(int argCount, int funcIndex, SDWORD *args, const SDWORD *stack, int stackdepth); | |
932 | + int CallFunction(int argCount, int funcIndex, SDWORD *args); | |
933 | 933 | |
934 | 934 | void DoFadeTo (int r, int g, int b, int a, fixed_t time); |
935 | 935 | void DoFadeRange (int r1, int g1, int b1, int a1, |
@@ -937,7 +937,7 @@ | ||
937 | 937 | void DoSetFont (int fontnum); |
938 | 938 | void SetActorProperty (int tid, int property, int value); |
939 | 939 | void DoSetActorProperty (AActor *actor, int property, int value); |
940 | - int GetActorProperty (int tid, int property, const SDWORD *stack, int stackdepth); | |
940 | + int GetActorProperty (int tid, int property); | |
941 | 941 | int CheckActorProperty (int tid, int property, int value); |
942 | 942 | int GetPlayerInput (int playernum, int inputnum); |
943 | 943 |
@@ -1008,7 +1008,7 @@ | ||
1008 | 1008 | bool ACS_IsScriptClientSide( const ScriptPtr *pScriptData ); |
1009 | 1009 | bool ACS_IsScriptPukeable( ULONG ulScript ); |
1010 | 1010 | int ACS_GetTranslationIndex( FRemapTable *pTranslation ); |
1011 | -int ACS_PushAndReturnDynamicString ( const FString &Work, const SDWORD *stack, int stackdepth ); | |
1011 | +int ACS_PushAndReturnDynamicString ( const FString &Work ); | |
1012 | 1012 | bool ACS_ExistsScript( int script ); |
1013 | 1013 | |
1014 | 1014 | // [BB] Export DoGiveInv |