mirror of
https://github.com/par274/sharpemu.git
synced 2026-07-16 00:40:59 +00:00
* [Json] Implement sce::Json::Value and Json::String construct/set/destroy libSceJson previously only had the Initializer/MemAllocator setup path. The Value and String classes themselves were entirely absent, so a Prospero title that builds a JSON tree (Quake PPSA01880 does, to shape a web-API request) hit unresolved imports and faulted on the call. The imports it left unresolved right before its access violation are exactly these Value ctors/setters and String ctor/dtor. Model the Value/String payload host-side (JsonObjectHeap), keyed by the guest `this` pointer, following the handle-shadow pattern already used by Ngs2Exports. The guest object bytes are deliberately not written: these objects are usually stack-allocated with an unknown real layout, and writing a guessed layout risks smashing an adjacent stack canary (the same hazard the AudioOut2 context-param note in this tree records). Constructors and setters follow the Itanium ABI and return `this` in rax, which is correct whether the real setter returns void or Value&. Covered NIDs (complete-object C1/D1 variants, matching the observed imports): Value(default/bool/long/ulong/double/ValueType/char*/String), Value::~Value, Value::set(bool/long/ulong/double/ValueType/char*/String), Value::clear, String(char*/default/copy), String::~String. Only the payload the guest can reach through library methods is modelled; direct guest reads of the object bytes are out of scope and would need observed layout evidence. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * [Tests] Add SharpEmu.Libs.Tests covering the Json Value/String exports First test project for SharpEmu.Libs (xunit), the SharpEmu.Libs.Tests layout the maintainer already agreed to in issue #36. - A FakeCpuMemory (single contiguous region) drives the exports at the CpuContext level with no live guest. - Direct-call tests: ctor/setter round-trips for bool/int/uint/double (read from xmm0)/char*/String/ValueType, destructor cleanup, and the graceful-degradation paths (missing String shadow and a faulting char* pointer both fall back to the empty string instead of throwing). - Registration test: a real ModuleManager scans SharpEmu.Libs and the nine NIDs Quake left unresolved now resolve to the libSceJson exports and dispatch cleanly (returns `this` in rax). InternalsVisibleTo exposes JsonObjectHeap to the test assembly. The test project's packages.lock.json is committed for CI locked-mode restore; CI does not run tests yet, left as a maintainer decision. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * [Json] Add Initializer::setGlobalNullAccessCallback Quake calls it during kexPSNWebAPI::Initialize and treats the not-found error as fatal for the whole Np Web API bring-up. Store the guest hook (never invoked by this HLE: shadows degrade to defaults instead of dereferencing missing members) and return success. Verified against the dump: the "setGlobalNullAccessCallback failed (0x80020002)" line is gone and kexPSNWebAPI::Initialize now logs "Np Web API Initialized"; the next blockers are sceNpAuthCreateRequest and sceUserServiceInitialize ordering, outside libSceJson. Also pins both Json test classes to one xunit collection: they share JsonObjectHeap statics and parallel class execution raced ResetForTests against a running test. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> --------- Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
212 lines
7.7 KiB
JSON
212 lines
7.7 KiB
JSON
{
|
|
"version": 2,
|
|
"dependencies": {
|
|
"net10.0": {
|
|
"Microsoft.NET.Test.Sdk": {
|
|
"type": "Direct",
|
|
"requested": "[17.14.1, )",
|
|
"resolved": "17.14.1",
|
|
"contentHash": "HJKqKOE+vshXra2aEHpi2TlxYX7Z9VFYkr+E5rwEvHC8eIXiyO+K9kNm8vmNom3e2rA56WqxU+/N9NJlLGXsJQ==",
|
|
"dependencies": {
|
|
"Microsoft.CodeCoverage": "17.14.1",
|
|
"Microsoft.TestPlatform.TestHost": "17.14.1"
|
|
}
|
|
},
|
|
"xunit": {
|
|
"type": "Direct",
|
|
"requested": "[2.9.3, )",
|
|
"resolved": "2.9.3",
|
|
"contentHash": "TlXQBinK35LpOPKHAqbLY4xlEen9TBafjs0V5KnA4wZsoQLQJiirCR4CbIXvOH8NzkW4YeJKP5P/Bnrodm0h9Q==",
|
|
"dependencies": {
|
|
"xunit.analyzers": "1.18.0",
|
|
"xunit.assert": "2.9.3",
|
|
"xunit.core": "[2.9.3]"
|
|
}
|
|
},
|
|
"xunit.runner.visualstudio": {
|
|
"type": "Direct",
|
|
"requested": "[3.1.1, )",
|
|
"resolved": "3.1.1",
|
|
"contentHash": "gNu2zhnuwjq5vQlU4S7yK/lfaKZDLmtcu+vTjnhfTlMAUYn+Hmgu8IIX0UCwWepYkk+Szx03DHx1bDnc9Fd+9w=="
|
|
},
|
|
"Microsoft.CodeCoverage": {
|
|
"type": "Transitive",
|
|
"resolved": "17.14.1",
|
|
"contentHash": "pmTrhfFIoplzFVbhVwUquT+77CbGH+h4/3mBpdmIlYtBi9nAB+kKI6dN3A/nV4DFi3wLLx/BlHIPK+MkbQ6Tpg=="
|
|
},
|
|
"Microsoft.DotNet.PlatformAbstractions": {
|
|
"type": "Transitive",
|
|
"resolved": "3.1.6",
|
|
"contentHash": "jek4XYaQ/PGUwDKKhwR8K47Uh1189PFzMeLqO83mXrXQVIpARZCcfuDedH50YDTepBkfijCZN5U/vZi++erxtg=="
|
|
},
|
|
"Microsoft.Extensions.DependencyModel": {
|
|
"type": "Transitive",
|
|
"resolved": "9.0.9",
|
|
"contentHash": "fNGvKct2De8ghm0Bpfq0iWthtzIWabgOTi+gJhNOPhNJIowXNEUE2eZNW/zNCzrHVA3PXg2yZ+3cWZndC2IqYA=="
|
|
},
|
|
"Microsoft.TestPlatform.ObjectModel": {
|
|
"type": "Transitive",
|
|
"resolved": "17.14.1",
|
|
"contentHash": "xTP1W6Mi6SWmuxd3a+jj9G9UoC850WGwZUps1Wah9r1ZxgXhdJfj1QqDLJkFjHDCvN42qDL2Ps5KjQYWUU0zcQ=="
|
|
},
|
|
"Microsoft.TestPlatform.TestHost": {
|
|
"type": "Transitive",
|
|
"resolved": "17.14.1",
|
|
"contentHash": "d78LPzGKkJwsJXAQwsbJJ7LE7D1wB+rAyhHHAaODF+RDSQ0NgMjDFkSA1Djw18VrxO76GlKAjRUhl+H8NL8Z+Q==",
|
|
"dependencies": {
|
|
"Microsoft.TestPlatform.ObjectModel": "17.14.1",
|
|
"Newtonsoft.Json": "13.0.3"
|
|
}
|
|
},
|
|
"Newtonsoft.Json": {
|
|
"type": "Transitive",
|
|
"resolved": "13.0.3",
|
|
"contentHash": "HrC5BXdl00IP9zeV+0Z848QWPAoCr9P3bDEZguI+gkLcBKAOxix/tLEAAHC+UvDNPv4a2d18lOReHMOagPa+zQ=="
|
|
},
|
|
"Silk.NET.Core": {
|
|
"type": "Transitive",
|
|
"resolved": "2.23.0",
|
|
"contentHash": "D7AT/nnwlB+4RZ84XY8QNGBZMJI5z9l4CSSETIJ1wCfRJzRt/341y3MRZ4HbnFz4r/IGaWOEZr86iE+0/65yyQ==",
|
|
"dependencies": {
|
|
"Microsoft.DotNet.PlatformAbstractions": "3.1.6",
|
|
"Microsoft.Extensions.DependencyModel": "9.0.9"
|
|
}
|
|
},
|
|
"Silk.NET.GLFW": {
|
|
"type": "Transitive",
|
|
"resolved": "2.23.0",
|
|
"contentHash": "UIs4sH57xlPUNHQ/1bt9rymPWlGy8IMDCNv86h0iM4TOA1CkIx0XM/n/tA4AReh1zQkNrvkxPEdZ3Blvy1dyXg==",
|
|
"dependencies": {
|
|
"Silk.NET.Core": "2.23.0",
|
|
"Ultz.Native.GLFW": "3.4.0"
|
|
}
|
|
},
|
|
"Silk.NET.Maths": {
|
|
"type": "Transitive",
|
|
"resolved": "2.23.0",
|
|
"contentHash": "r8PdIVzME8EH0qAgbmRPO87I4GfgR2j8TofT7EMuRJDf1QluoQwnVypDoFJjQ2ZBSRsGYk5unYxxogI05Ogsmw=="
|
|
},
|
|
"Silk.NET.Windowing.Common": {
|
|
"type": "Transitive",
|
|
"resolved": "2.23.0",
|
|
"contentHash": "ThStSinmY9KQI8DGiF5XEhkLJVnBcgRTBTzL9ijg1wMZAYuckz7ykrNw04fjRm2Gryh6tCNGbvz2XaY0efeFzg==",
|
|
"dependencies": {
|
|
"Silk.NET.Core": "2.23.0",
|
|
"Silk.NET.Maths": "2.23.0"
|
|
}
|
|
},
|
|
"Silk.NET.Windowing.Glfw": {
|
|
"type": "Transitive",
|
|
"resolved": "2.23.0",
|
|
"contentHash": "aYBudKmENmvLRn9p15HbdvlQTnnXskcDfTfbYwSb/4fr263rGLwYuDw/txUEc2jihHJiWCp5+75Y7z5wTJWl7g==",
|
|
"dependencies": {
|
|
"Silk.NET.GLFW": "2.23.0",
|
|
"Silk.NET.Windowing.Common": "2.23.0"
|
|
}
|
|
},
|
|
"Ultz.Native.GLFW": {
|
|
"type": "Transitive",
|
|
"resolved": "3.4.0",
|
|
"contentHash": "Iy22JopynbOJ32vA0lBhFEzGi65GQJBuJHYBYRBpydrDpNoTiHnjIXfA65Gu+8qsOr/ZEoIF8r9aHCgAXuO6DA=="
|
|
},
|
|
"xunit.abstractions": {
|
|
"type": "Transitive",
|
|
"resolved": "2.0.3",
|
|
"contentHash": "pot1I4YOxlWjIb5jmwvvQNbTrZ3lJQ+jUGkGjWE3hEFM0l5gOnBWS+H3qsex68s5cO52g+44vpGzhAt+42vwKg=="
|
|
},
|
|
"xunit.analyzers": {
|
|
"type": "Transitive",
|
|
"resolved": "1.18.0",
|
|
"contentHash": "OtFMHN8yqIcYP9wcVIgJrq01AfTxijjAqVDy/WeQVSyrDC1RzBWeQPztL49DN2syXRah8TYnfvk035s7L95EZQ=="
|
|
},
|
|
"xunit.assert": {
|
|
"type": "Transitive",
|
|
"resolved": "2.9.3",
|
|
"contentHash": "/Kq28fCE7MjOV42YLVRAJzRF0WmEqsmflm0cfpMjGtzQ2lR5mYVj1/i0Y8uDAOLczkL3/jArrwehfMD0YogMAA=="
|
|
},
|
|
"xunit.core": {
|
|
"type": "Transitive",
|
|
"resolved": "2.9.3",
|
|
"contentHash": "BiAEvqGvyme19wE0wTKdADH+NloYqikiU0mcnmiNyXaF9HyHmE6sr/3DC5vnBkgsWaE6yPyWszKSPSApWdRVeQ==",
|
|
"dependencies": {
|
|
"xunit.extensibility.core": "[2.9.3]",
|
|
"xunit.extensibility.execution": "[2.9.3]"
|
|
}
|
|
},
|
|
"xunit.extensibility.core": {
|
|
"type": "Transitive",
|
|
"resolved": "2.9.3",
|
|
"contentHash": "kf3si0YTn2a8J8eZNb+zFpwfoyvIrQ7ivNk5ZYA5yuYk1bEtMe4DxJ2CF/qsRgmEnDr7MnW1mxylBaHTZ4qErA==",
|
|
"dependencies": {
|
|
"xunit.abstractions": "2.0.3"
|
|
}
|
|
},
|
|
"xunit.extensibility.execution": {
|
|
"type": "Transitive",
|
|
"resolved": "2.9.3",
|
|
"contentHash": "yMb6vMESlSrE3Wfj7V6cjQ3S4TXdXpRqYeNEI3zsX31uTsGMJjEw6oD5F5u1cHnMptjhEECnmZSsPxB6ChZHDQ==",
|
|
"dependencies": {
|
|
"xunit.extensibility.core": "[2.9.3]"
|
|
}
|
|
},
|
|
"sharpemu.hle": {
|
|
"type": "Project",
|
|
"dependencies": {
|
|
"SharpEmu.Logging": "[1.0.0, )"
|
|
}
|
|
},
|
|
"sharpemu.libs": {
|
|
"type": "Project",
|
|
"dependencies": {
|
|
"SharpEmu.HLE": "[1.0.0, )",
|
|
"Silk.NET.Vulkan": "[2.23.0, )",
|
|
"Silk.NET.Vulkan.Extensions.EXT": "[2.23.0, )",
|
|
"Silk.NET.Vulkan.Extensions.KHR": "[2.23.0, )",
|
|
"Silk.NET.Windowing": "[2.23.0, )"
|
|
}
|
|
},
|
|
"sharpemu.logging": {
|
|
"type": "Project"
|
|
},
|
|
"Silk.NET.Vulkan": {
|
|
"type": "CentralTransitive",
|
|
"requested": "[2.23.0, )",
|
|
"resolved": "2.23.0",
|
|
"contentHash": "3/irtlSWXZ3eTi8N6nelI6L34NTB8ZJHpqVMNzZx2aX7Ek9YEQ34NoQW8/Tljrtmkg8KRhHW8hKTEzZaKV8PgA==",
|
|
"dependencies": {
|
|
"Silk.NET.Core": "2.23.0"
|
|
}
|
|
},
|
|
"Silk.NET.Vulkan.Extensions.EXT": {
|
|
"type": "CentralTransitive",
|
|
"requested": "[2.23.0, )",
|
|
"resolved": "2.23.0",
|
|
"contentHash": "+Oth189ksRiL6HvGCwIdnsYHawqrbO8y49u1H61z3wsfcHhQZeVDYe/wF5LD7fk3NcdgDvwFD3mLm1QWhdZySw==",
|
|
"dependencies": {
|
|
"Silk.NET.Core": "2.23.0",
|
|
"Silk.NET.Vulkan": "2.23.0"
|
|
}
|
|
},
|
|
"Silk.NET.Vulkan.Extensions.KHR": {
|
|
"type": "CentralTransitive",
|
|
"requested": "[2.23.0, )",
|
|
"resolved": "2.23.0",
|
|
"contentHash": "uRaf4j+SmH3DumjSSSUbFg33BnsGZUyXGj93O9NgGKZSJN3OTmNmQDxRew+/KiVLcgH6qzbto8aNGZ++j9GFWg==",
|
|
"dependencies": {
|
|
"Silk.NET.Core": "2.23.0",
|
|
"Silk.NET.Vulkan": "2.23.0"
|
|
}
|
|
},
|
|
"Silk.NET.Windowing": {
|
|
"type": "CentralTransitive",
|
|
"requested": "[2.23.0, )",
|
|
"resolved": "2.23.0",
|
|
"contentHash": "OPNPmt/lRyUKVYrFLQXVxyATqD3MKLc1iY1oKx1/2GppgmZxVZPwN12tekrQ4C7408kgB1L5JD1Wnirqqeb2kg==",
|
|
"dependencies": {
|
|
"Silk.NET.Windowing.Common": "2.23.0",
|
|
"Silk.NET.Windowing.Glfw": "2.23.0"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
} |