diff --git a/src/posix/cocoa/i_main.mm b/src/posix/cocoa/i_main.mm index 851e72e48..0d426caaa 100644 --- a/src/posix/cocoa/i_main.mm +++ b/src/posix/cocoa/i_main.mm @@ -173,7 +173,9 @@ static void I_DetectOS() "Unknown"; #endif - Printf("OS: %s %d.%d.%d (%s) %s\n", name, majorVersion, minorVersion, bugFixVersion, release, architecture); + Printf("OS: %s %d.%d.%d (%s) %s\n", name, + int(majorVersion), int(minorVersion), int(bugFixVersion), + release, architecture); } diff --git a/src/scripting/backend/codegen.cpp b/src/scripting/backend/codegen.cpp index dc904b804..0ea6517da 100644 --- a/src/scripting/backend/codegen.cpp +++ b/src/scripting/backend/codegen.cpp @@ -8815,7 +8815,8 @@ ExpEmit FxVMFunctionCall::Emit(VMFunctionBuilder *build) if (outerside == FScopeBarrier::Side_Virtual) outerside = FScopeBarrier::SideFromObjectFlags(CallingFunction->OwningClass->ObjectFlags); - if (selfside != outerside && (selfside == FScopeBarrier::Side_Play || selfside == FScopeBarrier::Side_UI)) // if the self pointer and the calling functions have the same scope the check here is not needed. + // [ZZ] only emit if target side cannot be checked at compile time. + if (selfside == FScopeBarrier::Side_PlainData) { // Check the self object against the calling function's flags at run time build->Emit(OP_SCOPE, selfemit.RegNum, outerside + 1, build->GetConstantAddress(vmfunc, ATAG_OBJECT)); diff --git a/src/scripting/decorate/thingdef_parse.cpp b/src/scripting/decorate/thingdef_parse.cpp index 05a927288..7ccc0b7d7 100644 --- a/src/scripting/decorate/thingdef_parse.cpp +++ b/src/scripting/decorate/thingdef_parse.cpp @@ -97,6 +97,13 @@ PClassActor *DecoDerivedClass(const FScriptPosition &sc, PClassActor *parent, FN sc.Message(MSG_FATAL, "Tried to define class '%s' more than twice in the same file.", typeName.GetChars()); } } + + if (type != nullptr) + { + // [ZZ] DECORATE classes are always play + type->ObjectFlags = FScopeBarrier::ChangeSideInObjectFlags(type->ObjectFlags, FScopeBarrier::Side_Play); + } + return type; } diff --git a/src/scripting/vm/vmexec.h b/src/scripting/vm/vmexec.h index b588d15d3..900d06ffa 100644 --- a/src/scripting/vm/vmexec.h +++ b/src/scripting/vm/vmexec.h @@ -648,10 +648,10 @@ begin: reg.a[a] = p->Virtuals[C]; } NEXTOP; - OP(SCOPE) : - { - ASSERTA(a); ASSERTA(C); - FScopeBarrier::ValidateCall(((DObject*)konsta[a].v)->GetClass(), (VMFunction*)konsta[C].v, B - 1); + OP(SCOPE): + { + ASSERTA(a); ASSERTKA(C); + FScopeBarrier::ValidateCall(((DObject*)reg.a[a])->GetClass(), (VMFunction*)konsta[C].v, B - 1); } NEXTOP; diff --git a/src/scripting/zscript/zcc_compile.cpp b/src/scripting/zscript/zcc_compile.cpp index 222c20a26..f18c3230f 100644 --- a/src/scripting/zscript/zcc_compile.cpp +++ b/src/scripting/zscript/zcc_compile.cpp @@ -658,12 +658,12 @@ void ZCCCompiler::CreateClassTypes() { Error(c->cls, "Can't change class scope in class %s", c->NodeName().GetChars()); } - c->Type()->ObjectFlags = (c->Type()->ObjectFlags & ~(OF_UI | OF_Play)) | (parent->ObjectFlags & (OF_UI | OF_Play)); + c->Type()->ObjectFlags = FScopeBarrier::ChangeSideInObjectFlags(c->Type()->ObjectFlags, FScopeBarrier::SideFromObjectFlags(parent->ObjectFlags)); } } else { - c->Type()->ObjectFlags = (c->Type()->ObjectFlags&~OF_UI) | OF_Play; + c->Type()->ObjectFlags = FScopeBarrier::ChangeSideInObjectFlags(c->Type()->ObjectFlags, FScopeBarrier::Side_Play); } c->Type()->bExported = true; // this class is accessible to script side type casts. (The reason for this flag is that types like PInt need to be skipped.) diff --git a/src/sound/music_audiotoolbox_mididevice.cpp b/src/sound/music_audiotoolbox_mididevice.cpp index 3dc57fdb0..ba48055e5 100644 --- a/src/sound/music_audiotoolbox_mididevice.cpp +++ b/src/sound/music_audiotoolbox_mididevice.cpp @@ -35,7 +35,7 @@ { \ DPrintf(DMSG_ERROR, \ "Failed with error 0x%08X at " __FILE__ ":%d:\n> %s", \ - result, __LINE__, #CALL); \ + int(result), __LINE__, #CALL); \ return __VA_ARGS__; \ } \ } @@ -55,7 +55,7 @@ int AudioToolboxMIDIDevice::Open(void (*callback)(unsigned int, void *, DWORD, D return 1; } - CFRunLoopAddTimer(CFRunLoopGetMain(), m_timer, kCFRunLoopDefaultMode); + CFRunLoopAddTimer(CFRunLoopGetCurrent(), m_timer, kCFRunLoopDefaultMode); m_callback = callback; m_userData = userData; @@ -73,7 +73,7 @@ void AudioToolboxMIDIDevice::Close() if (nullptr != m_timer) { - CFRunLoopRemoveTimer(CFRunLoopGetMain(), m_timer, kCFRunLoopDefaultMode); + CFRunLoopRemoveTimer(CFRunLoopGetCurrent(), m_timer, kCFRunLoopDefaultMode); CFRelease(m_timer); m_timer = nullptr; @@ -142,9 +142,16 @@ int AudioToolboxMIDIDevice::Resume() AUNode node; AT_MIDI_CHECK_ERROR(AUGraphGetIndNode(graph, i, &node), false); - AudioComponentDescription desc = {}; AudioUnit audioUnit = nullptr; +#if MAC_OS_X_VERSION_MAX_ALLOWED < 1050 + ComponentDescription desc = {}; + UInt32 classdatasize = 0; + void *classdata = nullptr; + AT_MIDI_CHECK_ERROR(AUGraphGetNodeInfo(graph, node, &desc, &classdatasize, &classdata, &audioUnit), false); +#else // 10.5 and above + AudioComponentDescription desc = {}; AT_MIDI_CHECK_ERROR(AUGraphNodeInfo(graph, node, &desc, &audioUnit), false); +#endif // prior to 10.5 if ( kAudioUnitType_Output != desc.componentType || kAudioUnitSubType_DefaultOutput != desc.componentSubType) @@ -260,7 +267,11 @@ bool AudioToolboxMIDIDevice::Preprocess(MIDIStreamer* song, bool looping) return false; } +#if MAC_OS_X_VERSION_MAX_ALLOWED < 1050 + AT_MIDI_CHECK_ERROR(MusicSequenceLoadSMFDataWithFlags(m_sequence, data, 0), false); +#else // 10.5 and above AT_MIDI_CHECK_ERROR(MusicSequenceFileLoadData(m_sequence, data, kMusicSequenceFile_MIDIType, 0), CFRelease(data), false); +#endif // prior to 10.5 CFRelease(data); diff --git a/src/stats.h b/src/stats.h index f18159616..c82410db1 100644 --- a/src/stats.h +++ b/src/stats.h @@ -130,6 +130,15 @@ inline unsigned long long rdtsc() unsigned long long tsc; asm volatile ("rdtsc; shlq $32, %%rdx; orq %%rdx, %%rax" : "=a" (tsc) :: "%rdx"); return tsc; +#elif defined __ppc__ + unsigned int lower, upper, temp; + do + { + asm volatile ("mftbu %0 \n mftb %1 \n mftbu %2 \n" + : "=r"(upper), "=r"(lower), "=r"(temp)); + } + while (upper != temp); + return (static_cast(upper) << 32) | lower; #else // i386 if (CPU.bRDTSC) {