diff --git a/.gitignore b/.gitignore index 6a3fb7e9..e28ee9a1 100644 --- a/.gitignore +++ b/.gitignore @@ -15,6 +15,8 @@ obj/ *.sln !nostrand/references/*.dll !magic-unity/Runtime/Infrastructure/Export/*.dll +!magic-unity-dual/Runtime/Infrastructure/Export/*.dll +!unity-examples/magic-unity-coexist/Assets/Plugins/clojure-clr/**/*.dll # macOS .DS_Store diff --git a/CHANGELOG.md b/CHANGELOG.md index 26cdac68..10e6ac8c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,16 @@ # Changelog +## v0.7.0 - 2026-06-09 + +A second Unity package variant for projects that keep stock ClojureCLR as the editor runtime. + +### Magic.Unity +- New `sg.flybot.magic.unity.dual` variant: the runtime `*.clj.dll` carry a `!UNITY_EDITOR` define constraint, so Unity excludes them from the editor and a coexistence project no longer logs the `Assembly is incompatible with the editor` lines on every domain reload. The default `sg.flybot.magic.unity` is unchanged and still runs MAGIC in editor Play mode - [#30](https://github.com/flybot-sg/magic/issues/30). +- New `docs/unity-integration.md` covers the consumer workflow and how to choose a variant. + +### Tooling +- `bb gen-unity-dual` generates the dual variant from `magic-unity` (drift-checked by `bb check-drift`); `bb coexist-noise` reproduces the console noise in-repo via `unity-examples/magic-unity-coexist`. Example Unity projects moved under `unity-examples/`. + ## v0.6.0 - 2026-06-07 Stock-ClojureCLR coexistence for Unity consumers that keep ClojureCLR as the editor runtime, plus IL2CPP workaround-selection fixes. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 6c0af125..3553e76e 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -33,7 +33,7 @@ MAGIC is a monorepo. Every issue should carry one or more `comp:` labels naming - `comp:magic-compiler` - `comp:nostrand` - `comp:magic-unity` -- `comp:magic-unity-smoke` +- `comp:unity-examples` ## Pull requests diff --git a/README.md b/README.md index aa85c570..bdedd27b 100644 --- a/README.md +++ b/README.md @@ -34,8 +34,9 @@ MAGIC is a self-hosting compiler: it is written in Clojure and compiles itself t | [mage](./mage) | Symbolic MSIL bytecode emitter | Clojure | | [magic-compiler](./magic-compiler) | The compiler (s-expressions to MSIL) | Clojure | | [nostrand](./nostrand) | Task runner, dependency manager, REPL | C# + Clojure | -| [magic-unity](./magic-unity) | Unity integration package (IL2CPP support) | C# | -| [magic-unity-smoke](./magic-unity-smoke) | Standalone Unity project that exercises MAGIC under IL2CPP. Regression suite for AOT-only bugs, runs by hand on the verified Unity version (`2022.3.62f3`). | Clojure + C# | +| [magic-unity](./magic-unity) | Unity integration package (IL2CPP support), default variant | C# | +| [magic-unity-dual](./magic-unity-dual) | Coexistence variant of magic-unity with the runtime excluded from the Editor (for projects that keep stock ClojureCLR). Generated by `bb gen-unity-dual`; see [Unity integration](./docs/unity-integration.md). | C# | +| [magic-unity-smoke](./unity-examples/magic-unity-smoke) | Standalone Unity project that exercises MAGIC under IL2CPP. Regression suite for AOT-only bugs, runs by hand on the verified Unity version (`2022.3.62f3`). | Clojure + C# | Each component has its own README with detailed documentation. @@ -86,27 +87,7 @@ You need three things: the `nos` CLI (build-time), the `magic-unity` UPM package Defaults install to `$HOME/.local/nostrand/` with the launcher symlinked to `$HOME/.local/bin/nos`. Override with `INSTALL_DIR=` / `INSTALL_LINK=` env vars if needed. -2. **Add the Unity package** to your `Packages/manifest.json`, pinned to a tag from the [releases page](https://github.com/flybot-sg/magic/releases): - - ```json - { - "dependencies": { - "sg.flybot.magic.unity": "https://github.com/flybot-sg/magic.git?path=magic-unity#" - } - } - ``` - -3. **Add `deps.edn` and `dotnet.clj`** at your Unity project root. Copy the templates from [`magic-unity-smoke/`](./magic-unity-smoke/): `deps.edn` declares your source `:paths` and any `:deps` (`nos` resolves them at boot, cloning git deps into `~/.nostrand/gitlibs`), and `dotnet.clj` holds the build/test tasks. The `nostrand.tasks` helpers (`compile-project`, `run-clojure-tests`) pin the shipped compiler flags and can derive the namespace set from your `deps.edn` paths, so `dotnet.clj` stays small. See [Porting a Clojure library to MAGIC](./docs/porting-libraries-to-magic.md) for the `dotnet.clj` patterns and the full option set. - -4. **Compile your Clojure** before opening Unity: - - ```bash - nos dotnet/build - ``` - - Drops your `.clj.dll` files into `Assets/Plugins/Magic/` where Unity will load them. - -5. **Open Unity, hit Play.** For CI, define a `nos dotnet/run-tests` task in your `dotnet.clj` to run Mono-side tests independent of Unity (see [`magic-unity-smoke/dotnet.clj`](magic-unity-smoke/dotnet.clj)). IL2CPP-only regressions need an actual Unity build; [`magic-unity-smoke`](./magic-unity-smoke) is the reference pattern. +2. **Add the package, compile, open Unity.** The [Unity integration guide](./docs/unity-integration.md) covers the `Packages/manifest.json` pin (and which of the two variants to pick: default, or `.dual` for projects that keep stock ClojureCLR in the Editor), the `deps.edn` / `dotnet.clj` templates, `nos dotnet/build`, and IL2CPP. ### Use `nos` for non-Unity Clojure-on-CLR @@ -284,7 +265,7 @@ cd magic-compiler && mono ../nostrand/bin/Release/net471/NostrandMain.exe test/a The MAGIC compiler itself uses the `test/all` entrypoint in [magic-compiler/test.clj](magic-compiler/test.clj). Downstream projects use their own `nos dotnet/run-tests` (see the Getting Started section above for the pattern). -For IL2CPP-specific regressions (AOT-only bugs that the Mono editor cannot catch), [magic-unity-smoke](./magic-unity-smoke) drives MAGIC's compile output through Unity's IL2CPP pipeline and reports pass/fail in the built player. Run by hand on the verified Unity version after touching the compiler, the runtimes, or `magic-unity` itself. +For IL2CPP-specific regressions (AOT-only bugs that the Mono editor cannot catch), [magic-unity-smoke](./unity-examples/magic-unity-smoke) drives MAGIC's compile output through Unity's IL2CPP pipeline and reports pass/fail in the built player. Run by hand on the verified Unity version after touching the compiler, the runtimes, or `magic-unity` itself. ## Git History diff --git a/bb.edn b/bb.edn index a2af8078..1cc6e2e9 100644 --- a/bb.edn +++ b/bb.edn @@ -2,6 +2,7 @@ ;; Run `bb tasks` for the public list. {:min-bb-version "1.3.0" + :paths ["bb"] :tasks {:requires ([babashka.fs :as fs] [clojure.string :as str]) @@ -89,6 +90,7 @@ check-drift {:doc "Verify generated files, stdlib bootstrap DLLs, and UPM version are current. Runs regen + refresh-stdlib + sync-upm-version and fails if the working tree changed. Use in CI and before opening a PR." + :requires ([magic.unity :as unity]) :depends [regen-callsites refresh-stdlib sync-upm-version] ;; Drift signals checked: ;; - magic-runtime/Magic.Runtime/Generated: .g.cs files produced by Mustache @@ -100,9 +102,21 @@ ;; non-deterministic (gensyms, hash tokens) and would always fail. ;; - magic-unity/package.json: UPM manifest version field. Synced from ;; version.edn by sync-upm-version (above). + ;; - magic-unity-dual: the generated coexistence variant. gen-unity-dual + ;; copies magic-unity verbatim, then constrains the 46 runtime metas and + ;; renames the package. refresh-stdlib (above) redeploys freshly-compiled, + ;; non-deterministic DLLs into magic-unity/Runtime/Infrastructure/Export, + ;; so we revert that byproduct first; the dual is then a copy of the + ;; committed binaries and the diff isolates the deterministic transforms + ;; (the meta constraints, the package rename) plus any DLL the maintainer + ;; refreshed in magic-unity without regenerating the dual. :task (let [checked-paths ["magic-runtime/Magic.Runtime/Generated" "magic-compiler/stdlib-manifest.edn" - "magic-unity/package.json"] + "magic-unity/package.json" + "magic-unity-dual"] + _ (shell "git" "checkout" "--" + "magic-unity/Runtime/Infrastructure/Export/") + _ (unity/gen-dual!) {:keys [out]} (apply shell {:continue true :out :string} "git" "diff" "--" checked-paths)] (when-not (str/blank? out) @@ -111,12 +125,14 @@ (println "Drift detected.") (println "Either a .mustache template was edited without regenerating .g.cs,") (println "a stdlib .clj source was edited without refreshing its .clj.dll,") - (println "or version.edn was bumped without syncing magic-unity/package.json.") + (println "version.edn was bumped without syncing magic-unity/package.json,") + (println "or magic-unity changed without regenerating magic-unity-dual.") (println) (println "Fix locally:") (println " bb regen-callsites # if magic-runtime Generated/ drifted") (println " bb refresh-stdlib # if stdlib-manifest.edn drifted") (println " bb sync-upm-version # if magic-unity/package.json drifted") + (println " bb gen-unity-dual # if magic-unity-dual drifted from magic-unity") (println " git add" (str/join " " checked-paths) "nostrand/references magic-unity/Runtime/Infrastructure/Export") (println) @@ -212,6 +228,22 @@ (when-not (str/includes? line ":tag :ret") (recur)))))))} + ;; ============================================================ + ;; Unity packaging (two variants) + coexistence repro + ;; ============================================================ + + gen-unity-dual + {:doc "Generate the magic-unity-dual UPM package from magic-unity. Byte-identical except the 46 runtime *.clj.dll plugins carry defineConstraints ['!UNITY_EDITOR'] so Unity leaves them out of the editor (a project running stock ClojureCLR in the editor then sees no 'incompatible with the editor' narration), and package.json is renamed sg.flybot.magic.unity.dual. The default sg.flybot.magic.unity stays editor-loadable so MAGIC also runs in the editor's Play mode. Output is committed and drift-checked; regenerate after any magic-unity change." + :requires ([magic.unity :as unity]) + :task (println "Generated magic-unity-dual -" (unity/gen-dual!) + "runtime plugins constrained to !UNITY_EDITOR")} + + coexist-noise + {:doc "Reproduce / regression-check the coexistence editor noise in-repo (the #25 'Assembly is incompatible with the editor' narration). Packs a magic-unity variant into an immutable tarball, points the magic-unity-coexist project (which vendors stock ClojureCLR) at it via a fresh PackageCache resolve (the only state that shows the noise: a mutable file: install writes the editor-off flip back and it never appears), launches Unity 2022.3.62f3 headless twice, and reports the narration-line count plus CoexistenceProbe state. 'bb coexist-noise' tests the dual variant (expect 0 lines, the shipped fix); 'bb coexist-noise magic-only' tests the default variant (expect 46 lines, the problem the dual variant solves). Quit any GUI Unity holding magic-unity-coexist first (batchmode exits 134)." + :requires ([magic.unity :as unity]) + :depends [gen-unity-dual] + :task (unity/coexist-noise! (or (first *command-line-args*) "dual"))} + ;; ============================================================ ;; Hygiene ;; ============================================================ diff --git a/bb/magic/unity.clj b/bb/magic/unity.clj new file mode 100644 index 00000000..7d39e28f --- /dev/null +++ b/bb/magic/unity.clj @@ -0,0 +1,158 @@ +(ns magic.unity + "Babashka helpers for the two MAGIC Unity package variants: generate the + editor-excluded `magic-unity-dual` from `magic-unity`, and drive the + `magic-unity-coexist` repro that proves the dual variant is silent." + (:require [babashka.fs :as fs] + [babashka.tasks :refer [shell]] + [clojure.pprint :as pp] + [clojure.string :as str])) + +(def ^:private default-pkg "magic-unity") +(def ^:private dual-pkg "magic-unity-dual") +(def ^:private coexist-proj "unity-examples/magic-unity-coexist") +(def ^:private unity + "/Applications/Unity/Hub/Editor/2022.3.62f3/Unity.app/Contents/MacOS/Unity") + +;;; Dual variant generation + +(defn- exclude-from-editor [meta-yaml] + (str/replace meta-yaml + " defineConstraints: []" + " defineConstraints:\n - '!UNITY_EDITOR'")) + +(defn- rename-package [package-json] + (-> package-json + (str/replace "\"name\": \"sg.flybot.magic.unity\"" + "\"name\": \"sg.flybot.magic.unity.dual\"") + (str/replace "\"displayName\": \"MAGIC Unity Integration\"" + "\"displayName\": \"MAGIC Unity Integration (dual: stock editor + MAGIC players)\""))) + +(defn- edit-file! + "Rewrite path through f. Throws when f changes nothing, the signal that the + source format drifted from what the generator expects." + [path f] + (let [content (slurp path) + edited (f content)] + (when (= content edited) + (throw (ex-info (str "gen-unity-dual: no substitution applied to " path) {:path path}))) + (spit path edited))) + +(defn gen-dual! + "Regenerate magic-unity-dual as a verbatim copy of magic-unity with the runtime + clj.dll plugins constrained to !UNITY_EDITOR and the package renamed. Returns + the number of constrained plugins." + [] + (fs/delete-tree dual-pkg) + (shell "cp" "-R" default-pkg dual-pkg) + (let [metas (fs/glob (str dual-pkg "/Runtime/Infrastructure/Export") "*.clj.dll.meta")] + (when (empty? metas) + (throw (ex-info "gen-unity-dual: no runtime *.clj.dll.meta in copy" {}))) + (run! #(edit-file! (str %) exclude-from-editor) metas) + (edit-file! (str dual-pkg "/package.json") rename-package) + (count metas))) + +;;; Coexistence repro + +(def ^:private variants + {"dual" {:pkg dual-pkg :dependency "sg.flybot.magic.unity.dual" :expected 0} + "magic-only" {:pkg default-pkg :dependency "sg.flybot.magic.unity" :expected 46}}) + +(defn- coexist-path [& parts] + (str/join "/" (cons coexist-proj parts))) + +(defn- pack-tarball! + "Pack pkg into a UPM tarball at tgz: a single top-level package/ directory." + [pkg tgz] + (let [staging (fs/create-temp-dir {:prefix "magic-coexist-pkg"}) + pkgdir (str (fs/path staging "package"))] + (fs/create-dirs pkgdir) + (shell "cp" "-R" (str pkg "/.") (str pkgdir "/")) + (shell "tar" "czf" tgz "-C" (str staging) "package") + (fs/delete-tree staging))) + +(defn- write-manifest! + "Pin the coexist project to dependency, which must equal the tarball's + package.json name or UPM refuses to resolve it." + [dependency] + (spit (coexist-path "Packages" "manifest.json") + (str "{\n \"dependencies\": {\n \"" dependency + "\": \"file:../magic-unity.tgz\"\n }\n}\n"))) + +(defn- reset-package-cache! [] + (fs/delete-if-exists (coexist-path "Packages" "packages-lock.json")) + (let [cache (coexist-path "Library" "PackageCache")] + (when (fs/exists? cache) + (run! fs/delete-tree (fs/glob cache "sg.flybot.magic.unity*"))))) + +(defn- run-editor! + "Launch Unity headless on the coexist project, logging to log; extra args + (e.g. -executeMethod) are appended. A non-zero exit is tolerated because the + log, not the exit code, is the signal." + [log & args] + (fs/create-dirs (coexist-path "Logs")) + (fs/delete-if-exists log) + (apply shell {:continue true} unity + "-batchmode" "-quit" "-nographics" + "-projectPath" coexist-proj "-logFile" log args)) + +(defn- parse-log [log-text] + (let [lines (str/split-lines log-text) + containing (fn [substr] (filter #(str/includes? % substr) lines))] + {:narration (count (containing "Assembly is incompatible with the editor")) + :dedup (count (containing "Duplicate assembly 'Clojure.dll'")) + :probe (first (containing "[CoexistenceProbe]"))})) + +(defn- verdict + "Classify a parsed run for the variant as [status message]." + [variant {:keys [narration probe]}] + (let [silent? (zero? narration) + probe-fixed? (boolean (some-> probe (str/includes? "core-clj-loadable=false")))] + (cond + (and (= variant "dual") silent? probe-fixed?) + [:pass "dual variant is silent; probe confirms #25 stays fixed (core-clj-loadable=false)"] + (and (= variant "dual") silent?) + [:inconclusive "0 narration but probe did not confirm core-clj-loadable=false; did the package resolve?"] + (= variant "dual") + [:fail (str "dual variant narrated " narration " lines; the !UNITY_EDITOR constraint is missing or ineffective")] + (pos? narration) + [:reproduced "reproduced the noise on the magic-only variant (expected); this is what the dual variant fixes"] + :else + [:unexpected "magic-only produced 0 narration lines"]))) + +(defn- result-summary + "Report map for a parsed run: status and message from the verdict, plus the + raw counts and the probe line." + [variant expected {:keys [narration dedup probe] :as result}] + (let [[status message] (verdict variant result)] + (array-map + :variant variant + :status status + :message message + :narration narration + :expected expected + :dedup dedup + :probe probe))) + +(defn coexist-noise! + "Reproduce / regression-check the coexistence noise for variant \"dual\" (the + shipped fix, expect 0 narration lines) or \"magic-only\" (the default, expect + 46). Packs the variant into an immutable tarball, resolves it fresh, then runs + Unity headless twice: a cold import, then a domain reload that runs + CoexistenceProbe. The probe runs only on the second pass because a flip + applies to the next domain load, so a same-session probe reads stale state." + [variant] + (let [{:keys [pkg dependency expected]} + (or (variants variant) + (throw (ex-info (str "unknown variant: " variant " (dual|magic-only)") {})))] + (when-not (fs/exists? unity) + (throw (ex-info (str "Unity 2022.3.62f3 not found: " unity) {}))) + (let [editor-log (coexist-path "Logs" "coexist-noise.editor.log")] + (println "Variant:" variant "- packing" pkg "(expecting" expected "narration lines)") + (pack-tarball! pkg (coexist-path "magic-unity.tgz")) + (write-manifest! dependency) + (reset-package-cache!) + (println "Run 1/2: cold import (slow)...") + (run-editor! (coexist-path "Logs" "coexist-noise.import.log")) + (println "Run 2/2: domain reload (narration + probe)...") + (run-editor! editor-log "-executeMethod" "CoexistenceProbe.Run") + (pp/pprint (result-summary variant expected (parse-log (slurp editor-log))))))) diff --git a/docs/porting-libraries-to-magic.md b/docs/porting-libraries-to-magic.md index caae22ec..49bcfd79 100644 --- a/docs/porting-libraries-to-magic.md +++ b/docs/porting-libraries-to-magic.md @@ -173,7 +173,7 @@ nos dotnet/run-tests # requires the namespaces, runs clojure.test, exits non- `run-tests` executes under Mono and does not cover IL2CPP codegen; for Unity, an actual IL2CPP build is the only way to catch AOT-only regressions (see -[`magic-unity-smoke`](../magic-unity-smoke)). +[`magic-unity-smoke`](../unity-examples/magic-unity-smoke)). `:clean? true` wipes the output dir before compiling, so the task does not need a `rm -rf build` shell step in front of it. diff --git a/docs/unity-integration.md b/docs/unity-integration.md new file mode 100644 index 00000000..5174b32f --- /dev/null +++ b/docs/unity-integration.md @@ -0,0 +1,58 @@ +# Unity integration + +How to use MAGIC in a Unity project: compile your Clojure to `.clj.dll` with the `nos` CLI outside Unity, then load it at play time through the `magic-unity` UPM package. The package also rewrites MAGIC's IL during IL2CPP builds (iOS, Android, consoles). + +This is the consumer-side guide. For what the package contains and how its internals work, see [magic-unity](../magic-unity). For the `deps.edn` / `dotnet.clj` compile workflow in depth, see [Porting a Clojure library to MAGIC](./porting-libraries-to-magic.md). + +## Steps + +1. **Install `nos`** (build-time only; needs the `mono` runtime, no .NET SDK). See [Install](../README.md#install) in the root README for the one-line installer. + +2. **Add the package** to `Packages/manifest.json`, pinned to a tag from the [releases page](https://github.com/flybot-sg/magic/releases). Pick one variant (see [Choosing a variant](#choosing-a-variant)): + + ```json + { + "dependencies": { + "sg.flybot.magic.unity": "https://github.com/flybot-sg/magic.git?path=magic-unity#" + } + } + ``` + +3. **Add `deps.edn` and `dotnet.clj`** at your project root. Copy the templates from [`unity-examples/magic-unity-smoke/`](../unity-examples/magic-unity-smoke/): `deps.edn` declares your source `:paths` and any `:deps`; `dotnet.clj` holds the build/test tasks. The `nostrand.tasks` helpers pin the shipped compiler flags and derive the namespace set from your paths, so `dotnet.clj` stays small. + +4. **Compile before opening Unity:** + + ```bash + nos dotnet/build + ``` + + This drops your `.clj.dll` into `Assets/Plugins/Magic/`, where Unity loads them. + +5. **Open Unity and hit Play.** For CI, add a `nos dotnet/run-tests` task to run the Mono-side tests without Unity (see [`magic-unity-smoke/dotnet.clj`](../unity-examples/magic-unity-smoke/dotnet.clj)). IL2CPP-only regressions need a real Unity build. + +## Choosing a variant + +The package ships in two variants, identical except for whether the runtime `.clj.dll` plugins are visible to the Editor: + +| | `sg.flybot.magic.unity` (default) | `sg.flybot.magic.unity.dual` | +|---|---|---| +| Runtime in the Editor | loadable | excluded (`!UNITY_EDITOR`) | +| MAGIC in Editor Play mode | works | not available (Editor uses stock ClojureCLR) | +| Alongside stock ClojureCLR | benign console noise, handled by the guard | silent (runtime absent from the Editor) | +| Player builds (Mono / IL2CPP) | identical | identical | + +- **Default** if MAGIC runs in your Editor (Play mode, edit-mode tooling) and there is no stock ClojureCLR. +- **`.dual`** if your Editor runs stock ClojureCLR (REPL / hot-reload) and MAGIC ships only in player builds. Pin `?path=magic-unity-dual#`. + +Full comparison and rationale: [magic-unity, Package variants](../magic-unity/README.md#package-variants). + +## Coexistence with stock ClojureCLR + +A project that keeps stock ClojureCLR in the Editor and ships MAGIC in players runs both runtimes. With the **default** variant the Editor prints one benign `Assembly is incompatible with the editor` line per runtime `.clj.dll` on each domain reload (Unity narrating the intended exclusion; player builds are unaffected). The **`.dual`** variant excludes the runtime from the Editor by construction, so those lines never appear. Either way the stock probe for `clojure.core.clj` is kept away from the fork assemblies ([#25](https://github.com/flybot-sg/magic/issues/25)). + +The in-repo reproduction is [`unity-examples/magic-unity-coexist`](../unity-examples/magic-unity-coexist): `bb coexist-noise` checks that the dual variant is silent, `bb coexist-noise magic-only` reproduces the noise on the default variant. + +## Examples + +- [`unity-examples/magic-unity-smoke`](../unity-examples/magic-unity-smoke): standalone IL2CPP regression suite. The reference pattern for `deps.edn` / `dotnet.clj`, with a `MAGIC -> Smoke -> Build & Run IL2CPP` menu. Run by hand on Unity 2022.3.62f3. +- [`unity-examples/magic-unity-coexist`](../unity-examples/magic-unity-coexist): coexistence repro that vendors stock ClojureCLR, driven by `bb coexist-noise`. diff --git a/magic-unity-dual/.gitignore b/magic-unity-dual/.gitignore new file mode 100644 index 00000000..2e9693ed --- /dev/null +++ b/magic-unity-dual/.gitignore @@ -0,0 +1,2 @@ +obj +bin \ No newline at end of file diff --git a/magic-unity-dual/Editor.meta b/magic-unity-dual/Editor.meta new file mode 100644 index 00000000..1d4e40c1 --- /dev/null +++ b/magic-unity-dual/Editor.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 5833da01c16b2a42fb0928683240c079 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/magic-unity-dual/Editor/BytecodeAssumptionViolatedException.cs b/magic-unity-dual/Editor/BytecodeAssumptionViolatedException.cs new file mode 100644 index 00000000..5be8e26c --- /dev/null +++ b/magic-unity-dual/Editor/BytecodeAssumptionViolatedException.cs @@ -0,0 +1,9 @@ +using System; + +namespace Magic.Unity +{ + public class BytecodeAssumptionViolatedException : Exception + { + public BytecodeAssumptionViolatedException(string message) : base(message) { } + } +} \ No newline at end of file diff --git a/magic-unity-dual/Editor/BytecodeAssumptionViolatedException.cs.meta b/magic-unity-dual/Editor/BytecodeAssumptionViolatedException.cs.meta new file mode 100644 index 00000000..cb57c087 --- /dev/null +++ b/magic-unity-dual/Editor/BytecodeAssumptionViolatedException.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: cc7075fe0a4f28ab1b914d19309f7e23 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/magic-unity-dual/Editor/EliminateUnreachableInstructions.cs b/magic-unity-dual/Editor/EliminateUnreachableInstructions.cs new file mode 100644 index 00000000..72c92055 --- /dev/null +++ b/magic-unity-dual/Editor/EliminateUnreachableInstructions.cs @@ -0,0 +1,118 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using Mono.Cecil; +using Mono.Cecil.Cil; +using Mono.Cecil.Rocks; +using UnityEngine; + +namespace Magic.Unity +{ + public static class EliminateUnreachableInstructions + { + public static void RewriteMethod(MethodDefinition m) + { + if (m.HasBody) + { + var reachable = new HashSet(); + Mark(m, reachable); + Sweep(m, reachable); + } + } + + static void Mark(MethodDefinition method, HashSet reachable) + { + var instructions = method.Body.Instructions; + var remaining = new Queue(instructions.Count); + + // methods enter at first instruction + remaining.Enqueue(instructions.First()); + + // Exception-handler boundary instructions (TryStart, TryEnd, + // HandlerStart, HandlerEnd, FilterStart) must survive the sweep + // so the EH table stays consistent. Seeding them here also lets + // BFS pick up the post-handler fall-through path that normal + // flow analysis treats as dead when the try body always throws. + foreach (var eh in method.Body.ExceptionHandlers) + { + if (eh.TryStart != null) remaining.Enqueue(eh.TryStart); + if (eh.TryEnd != null) remaining.Enqueue(eh.TryEnd); + if (eh.HandlerStart != null) remaining.Enqueue(eh.HandlerStart); + if (eh.HandlerEnd != null) remaining.Enqueue(eh.HandlerEnd); + if (eh.FilterStart != null) remaining.Enqueue(eh.FilterStart); + } + + while (remaining.Count > 0) + { + var instruction = remaining.Dequeue(); + + // skip instruction if already visited + if (reachable.Contains(instruction)) + continue; + + // mark instruction as reachable + reachable.Add(instruction); + + // if instruction is the start of a try/catch/finally region enqueue the + // region's catch and finally handlers + foreach (var eh in method.Body.ExceptionHandlers) + if (instruction == eh.TryStart) + remaining.Enqueue(eh.HandlerStart); + + switch (instruction.OpCode.FlowControl) + { + // most instructions just reach the next instruction + case FlowControl.Call: + case FlowControl.Meta: + case FlowControl.Break: + case FlowControl.Next: + remaining.Enqueue(instruction.Next); + break; + // conditional branches reach next instruction and branch target(s) + case FlowControl.Cond_Branch: + remaining.Enqueue(instruction.Next); + goto case FlowControl.Branch; + // branches only reach their branch target(s) + case FlowControl.Branch: + if (instruction.Operand is Instruction branchTarget) + remaining.Enqueue(branchTarget); + else if (instruction.Operand is Instruction[] branchTargets) + foreach (var target in branchTargets) + remaining.Enqueue(target); + else + throw new BytecodeAssumptionViolatedException($"Branch instruction operand not instruction {instruction}"); + break; + // throw and return reach no instructions + case FlowControl.Throw: + case FlowControl.Return: + break; + // FlowControl.Phi is not covered but should be extinct in the wild + default: + throw new NotImplementedException($"Unexpected control flow {instruction.OpCode.FlowControl} in {instruction}"); + } + } + } + + static void Sweep(MethodDefinition method, HashSet reachable) + { + // no work to do if all instructions are reachable + if (method.Body.Instructions.Count == reachable.Count) + return; + + UnityEngine.Debug.Log($"[Magic.Unity/EliminateUnreachableInstructions] {method}"); + var unreachable = new HashSet(); + + // gather all unreachable instructions from method + foreach (var instruction in method.Body.Instructions) + if (!reachable.Contains(instruction)) + unreachable.Add(instruction); + + // remove all unreachable instructions + foreach(var instruction in unreachable) + { + UnityEngine.Debug.Log($"[Magic.Unity/EliminateUnreachableInstructions] {instruction}"); + method.Body.Instructions.Remove(instruction); + } + } + } +} \ No newline at end of file diff --git a/magic-unity-dual/Editor/EliminateUnreachableInstructions.cs.meta b/magic-unity-dual/Editor/EliminateUnreachableInstructions.cs.meta new file mode 100644 index 00000000..0eb683e6 --- /dev/null +++ b/magic-unity-dual/Editor/EliminateUnreachableInstructions.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: e5bdb5da62514bdf9994013fd6f859a5 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/magic-unity-dual/Editor/GenerateGenericWorkaroundMethods.cs b/magic-unity-dual/Editor/GenerateGenericWorkaroundMethods.cs new file mode 100644 index 00000000..bdc1498e --- /dev/null +++ b/magic-unity-dual/Editor/GenerateGenericWorkaroundMethods.cs @@ -0,0 +1,404 @@ +using System; +using System.Globalization; +using System.Linq; +using System.Collections.Generic; +using Mono.Cecil; +using Mono.Cecil.Rocks; +using Mono.Cecil.Cil; +using UnityEditor.Compilation; + +namespace Magic.Unity +{ + public static class GenerateGenericWorkaroundMethods + { + struct DynamicCallSiteInfo + { + public string name; + public int arity; + public bool isStatic; + } + + static HashSet DynamicCallSites = new HashSet(); + static List AllMethods = new List(); + static TypeDefinition MagicRuntimeDelegateHelpers = null; + + static HashSet PlayerReferenceNames = null; + static HashSet PlayerReferenceDirectories = null; + + // The collected assemblies feed AllMethods, the pool of candidate dynamic + // dispatch targets whose GetMethodDelegateFast instantiations get emitted + // into the shipped .clj.dlls. A signature referencing an assembly absent + // from the player build breaks the IL2CPP build; the type-reference + // closure resolves against the editor's full desktop BCL, which on + // Windows reaches editor-only assemblies like Mono.WebBrowser. So collect + // an assembly only if player scripts compile against it. Desktop-only BCL + // assemblies are never player compilation references, while UnityEngine + // modules, the player BCL profile, plugins (including .clj.dlls), and + // user script assemblies all are. + static HashSet CollectPlayerReferenceNames() + { + var names = new HashSet(StringComparer.OrdinalIgnoreCase); + var responseFileNames = new HashSet(StringComparer.OrdinalIgnoreCase); + foreach (var assembly in CompilationPipeline.GetAssemblies(AssembliesType.PlayerWithoutTestAssemblies)) + { + names.Add(assembly.name); + foreach (var reference in assembly.allReferences) + { + names.Add(System.IO.Path.GetFileNameWithoutExtension(reference)); + } + foreach (var reference in ResponseFileReferenceNames(assembly)) + { + names.Add(reference); + responseFileNames.Add(reference); + } + } + // The full reference list below can exceed Unity's log line limit, + // so the response file contribution gets its own observable line. + UnityEngine.Debug.Log($"[Magic.Unity] response file references: {(responseFileNames.Count == 0 ? "(none)" : string.Join(",", responseFileNames.OrderBy(n => n)))}"); + return names; + } + + // allReferences never lists references added through compiler + // response files (csc.rsp -r:System.Web.dll), but player code + // compiles and ships against them, so their signatures deserve + // workarounds too. + static IEnumerable ResponseFileReferenceNames(UnityEditor.Compilation.Assembly assembly) + { + var names = new List(); + foreach (var responseFile in assembly.compilerOptions.ResponseFiles) + { + string[] lines; + try + { + lines = System.IO.File.ReadAllLines(responseFile); + } + catch (Exception e) + { + UnityEngine.Debug.LogWarning($"[Magic.Unity] could not read response file {responseFile}: {e.Message}"); + continue; + } + foreach (var rawLine in lines) + { + var line = rawLine.Trim(); + string value = null; + if (line.StartsWith("-r:") || line.StartsWith("/r:")) + { + value = line.Substring(3); + } + else if (line.StartsWith("-reference:") || line.StartsWith("/reference:")) + { + value = line.Substring(11); + } + if (value == null) + { + continue; + } + // extern alias form: -r:alias=Assembly.dll + var aliasSeparator = value.IndexOf('='); + if (aliasSeparator >= 0) + { + value = value.Substring(aliasSeparator + 1); + } + names.Add(System.IO.Path.GetFileNameWithoutExtension(value.Trim().Trim('"'))); + } + } + return names; + } + + // Player assemblies live in more places than the four directories + // below: UPM packages resolve under Library/PackageCache and + // precompiled plugins sit anywhere in Assets. Without their + // directories the resolver silently drops those assemblies from the + // reference walk and their signatures get no workarounds. Editor + // install paths stay excluded on purpose: searching the BCL profile + // directories makes the netstandard facade resolve, which expands + // the workaround closure into desktop BCL assemblies (System.Data + // and friends) and forces them into every player build. + static HashSet CollectPlayerReferenceDirectories() + { + var editorInstall = System.IO.Path.GetDirectoryName(UnityEditor.EditorApplication.applicationPath); + var directories = new HashSet(StringComparer.OrdinalIgnoreCase); + foreach (var assembly in CompilationPipeline.GetAssemblies(AssembliesType.PlayerWithoutTestAssemblies)) + { + foreach (var reference in assembly.allReferences) + { + var physical = System.IO.Path.GetFullPath(PackageExportPath.PhysicalPath(reference)); + if (!physical.StartsWith(editorInstall, StringComparison.OrdinalIgnoreCase)) + { + directories.Add(System.IO.Path.GetDirectoryName(physical)); + } + } + } + return directories; + } + + static bool ShouldCollectReferencedAssembly(AssemblyDefinition assy) + { + return PlayerReferenceNames.Contains(assy.Name.Name); + } + + static HashSet CollectAllReferencedAssemblies(AssemblyDefinition assydef, HashSet seen = null) + { + if(seen == null) + seen = new HashSet(); + seen.Add(assydef); + var resolver = assydef.MainModule.AssemblyResolver as DefaultAssemblyResolver; + resolver.AddSearchDirectory("Library/ScriptAssemblies"); + resolver.AddSearchDirectory(PackageExportPath.ExportDirectory); + resolver.AddSearchDirectory(System.IO.Path.GetDirectoryName(typeof(string).Assembly.Location)); + resolver.AddSearchDirectory(System.IO.Path.GetDirectoryName(typeof(UnityEngine.GameObject).Assembly.Location)); + foreach (var directory in PlayerReferenceDirectories) + { + resolver.AddSearchDirectory(directory); + } + + foreach (var tr in assydef.MainModule.GetTypeReferences()) + { + try + { + var resolved = tr.Resolve(); + if(!seen.Contains(resolved.Module.Assembly)) + { + if(ShouldCollectReferencedAssembly(resolved.Module.Assembly)) + { + CollectAllReferencedAssemblies(resolved.Module.Assembly, seen); + } + else + { + UnityEngine.Debug.Log($"[CollectAllReferencedAssemblies] Skip {resolved.Module.Assembly} (not a player compilation reference)"); + } + } + } + catch(AssemblyResolutionException e) + { + UnityEngine.Debug.Log($"[CollectAllReferencedAssemblies] Failed to resolve Assembly {e.AssemblyReference.FullName}, skipping"); + } + } + + return seen; + } + + public static void Init() + { + PlayerReferenceNames = CollectPlayerReferenceNames(); + PlayerReferenceDirectories = CollectPlayerReferenceDirectories(); + // A degenerate reference set would silently turn workaround + // generation into a no-op: the build stays green and devices throw + // ExecutionEngineException at runtime. Fail the build instead. Any + // sane player reference set contains a core library and at least + // one UnityEngine module. + if (!(PlayerReferenceNames.Contains("mscorlib") || PlayerReferenceNames.Contains("netstandard")) + || !PlayerReferenceNames.Any(n => n.StartsWith("UnityEngine"))) + { + throw new InvalidOperationException($"[Magic.Unity] player compilation reference set looks degenerate ({PlayerReferenceNames.Count} entries), refusing to generate IL2CPP workarounds from it"); + } + UnityEngine.Debug.Log($"[CollectAllReferencedAssemblies] player compilation references: {string.Join(",", PlayerReferenceNames.OrderBy(n => n))}"); + var assemblyCSharp = AssemblyDefinition.ReadAssembly("Library/ScriptAssemblies/Assembly-CSharp.dll"); + var referencedAssemblies = CollectAllReferencedAssemblies(assemblyCSharp); + UnityEngine.Debug.Log($"[CollectAllReferencedAssemblies] {string.Join(",", referencedAssemblies)}"); + + AllMethods = referencedAssemblies + .Select(a => a.MainModule) + .SelectMany(m => m.Types) + .SelectMany(t => t.Methods) + .ToList(); + + MagicRuntimeDelegateHelpers = AssemblyDefinition + .ReadAssembly(PackageExportPath.MagicRuntimeDll) + .MainModule + .Types + .Where(t => t.FullName == "Magic.DelegateHelpers").Single(); + } + + public static void StartRewriteAssembly(AssemblyDefinition assy) + { + DynamicCallSites.Clear(); + } + + public static void FinishRewriteAssembly(AssemblyDefinition assy) + { + if (DynamicCallSites.Count > 0) + { + MaybeEmitWorkaroundStaticType(assy, DynamicCallSites); + } + } + + public static void AnalyzeMethod(MethodDefinition m) + { + foreach (var i in m.Body.Instructions) + { + if (i.OpCode == OpCodes.Stsfld) + { + var field = i.Operand as FieldReference; + if (field.FieldType.FullName.StartsWith("Magic.CallSiteZeroArityMember")) + { + var ldstrInstruction = i.Previous.Previous; + if (ldstrInstruction.OpCode != OpCodes.Ldstr) + { + throw new BytecodeAssumptionViolatedException($"Could not find name of callsite target member, MAGIC's bytecode patterns may have changed. (expected ldstr at {ldstrInstruction.Offset}, got {ldstrInstruction})"); + } + var name = ldstrInstruction.Operand as string; + DynamicCallSites.Add(new DynamicCallSiteInfo + { + name = name, + arity = 0, + isStatic = false + }); + DynamicCallSites.Add(new DynamicCallSiteInfo + { + name = $"get_{name}", + arity = 0, + isStatic = false + }); + } + else if (field.FieldType.FullName.StartsWith("Magic.CallsiteInstanceMethod")) + { + var ldstrInstruction = i.Previous.Previous; + if (ldstrInstruction.OpCode != OpCodes.Ldstr) + { + throw new BytecodeAssumptionViolatedException($"Could not find name of callsite target member, MAGIC's bytecode patterns may have changed. (expected ldstr at {ldstrInstruction.Offset}, got {ldstrInstruction})"); + } + var name = ldstrInstruction.Operand as string; + var invokeMethod = field.FieldType.Resolve().Methods.Where(_m => _m.Name == "Invoke").Single(); + var arity = invokeMethod.Parameters.Count - 1; + DynamicCallSites.Add(new DynamicCallSiteInfo + { + name = name, + arity = arity, + isStatic = false + }); + } + else if (field.FieldType.FullName.StartsWith("Magic.CallsiteStaticMethod")) + { + var ldstrInstruction = i.Previous.Previous; + if (ldstrInstruction.OpCode != OpCodes.Ldstr) + { + throw new BytecodeAssumptionViolatedException($"Could not find name of callsite target member, MAGIC's bytecode patterns may have changed. (expected ldstr at {ldstrInstruction.Offset}, got {ldstrInstruction})"); + } + var name = ldstrInstruction.Operand as string; + var invokeMethod = field.FieldType.Resolve().Methods.Where(_m => _m.Name == "Invoke").Single(); + var arity = invokeMethod.Parameters.Count; + DynamicCallSites.Add(new DynamicCallSiteInfo + { + name = name, + arity = arity, + isStatic = true + }); + } + } + } + } + + public static void MaybeRemoveIL2CPPWorkaround(AssemblyDefinition assy) + { + // to make this process idempotent we remove the workaround type if + // it exists. this happens when we run this process over the same + // assembly multiple times. + var existingWorkaroundType = assy.MainModule.Types.Where(t => t.Namespace == "Magic.Unity" && t.Name == "").FirstOrDefault(); + if(existingWorkaroundType != null) + { + UnityEngine.Debug.LogFormat("[Magic.Unity/GenerateGenericWorkaroundMethods] {1} found existing workaround type, removing {0}", existingWorkaroundType, assy); + assy.MainModule.Types.Remove(existingWorkaroundType); + } + } + + static void MaybeEmitWorkaroundStaticType(AssemblyDefinition assy, IEnumerable callSiteInfos) + { + var type = new TypeDefinition("Magic.Unity", "", TypeAttributes.Public, assy.MainModule.TypeSystem.Object); + var method = new MethodDefinition("", MethodAttributes.Public | MethodAttributes.Static, assy.MainModule.TypeSystem.Void); + var invocations = 0; + // have to add type to assembly so that module.Import in + // EmitWorkaroundInvocation works. we remove if no invocations are + // needed + assy.MainModule.Types.Add(type); + type.Methods.Add(method); + foreach (var callSiteInfo in callSiteInfos) + { + UnityEngine.Debug.LogFormat("[Magic.Unity/GenerateGenericWorkaroundMethods] call site name {0}", callSiteInfo.name); + var signatures = GetPrecompilationSignatures(callSiteInfo); + foreach (var signature in signatures) + { + invocations += 1; + EmitWorkaroundInvocation(method.Body, signature); + } + } + method.Body.Instructions.Add(Instruction.Create(OpCodes.Ret)); + if(invocations == 0) + { + // no actual invocations generated, remove type from assembly + assy.MainModule.Types.Remove(type); + } + else + { + UnityEngine.Debug.LogFormat("[Magic.Unity/GenerateGenericWorkaroundMethods] added il2cpp workaround to {1} {0}", type, assy); + } + } + + public static MethodDefinition GetRuntimeDelegateHelperMethod(string name) + { + foreach (var method in MagicRuntimeDelegateHelpers.Methods) + { + if (method.Name == name) + return method; + } + + throw new KeyNotFoundException($"Could not find method {name} in MAGIC runtime delegate helpers"); + } + + private static void EmitWorkaroundInvocation(MethodBody body, TypeReference[] signature) + { + UnityEngine.Debug.LogFormat("[Magic.Unity/GenerateGenericWorkaroundMethods] EmitWorkaroundInvocation {0}", string.Join(",", signature)); + var module = body.Method.Module; + var arity = signature.Length - 1; + var name = $"GetMethodDelegateFast{arity:D2}"; + var openGenericMethod = module.ImportReference(GetRuntimeDelegateHelperMethod(name)); + var closedGenericMethod = new Mono.Cecil.GenericInstanceMethod(openGenericMethod); + foreach (var t in signature) + { + closedGenericMethod.GenericArguments.Add(module.ImportReference(t)); + } + body.Instructions.Add(Instruction.Create(OpCodes.Ldnull)); + body.Instructions.Add(Instruction.Create(OpCodes.Call, closedGenericMethod)); + body.Instructions.Add(Instruction.Create(OpCodes.Pop)); + } + + static TypeReference[] GetPrecompilationSignature(MethodDefinition m) + { + var paramTypes = m.Parameters.Select(_m => _m.ParameterType); + var returnType = m.ReturnType == m.Module.TypeSystem.Void ? m.Module.TypeSystem.Object : m.ReturnType; + var declaringType = m.DeclaringType; + return m.IsStatic ? paramTypes.Append(returnType).ToArray() + : paramTypes.Prepend(declaringType).Append(returnType).ToArray(); + } + + static List GetPrecompilationSignatures(DynamicCallSiteInfo callSiteInfo) + { + return AllMethods.Where(m => m.Name == callSiteInfo.name + && m.Parameters.Count == callSiteInfo.arity + && m.IsStatic == callSiteInfo.isStatic + && IsPrecompilationCandidate(m)) + .Select(GetPrecompilationSignature) + .ToList(); + } + + static bool IsPrecompilationCandidate(MethodDefinition m) + { + return m.IsPublic + && !m.DeclaringType.HasGenericParameters + && !m.HasGenericParameters + && !m.IsGenericInstance + && !m.ReturnType.HasGenericParameters + && !(m.ReturnType == m.Module.TypeSystem.Void) + && !m.ReturnType.IsGenericInstance + && !m.ReturnType.HasGenericParameters + && !m.Parameters.Any(p => p.ParameterType.IsByReference) + && !m.Parameters.Any(p => p.ParameterType.HasGenericParameters) + && !m.Parameters.Any(p => p.ParameterType.IsGenericInstance) + && (m.Parameters.Any(p => p.ParameterType.IsValueType) + || m.ReturnType.IsValueType + || (m.DeclaringType.IsValueType + && !m.DeclaringType.IsByReference + && !m.IsStatic)); + } + } +} \ No newline at end of file diff --git a/magic-unity-dual/Editor/GenerateGenericWorkaroundMethods.cs.meta b/magic-unity-dual/Editor/GenerateGenericWorkaroundMethods.cs.meta new file mode 100644 index 00000000..f07bbbd3 --- /dev/null +++ b/magic-unity-dual/Editor/GenerateGenericWorkaroundMethods.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 9878c54175e3ad8c48f7869fe7cecd79 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/magic-unity-dual/Editor/IL2CPPWorkarounds.cs b/magic-unity-dual/Editor/IL2CPPWorkarounds.cs new file mode 100644 index 00000000..c1679c62 --- /dev/null +++ b/magic-unity-dual/Editor/IL2CPPWorkarounds.cs @@ -0,0 +1,87 @@ +using System; +using System.IO; +using System.Collections.Generic; +using System.Linq; +using Mono.Cecil; +using Mono.Cecil.Cil; +using Mono.Cecil.Rocks; +using UnityEditor; +using UnityEditor.Build; +using UnityEngine; + +namespace Magic.Unity +{ + public static class IL2CPPWorkarounds + { + + static bool IsIL2CPPEnabled() + { + return PlayerSettings.GetScriptingBackend(NamedBuildTarget.FromBuildTargetGroup(EditorUserBuildSettings.selectedBuildTargetGroup)) == ScriptingImplementation.IL2CPP; + } + + public static void RewriteAssemblies() + { + RewriteAssemblies(PlayerCljAssemblies.Paths()); + } + + public static void RewriteAssemblies(IEnumerable files) + { + var fileList = files.ToList(); + Debug.LogFormat("[Magic.Unity] rewriting {0} clj assemblies", fileList.Count); + GenerateGenericWorkaroundMethods.Init(); + foreach (var file in fileList) + { + RewriteAssembly(file); + } + } + + static void RewriteAssembly(string file) + { + var runtimeLocation = PackageExportPath.ExportDirectory; + Debug.LogFormat($"[Magic.Unity] runtime location {runtimeLocation}"); + + var resolver = new DefaultAssemblyResolver(); + resolver.AddSearchDirectory(runtimeLocation); + var outfile = file + ".out"; + using (var assy = AssemblyDefinition.ReadAssembly(file, new ReaderParameters { AssemblyResolver = resolver })) + { + Debug.LogFormat("[Magic.Unity] processing {0} ({1})", assy.FullName, file); + + GenerateGenericWorkaroundMethods.MaybeRemoveIL2CPPWorkaround(assy); + + if(IsIL2CPPEnabled()) + { + Debug.LogFormat("[Magic.Unity] {0} adding IL2CPP workarounds", assy.FullName); + + GenerateGenericWorkaroundMethods.StartRewriteAssembly(assy); + + foreach (var t in assy.MainModule.Types) + { + foreach (var m in t.Methods) + { + if (m.HasBody) + ProcessMethod(m); + } + } + + GenerateGenericWorkaroundMethods.FinishRewriteAssembly(assy); + } + + assy.MainModule.Write(outfile); + } + File.Delete(file); + File.Move(outfile, file); + File.Delete(outfile); + } + + static void ProcessMethod(MethodDefinition m) + { + m.Body.SimplifyMacros(); + + EliminateUnreachableInstructions.RewriteMethod(m); + GenerateGenericWorkaroundMethods.AnalyzeMethod(m); + + m.Body.OptimizeMacros(); + } + } +} diff --git a/magic-unity-dual/Editor/IL2CPPWorkarounds.cs.meta b/magic-unity-dual/Editor/IL2CPPWorkarounds.cs.meta new file mode 100644 index 00000000..5186a6b5 --- /dev/null +++ b/magic-unity-dual/Editor/IL2CPPWorkarounds.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 7cbdbe6362e8c817f98655b93086240f +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/magic-unity-dual/Editor/LinkXmlGenerator.cs b/magic-unity-dual/Editor/LinkXmlGenerator.cs new file mode 100644 index 00000000..7b4ed31e --- /dev/null +++ b/magic-unity-dual/Editor/LinkXmlGenerator.cs @@ -0,0 +1,65 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Xml; +using UnityEditor; +using UnityEngine; + +namespace Magic.Unity +{ + static class LinkXmlGenerator + { + public static void BuildLinkXml() + { + var cljAssemblies = PlayerCljAssemblies.Paths() + .Select(Path.GetFileNameWithoutExtension) + .Concat(new[] { "Clojure", "Magic.Runtime" }); + BuildLinkXml(cljAssemblies); + + } + public static void BuildLinkXml(IEnumerable linkXmlEntries) + { + var linkPath = "Assets/link.xml"; + if (File.Exists(linkPath)) + { + Debug.Log("[Magic.Unity/LinkXmlGenerator] Update link.xml"); + var doc = new XmlDocument(); + doc.Load(linkPath); + var linker = doc.DocumentElement; + var existed = linker.ChildNodes + .Cast() + .Select(assembly => assembly.Attributes?["fullname"].Value) + .ToHashSet(); + var added = linkXmlEntries + .Where(e => !existed.Contains(e)) + .ToArray(); + if (added.Any()) + { + linker.AppendChild(doc.CreateComment("auto add by builder")); + foreach (var e in added) + { + Debug.Log($"[Magic.Unity/LinkXmlGenerator] Adding entry '{e}'"); + var ele = doc.CreateElement("assembly"); + ele.SetAttribute("fullname", e); + linker.AppendChild(ele); + } + doc.Save(linkPath); + } + return; + } + Debug.Log("[Magic.Unity/LinkXmlGenerator] Generating link.xml"); + var linkXml = XmlWriter.Create(linkPath); + linkXml.WriteStartElement("linker"); + foreach (var entry in linkXmlEntries) + { + Debug.Log($"[Magic.Unity/LinkXmlGenerator] Adding entry '{entry}'"); + linkXml.WriteStartElement("assembly"); + linkXml.WriteAttributeString("fullname", entry); + linkXml.WriteEndElement(); + } + linkXml.WriteEndElement(); + linkXml.Close(); + } + } +} \ No newline at end of file diff --git a/magic-unity-dual/Editor/LinkXmlGenerator.cs.meta b/magic-unity-dual/Editor/LinkXmlGenerator.cs.meta new file mode 100644 index 00000000..91d2806d --- /dev/null +++ b/magic-unity-dual/Editor/LinkXmlGenerator.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: c5c344eeed5676fd5a516fd44ed2c2ab +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/magic-unity-dual/Editor/Magic.Unity.Editor.asmdef b/magic-unity-dual/Editor/Magic.Unity.Editor.asmdef new file mode 100644 index 00000000..fc693059 --- /dev/null +++ b/magic-unity-dual/Editor/Magic.Unity.Editor.asmdef @@ -0,0 +1,21 @@ +{ + "name": "Magic.Unity.Editor", + "rootNamespace": "", + "references": [], + "includePlatforms": [ + "Editor" + ], + "excludePlatforms": [], + "allowUnsafeCode": false, + "overrideReferences": true, + "precompiledReferences": [ + "Mono.Cecil.dll", + "Mono.Cecil.Rocks.dll", + "Mono.Cecil.Mdb.dll", + "Mono.Cecil.Pdb.dll" + ], + "autoReferenced": true, + "defineConstraints": [], + "versionDefines": [], + "noEngineReferences": false +} \ No newline at end of file diff --git a/magic-unity-dual/Editor/Magic.Unity.Editor.asmdef.meta b/magic-unity-dual/Editor/Magic.Unity.Editor.asmdef.meta new file mode 100644 index 00000000..a816b3cd --- /dev/null +++ b/magic-unity-dual/Editor/Magic.Unity.Editor.asmdef.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: c8b8ad9bde1c340ada9c2647589baedd +AssemblyDefinitionImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/magic-unity-dual/Editor/MagicPreprocessor.cs b/magic-unity-dual/Editor/MagicPreprocessor.cs new file mode 100644 index 00000000..da965abd --- /dev/null +++ b/magic-unity-dual/Editor/MagicPreprocessor.cs @@ -0,0 +1,40 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Xml; +using UnityEditor; +using UnityEditor.Build; +using UnityEditor.Build.Reporting; +using UnityEngine; + +namespace Magic.Unity +{ + class BuildPreprocessor : IPreprocessBuildWithReport + { + public int callbackOrder => 0; + + public void OnPreprocessBuild(BuildReport report) + { + Debug.Log($"[Magic.Unity] preprocessing build at path {report.summary.outputPath} ({report.summary.platform})"); +#if UNITY_2022_1_OR_NEWER + foreach (var file in report.GetFiles()) +#else + foreach (var file in report.files) +#endif + { + Debug.Log($"[Magic.Unity] file {file.path}"); + } + + try + { + StockClojureCoexistence.Reconcile(); + IL2CPPWorkarounds.RewriteAssemblies(); + LinkXmlGenerator.BuildLinkXml(); + } catch (Exception e) + { + throw new BuildPlayerWindow.BuildMethodException(e.Message); + } + } + } +} diff --git a/magic-unity-dual/Editor/MagicPreprocessor.cs.meta b/magic-unity-dual/Editor/MagicPreprocessor.cs.meta new file mode 100644 index 00000000..09a8cfc3 --- /dev/null +++ b/magic-unity-dual/Editor/MagicPreprocessor.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 590e0439a46ee5b688685f84339d552c +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/magic-unity-dual/Editor/PackageExportPath.cs b/magic-unity-dual/Editor/PackageExportPath.cs new file mode 100644 index 00000000..4192c76c --- /dev/null +++ b/magic-unity-dual/Editor/PackageExportPath.cs @@ -0,0 +1,40 @@ +using System; +using System.IO; +using UnityEditor.PackageManager; + +namespace Magic.Unity +{ + // The pre-build rewrite must read the package's own runtime DLLs. They + // cannot be located through typeof(...).Assembly.Location or + // Assembly.Load: when a consumer keeps a stock ClojureCLR in Assets, + // Unity dedups Clojure.dll by file name and those anchors bind to the + // stock copy. Resolve the package install path instead; resolvedPath is + // the physical location for git, registry, local and embedded packages. + internal static class PackageExportPath + { + static PackageInfo Package => PackageInfo.FindForAssembly(typeof(PackageExportPath).Assembly); + + internal static string ExportDirectory => Path.Combine(Package.resolvedPath, "Runtime", "Infrastructure", "Export"); + + internal static string MagicRuntimeDll => Path.Combine(ExportDirectory, "Magic.Runtime.dll"); + + internal static string ExportAssetPath => Package.assetPath + "/Runtime/Infrastructure/Export"; + + // Asset paths under Packages/ are virtual; map them to the physical + // location before any File or Cecil access. Assets/ paths and + // absolute paths pass through. + internal static string PhysicalPath(string assetPath) + { + if (assetPath.StartsWith("Packages/", StringComparison.Ordinal)) + { + var package = PackageInfo.FindForAssetPath(assetPath); + if (package != null) + { + var relative = assetPath.Substring(package.assetPath.Length + 1); + return Path.Combine(package.resolvedPath, relative); + } + } + return assetPath; + } + } +} diff --git a/magic-unity-dual/Editor/PackageExportPath.cs.meta b/magic-unity-dual/Editor/PackageExportPath.cs.meta new file mode 100644 index 00000000..b9737b2c --- /dev/null +++ b/magic-unity-dual/Editor/PackageExportPath.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: fe3abe2787ece4661b1208b2730c70c8 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/magic-unity-dual/Editor/PlayerCljAssemblies.cs b/magic-unity-dual/Editor/PlayerCljAssemblies.cs new file mode 100644 index 00000000..d64976ba --- /dev/null +++ b/magic-unity-dual/Editor/PlayerCljAssemblies.cs @@ -0,0 +1,37 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using UnityEditor.Compilation; + +namespace Magic.Unity +{ + // The pre-build rewrite and the link.xml generator used to discover clj + // assemblies by scanning the loaded AppDomain. In a coexisting editor + // the fork runtime DLLs are excluded from the editor domain (see + // StockClojureCoexistence), which would turn that scan into a silent + // no-op: no workarounds generated, no link.xml entries, devices fail at + // runtime. Discover them from player compilation references instead; + // that is the set that actually ships, independent of editor state. + internal static class PlayerCljAssemblies + { + internal static List Paths() + { + var paths = new HashSet(StringComparer.OrdinalIgnoreCase); + foreach (var assembly in CompilationPipeline.GetAssemblies(AssembliesType.PlayerWithoutTestAssemblies)) + { + foreach (var reference in assembly.allReferences) + { + if (reference.EndsWith(".clj.dll", StringComparison.OrdinalIgnoreCase)) + { + paths.Add(PackageExportPath.PhysicalPath(reference)); + } + } + } + if (paths.Count == 0) + { + throw new InvalidOperationException("[Magic.Unity] no .clj.dll player compilation references found, refusing to continue with an empty clj assembly set"); + } + return paths.OrderBy(p => p, StringComparer.OrdinalIgnoreCase).ToList(); + } + } +} diff --git a/magic-unity-dual/Editor/PlayerCljAssemblies.cs.meta b/magic-unity-dual/Editor/PlayerCljAssemblies.cs.meta new file mode 100644 index 00000000..06830c1f --- /dev/null +++ b/magic-unity-dual/Editor/PlayerCljAssemblies.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 57669782459ef435cacc7ef76edd336a +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/magic-unity-dual/Editor/StockClojureCoexistence.cs b/magic-unity-dual/Editor/StockClojureCoexistence.cs new file mode 100644 index 00000000..fda47bbd --- /dev/null +++ b/magic-unity-dual/Editor/StockClojureCoexistence.cs @@ -0,0 +1,258 @@ +using System; +using System.IO; +using System.Linq; +using Mono.Cecil; +using UnityEditor; +using UnityEngine; + +namespace Magic.Unity +{ + // Stock clojure.lang.RT probes Assembly.Load("clojure.core.clj") during + // init; finding the fork-compiled DLL throws a TypeLoadException storm. + // So while a foreign (strong-named) Clojure.dll is present under + // Assets, fork .clj.dll plugins are imported with editor loading off. + // Only the clj.dlls: excluding the fork Clojure.dll itself would leave + // Magic.Unity with no Clojure to compile against once the stock copy + // is removed, breaking the revert under batch mode. + // + // Separate bootstrap class: import callbacks touch the helper class, + // and a static ctor that throws mid import (asset database calls do) + // would poison it for the whole domain. + [InitializeOnLoad] + internal static class StockClojureCoexistenceBootstrap + { + static StockClojureCoexistenceBootstrap() + { + // delayCall may never fire before a batch run ends; the direct + // call throws when the domain load is inside an import batch. + if (Application.isBatchMode) + { + try + { + StockClojureCoexistence.Reconcile(); + } + catch (UnityException) + { + EditorApplication.delayCall += StockClojureCoexistence.Reconcile; + } + } + else + { + EditorApplication.delayCall += StockClojureCoexistence.Reconcile; + } + } + } + + internal static class StockClojureCoexistence + { + // The state file shares the artifact database's lifetime: a Library + // wipe loses both, and the rebuilt artifacts go through the + // preprocessor with the current state anyway. + public static void Reconcile() + { + var foreign = ForeignClojurePresent(); + var current = foreign ? "foreign-clojure" : "pure-magic"; + if (LastAppliedState() == current) + { + return; + } + Debug.Log(foreign + ? "[Magic.Unity/StockClojureCoexistence] foreign Clojure.dll detected, reimporting fork clj.dll plugins with editor loading off" + : "[Magic.Unity/StockClojureCoexistence] no foreign Clojure.dll present, reimporting fork clj.dll plugins with their pristine settings"); + foreach (var importer in PluginImporter.GetAllImporters()) + { + if (!importer.isNativePlugin && importer.assetPath.EndsWith(".clj.dll", StringComparison.OrdinalIgnoreCase)) + { + AssetDatabase.ImportAsset(importer.assetPath); + } + } + try + { + File.WriteAllText(StateFilePath, current); + } + catch (Exception e) + { + Debug.LogWarning($"[Magic.Unity/StockClojureCoexistence] could not write {StateFilePath}: {e.Message}"); + } + } + + static string StateFilePath => + Path.Combine(Path.GetDirectoryName(Application.dataPath), "Library", "MagicUnityCoexistenceState.txt"); + + static string LastAppliedState() + { + try + { + return File.Exists(StateFilePath) ? File.ReadAllText(StateFilePath).Trim() : ""; + } + catch (Exception) + { + return ""; + } + } + + // Filesystem scan, not a PluginImporter scan: the asset database is + // not queryable inside import callbacks. A vendored fork copy in + // Assets has no strong name and stays non-foreign. + internal static bool ForeignClojurePresent() + { + try + { + return Directory.EnumerateFiles(Application.dataPath, "Clojure.dll", SearchOption.AllDirectories).Any(IsStockClojure); + } + catch (Exception e) + { + Debug.LogWarning($"[Magic.Unity/StockClojureCoexistence] foreign Clojure scan failed: {e.Message}"); + return false; + } + } + + static bool IsStockClojure(string path) + { + try + { + var token = System.Reflection.AssemblyName.GetAssemblyName(path).GetPublicKeyToken(); + return token != null && token.Length > 0; + } + catch (Exception e) + { + Debug.LogWarning($"[Magic.Unity/StockClojureCoexistence] could not inspect {path}: {e.Message}"); + return false; + } + } + + internal static bool ReferencesForkClojure(string path) + { + try + { + using (var assembly = AssemblyDefinition.ReadAssembly(path)) + { + var clojureReference = assembly.MainModule.AssemblyReferences.FirstOrDefault(r => r.Name == "Clojure"); + return clojureReference != null + && (clojureReference.PublicKeyToken == null || clojureReference.PublicKeyToken.Length == 0); + } + } + catch (Exception e) + { + Debug.LogWarning($"[Magic.Unity/StockClojureCoexistence] could not inspect {path}: {e.Message}"); + return false; + } + } + + internal static System.Collections.Generic.IEnumerable ValidBuildTargets() + { + foreach (BuildTarget target in Enum.GetValues(typeof(BuildTarget))) + { + if ((int)target < 0) + { + continue; + } + var field = typeof(BuildTarget).GetField(target.ToString()); + if (field == null || field.GetCustomAttributes(typeof(ObsoleteAttribute), false).Any()) + { + continue; + } + yield return target; + } + } + } + + // Importer changes made here are written back to the .meta on mutable + // installs (the userData marker drives the restore) and stay + // artifact-only on immutable installs, where the pristine .meta is the + // restore state. + internal class CljPluginPreprocessor : AssetPostprocessor + { + void OnPreprocessAsset() + { + if (!assetPath.EndsWith(".clj.dll", StringComparison.OrdinalIgnoreCase)) + { + return; + } + var importer = assetImporter as PluginImporter; + if (importer == null) + { + return; + } + if (StockClojureCoexistence.ForeignClojurePresent()) + { + DisableEditorLoading(importer); + } + else + { + RestoreEditorLoading(importer); + } + } + + // SetExcludeEditorFromAnyPlatform is not honored by the plugin + // loader, hence the switch to explicit per-platform compatibility. + // Restore goes by marker only, never touching a plugin the consumer + // made editor-only themselves. + const string AnyPlatformMarker = "Magic.Unity.StockClojureCoexistence:any-platform"; + const string CustomPlatformsMarker = "Magic.Unity.StockClojureCoexistence:custom-platforms"; + + static void DisableEditorLoading(PluginImporter importer) + { + if (HasMarker(importer) + || (!importer.GetCompatibleWithAnyPlatform() && !importer.GetCompatibleWithEditor())) + { + return; + } + if (!StockClojureCoexistence.ReferencesForkClojure(PackageExportPath.PhysicalPath(importer.assetPath))) + { + return; + } + string marker; + if (importer.GetCompatibleWithAnyPlatform()) + { + importer.SetCompatibleWithAnyPlatform(false); + foreach (var target in StockClojureCoexistence.ValidBuildTargets()) + { + try { importer.SetCompatibleWithPlatform(target, true); } catch { } + } + marker = AnyPlatformMarker; + } + else + { + marker = CustomPlatformsMarker; + } + AddMarker(importer, marker); + importer.SetCompatibleWithEditor(false); + Debug.Log($"[Magic.Unity/StockClojureCoexistence] editor loading off for {importer.assetPath}"); + } + + static void RestoreEditorLoading(PluginImporter importer) + { + if (!HasMarker(importer)) + { + return; + } + var wasAnyPlatform = importer.userData.Contains(AnyPlatformMarker); + RemoveMarker(importer); + importer.SetCompatibleWithEditor(true); + if (wasAnyPlatform) + { + importer.SetCompatibleWithAnyPlatform(true); + importer.SetExcludeEditorFromAnyPlatform(false); + } + Debug.Log($"[Magic.Unity/StockClojureCoexistence] editor loading on for {importer.assetPath}"); + } + + static bool HasMarker(PluginImporter importer) + { + return importer.userData != null && importer.userData.Contains("Magic.Unity.StockClojureCoexistence:"); + } + + static void AddMarker(PluginImporter importer, string marker) + { + importer.userData = string.IsNullOrEmpty(importer.userData) ? marker : marker + ";" + importer.userData; + } + + static void RemoveMarker(PluginImporter importer) + { + importer.userData = importer.userData + .Replace(AnyPlatformMarker + ";", "").Replace(AnyPlatformMarker, "") + .Replace(CustomPlatformsMarker + ";", "").Replace(CustomPlatformsMarker, ""); + } + } +} diff --git a/magic-unity-dual/Editor/StockClojureCoexistence.cs.meta b/magic-unity-dual/Editor/StockClojureCoexistence.cs.meta new file mode 100644 index 00000000..3a070498 --- /dev/null +++ b/magic-unity-dual/Editor/StockClojureCoexistence.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 9043d4d40082b4d17a1f739ceb0c212c +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/magic-unity-dual/Magic.Unity.nuspec b/magic-unity-dual/Magic.Unity.nuspec new file mode 100644 index 00000000..ef785c9d --- /dev/null +++ b/magic-unity-dual/Magic.Unity.nuspec @@ -0,0 +1,22 @@ + + + + Magic.Unity + 2.0.0 + Magic.Unity + skydread1 + Contains the MAGIC, Clojure, Clojure.Runtime and Magic.Runtime dlls. + + + + + + + + + + + + + + diff --git a/magic-unity-dual/Magic.Unity.nuspec.meta b/magic-unity-dual/Magic.Unity.nuspec.meta new file mode 100644 index 00000000..cf5fc127 --- /dev/null +++ b/magic-unity-dual/Magic.Unity.nuspec.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 052bd2d302a8c4d278ff422beac7ba40 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/magic-unity-dual/README.md b/magic-unity-dual/README.md new file mode 100644 index 00000000..88ee0015 --- /dev/null +++ b/magic-unity-dual/README.md @@ -0,0 +1,68 @@ +MAGIC Unity Integration +======================= + +[Unity](https://unity.com/) integration for the MAGIC compiler. + +This UPM package ships the Clojure runtime DLLs that Unity loads at play time, plus the Editor-side preprocessors that rewrite MAGIC's IL during an IL2CPP build (iOS, Android, consoles). It does not compile Clojure; that step runs outside Unity via `nos dotnet/build` (see [Nostrand](../nostrand)). + +## Install + +Consume as a UPM package via git URL in `Packages/manifest.json`, pinned to a tag from the [releases page](https://github.com/flybot-sg/magic/releases). Pick the variant that matches how your Editor runs Clojure (see [Package variants](#package-variants)): + +``` +// Default: MAGIC everywhere, including the Editor's Play mode. For projects +// with no stock ClojureCLR. +"sg.flybot.magic.unity": "https://github.com/flybot-sg/magic.git?path=magic-unity#" +``` + +``` +// Dual: stock ClojureCLR in the Editor, MAGIC in player builds. The runtime +// DLLs are excluded from the Editor, so there is no console noise and no probe +// clash. For projects that keep ClojureCLR for Editor / REPL work. +"sg.flybot.magic.unity.dual": "https://github.com/flybot-sg/magic.git?path=magic-unity-dual#" +``` + +Install exactly one variant. See [magic-unity-smoke](../unity-examples/magic-unity-smoke) for a working IL2CPP regression project that uses this integration. + +## What the package ships + +- `Runtime/Infrastructure/Export/` - prebuilt Clojure runtime: `Clojure.dll`, `Magic.Runtime.dll`, and the full stdlib as `*.clj.dll` (e.g. `clojure.core.clj.dll`, `clojure.pprint.clj.dll`, ...). Unity loads these as regular .NET assemblies at play time. +- `Runtime/Magic.Unity.cs` - the `Magic.Unity.Clojure` API (Boot/Require/GetVar) that C# scripts call to drive the Clojure runtime. Sets the platform-appropriate code-load order (`InitType` only on IL2CPP, `InitType` + `FileSystem` in the Editor). +- `Editor/MagicPreprocessor.cs` - an `IPreprocessBuildWithReport` hook that runs on every build and drives the IL2CPP-specific rewrites below. +- `Editor/IL2CPPWorkarounds.cs` - walks each candidate assembly with Mono.Cecil and applies `EliminateUnreachableInstructions` (removes dead IL the AOT linker chokes on) and `GenerateGenericWorkaroundMethods` (synthesises reachable instantiations of generic delegate helpers so IL2CPP's generic-sharing pass can find them). +- `Editor/LinkXmlGenerator.cs` - appends MAGIC-required `` entries to `Assets/link.xml` so the managed-code stripper does not remove dynamically-referenced types. + +## How it works + +1. You compile your own Clojure namespaces to `.clj.dll` outside Unity via `nos dotnet/build`, writing them into `Assets/Plugins/Magic/` (see [magic-unity-smoke/dotnet.clj](../unity-examples/magic-unity-smoke/dotnet.clj) for the canonical task definition). The package does not include a compiler. +2. Unity opens the project. The prebuilt runtime + stdlib from `Runtime/Infrastructure/Export/` and your own `.clj.dll`s are both loaded as plain .NET assemblies. `Magic.Unity.Clojure.Boot()` initialises the runtime; `Require` / `GetVar` let C# scripts call into Clojure. +3. On every build, `MagicPreprocessor` runs first. When the build target uses IL2CPP, it rewrites the `.clj.dll` bodies in place so the IL2CPP transpiler can consume them (and writes `link.xml` entries); on a Mono build the preprocessor only sweeps any leftover IL2CPP-only workarounds from a previous build. The runtime DLLs are loaded the same way under either backend. +4. Coexistence with stock ClojureCLR: if a strong-named `Clojure.dll` is found under `Assets` (projects that keep ClojureCLR for Editor work and MAGIC for shipped builds), every MAGIC-compiled `.clj.dll` is imported with Editor loading off, because the stock runtime probe-loads `clojure.core.clj` at init and a MAGIC DLL answering that probe fails to load. With this default variant the runtime ships Editor-loadable, so on an immutable (PackageCache) install the Editor logs `Assembly '...clj.dll' will not be loaded due to errors: Assembly is incompatible with the editor` for the package's `Export` DLLs on every domain reload. These lines are benign (Unity reporting the intended exclusion, not a failure), and player builds are unaffected. To silence them, use the [`.dual` variant](#package-variants), which ships the runtime excluded from the Editor by construction. + +## Package variants + +The package is shipped in two variants. They are identical except for one thing: whether the runtime `Runtime/Infrastructure/Export/*.clj.dll` plugins carry a `!UNITY_EDITOR` define constraint. That single difference decides whether the MAGIC runtime is visible to the Editor. + +| | `sg.flybot.magic.unity` (default) | `sg.flybot.magic.unity.dual` | +|---|---|---| +| Runtime in the Editor | yes (loadable) | no (`!UNITY_EDITOR`) | +| MAGIC in Editor Play mode | works | not available (use stock ClojureCLR) | +| Stock ClojureCLR alongside | probe clash, handled by the coexistence guard, with benign console noise | no clash, no noise (runtime is simply absent from the Editor) | +| Player builds (Mono / IL2CPP) | identical | identical | + +Choose the **default** if your project runs MAGIC in the Editor (Play mode, edit-mode tooling) and has no stock ClojureCLR. Choose **`.dual`** if your Editor runs stock ClojureCLR (REPL / hot-reload) and MAGIC only ships in player builds: the runtime is excluded from the Editor by the define constraint, so Unity never attempts to load it there and prints no narration. + +`magic-unity-dual/` is generated from `magic-unity/` by `bb gen-unity-dual` (the DLLs are byte-identical copies; only the 46 runtime `.meta`s and the package name differ) and is kept in sync by `bb check-drift`. The in-repo coexistence repro that validates both variants is `magic-unity-coexist/` (`bb coexist-noise` for the dual variant, `bb coexist-noise magic-only` to reproduce the noise). + +## API + +`Magic.Unity.Clojure` static class: + +- `void Require(string ns)` - load a Clojure namespace. Must be called before looking up vars in that namespace. +- `clojure.lang.Var GetVar(string ns, string name)` - look up a Clojure var. Dereference with `deref` or invoke with `invoke`. +- `T GetVar(string ns, string name)` - typed variant. +- `void Boot()` - initialize the Clojure runtime. Called automatically by the other methods; rarely needed directly. + +## Legal + +Copyright © 2020 Ramsey Nasser and contributors. Licensed under the Apache License, Version 2.0. diff --git a/magic-unity-dual/README.md.meta b/magic-unity-dual/README.md.meta new file mode 100644 index 00000000..3dad1010 --- /dev/null +++ b/magic-unity-dual/README.md.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: bd83e574f99edd046bb23f6463944ee6 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/magic-unity-dual/Runtime.meta b/magic-unity-dual/Runtime.meta new file mode 100644 index 00000000..94a76a3e --- /dev/null +++ b/magic-unity-dual/Runtime.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: be6fba836f68877c382e7708819f5f3f +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/magic-unity-dual/Runtime/Infrastructure.meta b/magic-unity-dual/Runtime/Infrastructure.meta new file mode 100644 index 00000000..a146163e --- /dev/null +++ b/magic-unity-dual/Runtime/Infrastructure.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 9e62c7d353954c469b52e6e590e68e67 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/magic-unity-dual/Runtime/Infrastructure/Export.meta b/magic-unity-dual/Runtime/Infrastructure/Export.meta new file mode 100644 index 00000000..2f62afcd --- /dev/null +++ b/magic-unity-dual/Runtime/Infrastructure/Export.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: e322e406c3fb84ea49c2195c6abbfbb8 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/magic-unity-dual/Runtime/Infrastructure/Export/Clojure.dll b/magic-unity-dual/Runtime/Infrastructure/Export/Clojure.dll new file mode 100644 index 00000000..9dec5454 Binary files /dev/null and b/magic-unity-dual/Runtime/Infrastructure/Export/Clojure.dll differ diff --git a/magic-unity-dual/Runtime/Infrastructure/Export/Clojure.dll.meta b/magic-unity-dual/Runtime/Infrastructure/Export/Clojure.dll.meta new file mode 100644 index 00000000..30104fdf --- /dev/null +++ b/magic-unity-dual/Runtime/Infrastructure/Export/Clojure.dll.meta @@ -0,0 +1,92 @@ +fileFormatVersion: 2 +guid: e3e99e46c2f80aeac9ea02a830ece9a8 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + : Any + second: + enabled: 0 + settings: + Exclude Android: 0 + Exclude Editor: 0 + Exclude Linux64: 0 + Exclude OSXUniversal: 0 + Exclude WebGL: 0 + Exclude Win: 0 + Exclude Win64: 0 + Exclude iOS: 0 + - first: + Android: Android + second: + enabled: 1 + settings: + CPU: ARMv7 + - first: + Any: + second: + enabled: 1 + settings: {} + - first: + Editor: Editor + second: + enabled: 1 + settings: + CPU: AnyCPU + DefaultValueInitialized: true + OS: AnyOS + - first: + Standalone: Linux64 + second: + enabled: 1 + settings: + CPU: AnyCPU + - first: + Standalone: OSXUniversal + second: + enabled: 1 + settings: + CPU: AnyCPU + - first: + Standalone: Win + second: + enabled: 1 + settings: + CPU: x86 + - first: + Standalone: Win64 + second: + enabled: 1 + settings: + CPU: x86_64 + - first: + WebGL: WebGL + second: + enabled: 1 + settings: {} + - first: + Windows Store Apps: WindowsStoreApps + second: + enabled: 0 + settings: + CPU: AnyCPU + - first: + iPhone: iOS + second: + enabled: 1 + settings: + AddToEmbeddedBinaries: false + CPU: AnyCPU + CompileFlags: + FrameworkDependencies: + userData: + assetBundleName: + assetBundleVariant: diff --git a/magic-unity-dual/Runtime/Infrastructure/Export/Magic.Runtime.dll b/magic-unity-dual/Runtime/Infrastructure/Export/Magic.Runtime.dll new file mode 100644 index 00000000..2f8ac9e9 Binary files /dev/null and b/magic-unity-dual/Runtime/Infrastructure/Export/Magic.Runtime.dll differ diff --git a/magic-unity-dual/Runtime/Infrastructure/Export/Magic.Runtime.dll.meta b/magic-unity-dual/Runtime/Infrastructure/Export/Magic.Runtime.dll.meta new file mode 100644 index 00000000..0eac98fc --- /dev/null +++ b/magic-unity-dual/Runtime/Infrastructure/Export/Magic.Runtime.dll.meta @@ -0,0 +1,82 @@ +fileFormatVersion: 2 +guid: 5cf4cbc1b276f89b1adaf1e50eab5b07 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + : Any + second: + enabled: 0 + settings: + Exclude Android: 0 + Exclude Editor: 0 + Exclude Linux64: 0 + Exclude OSXUniversal: 0 + Exclude WebGL: 0 + Exclude Win: 0 + Exclude Win64: 0 + - first: + Android: Android + second: + enabled: 1 + settings: + CPU: ARMv7 + - first: + Any: + second: + enabled: 1 + settings: {} + - first: + Editor: Editor + second: + enabled: 1 + settings: + CPU: AnyCPU + DefaultValueInitialized: true + OS: AnyOS + - first: + Standalone: Linux64 + second: + enabled: 1 + settings: + CPU: AnyCPU + - first: + Standalone: OSXUniversal + second: + enabled: 1 + settings: + CPU: x86_64 + - first: + Standalone: Win + second: + enabled: 1 + settings: + CPU: x86 + - first: + Standalone: Win64 + second: + enabled: 1 + settings: + CPU: x86_64 + - first: + WebGL: WebGL + second: + enabled: 1 + settings: {} + - first: + Windows Store Apps: WindowsStoreApps + second: + enabled: 0 + settings: + CPU: AnyCPU + userData: + assetBundleName: + assetBundleVariant: diff --git a/magic-unity-dual/Runtime/Infrastructure/Export/clojure.clr.io.clj.dll b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.clr.io.clj.dll new file mode 100755 index 00000000..2341b2fb Binary files /dev/null and b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.clr.io.clj.dll differ diff --git a/magic-unity-dual/Runtime/Infrastructure/Export/clojure.clr.io.clj.dll.meta b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.clr.io.clj.dll.meta new file mode 100644 index 00000000..07def207 --- /dev/null +++ b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.clr.io.clj.dll.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 9ff609d6dda9d7a9d9f3b493e035e9c4 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: + - '!UNITY_EDITOR' + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + : Any + second: + enabled: 0 + settings: + Exclude Android: 0 + Exclude Editor: 0 + Exclude Linux64: 0 + Exclude OSXUniversal: 0 + Exclude WebGL: 0 + Exclude Win: 0 + Exclude Win64: 0 + - first: + Android: Android + second: + enabled: 1 + settings: {} + - first: + Any: + second: + enabled: 1 + settings: {} + - first: + Editor: Editor + second: + enabled: 1 + settings: + DefaultValueInitialized: true + - first: + Standalone: Linux64 + second: + enabled: 1 + settings: {} + - first: + Standalone: OSXUniversal + second: + enabled: 1 + settings: {} + - first: + Standalone: Win + second: + enabled: 1 + settings: {} + - first: + Standalone: Win64 + second: + enabled: 1 + settings: {} + - first: + WebGL: WebGL + second: + enabled: 1 + settings: {} + - first: + Windows Store Apps: WindowsStoreApps + second: + enabled: 0 + settings: + CPU: AnyCPU + userData: + assetBundleName: + assetBundleVariant: diff --git a/magic-unity-dual/Runtime/Infrastructure/Export/clojure.clr.shell.clj.dll b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.clr.shell.clj.dll new file mode 100755 index 00000000..87defe44 Binary files /dev/null and b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.clr.shell.clj.dll differ diff --git a/magic-unity-dual/Runtime/Infrastructure/Export/clojure.clr.shell.clj.dll.meta b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.clr.shell.clj.dll.meta new file mode 100644 index 00000000..4302256e --- /dev/null +++ b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.clr.shell.clj.dll.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 3c21f92af3fd244ddb3a394b2809b2a0 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: + - '!UNITY_EDITOR' + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + : Any + second: + enabled: 0 + settings: + Exclude Android: 0 + Exclude Editor: 0 + Exclude Linux64: 0 + Exclude OSXUniversal: 0 + Exclude WebGL: 0 + Exclude Win: 0 + Exclude Win64: 0 + - first: + Android: Android + second: + enabled: 1 + settings: {} + - first: + Any: + second: + enabled: 1 + settings: {} + - first: + Editor: Editor + second: + enabled: 1 + settings: + DefaultValueInitialized: true + - first: + Standalone: Linux64 + second: + enabled: 1 + settings: {} + - first: + Standalone: OSXUniversal + second: + enabled: 1 + settings: {} + - first: + Standalone: Win + second: + enabled: 1 + settings: {} + - first: + Standalone: Win64 + second: + enabled: 1 + settings: {} + - first: + WebGL: WebGL + second: + enabled: 1 + settings: {} + - first: + Windows Store Apps: WindowsStoreApps + second: + enabled: 0 + settings: + CPU: AnyCPU + userData: + assetBundleName: + assetBundleVariant: diff --git a/magic-unity-dual/Runtime/Infrastructure/Export/clojure.core.clj.dll b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.core.clj.dll new file mode 100644 index 00000000..603dfe3e Binary files /dev/null and b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.core.clj.dll differ diff --git a/magic-unity-dual/Runtime/Infrastructure/Export/clojure.core.clj.dll.meta b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.core.clj.dll.meta new file mode 100644 index 00000000..c343fee9 --- /dev/null +++ b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.core.clj.dll.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: e029870591401029fa7d2abb95feb5de +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: + - '!UNITY_EDITOR' + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + : Any + second: + enabled: 0 + settings: + Exclude Android: 0 + Exclude Editor: 0 + Exclude Linux64: 0 + Exclude OSXUniversal: 0 + Exclude WebGL: 0 + Exclude Win: 0 + Exclude Win64: 0 + - first: + Android: Android + second: + enabled: 1 + settings: {} + - first: + Any: + second: + enabled: 1 + settings: {} + - first: + Editor: Editor + second: + enabled: 1 + settings: + DefaultValueInitialized: true + - first: + Standalone: Linux64 + second: + enabled: 1 + settings: {} + - first: + Standalone: OSXUniversal + second: + enabled: 1 + settings: {} + - first: + Standalone: Win + second: + enabled: 1 + settings: {} + - first: + Standalone: Win64 + second: + enabled: 1 + settings: {} + - first: + WebGL: WebGL + second: + enabled: 1 + settings: {} + - first: + Windows Store Apps: WindowsStoreApps + second: + enabled: 0 + settings: + CPU: AnyCPU + userData: + assetBundleName: + assetBundleVariant: diff --git a/magic-unity-dual/Runtime/Infrastructure/Export/clojure.core.protocols.clj.dll b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.core.protocols.clj.dll new file mode 100755 index 00000000..502c6584 Binary files /dev/null and b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.core.protocols.clj.dll differ diff --git a/magic-unity-dual/Runtime/Infrastructure/Export/clojure.core.protocols.clj.dll.meta b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.core.protocols.clj.dll.meta new file mode 100644 index 00000000..165ce4dc --- /dev/null +++ b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.core.protocols.clj.dll.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: e18f7297fea1c93ec92ba2e47adb93c7 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: + - '!UNITY_EDITOR' + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + : Any + second: + enabled: 0 + settings: + Exclude Android: 0 + Exclude Editor: 0 + Exclude Linux64: 0 + Exclude OSXUniversal: 0 + Exclude WebGL: 0 + Exclude Win: 0 + Exclude Win64: 0 + - first: + Android: Android + second: + enabled: 1 + settings: {} + - first: + Any: + second: + enabled: 1 + settings: {} + - first: + Editor: Editor + second: + enabled: 1 + settings: + DefaultValueInitialized: true + - first: + Standalone: Linux64 + second: + enabled: 1 + settings: {} + - first: + Standalone: OSXUniversal + second: + enabled: 1 + settings: {} + - first: + Standalone: Win + second: + enabled: 1 + settings: {} + - first: + Standalone: Win64 + second: + enabled: 1 + settings: {} + - first: + WebGL: WebGL + second: + enabled: 1 + settings: {} + - first: + Windows Store Apps: WindowsStoreApps + second: + enabled: 0 + settings: + CPU: AnyCPU + userData: + assetBundleName: + assetBundleVariant: diff --git a/magic-unity-dual/Runtime/Infrastructure/Export/clojure.core.reducers.clj.dll b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.core.reducers.clj.dll new file mode 100755 index 00000000..61709c7d Binary files /dev/null and b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.core.reducers.clj.dll differ diff --git a/magic-unity-dual/Runtime/Infrastructure/Export/clojure.core.reducers.clj.dll.meta b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.core.reducers.clj.dll.meta new file mode 100644 index 00000000..89b39c3f --- /dev/null +++ b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.core.reducers.clj.dll.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 63d589a38e370d93c9c917220f9c4139 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: + - '!UNITY_EDITOR' + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + : Any + second: + enabled: 0 + settings: + Exclude Android: 0 + Exclude Editor: 0 + Exclude Linux64: 0 + Exclude OSXUniversal: 0 + Exclude WebGL: 0 + Exclude Win: 0 + Exclude Win64: 0 + - first: + Android: Android + second: + enabled: 1 + settings: {} + - first: + Any: + second: + enabled: 1 + settings: {} + - first: + Editor: Editor + second: + enabled: 1 + settings: + DefaultValueInitialized: true + - first: + Standalone: Linux64 + second: + enabled: 1 + settings: {} + - first: + Standalone: OSXUniversal + second: + enabled: 1 + settings: {} + - first: + Standalone: Win + second: + enabled: 1 + settings: {} + - first: + Standalone: Win64 + second: + enabled: 1 + settings: {} + - first: + WebGL: WebGL + second: + enabled: 1 + settings: {} + - first: + Windows Store Apps: WindowsStoreApps + second: + enabled: 0 + settings: + CPU: AnyCPU + userData: + assetBundleName: + assetBundleVariant: diff --git a/magic-unity-dual/Runtime/Infrastructure/Export/clojure.core.server.clj.dll b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.core.server.clj.dll new file mode 100755 index 00000000..be43f129 Binary files /dev/null and b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.core.server.clj.dll differ diff --git a/magic-unity-dual/Runtime/Infrastructure/Export/clojure.core.server.clj.dll.meta b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.core.server.clj.dll.meta new file mode 100644 index 00000000..cc2f56db --- /dev/null +++ b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.core.server.clj.dll.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 9474d9b61e63861dca5c35f7f78dd3a4 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: + - '!UNITY_EDITOR' + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + : Any + second: + enabled: 0 + settings: + Exclude Android: 0 + Exclude Editor: 0 + Exclude Linux64: 0 + Exclude OSXUniversal: 0 + Exclude WebGL: 0 + Exclude Win: 0 + Exclude Win64: 0 + - first: + Android: Android + second: + enabled: 1 + settings: {} + - first: + Any: + second: + enabled: 1 + settings: {} + - first: + Editor: Editor + second: + enabled: 1 + settings: + DefaultValueInitialized: true + - first: + Standalone: Linux64 + second: + enabled: 1 + settings: {} + - first: + Standalone: OSXUniversal + second: + enabled: 1 + settings: {} + - first: + Standalone: Win + second: + enabled: 1 + settings: {} + - first: + Standalone: Win64 + second: + enabled: 1 + settings: {} + - first: + WebGL: WebGL + second: + enabled: 1 + settings: {} + - first: + Windows Store Apps: WindowsStoreApps + second: + enabled: 0 + settings: + CPU: AnyCPU + userData: + assetBundleName: + assetBundleVariant: diff --git a/magic-unity-dual/Runtime/Infrastructure/Export/clojure.core.specs.alpha.clj.dll b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.core.specs.alpha.clj.dll new file mode 100755 index 00000000..ef203586 Binary files /dev/null and b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.core.specs.alpha.clj.dll differ diff --git a/magic-unity-dual/Runtime/Infrastructure/Export/clojure.core.specs.alpha.clj.dll.meta b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.core.specs.alpha.clj.dll.meta new file mode 100644 index 00000000..4860e873 --- /dev/null +++ b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.core.specs.alpha.clj.dll.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: e797b1bc2c1845b51a55fcab72c959e1 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: + - '!UNITY_EDITOR' + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + : Any + second: + enabled: 0 + settings: + Exclude Android: 0 + Exclude Editor: 0 + Exclude Linux64: 0 + Exclude OSXUniversal: 0 + Exclude WebGL: 0 + Exclude Win: 0 + Exclude Win64: 0 + - first: + Android: Android + second: + enabled: 1 + settings: {} + - first: + Any: + second: + enabled: 1 + settings: {} + - first: + Editor: Editor + second: + enabled: 1 + settings: + DefaultValueInitialized: true + - first: + Standalone: Linux64 + second: + enabled: 1 + settings: {} + - first: + Standalone: OSXUniversal + second: + enabled: 1 + settings: {} + - first: + Standalone: Win + second: + enabled: 1 + settings: {} + - first: + Standalone: Win64 + second: + enabled: 1 + settings: {} + - first: + WebGL: WebGL + second: + enabled: 1 + settings: {} + - first: + Windows Store Apps: WindowsStoreApps + second: + enabled: 0 + settings: + CPU: AnyCPU + userData: + assetBundleName: + assetBundleVariant: diff --git a/magic-unity-dual/Runtime/Infrastructure/Export/clojure.core_clr.clj.dll b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.core_clr.clj.dll new file mode 100644 index 00000000..11d39fa6 Binary files /dev/null and b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.core_clr.clj.dll differ diff --git a/magic-unity-dual/Runtime/Infrastructure/Export/clojure.core_clr.clj.dll.meta b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.core_clr.clj.dll.meta new file mode 100644 index 00000000..7841c1f2 --- /dev/null +++ b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.core_clr.clj.dll.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 206c55e0b9c00f1f9992651307ff0938 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: + - '!UNITY_EDITOR' + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + : Any + second: + enabled: 0 + settings: + Exclude Android: 0 + Exclude Editor: 0 + Exclude Linux64: 0 + Exclude OSXUniversal: 0 + Exclude WebGL: 0 + Exclude Win: 0 + Exclude Win64: 0 + - first: + Android: Android + second: + enabled: 1 + settings: {} + - first: + Any: + second: + enabled: 1 + settings: {} + - first: + Editor: Editor + second: + enabled: 1 + settings: + DefaultValueInitialized: true + - first: + Standalone: Linux64 + second: + enabled: 1 + settings: {} + - first: + Standalone: OSXUniversal + second: + enabled: 1 + settings: {} + - first: + Standalone: Win + second: + enabled: 1 + settings: {} + - first: + Standalone: Win64 + second: + enabled: 1 + settings: {} + - first: + WebGL: WebGL + second: + enabled: 1 + settings: {} + - first: + Windows Store Apps: WindowsStoreApps + second: + enabled: 0 + settings: + CPU: AnyCPU + userData: + assetBundleName: + assetBundleVariant: diff --git a/magic-unity-dual/Runtime/Infrastructure/Export/clojure.core_deftype.clj.dll b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.core_deftype.clj.dll new file mode 100755 index 00000000..12a613c0 Binary files /dev/null and b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.core_deftype.clj.dll differ diff --git a/magic-unity-dual/Runtime/Infrastructure/Export/clojure.core_deftype.clj.dll.meta b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.core_deftype.clj.dll.meta new file mode 100644 index 00000000..3525ef58 --- /dev/null +++ b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.core_deftype.clj.dll.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 6dc555323f810b25d9be822d7d5e746d +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: + - '!UNITY_EDITOR' + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + : Any + second: + enabled: 0 + settings: + Exclude Android: 0 + Exclude Editor: 0 + Exclude Linux64: 0 + Exclude OSXUniversal: 0 + Exclude WebGL: 0 + Exclude Win: 0 + Exclude Win64: 0 + - first: + Android: Android + second: + enabled: 1 + settings: {} + - first: + Any: + second: + enabled: 1 + settings: {} + - first: + Editor: Editor + second: + enabled: 1 + settings: + DefaultValueInitialized: true + - first: + Standalone: Linux64 + second: + enabled: 1 + settings: {} + - first: + Standalone: OSXUniversal + second: + enabled: 1 + settings: {} + - first: + Standalone: Win + second: + enabled: 1 + settings: {} + - first: + Standalone: Win64 + second: + enabled: 1 + settings: {} + - first: + WebGL: WebGL + second: + enabled: 1 + settings: {} + - first: + Windows Store Apps: WindowsStoreApps + second: + enabled: 0 + settings: + CPU: AnyCPU + userData: + assetBundleName: + assetBundleVariant: diff --git a/magic-unity-dual/Runtime/Infrastructure/Export/clojure.core_print.clj.dll b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.core_print.clj.dll new file mode 100755 index 00000000..614907d9 Binary files /dev/null and b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.core_print.clj.dll differ diff --git a/magic-unity-dual/Runtime/Infrastructure/Export/clojure.core_print.clj.dll.meta b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.core_print.clj.dll.meta new file mode 100644 index 00000000..212ebf8d --- /dev/null +++ b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.core_print.clj.dll.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 520ad7f59bc58dd8c9a3938111d09b1f +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: + - '!UNITY_EDITOR' + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + : Any + second: + enabled: 0 + settings: + Exclude Android: 0 + Exclude Editor: 0 + Exclude Linux64: 0 + Exclude OSXUniversal: 0 + Exclude WebGL: 0 + Exclude Win: 0 + Exclude Win64: 0 + - first: + Android: Android + second: + enabled: 1 + settings: {} + - first: + Any: + second: + enabled: 1 + settings: {} + - first: + Editor: Editor + second: + enabled: 1 + settings: + DefaultValueInitialized: true + - first: + Standalone: Linux64 + second: + enabled: 1 + settings: {} + - first: + Standalone: OSXUniversal + second: + enabled: 1 + settings: {} + - first: + Standalone: Win + second: + enabled: 1 + settings: {} + - first: + Standalone: Win64 + second: + enabled: 1 + settings: {} + - first: + WebGL: WebGL + second: + enabled: 1 + settings: {} + - first: + Windows Store Apps: WindowsStoreApps + second: + enabled: 0 + settings: + CPU: AnyCPU + userData: + assetBundleName: + assetBundleVariant: diff --git a/magic-unity-dual/Runtime/Infrastructure/Export/clojure.core_proxy.clj.dll b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.core_proxy.clj.dll new file mode 100755 index 00000000..8bd152ee Binary files /dev/null and b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.core_proxy.clj.dll differ diff --git a/magic-unity-dual/Runtime/Infrastructure/Export/clojure.core_proxy.clj.dll.meta b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.core_proxy.clj.dll.meta new file mode 100644 index 00000000..2c869efb --- /dev/null +++ b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.core_proxy.clj.dll.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: b87e77348c6450c0e80793ddd3f31d4e +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: + - '!UNITY_EDITOR' + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + : Any + second: + enabled: 0 + settings: + Exclude Android: 0 + Exclude Editor: 0 + Exclude Linux64: 0 + Exclude OSXUniversal: 0 + Exclude WebGL: 0 + Exclude Win: 0 + Exclude Win64: 0 + - first: + Android: Android + second: + enabled: 1 + settings: {} + - first: + Any: + second: + enabled: 1 + settings: {} + - first: + Editor: Editor + second: + enabled: 1 + settings: + DefaultValueInitialized: true + - first: + Standalone: Linux64 + second: + enabled: 1 + settings: {} + - first: + Standalone: OSXUniversal + second: + enabled: 1 + settings: {} + - first: + Standalone: Win + second: + enabled: 1 + settings: {} + - first: + Standalone: Win64 + second: + enabled: 1 + settings: {} + - first: + WebGL: WebGL + second: + enabled: 1 + settings: {} + - first: + Windows Store Apps: WindowsStoreApps + second: + enabled: 0 + settings: + CPU: AnyCPU + userData: + assetBundleName: + assetBundleVariant: diff --git a/magic-unity-dual/Runtime/Infrastructure/Export/clojure.data.clj.dll b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.data.clj.dll new file mode 100755 index 00000000..634c0956 Binary files /dev/null and b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.data.clj.dll differ diff --git a/magic-unity-dual/Runtime/Infrastructure/Export/clojure.data.clj.dll.meta b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.data.clj.dll.meta new file mode 100644 index 00000000..a9d13e3c --- /dev/null +++ b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.data.clj.dll.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 397d6681151e37e319f5cd82065a9954 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: + - '!UNITY_EDITOR' + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + : Any + second: + enabled: 0 + settings: + Exclude Android: 0 + Exclude Editor: 0 + Exclude Linux64: 0 + Exclude OSXUniversal: 0 + Exclude WebGL: 0 + Exclude Win: 0 + Exclude Win64: 0 + - first: + Android: Android + second: + enabled: 1 + settings: {} + - first: + Any: + second: + enabled: 1 + settings: {} + - first: + Editor: Editor + second: + enabled: 1 + settings: + DefaultValueInitialized: true + - first: + Standalone: Linux64 + second: + enabled: 1 + settings: {} + - first: + Standalone: OSXUniversal + second: + enabled: 1 + settings: {} + - first: + Standalone: Win + second: + enabled: 1 + settings: {} + - first: + Standalone: Win64 + second: + enabled: 1 + settings: {} + - first: + WebGL: WebGL + second: + enabled: 1 + settings: {} + - first: + Windows Store Apps: WindowsStoreApps + second: + enabled: 0 + settings: + CPU: AnyCPU + userData: + assetBundleName: + assetBundleVariant: diff --git a/magic-unity-dual/Runtime/Infrastructure/Export/clojure.datafy.clj.dll b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.datafy.clj.dll new file mode 100755 index 00000000..e7c15d65 Binary files /dev/null and b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.datafy.clj.dll differ diff --git a/magic-unity-dual/Runtime/Infrastructure/Export/clojure.datafy.clj.dll.meta b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.datafy.clj.dll.meta new file mode 100644 index 00000000..ae236b9c --- /dev/null +++ b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.datafy.clj.dll.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: f083d6b6a5525baca8bcf50048cd5688 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: + - '!UNITY_EDITOR' + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + : Any + second: + enabled: 0 + settings: + Exclude Android: 0 + Exclude Editor: 0 + Exclude Linux64: 0 + Exclude OSXUniversal: 0 + Exclude WebGL: 0 + Exclude Win: 0 + Exclude Win64: 0 + - first: + Android: Android + second: + enabled: 1 + settings: {} + - first: + Any: + second: + enabled: 1 + settings: {} + - first: + Editor: Editor + second: + enabled: 1 + settings: + DefaultValueInitialized: true + - first: + Standalone: Linux64 + second: + enabled: 1 + settings: {} + - first: + Standalone: OSXUniversal + second: + enabled: 1 + settings: {} + - first: + Standalone: Win + second: + enabled: 1 + settings: {} + - first: + Standalone: Win64 + second: + enabled: 1 + settings: {} + - first: + WebGL: WebGL + second: + enabled: 1 + settings: {} + - first: + Windows Store Apps: WindowsStoreApps + second: + enabled: 0 + settings: + CPU: AnyCPU + userData: + assetBundleName: + assetBundleVariant: diff --git a/magic-unity-dual/Runtime/Infrastructure/Export/clojure.edn.clj.dll b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.edn.clj.dll new file mode 100755 index 00000000..d5a0f919 Binary files /dev/null and b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.edn.clj.dll differ diff --git a/magic-unity-dual/Runtime/Infrastructure/Export/clojure.edn.clj.dll.meta b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.edn.clj.dll.meta new file mode 100644 index 00000000..46f8f05a --- /dev/null +++ b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.edn.clj.dll.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 7c02aca813b5639e688ddc71747aae1b +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: + - '!UNITY_EDITOR' + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + : Any + second: + enabled: 0 + settings: + Exclude Android: 0 + Exclude Editor: 0 + Exclude Linux64: 0 + Exclude OSXUniversal: 0 + Exclude WebGL: 0 + Exclude Win: 0 + Exclude Win64: 0 + - first: + Android: Android + second: + enabled: 1 + settings: {} + - first: + Any: + second: + enabled: 1 + settings: {} + - first: + Editor: Editor + second: + enabled: 1 + settings: + DefaultValueInitialized: true + - first: + Standalone: Linux64 + second: + enabled: 1 + settings: {} + - first: + Standalone: OSXUniversal + second: + enabled: 1 + settings: {} + - first: + Standalone: Win + second: + enabled: 1 + settings: {} + - first: + Standalone: Win64 + second: + enabled: 1 + settings: {} + - first: + WebGL: WebGL + second: + enabled: 1 + settings: {} + - first: + Windows Store Apps: WindowsStoreApps + second: + enabled: 0 + settings: + CPU: AnyCPU + userData: + assetBundleName: + assetBundleVariant: diff --git a/magic-unity-dual/Runtime/Infrastructure/Export/clojure.genclass.clj.dll b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.genclass.clj.dll new file mode 100755 index 00000000..6547a3fd Binary files /dev/null and b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.genclass.clj.dll differ diff --git a/magic-unity-dual/Runtime/Infrastructure/Export/clojure.genclass.clj.dll.meta b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.genclass.clj.dll.meta new file mode 100644 index 00000000..0958ebbc --- /dev/null +++ b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.genclass.clj.dll.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 5a56dfa681459413f91bb3840c7ff0ca +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: + - '!UNITY_EDITOR' + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + : Any + second: + enabled: 0 + settings: + Exclude Android: 0 + Exclude Editor: 0 + Exclude Linux64: 0 + Exclude OSXUniversal: 0 + Exclude WebGL: 0 + Exclude Win: 0 + Exclude Win64: 0 + - first: + Android: Android + second: + enabled: 1 + settings: {} + - first: + Any: + second: + enabled: 1 + settings: {} + - first: + Editor: Editor + second: + enabled: 1 + settings: + DefaultValueInitialized: true + - first: + Standalone: Linux64 + second: + enabled: 1 + settings: {} + - first: + Standalone: OSXUniversal + second: + enabled: 1 + settings: {} + - first: + Standalone: Win + second: + enabled: 1 + settings: {} + - first: + Standalone: Win64 + second: + enabled: 1 + settings: {} + - first: + WebGL: WebGL + second: + enabled: 1 + settings: {} + - first: + Windows Store Apps: WindowsStoreApps + second: + enabled: 0 + settings: + CPU: AnyCPU + userData: + assetBundleName: + assetBundleVariant: diff --git a/magic-unity-dual/Runtime/Infrastructure/Export/clojure.gvec.clj.dll b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.gvec.clj.dll new file mode 100755 index 00000000..03be174b Binary files /dev/null and b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.gvec.clj.dll differ diff --git a/magic-unity-dual/Runtime/Infrastructure/Export/clojure.gvec.clj.dll.meta b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.gvec.clj.dll.meta new file mode 100644 index 00000000..c5855212 --- /dev/null +++ b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.gvec.clj.dll.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 9af7e5d2e870cc65187fae3cb49a8801 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: + - '!UNITY_EDITOR' + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + : Any + second: + enabled: 0 + settings: + Exclude Android: 0 + Exclude Editor: 0 + Exclude Linux64: 0 + Exclude OSXUniversal: 0 + Exclude WebGL: 0 + Exclude Win: 0 + Exclude Win64: 0 + - first: + Android: Android + second: + enabled: 1 + settings: {} + - first: + Any: + second: + enabled: 1 + settings: {} + - first: + Editor: Editor + second: + enabled: 1 + settings: + DefaultValueInitialized: true + - first: + Standalone: Linux64 + second: + enabled: 1 + settings: {} + - first: + Standalone: OSXUniversal + second: + enabled: 1 + settings: {} + - first: + Standalone: Win + second: + enabled: 1 + settings: {} + - first: + Standalone: Win64 + second: + enabled: 1 + settings: {} + - first: + WebGL: WebGL + second: + enabled: 1 + settings: {} + - first: + Windows Store Apps: WindowsStoreApps + second: + enabled: 0 + settings: + CPU: AnyCPU + userData: + assetBundleName: + assetBundleVariant: diff --git a/magic-unity-dual/Runtime/Infrastructure/Export/clojure.instant.clj.dll b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.instant.clj.dll new file mode 100755 index 00000000..496e391d Binary files /dev/null and b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.instant.clj.dll differ diff --git a/magic-unity-dual/Runtime/Infrastructure/Export/clojure.instant.clj.dll.meta b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.instant.clj.dll.meta new file mode 100644 index 00000000..ddba093e --- /dev/null +++ b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.instant.clj.dll.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 4cf35fec3e1a338fb9315fc6f3d22693 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: + - '!UNITY_EDITOR' + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + : Any + second: + enabled: 0 + settings: + Exclude Android: 0 + Exclude Editor: 0 + Exclude Linux64: 0 + Exclude OSXUniversal: 0 + Exclude WebGL: 0 + Exclude Win: 0 + Exclude Win64: 0 + - first: + Android: Android + second: + enabled: 1 + settings: {} + - first: + Any: + second: + enabled: 1 + settings: {} + - first: + Editor: Editor + second: + enabled: 1 + settings: + DefaultValueInitialized: true + - first: + Standalone: Linux64 + second: + enabled: 1 + settings: {} + - first: + Standalone: OSXUniversal + second: + enabled: 1 + settings: {} + - first: + Standalone: Win + second: + enabled: 1 + settings: {} + - first: + Standalone: Win64 + second: + enabled: 1 + settings: {} + - first: + WebGL: WebGL + second: + enabled: 1 + settings: {} + - first: + Windows Store Apps: WindowsStoreApps + second: + enabled: 0 + settings: + CPU: AnyCPU + userData: + assetBundleName: + assetBundleVariant: diff --git a/magic-unity-dual/Runtime/Infrastructure/Export/clojure.main.clj.dll b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.main.clj.dll new file mode 100755 index 00000000..f437f767 Binary files /dev/null and b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.main.clj.dll differ diff --git a/magic-unity-dual/Runtime/Infrastructure/Export/clojure.main.clj.dll.meta b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.main.clj.dll.meta new file mode 100644 index 00000000..c4dfc024 --- /dev/null +++ b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.main.clj.dll.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 8ce3e0e5350b75b39a11efffcf0ddd7d +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: + - '!UNITY_EDITOR' + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + : Any + second: + enabled: 0 + settings: + Exclude Android: 0 + Exclude Editor: 0 + Exclude Linux64: 0 + Exclude OSXUniversal: 0 + Exclude WebGL: 0 + Exclude Win: 0 + Exclude Win64: 0 + - first: + Android: Android + second: + enabled: 1 + settings: {} + - first: + Any: + second: + enabled: 1 + settings: {} + - first: + Editor: Editor + second: + enabled: 1 + settings: + DefaultValueInitialized: true + - first: + Standalone: Linux64 + second: + enabled: 1 + settings: {} + - first: + Standalone: OSXUniversal + second: + enabled: 1 + settings: {} + - first: + Standalone: Win + second: + enabled: 1 + settings: {} + - first: + Standalone: Win64 + second: + enabled: 1 + settings: {} + - first: + WebGL: WebGL + second: + enabled: 1 + settings: {} + - first: + Windows Store Apps: WindowsStoreApps + second: + enabled: 0 + settings: + CPU: AnyCPU + userData: + assetBundleName: + assetBundleVariant: diff --git a/magic-unity-dual/Runtime/Infrastructure/Export/clojure.pprint.cl_format.clj.dll b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.pprint.cl_format.clj.dll new file mode 100644 index 00000000..143cddc1 Binary files /dev/null and b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.pprint.cl_format.clj.dll differ diff --git a/magic-unity-dual/Runtime/Infrastructure/Export/clojure.pprint.cl_format.clj.dll.meta b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.pprint.cl_format.clj.dll.meta new file mode 100644 index 00000000..3423d68d --- /dev/null +++ b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.pprint.cl_format.clj.dll.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 1bc4a08fbcea95e70b98721785de4484 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: + - '!UNITY_EDITOR' + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + : Any + second: + enabled: 0 + settings: + Exclude Android: 0 + Exclude Editor: 0 + Exclude Linux64: 0 + Exclude OSXUniversal: 0 + Exclude WebGL: 0 + Exclude Win: 0 + Exclude Win64: 0 + - first: + Android: Android + second: + enabled: 1 + settings: {} + - first: + Any: + second: + enabled: 1 + settings: {} + - first: + Editor: Editor + second: + enabled: 1 + settings: + DefaultValueInitialized: true + - first: + Standalone: Linux64 + second: + enabled: 1 + settings: {} + - first: + Standalone: OSXUniversal + second: + enabled: 1 + settings: {} + - first: + Standalone: Win + second: + enabled: 1 + settings: {} + - first: + Standalone: Win64 + second: + enabled: 1 + settings: {} + - first: + WebGL: WebGL + second: + enabled: 1 + settings: {} + - first: + Windows Store Apps: WindowsStoreApps + second: + enabled: 0 + settings: + CPU: AnyCPU + userData: + assetBundleName: + assetBundleVariant: diff --git a/magic-unity-dual/Runtime/Infrastructure/Export/clojure.pprint.clj.dll b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.pprint.clj.dll new file mode 100755 index 00000000..fa5cf366 Binary files /dev/null and b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.pprint.clj.dll differ diff --git a/magic-unity-dual/Runtime/Infrastructure/Export/clojure.pprint.clj.dll.meta b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.pprint.clj.dll.meta new file mode 100644 index 00000000..c79f8726 --- /dev/null +++ b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.pprint.clj.dll.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 52f4182e84a8d115293ea3c1023eb737 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: + - '!UNITY_EDITOR' + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + : Any + second: + enabled: 0 + settings: + Exclude Android: 0 + Exclude Editor: 0 + Exclude Linux64: 0 + Exclude OSXUniversal: 0 + Exclude WebGL: 0 + Exclude Win: 0 + Exclude Win64: 0 + - first: + Android: Android + second: + enabled: 1 + settings: {} + - first: + Any: + second: + enabled: 1 + settings: {} + - first: + Editor: Editor + second: + enabled: 1 + settings: + DefaultValueInitialized: true + - first: + Standalone: Linux64 + second: + enabled: 1 + settings: {} + - first: + Standalone: OSXUniversal + second: + enabled: 1 + settings: {} + - first: + Standalone: Win + second: + enabled: 1 + settings: {} + - first: + Standalone: Win64 + second: + enabled: 1 + settings: {} + - first: + WebGL: WebGL + second: + enabled: 1 + settings: {} + - first: + Windows Store Apps: WindowsStoreApps + second: + enabled: 0 + settings: + CPU: AnyCPU + userData: + assetBundleName: + assetBundleVariant: diff --git a/magic-unity-dual/Runtime/Infrastructure/Export/clojure.pprint.column_writer.clj.dll b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.pprint.column_writer.clj.dll new file mode 100644 index 00000000..00ba0cab Binary files /dev/null and b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.pprint.column_writer.clj.dll differ diff --git a/magic-unity-dual/Runtime/Infrastructure/Export/clojure.pprint.column_writer.clj.dll.meta b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.pprint.column_writer.clj.dll.meta new file mode 100644 index 00000000..5462abf3 --- /dev/null +++ b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.pprint.column_writer.clj.dll.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: d027b6b92e4e9962097b67dedfb28b14 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: + - '!UNITY_EDITOR' + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + : Any + second: + enabled: 0 + settings: + Exclude Android: 0 + Exclude Editor: 0 + Exclude Linux64: 0 + Exclude OSXUniversal: 0 + Exclude WebGL: 0 + Exclude Win: 0 + Exclude Win64: 0 + - first: + Android: Android + second: + enabled: 1 + settings: {} + - first: + Any: + second: + enabled: 1 + settings: {} + - first: + Editor: Editor + second: + enabled: 1 + settings: + DefaultValueInitialized: true + - first: + Standalone: Linux64 + second: + enabled: 1 + settings: {} + - first: + Standalone: OSXUniversal + second: + enabled: 1 + settings: {} + - first: + Standalone: Win + second: + enabled: 1 + settings: {} + - first: + Standalone: Win64 + second: + enabled: 1 + settings: {} + - first: + WebGL: WebGL + second: + enabled: 1 + settings: {} + - first: + Windows Store Apps: WindowsStoreApps + second: + enabled: 0 + settings: + CPU: AnyCPU + userData: + assetBundleName: + assetBundleVariant: diff --git a/magic-unity-dual/Runtime/Infrastructure/Export/clojure.pprint.dispatch.clj.dll b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.pprint.dispatch.clj.dll new file mode 100644 index 00000000..e80a066b Binary files /dev/null and b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.pprint.dispatch.clj.dll differ diff --git a/magic-unity-dual/Runtime/Infrastructure/Export/clojure.pprint.dispatch.clj.dll.meta b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.pprint.dispatch.clj.dll.meta new file mode 100644 index 00000000..2b892e07 --- /dev/null +++ b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.pprint.dispatch.clj.dll.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: dd2c3818bf894d866886640307a4120b +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: + - '!UNITY_EDITOR' + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + : Any + second: + enabled: 0 + settings: + Exclude Android: 0 + Exclude Editor: 0 + Exclude Linux64: 0 + Exclude OSXUniversal: 0 + Exclude WebGL: 0 + Exclude Win: 0 + Exclude Win64: 0 + - first: + Android: Android + second: + enabled: 1 + settings: {} + - first: + Any: + second: + enabled: 1 + settings: {} + - first: + Editor: Editor + second: + enabled: 1 + settings: + DefaultValueInitialized: true + - first: + Standalone: Linux64 + second: + enabled: 1 + settings: {} + - first: + Standalone: OSXUniversal + second: + enabled: 1 + settings: {} + - first: + Standalone: Win + second: + enabled: 1 + settings: {} + - first: + Standalone: Win64 + second: + enabled: 1 + settings: {} + - first: + WebGL: WebGL + second: + enabled: 1 + settings: {} + - first: + Windows Store Apps: WindowsStoreApps + second: + enabled: 0 + settings: + CPU: AnyCPU + userData: + assetBundleName: + assetBundleVariant: diff --git a/magic-unity-dual/Runtime/Infrastructure/Export/clojure.pprint.pprint_base.clj.dll b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.pprint.pprint_base.clj.dll new file mode 100644 index 00000000..44360551 Binary files /dev/null and b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.pprint.pprint_base.clj.dll differ diff --git a/magic-unity-dual/Runtime/Infrastructure/Export/clojure.pprint.pprint_base.clj.dll.meta b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.pprint.pprint_base.clj.dll.meta new file mode 100644 index 00000000..6c4681c9 --- /dev/null +++ b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.pprint.pprint_base.clj.dll.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 383eb2f2dd5b4f3edb5f3f0e9115b3a5 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: + - '!UNITY_EDITOR' + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + : Any + second: + enabled: 0 + settings: + Exclude Android: 0 + Exclude Editor: 0 + Exclude Linux64: 0 + Exclude OSXUniversal: 0 + Exclude WebGL: 0 + Exclude Win: 0 + Exclude Win64: 0 + - first: + Android: Android + second: + enabled: 1 + settings: {} + - first: + Any: + second: + enabled: 1 + settings: {} + - first: + Editor: Editor + second: + enabled: 1 + settings: + DefaultValueInitialized: true + - first: + Standalone: Linux64 + second: + enabled: 1 + settings: {} + - first: + Standalone: OSXUniversal + second: + enabled: 1 + settings: {} + - first: + Standalone: Win + second: + enabled: 1 + settings: {} + - first: + Standalone: Win64 + second: + enabled: 1 + settings: {} + - first: + WebGL: WebGL + second: + enabled: 1 + settings: {} + - first: + Windows Store Apps: WindowsStoreApps + second: + enabled: 0 + settings: + CPU: AnyCPU + userData: + assetBundleName: + assetBundleVariant: diff --git a/magic-unity-dual/Runtime/Infrastructure/Export/clojure.pprint.pretty_writer.clj.dll b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.pprint.pretty_writer.clj.dll new file mode 100755 index 00000000..b604b9d8 Binary files /dev/null and b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.pprint.pretty_writer.clj.dll differ diff --git a/magic-unity-dual/Runtime/Infrastructure/Export/clojure.pprint.pretty_writer.clj.dll.meta b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.pprint.pretty_writer.clj.dll.meta new file mode 100644 index 00000000..ad1055b2 --- /dev/null +++ b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.pprint.pretty_writer.clj.dll.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 6269c7a29e4906c658ad1431d22f2739 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: + - '!UNITY_EDITOR' + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + : Any + second: + enabled: 0 + settings: + Exclude Android: 0 + Exclude Editor: 0 + Exclude Linux64: 0 + Exclude OSXUniversal: 0 + Exclude WebGL: 0 + Exclude Win: 0 + Exclude Win64: 0 + - first: + Android: Android + second: + enabled: 1 + settings: {} + - first: + Any: + second: + enabled: 1 + settings: {} + - first: + Editor: Editor + second: + enabled: 1 + settings: + DefaultValueInitialized: true + - first: + Standalone: Linux64 + second: + enabled: 1 + settings: {} + - first: + Standalone: OSXUniversal + second: + enabled: 1 + settings: {} + - first: + Standalone: Win + second: + enabled: 1 + settings: {} + - first: + Standalone: Win64 + second: + enabled: 1 + settings: {} + - first: + WebGL: WebGL + second: + enabled: 1 + settings: {} + - first: + Windows Store Apps: WindowsStoreApps + second: + enabled: 0 + settings: + CPU: AnyCPU + userData: + assetBundleName: + assetBundleVariant: diff --git a/magic-unity-dual/Runtime/Infrastructure/Export/clojure.pprint.print_table.clj.dll b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.pprint.print_table.clj.dll new file mode 100644 index 00000000..9b6c8a05 Binary files /dev/null and b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.pprint.print_table.clj.dll differ diff --git a/magic-unity-dual/Runtime/Infrastructure/Export/clojure.pprint.print_table.clj.dll.meta b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.pprint.print_table.clj.dll.meta new file mode 100644 index 00000000..6c577abe --- /dev/null +++ b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.pprint.print_table.clj.dll.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 3cb817d585b9ed53498f458296483bc2 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: + - '!UNITY_EDITOR' + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + : Any + second: + enabled: 0 + settings: + Exclude Android: 0 + Exclude Editor: 0 + Exclude Linux64: 0 + Exclude OSXUniversal: 0 + Exclude WebGL: 0 + Exclude Win: 0 + Exclude Win64: 0 + - first: + Android: Android + second: + enabled: 1 + settings: {} + - first: + Any: + second: + enabled: 1 + settings: {} + - first: + Editor: Editor + second: + enabled: 1 + settings: + DefaultValueInitialized: true + - first: + Standalone: Linux64 + second: + enabled: 1 + settings: {} + - first: + Standalone: OSXUniversal + second: + enabled: 1 + settings: {} + - first: + Standalone: Win + second: + enabled: 1 + settings: {} + - first: + Standalone: Win64 + second: + enabled: 1 + settings: {} + - first: + WebGL: WebGL + second: + enabled: 1 + settings: {} + - first: + Windows Store Apps: WindowsStoreApps + second: + enabled: 0 + settings: + CPU: AnyCPU + userData: + assetBundleName: + assetBundleVariant: diff --git a/magic-unity-dual/Runtime/Infrastructure/Export/clojure.pprint.utilities.clj.dll b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.pprint.utilities.clj.dll new file mode 100644 index 00000000..b0808e19 Binary files /dev/null and b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.pprint.utilities.clj.dll differ diff --git a/magic-unity-dual/Runtime/Infrastructure/Export/clojure.pprint.utilities.clj.dll.meta b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.pprint.utilities.clj.dll.meta new file mode 100644 index 00000000..c7ffbe93 --- /dev/null +++ b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.pprint.utilities.clj.dll.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: fad3d4df50d788c3890b593bfcaf5b30 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: + - '!UNITY_EDITOR' + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + : Any + second: + enabled: 0 + settings: + Exclude Android: 0 + Exclude Editor: 0 + Exclude Linux64: 0 + Exclude OSXUniversal: 0 + Exclude WebGL: 0 + Exclude Win: 0 + Exclude Win64: 0 + - first: + Android: Android + second: + enabled: 1 + settings: {} + - first: + Any: + second: + enabled: 1 + settings: {} + - first: + Editor: Editor + second: + enabled: 1 + settings: + DefaultValueInitialized: true + - first: + Standalone: Linux64 + second: + enabled: 1 + settings: {} + - first: + Standalone: OSXUniversal + second: + enabled: 1 + settings: {} + - first: + Standalone: Win + second: + enabled: 1 + settings: {} + - first: + Standalone: Win64 + second: + enabled: 1 + settings: {} + - first: + WebGL: WebGL + second: + enabled: 1 + settings: {} + - first: + Windows Store Apps: WindowsStoreApps + second: + enabled: 0 + settings: + CPU: AnyCPU + userData: + assetBundleName: + assetBundleVariant: diff --git a/magic-unity-dual/Runtime/Infrastructure/Export/clojure.repl.clj.dll b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.repl.clj.dll new file mode 100644 index 00000000..e6c99d61 Binary files /dev/null and b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.repl.clj.dll differ diff --git a/magic-unity-dual/Runtime/Infrastructure/Export/clojure.repl.clj.dll.meta b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.repl.clj.dll.meta new file mode 100644 index 00000000..395f2f74 --- /dev/null +++ b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.repl.clj.dll.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 35f118793f83e98e8804596f71fba5a5 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: + - '!UNITY_EDITOR' + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + : Any + second: + enabled: 0 + settings: + Exclude Android: 0 + Exclude Editor: 0 + Exclude Linux64: 0 + Exclude OSXUniversal: 0 + Exclude WebGL: 0 + Exclude Win: 0 + Exclude Win64: 0 + - first: + Android: Android + second: + enabled: 1 + settings: {} + - first: + Any: + second: + enabled: 1 + settings: {} + - first: + Editor: Editor + second: + enabled: 1 + settings: + DefaultValueInitialized: true + - first: + Standalone: Linux64 + second: + enabled: 1 + settings: {} + - first: + Standalone: OSXUniversal + second: + enabled: 1 + settings: {} + - first: + Standalone: Win + second: + enabled: 1 + settings: {} + - first: + Standalone: Win64 + second: + enabled: 1 + settings: {} + - first: + WebGL: WebGL + second: + enabled: 1 + settings: {} + - first: + Windows Store Apps: WindowsStoreApps + second: + enabled: 0 + settings: + CPU: AnyCPU + userData: + assetBundleName: + assetBundleVariant: diff --git a/magic-unity-dual/Runtime/Infrastructure/Export/clojure.set.clj.dll b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.set.clj.dll new file mode 100755 index 00000000..2a097822 Binary files /dev/null and b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.set.clj.dll differ diff --git a/magic-unity-dual/Runtime/Infrastructure/Export/clojure.set.clj.dll.meta b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.set.clj.dll.meta new file mode 100644 index 00000000..d2a17c53 --- /dev/null +++ b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.set.clj.dll.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 8884eb5cc69aefcdbb323308d669e1f0 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: + - '!UNITY_EDITOR' + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + : Any + second: + enabled: 0 + settings: + Exclude Android: 0 + Exclude Editor: 0 + Exclude Linux64: 0 + Exclude OSXUniversal: 0 + Exclude WebGL: 0 + Exclude Win: 0 + Exclude Win64: 0 + - first: + Android: Android + second: + enabled: 1 + settings: {} + - first: + Any: + second: + enabled: 1 + settings: {} + - first: + Editor: Editor + second: + enabled: 1 + settings: + DefaultValueInitialized: true + - first: + Standalone: Linux64 + second: + enabled: 1 + settings: {} + - first: + Standalone: OSXUniversal + second: + enabled: 1 + settings: {} + - first: + Standalone: Win + second: + enabled: 1 + settings: {} + - first: + Standalone: Win64 + second: + enabled: 1 + settings: {} + - first: + WebGL: WebGL + second: + enabled: 1 + settings: {} + - first: + Windows Store Apps: WindowsStoreApps + second: + enabled: 0 + settings: + CPU: AnyCPU + userData: + assetBundleName: + assetBundleVariant: diff --git a/magic-unity-dual/Runtime/Infrastructure/Export/clojure.spec.alpha.clj.dll b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.spec.alpha.clj.dll new file mode 100755 index 00000000..a116e0fd Binary files /dev/null and b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.spec.alpha.clj.dll differ diff --git a/magic-unity-dual/Runtime/Infrastructure/Export/clojure.spec.alpha.clj.dll.meta b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.spec.alpha.clj.dll.meta new file mode 100644 index 00000000..938112ff --- /dev/null +++ b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.spec.alpha.clj.dll.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: e0563d831be1f41189fce78048d9823f +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: + - '!UNITY_EDITOR' + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + : Any + second: + enabled: 0 + settings: + Exclude Android: 0 + Exclude Editor: 0 + Exclude Linux64: 0 + Exclude OSXUniversal: 0 + Exclude WebGL: 0 + Exclude Win: 0 + Exclude Win64: 0 + - first: + Android: Android + second: + enabled: 1 + settings: {} + - first: + Any: + second: + enabled: 1 + settings: {} + - first: + Editor: Editor + second: + enabled: 1 + settings: + DefaultValueInitialized: true + - first: + Standalone: Linux64 + second: + enabled: 1 + settings: {} + - first: + Standalone: OSXUniversal + second: + enabled: 1 + settings: {} + - first: + Standalone: Win + second: + enabled: 1 + settings: {} + - first: + Standalone: Win64 + second: + enabled: 1 + settings: {} + - first: + WebGL: WebGL + second: + enabled: 1 + settings: {} + - first: + Windows Store Apps: WindowsStoreApps + second: + enabled: 0 + settings: + CPU: AnyCPU + userData: + assetBundleName: + assetBundleVariant: diff --git a/magic-unity-dual/Runtime/Infrastructure/Export/clojure.spec.gen.alpha.clj.dll b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.spec.gen.alpha.clj.dll new file mode 100755 index 00000000..ac848981 Binary files /dev/null and b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.spec.gen.alpha.clj.dll differ diff --git a/magic-unity-dual/Runtime/Infrastructure/Export/clojure.spec.gen.alpha.clj.dll.meta b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.spec.gen.alpha.clj.dll.meta new file mode 100644 index 00000000..d2af6bc5 --- /dev/null +++ b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.spec.gen.alpha.clj.dll.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: afd607053db43a930b54b57c22428207 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: + - '!UNITY_EDITOR' + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + : Any + second: + enabled: 0 + settings: + Exclude Android: 0 + Exclude Editor: 0 + Exclude Linux64: 0 + Exclude OSXUniversal: 0 + Exclude WebGL: 0 + Exclude Win: 0 + Exclude Win64: 0 + - first: + Android: Android + second: + enabled: 1 + settings: {} + - first: + Any: + second: + enabled: 1 + settings: {} + - first: + Editor: Editor + second: + enabled: 1 + settings: + DefaultValueInitialized: true + - first: + Standalone: Linux64 + second: + enabled: 1 + settings: {} + - first: + Standalone: OSXUniversal + second: + enabled: 1 + settings: {} + - first: + Standalone: Win + second: + enabled: 1 + settings: {} + - first: + Standalone: Win64 + second: + enabled: 1 + settings: {} + - first: + WebGL: WebGL + second: + enabled: 1 + settings: {} + - first: + Windows Store Apps: WindowsStoreApps + second: + enabled: 0 + settings: + CPU: AnyCPU + userData: + assetBundleName: + assetBundleVariant: diff --git a/magic-unity-dual/Runtime/Infrastructure/Export/clojure.stacktrace.clj.dll b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.stacktrace.clj.dll new file mode 100755 index 00000000..18b1b0fa Binary files /dev/null and b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.stacktrace.clj.dll differ diff --git a/magic-unity-dual/Runtime/Infrastructure/Export/clojure.stacktrace.clj.dll.meta b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.stacktrace.clj.dll.meta new file mode 100644 index 00000000..45b33537 --- /dev/null +++ b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.stacktrace.clj.dll.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 06884e3ac12ba308ea3135d929d3b6ca +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: + - '!UNITY_EDITOR' + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + : Any + second: + enabled: 0 + settings: + Exclude Android: 0 + Exclude Editor: 0 + Exclude Linux64: 0 + Exclude OSXUniversal: 0 + Exclude WebGL: 0 + Exclude Win: 0 + Exclude Win64: 0 + - first: + Android: Android + second: + enabled: 1 + settings: {} + - first: + Any: + second: + enabled: 1 + settings: {} + - first: + Editor: Editor + second: + enabled: 1 + settings: + DefaultValueInitialized: true + - first: + Standalone: Linux64 + second: + enabled: 1 + settings: {} + - first: + Standalone: OSXUniversal + second: + enabled: 1 + settings: {} + - first: + Standalone: Win + second: + enabled: 1 + settings: {} + - first: + Standalone: Win64 + second: + enabled: 1 + settings: {} + - first: + WebGL: WebGL + second: + enabled: 1 + settings: {} + - first: + Windows Store Apps: WindowsStoreApps + second: + enabled: 0 + settings: + CPU: AnyCPU + userData: + assetBundleName: + assetBundleVariant: diff --git a/magic-unity-dual/Runtime/Infrastructure/Export/clojure.string.clj.dll b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.string.clj.dll new file mode 100755 index 00000000..6ffdd509 Binary files /dev/null and b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.string.clj.dll differ diff --git a/magic-unity-dual/Runtime/Infrastructure/Export/clojure.string.clj.dll.meta b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.string.clj.dll.meta new file mode 100644 index 00000000..16973228 --- /dev/null +++ b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.string.clj.dll.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 7f70b4b20daf4be7b8c5b7b7b19790e8 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: + - '!UNITY_EDITOR' + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + : Any + second: + enabled: 0 + settings: + Exclude Android: 0 + Exclude Editor: 0 + Exclude Linux64: 0 + Exclude OSXUniversal: 0 + Exclude WebGL: 0 + Exclude Win: 0 + Exclude Win64: 0 + - first: + Android: Android + second: + enabled: 1 + settings: {} + - first: + Any: + second: + enabled: 1 + settings: {} + - first: + Editor: Editor + second: + enabled: 1 + settings: + DefaultValueInitialized: true + - first: + Standalone: Linux64 + second: + enabled: 1 + settings: {} + - first: + Standalone: OSXUniversal + second: + enabled: 1 + settings: {} + - first: + Standalone: Win + second: + enabled: 1 + settings: {} + - first: + Standalone: Win64 + second: + enabled: 1 + settings: {} + - first: + WebGL: WebGL + second: + enabled: 1 + settings: {} + - first: + Windows Store Apps: WindowsStoreApps + second: + enabled: 0 + settings: + CPU: AnyCPU + userData: + assetBundleName: + assetBundleVariant: diff --git a/magic-unity-dual/Runtime/Infrastructure/Export/clojure.template.clj.dll b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.template.clj.dll new file mode 100755 index 00000000..118d9283 Binary files /dev/null and b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.template.clj.dll differ diff --git a/magic-unity-dual/Runtime/Infrastructure/Export/clojure.template.clj.dll.meta b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.template.clj.dll.meta new file mode 100644 index 00000000..2695f4f8 --- /dev/null +++ b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.template.clj.dll.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 293ae0df994a5b4208d3d858b4d49804 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: + - '!UNITY_EDITOR' + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + : Any + second: + enabled: 0 + settings: + Exclude Android: 0 + Exclude Editor: 0 + Exclude Linux64: 0 + Exclude OSXUniversal: 0 + Exclude WebGL: 0 + Exclude Win: 0 + Exclude Win64: 0 + - first: + Android: Android + second: + enabled: 1 + settings: {} + - first: + Any: + second: + enabled: 1 + settings: {} + - first: + Editor: Editor + second: + enabled: 1 + settings: + DefaultValueInitialized: true + - first: + Standalone: Linux64 + second: + enabled: 1 + settings: {} + - first: + Standalone: OSXUniversal + second: + enabled: 1 + settings: {} + - first: + Standalone: Win + second: + enabled: 1 + settings: {} + - first: + Standalone: Win64 + second: + enabled: 1 + settings: {} + - first: + WebGL: WebGL + second: + enabled: 1 + settings: {} + - first: + Windows Store Apps: WindowsStoreApps + second: + enabled: 0 + settings: + CPU: AnyCPU + userData: + assetBundleName: + assetBundleVariant: diff --git a/magic-unity-dual/Runtime/Infrastructure/Export/clojure.test.clj.dll b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.test.clj.dll new file mode 100755 index 00000000..21d967bb Binary files /dev/null and b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.test.clj.dll differ diff --git a/magic-unity-dual/Runtime/Infrastructure/Export/clojure.test.clj.dll.meta b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.test.clj.dll.meta new file mode 100644 index 00000000..94b6ae34 --- /dev/null +++ b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.test.clj.dll.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: bf46318cc008b014092d08daeb13967a +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: + - '!UNITY_EDITOR' + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + : Any + second: + enabled: 0 + settings: + Exclude Android: 0 + Exclude Editor: 0 + Exclude Linux64: 0 + Exclude OSXUniversal: 0 + Exclude WebGL: 0 + Exclude Win: 0 + Exclude Win64: 0 + - first: + Android: Android + second: + enabled: 1 + settings: {} + - first: + Any: + second: + enabled: 1 + settings: {} + - first: + Editor: Editor + second: + enabled: 1 + settings: + DefaultValueInitialized: true + - first: + Standalone: Linux64 + second: + enabled: 1 + settings: {} + - first: + Standalone: OSXUniversal + second: + enabled: 1 + settings: {} + - first: + Standalone: Win + second: + enabled: 1 + settings: {} + - first: + Standalone: Win64 + second: + enabled: 1 + settings: {} + - first: + WebGL: WebGL + second: + enabled: 1 + settings: {} + - first: + Windows Store Apps: WindowsStoreApps + second: + enabled: 0 + settings: + CPU: AnyCPU + userData: + assetBundleName: + assetBundleVariant: diff --git a/magic-unity-dual/Runtime/Infrastructure/Export/clojure.tools.analyzer.ast.clj.dll b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.tools.analyzer.ast.clj.dll new file mode 100644 index 00000000..ce48b848 Binary files /dev/null and b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.tools.analyzer.ast.clj.dll differ diff --git a/magic-unity-dual/Runtime/Infrastructure/Export/clojure.tools.analyzer.ast.clj.dll.meta b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.tools.analyzer.ast.clj.dll.meta new file mode 100644 index 00000000..acd70b06 --- /dev/null +++ b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.tools.analyzer.ast.clj.dll.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 41dae04f9785819e89501a243782baca +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: + - '!UNITY_EDITOR' + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + : Any + second: + enabled: 0 + settings: + Exclude Android: 0 + Exclude Editor: 0 + Exclude Linux64: 0 + Exclude OSXUniversal: 0 + Exclude WebGL: 0 + Exclude Win: 0 + Exclude Win64: 0 + - first: + Android: Android + second: + enabled: 1 + settings: {} + - first: + Any: + second: + enabled: 1 + settings: {} + - first: + Editor: Editor + second: + enabled: 1 + settings: + DefaultValueInitialized: true + - first: + Standalone: Linux64 + second: + enabled: 1 + settings: {} + - first: + Standalone: OSXUniversal + second: + enabled: 1 + settings: {} + - first: + Standalone: Win + second: + enabled: 1 + settings: {} + - first: + Standalone: Win64 + second: + enabled: 1 + settings: {} + - first: + WebGL: WebGL + second: + enabled: 1 + settings: {} + - first: + Windows Store Apps: WindowsStoreApps + second: + enabled: 0 + settings: + CPU: AnyCPU + userData: + assetBundleName: + assetBundleVariant: diff --git a/magic-unity-dual/Runtime/Infrastructure/Export/clojure.tools.analyzer.clj.dll b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.tools.analyzer.clj.dll new file mode 100644 index 00000000..6455c950 Binary files /dev/null and b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.tools.analyzer.clj.dll differ diff --git a/magic-unity-dual/Runtime/Infrastructure/Export/clojure.tools.analyzer.clj.dll.meta b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.tools.analyzer.clj.dll.meta new file mode 100644 index 00000000..810a5133 --- /dev/null +++ b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.tools.analyzer.clj.dll.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: ff65c4d2fb81cb605b65d7c49b70069b +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: + - '!UNITY_EDITOR' + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + : Any + second: + enabled: 0 + settings: + Exclude Android: 0 + Exclude Editor: 0 + Exclude Linux64: 0 + Exclude OSXUniversal: 0 + Exclude WebGL: 0 + Exclude Win: 0 + Exclude Win64: 0 + - first: + Android: Android + second: + enabled: 1 + settings: {} + - first: + Any: + second: + enabled: 1 + settings: {} + - first: + Editor: Editor + second: + enabled: 1 + settings: + DefaultValueInitialized: true + - first: + Standalone: Linux64 + second: + enabled: 1 + settings: {} + - first: + Standalone: OSXUniversal + second: + enabled: 1 + settings: {} + - first: + Standalone: Win + second: + enabled: 1 + settings: {} + - first: + Standalone: Win64 + second: + enabled: 1 + settings: {} + - first: + WebGL: WebGL + second: + enabled: 1 + settings: {} + - first: + Windows Store Apps: WindowsStoreApps + second: + enabled: 0 + settings: + CPU: AnyCPU + userData: + assetBundleName: + assetBundleVariant: diff --git a/magic-unity-dual/Runtime/Infrastructure/Export/clojure.tools.analyzer.env.clj.dll b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.tools.analyzer.env.clj.dll new file mode 100644 index 00000000..08420801 Binary files /dev/null and b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.tools.analyzer.env.clj.dll differ diff --git a/magic-unity-dual/Runtime/Infrastructure/Export/clojure.tools.analyzer.env.clj.dll.meta b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.tools.analyzer.env.clj.dll.meta new file mode 100644 index 00000000..e8fb6324 --- /dev/null +++ b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.tools.analyzer.env.clj.dll.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 4c544d6f142cb401384f726b1f073cf0 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: + - '!UNITY_EDITOR' + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + : Any + second: + enabled: 0 + settings: + Exclude Android: 0 + Exclude Editor: 0 + Exclude Linux64: 0 + Exclude OSXUniversal: 0 + Exclude WebGL: 0 + Exclude Win: 0 + Exclude Win64: 0 + - first: + Android: Android + second: + enabled: 1 + settings: {} + - first: + Any: + second: + enabled: 1 + settings: {} + - first: + Editor: Editor + second: + enabled: 1 + settings: + DefaultValueInitialized: true + - first: + Standalone: Linux64 + second: + enabled: 1 + settings: {} + - first: + Standalone: OSXUniversal + second: + enabled: 1 + settings: {} + - first: + Standalone: Win + second: + enabled: 1 + settings: {} + - first: + Standalone: Win64 + second: + enabled: 1 + settings: {} + - first: + WebGL: WebGL + second: + enabled: 1 + settings: {} + - first: + Windows Store Apps: WindowsStoreApps + second: + enabled: 0 + settings: + CPU: AnyCPU + userData: + assetBundleName: + assetBundleVariant: diff --git a/magic-unity-dual/Runtime/Infrastructure/Export/clojure.tools.analyzer.passes.cleanup.clj.dll b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.tools.analyzer.passes.cleanup.clj.dll new file mode 100644 index 00000000..28ca3982 Binary files /dev/null and b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.tools.analyzer.passes.cleanup.clj.dll differ diff --git a/magic-unity-dual/Runtime/Infrastructure/Export/clojure.tools.analyzer.passes.cleanup.clj.dll.meta b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.tools.analyzer.passes.cleanup.clj.dll.meta new file mode 100644 index 00000000..1ba5fffa --- /dev/null +++ b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.tools.analyzer.passes.cleanup.clj.dll.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 8aeed6b5e467a751e8d167c99c2b6288 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: + - '!UNITY_EDITOR' + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + : Any + second: + enabled: 0 + settings: + Exclude Android: 0 + Exclude Editor: 0 + Exclude Linux64: 0 + Exclude OSXUniversal: 0 + Exclude WebGL: 0 + Exclude Win: 0 + Exclude Win64: 0 + - first: + Android: Android + second: + enabled: 1 + settings: {} + - first: + Any: + second: + enabled: 1 + settings: {} + - first: + Editor: Editor + second: + enabled: 1 + settings: + DefaultValueInitialized: true + - first: + Standalone: Linux64 + second: + enabled: 1 + settings: {} + - first: + Standalone: OSXUniversal + second: + enabled: 1 + settings: {} + - first: + Standalone: Win + second: + enabled: 1 + settings: {} + - first: + Standalone: Win64 + second: + enabled: 1 + settings: {} + - first: + WebGL: WebGL + second: + enabled: 1 + settings: {} + - first: + Windows Store Apps: WindowsStoreApps + second: + enabled: 0 + settings: + CPU: AnyCPU + userData: + assetBundleName: + assetBundleVariant: diff --git a/magic-unity-dual/Runtime/Infrastructure/Export/clojure.tools.analyzer.passes.clj.dll b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.tools.analyzer.passes.clj.dll new file mode 100644 index 00000000..a97229ff Binary files /dev/null and b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.tools.analyzer.passes.clj.dll differ diff --git a/magic-unity-dual/Runtime/Infrastructure/Export/clojure.tools.analyzer.passes.clj.dll.meta b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.tools.analyzer.passes.clj.dll.meta new file mode 100644 index 00000000..7531d355 --- /dev/null +++ b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.tools.analyzer.passes.clj.dll.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: bc51a0cb20cc40a71a234b6548279bbe +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: + - '!UNITY_EDITOR' + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + : Any + second: + enabled: 0 + settings: + Exclude Android: 0 + Exclude Editor: 0 + Exclude Linux64: 0 + Exclude OSXUniversal: 0 + Exclude WebGL: 0 + Exclude Win: 0 + Exclude Win64: 0 + - first: + Android: Android + second: + enabled: 1 + settings: {} + - first: + Any: + second: + enabled: 1 + settings: {} + - first: + Editor: Editor + second: + enabled: 1 + settings: + DefaultValueInitialized: true + - first: + Standalone: Linux64 + second: + enabled: 1 + settings: {} + - first: + Standalone: OSXUniversal + second: + enabled: 1 + settings: {} + - first: + Standalone: Win + second: + enabled: 1 + settings: {} + - first: + Standalone: Win64 + second: + enabled: 1 + settings: {} + - first: + WebGL: WebGL + second: + enabled: 1 + settings: {} + - first: + Windows Store Apps: WindowsStoreApps + second: + enabled: 0 + settings: + CPU: AnyCPU + userData: + assetBundleName: + assetBundleVariant: diff --git a/magic-unity-dual/Runtime/Infrastructure/Export/clojure.tools.analyzer.passes.elide_meta.clj.dll b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.tools.analyzer.passes.elide_meta.clj.dll new file mode 100644 index 00000000..08b2e8e2 Binary files /dev/null and b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.tools.analyzer.passes.elide_meta.clj.dll differ diff --git a/magic-unity-dual/Runtime/Infrastructure/Export/clojure.tools.analyzer.passes.elide_meta.clj.dll.meta b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.tools.analyzer.passes.elide_meta.clj.dll.meta new file mode 100644 index 00000000..90334449 --- /dev/null +++ b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.tools.analyzer.passes.elide_meta.clj.dll.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 57681f7055e39cb57b8291ca222441c8 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: + - '!UNITY_EDITOR' + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + : Any + second: + enabled: 0 + settings: + Exclude Android: 0 + Exclude Editor: 0 + Exclude Linux64: 0 + Exclude OSXUniversal: 0 + Exclude WebGL: 0 + Exclude Win: 0 + Exclude Win64: 0 + - first: + Android: Android + second: + enabled: 1 + settings: {} + - first: + Any: + second: + enabled: 1 + settings: {} + - first: + Editor: Editor + second: + enabled: 1 + settings: + DefaultValueInitialized: true + - first: + Standalone: Linux64 + second: + enabled: 1 + settings: {} + - first: + Standalone: OSXUniversal + second: + enabled: 1 + settings: {} + - first: + Standalone: Win + second: + enabled: 1 + settings: {} + - first: + Standalone: Win64 + second: + enabled: 1 + settings: {} + - first: + WebGL: WebGL + second: + enabled: 1 + settings: {} + - first: + Windows Store Apps: WindowsStoreApps + second: + enabled: 0 + settings: + CPU: AnyCPU + userData: + assetBundleName: + assetBundleVariant: diff --git a/magic-unity-dual/Runtime/Infrastructure/Export/clojure.tools.analyzer.passes.source_info.clj.dll b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.tools.analyzer.passes.source_info.clj.dll new file mode 100644 index 00000000..d1d9883f Binary files /dev/null and b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.tools.analyzer.passes.source_info.clj.dll differ diff --git a/magic-unity-dual/Runtime/Infrastructure/Export/clojure.tools.analyzer.passes.source_info.clj.dll.meta b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.tools.analyzer.passes.source_info.clj.dll.meta new file mode 100644 index 00000000..dba80e24 --- /dev/null +++ b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.tools.analyzer.passes.source_info.clj.dll.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: bffbd5703d214751a9adb4073e3806e5 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: + - '!UNITY_EDITOR' + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + : Any + second: + enabled: 0 + settings: + Exclude Android: 0 + Exclude Editor: 0 + Exclude Linux64: 0 + Exclude OSXUniversal: 0 + Exclude WebGL: 0 + Exclude Win: 0 + Exclude Win64: 0 + - first: + Android: Android + second: + enabled: 1 + settings: {} + - first: + Any: + second: + enabled: 1 + settings: {} + - first: + Editor: Editor + second: + enabled: 1 + settings: + DefaultValueInitialized: true + - first: + Standalone: Linux64 + second: + enabled: 1 + settings: {} + - first: + Standalone: OSXUniversal + second: + enabled: 1 + settings: {} + - first: + Standalone: Win + second: + enabled: 1 + settings: {} + - first: + Standalone: Win64 + second: + enabled: 1 + settings: {} + - first: + WebGL: WebGL + second: + enabled: 1 + settings: {} + - first: + Windows Store Apps: WindowsStoreApps + second: + enabled: 0 + settings: + CPU: AnyCPU + userData: + assetBundleName: + assetBundleVariant: diff --git a/magic-unity-dual/Runtime/Infrastructure/Export/clojure.tools.analyzer.passes.trim.clj.dll b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.tools.analyzer.passes.trim.clj.dll new file mode 100644 index 00000000..3ca9dd86 Binary files /dev/null and b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.tools.analyzer.passes.trim.clj.dll differ diff --git a/magic-unity-dual/Runtime/Infrastructure/Export/clojure.tools.analyzer.passes.trim.clj.dll.meta b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.tools.analyzer.passes.trim.clj.dll.meta new file mode 100644 index 00000000..9787698f --- /dev/null +++ b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.tools.analyzer.passes.trim.clj.dll.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 3bd4824bf633f710096aecf21574be57 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: + - '!UNITY_EDITOR' + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + : Any + second: + enabled: 0 + settings: + Exclude Android: 0 + Exclude Editor: 0 + Exclude Linux64: 0 + Exclude OSXUniversal: 0 + Exclude WebGL: 0 + Exclude Win: 0 + Exclude Win64: 0 + - first: + Android: Android + second: + enabled: 1 + settings: {} + - first: + Any: + second: + enabled: 1 + settings: {} + - first: + Editor: Editor + second: + enabled: 1 + settings: + DefaultValueInitialized: true + - first: + Standalone: Linux64 + second: + enabled: 1 + settings: {} + - first: + Standalone: OSXUniversal + second: + enabled: 1 + settings: {} + - first: + Standalone: Win + second: + enabled: 1 + settings: {} + - first: + Standalone: Win64 + second: + enabled: 1 + settings: {} + - first: + WebGL: WebGL + second: + enabled: 1 + settings: {} + - first: + Windows Store Apps: WindowsStoreApps + second: + enabled: 0 + settings: + CPU: AnyCPU + userData: + assetBundleName: + assetBundleVariant: diff --git a/magic-unity-dual/Runtime/Infrastructure/Export/clojure.tools.analyzer.utils.clj.dll b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.tools.analyzer.utils.clj.dll new file mode 100644 index 00000000..07ca954e Binary files /dev/null and b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.tools.analyzer.utils.clj.dll differ diff --git a/magic-unity-dual/Runtime/Infrastructure/Export/clojure.tools.analyzer.utils.clj.dll.meta b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.tools.analyzer.utils.clj.dll.meta new file mode 100644 index 00000000..02c2212c --- /dev/null +++ b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.tools.analyzer.utils.clj.dll.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: a89d85385c6644b7b97b6e129fda81e0 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: + - '!UNITY_EDITOR' + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + : Any + second: + enabled: 0 + settings: + Exclude Android: 0 + Exclude Editor: 0 + Exclude Linux64: 0 + Exclude OSXUniversal: 0 + Exclude WebGL: 0 + Exclude Win: 0 + Exclude Win64: 0 + - first: + Android: Android + second: + enabled: 1 + settings: {} + - first: + Any: + second: + enabled: 1 + settings: {} + - first: + Editor: Editor + second: + enabled: 1 + settings: + DefaultValueInitialized: true + - first: + Standalone: Linux64 + second: + enabled: 1 + settings: {} + - first: + Standalone: OSXUniversal + second: + enabled: 1 + settings: {} + - first: + Standalone: Win + second: + enabled: 1 + settings: {} + - first: + Standalone: Win64 + second: + enabled: 1 + settings: {} + - first: + WebGL: WebGL + second: + enabled: 1 + settings: {} + - first: + Windows Store Apps: WindowsStoreApps + second: + enabled: 0 + settings: + CPU: AnyCPU + userData: + assetBundleName: + assetBundleVariant: diff --git a/magic-unity-dual/Runtime/Infrastructure/Export/clojure.uuid.clj.dll b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.uuid.clj.dll new file mode 100755 index 00000000..145d1c23 Binary files /dev/null and b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.uuid.clj.dll differ diff --git a/magic-unity-dual/Runtime/Infrastructure/Export/clojure.uuid.clj.dll.meta b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.uuid.clj.dll.meta new file mode 100644 index 00000000..033c3677 --- /dev/null +++ b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.uuid.clj.dll.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 931b9cb4bc483e31385bba70ae7a71cc +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: + - '!UNITY_EDITOR' + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + : Any + second: + enabled: 0 + settings: + Exclude Android: 0 + Exclude Editor: 0 + Exclude Linux64: 0 + Exclude OSXUniversal: 0 + Exclude WebGL: 0 + Exclude Win: 0 + Exclude Win64: 0 + - first: + Android: Android + second: + enabled: 1 + settings: {} + - first: + Any: + second: + enabled: 1 + settings: {} + - first: + Editor: Editor + second: + enabled: 1 + settings: + DefaultValueInitialized: true + - first: + Standalone: Linux64 + second: + enabled: 1 + settings: {} + - first: + Standalone: OSXUniversal + second: + enabled: 1 + settings: {} + - first: + Standalone: Win + second: + enabled: 1 + settings: {} + - first: + Standalone: Win64 + second: + enabled: 1 + settings: {} + - first: + WebGL: WebGL + second: + enabled: 1 + settings: {} + - first: + Windows Store Apps: WindowsStoreApps + second: + enabled: 0 + settings: + CPU: AnyCPU + userData: + assetBundleName: + assetBundleVariant: diff --git a/magic-unity-dual/Runtime/Infrastructure/Export/clojure.walk.clj.dll b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.walk.clj.dll new file mode 100755 index 00000000..a4fb060b Binary files /dev/null and b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.walk.clj.dll differ diff --git a/magic-unity-dual/Runtime/Infrastructure/Export/clojure.walk.clj.dll.meta b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.walk.clj.dll.meta new file mode 100644 index 00000000..abfe1b0c --- /dev/null +++ b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.walk.clj.dll.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 827815ac5778b95c8a536cf9d09ff9ee +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: + - '!UNITY_EDITOR' + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + : Any + second: + enabled: 0 + settings: + Exclude Android: 0 + Exclude Editor: 0 + Exclude Linux64: 0 + Exclude OSXUniversal: 0 + Exclude WebGL: 0 + Exclude Win: 0 + Exclude Win64: 0 + - first: + Android: Android + second: + enabled: 1 + settings: {} + - first: + Any: + second: + enabled: 1 + settings: {} + - first: + Editor: Editor + second: + enabled: 1 + settings: + DefaultValueInitialized: true + - first: + Standalone: Linux64 + second: + enabled: 1 + settings: {} + - first: + Standalone: OSXUniversal + second: + enabled: 1 + settings: {} + - first: + Standalone: Win + second: + enabled: 1 + settings: {} + - first: + Standalone: Win64 + second: + enabled: 1 + settings: {} + - first: + WebGL: WebGL + second: + enabled: 1 + settings: {} + - first: + Windows Store Apps: WindowsStoreApps + second: + enabled: 0 + settings: + CPU: AnyCPU + userData: + assetBundleName: + assetBundleVariant: diff --git a/magic-unity-dual/Runtime/Infrastructure/Export/clojure.zip.clj.dll b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.zip.clj.dll new file mode 100755 index 00000000..c871cf74 Binary files /dev/null and b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.zip.clj.dll differ diff --git a/magic-unity-dual/Runtime/Infrastructure/Export/clojure.zip.clj.dll.meta b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.zip.clj.dll.meta new file mode 100644 index 00000000..eeb85005 --- /dev/null +++ b/magic-unity-dual/Runtime/Infrastructure/Export/clojure.zip.clj.dll.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 13b41b8ad71d801b18bdfcf14ae198e0 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: + - '!UNITY_EDITOR' + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + : Any + second: + enabled: 0 + settings: + Exclude Android: 0 + Exclude Editor: 0 + Exclude Linux64: 0 + Exclude OSXUniversal: 0 + Exclude WebGL: 0 + Exclude Win: 0 + Exclude Win64: 0 + - first: + Android: Android + second: + enabled: 1 + settings: {} + - first: + Any: + second: + enabled: 1 + settings: {} + - first: + Editor: Editor + second: + enabled: 1 + settings: + DefaultValueInitialized: true + - first: + Standalone: Linux64 + second: + enabled: 1 + settings: {} + - first: + Standalone: OSXUniversal + second: + enabled: 1 + settings: {} + - first: + Standalone: Win + second: + enabled: 1 + settings: {} + - first: + Standalone: Win64 + second: + enabled: 1 + settings: {} + - first: + WebGL: WebGL + second: + enabled: 1 + settings: {} + - first: + Windows Store Apps: WindowsStoreApps + second: + enabled: 0 + settings: + CPU: AnyCPU + userData: + assetBundleName: + assetBundleVariant: diff --git a/magic-unity-dual/Runtime/Magic.Unity.asmdef b/magic-unity-dual/Runtime/Magic.Unity.asmdef new file mode 100644 index 00000000..78c525db --- /dev/null +++ b/magic-unity-dual/Runtime/Magic.Unity.asmdef @@ -0,0 +1,15 @@ +{ + "name": "Magic.Unity", + "rootNamespace": "", + "references": [], + "includePlatforms": [ + ], + "excludePlatforms": [], + "allowUnsafeCode": false, + "overrideReferences": false, + "precompiledReferences": [], + "autoReferenced": true, + "defineConstraints": [], + "versionDefines": [], + "noEngineReferences": false +} \ No newline at end of file diff --git a/magic-unity-dual/Runtime/Magic.Unity.asmdef.meta b/magic-unity-dual/Runtime/Magic.Unity.asmdef.meta new file mode 100644 index 00000000..bdcfc11f --- /dev/null +++ b/magic-unity-dual/Runtime/Magic.Unity.asmdef.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: f5fc100bb1c33fe0987babc6acd0414e +AssemblyDefinitionImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/magic-unity-dual/Runtime/Magic.Unity.cs b/magic-unity-dual/Runtime/Magic.Unity.cs new file mode 100644 index 00000000..82c3af94 --- /dev/null +++ b/magic-unity-dual/Runtime/Magic.Unity.cs @@ -0,0 +1,111 @@ +using System; +using System.Reflection; +using clojure.lang; + +namespace Magic.Unity +{ + /// + /// MAGIC's Unity-specific Clojure integration + /// + public static class Clojure + { + static bool _booted = false; + static Var RequireVar; + + /// + /// Initialize the Clojure runtime. + /// + /// + /// This must be run before any Clojure functions can run. The + /// Magic.Unity integration functions do this automatically. + /// + public static void Boot() + { + if (!_booted) + { + _booted = true; + BootMagicRuntime(); + RequireVar = RT.var("clojure.core", "require"); + } + } + + // The bootstrap below uses API that only exists in MAGIC's Clojure + // fork: RuntimeBootstrapFlag.CodeLoadOrder, RT.Initialize with the + // doRuntimePostBoostrap parameter, and RT.TryLoadInitType. A consumer + // may keep a stock ClojureCLR in Assets for in-editor runtime + // compilation; Unity dedups managed plugins by file name, so this + // file can end up compiled against stock Clojure.dll. Bind the + // fork-only members via reflection: when the fork is present this + // runs the exact same bootstrap as before, when it is absent (stock) + // the bootstrap is skipped and stock self-initializes on first + // RT.var. + static void BootMagicRuntime() + { + var clojureAssembly = typeof(RT).Assembly; + var bootstrapFlagType = clojureAssembly.GetType("clojure.lang.RuntimeBootstrapFlag"); + var codeLoadOrderField = bootstrapFlagType?.GetField("CodeLoadOrder", BindingFlags.Public | BindingFlags.Static); + var codeSourceType = bootstrapFlagType?.GetNestedType("CodeSource"); + var initializeMethod = typeof(RT).GetMethod("Initialize", BindingFlags.Public | BindingFlags.Static, null, new[] { typeof(bool), typeof(bool) }, null); + var tryLoadInitTypeMethod = typeof(RT).GetMethod("TryLoadInitType", BindingFlags.Public | BindingFlags.Static, null, new[] { typeof(string) }, null); + if (codeLoadOrderField == null || codeSourceType == null || initializeMethod == null || tryLoadInitTypeMethod == null) + { + return; + } +#if UNITY_EDITOR + SetCodeLoadOrder(codeLoadOrderField, codeSourceType, new[] { "InitType", "FileSystem" }); +#elif ENABLE_IL2CPP + SetCodeLoadOrder(codeLoadOrderField, codeSourceType, new[] { "InitType" }); +#endif + initializeMethod.Invoke(null, new object[] { true, false }); + tryLoadInitTypeMethod.Invoke(null, new object[] { "clojure/core" }); + } + + static void SetCodeLoadOrder(FieldInfo codeLoadOrderField, Type codeSourceType, string[] sourceNames) + { + var codeLoadOrder = Array.CreateInstance(codeSourceType, sourceNames.Length); + for (var i = 0; i < sourceNames.Length; i++) + { + codeLoadOrder.SetValue(Enum.Parse(codeSourceType, sourceNames[i]), i); + } + codeLoadOrderField.SetValue(null, codeLoadOrder); + } + + /// + /// Lookup a Clojure var + /// + /// The namespace of the var + /// The name of the var + /// + public static Var GetVar(string ns, string name) + { + Boot(); + return RT.var(ns, name); + } + + /// + /// Lookup a Clojure var and cast to a known type + /// + /// + /// Useful when the var is known to be a function with type hints. + /// Casting to a Magic.Function type in that case avoids boxing. + /// + /// The namespace of the var + /// The name of the var + /// + public static T GetVar(string ns, string name) + { + Boot(); + return (T)(RT.var(ns, name).deref()); + } + + /// + /// Require a Clojure namespace + /// + /// The name of the namespace + public static void Require(string ns) + { + Boot(); + RequireVar.invoke(Symbol.intern(ns)); + } + } +} diff --git a/magic-unity-dual/Runtime/Magic.Unity.cs.meta b/magic-unity-dual/Runtime/Magic.Unity.cs.meta new file mode 100644 index 00000000..159d8be3 --- /dev/null +++ b/magic-unity-dual/Runtime/Magic.Unity.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 371774cf2fdcbe950926c35eb4d05508 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/magic-unity-dual/Runtime/Magic.Unity.csproj b/magic-unity-dual/Runtime/Magic.Unity.csproj new file mode 100644 index 00000000..d95b0aab --- /dev/null +++ b/magic-unity-dual/Runtime/Magic.Unity.csproj @@ -0,0 +1,11 @@ + + + netstandard2.0 + + + Magic.Unity.nuspec + + https://api.nuget.org/v3/index.json + + + diff --git a/magic-unity-dual/Runtime/Magic.Unity.csproj.meta b/magic-unity-dual/Runtime/Magic.Unity.csproj.meta new file mode 100644 index 00000000..ff66f40d --- /dev/null +++ b/magic-unity-dual/Runtime/Magic.Unity.csproj.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 953a8630b9695cc398fcd81f104a91b7 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/magic-unity-dual/dotnet.clj b/magic-unity-dual/dotnet.clj new file mode 100644 index 00000000..c0a88d75 --- /dev/null +++ b/magic-unity-dual/dotnet.clj @@ -0,0 +1,17 @@ +(ns dotnet + + "Dotnet related tasks to be called by `nostrand`. + Nostrand uses the `magic` compiler. + + ## Motivation + + This namespace provides convenient functions to: + - pack and push NuGet Packages to a host repo" + + (:require [nostrand.tasks :as tasks])) + +(defn nuget-push + "Pack and Push NuGet Package to git host repo. + nos dotnet/nuget-push" + [] + (tasks/nuget-push "github" false "Release")) diff --git a/magic-unity-dual/dotnet.clj.meta b/magic-unity-dual/dotnet.clj.meta new file mode 100644 index 00000000..0be483a3 --- /dev/null +++ b/magic-unity-dual/dotnet.clj.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: caf3de7d807eaa861935917021bf6cdb +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/magic-unity-dual/package.json b/magic-unity-dual/package.json new file mode 100644 index 00000000..5434e325 --- /dev/null +++ b/magic-unity-dual/package.json @@ -0,0 +1,24 @@ +{ + "name": "sg.flybot.magic.unity.dual", + "version": "0.7.0", + "displayName": "MAGIC Unity Integration (dual: stock editor + MAGIC players)", + "description": "The integration of the MAGIC Clojure compiler into Unity", + "unity": "2021.2", + "unityRelease": "3f1", + "documentationUrl": "https://github.com/flybot-sg/magic", + "changelogUrl": "https://github.com/flybot-sg/magic/blob/main/CHANGELOG.md", + "licensesUrl": "https://github.com/flybot-sg/magic/blob/main/clojure-runtime/epl-v10.html", + "dependencies": { + "com.unity.nuget.mono-cecil": "1.11.4" + }, + "keywords": [ + "lisp", + "clojure", + "compiler", + "magic" + ], + "author": { + "name": "Flybot (fork of work by Ramsey Nasser)", + "url": "https://flybot.sg/" + } +} diff --git a/magic-unity-dual/package.json.meta b/magic-unity-dual/package.json.meta new file mode 100644 index 00000000..528da058 --- /dev/null +++ b/magic-unity-dual/package.json.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 6bef7c04353c6394ea4496d0fe286e74 +PackageManifestImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/magic-unity/README.md b/magic-unity/README.md index 63cb4e89..88ee0015 100644 --- a/magic-unity/README.md +++ b/magic-unity/README.md @@ -7,13 +7,22 @@ This UPM package ships the Clojure runtime DLLs that Unity loads at play time, p ## Install -Consume as a UPM package via git URL in `Packages/manifest.json`, pinned to a tag from the [releases page](https://github.com/flybot-sg/magic/releases): +Consume as a UPM package via git URL in `Packages/manifest.json`, pinned to a tag from the [releases page](https://github.com/flybot-sg/magic/releases). Pick the variant that matches how your Editor runs Clojure (see [Package variants](#package-variants)): ``` +// Default: MAGIC everywhere, including the Editor's Play mode. For projects +// with no stock ClojureCLR. "sg.flybot.magic.unity": "https://github.com/flybot-sg/magic.git?path=magic-unity#" ``` -See [magic-unity-smoke](../magic-unity-smoke) for a working IL2CPP regression project that uses this integration. +``` +// Dual: stock ClojureCLR in the Editor, MAGIC in player builds. The runtime +// DLLs are excluded from the Editor, so there is no console noise and no probe +// clash. For projects that keep ClojureCLR for Editor / REPL work. +"sg.flybot.magic.unity.dual": "https://github.com/flybot-sg/magic.git?path=magic-unity-dual#" +``` + +Install exactly one variant. See [magic-unity-smoke](../unity-examples/magic-unity-smoke) for a working IL2CPP regression project that uses this integration. ## What the package ships @@ -25,10 +34,25 @@ See [magic-unity-smoke](../magic-unity-smoke) for a working IL2CPP regression pr ## How it works -1. You compile your own Clojure namespaces to `.clj.dll` outside Unity via `nos dotnet/build`, writing them into `Assets/Plugins/Magic/` (see [magic-unity-smoke/dotnet.clj](../magic-unity-smoke/dotnet.clj) for the canonical task definition). The package does not include a compiler. +1. You compile your own Clojure namespaces to `.clj.dll` outside Unity via `nos dotnet/build`, writing them into `Assets/Plugins/Magic/` (see [magic-unity-smoke/dotnet.clj](../unity-examples/magic-unity-smoke/dotnet.clj) for the canonical task definition). The package does not include a compiler. 2. Unity opens the project. The prebuilt runtime + stdlib from `Runtime/Infrastructure/Export/` and your own `.clj.dll`s are both loaded as plain .NET assemblies. `Magic.Unity.Clojure.Boot()` initialises the runtime; `Require` / `GetVar` let C# scripts call into Clojure. 3. On every build, `MagicPreprocessor` runs first. When the build target uses IL2CPP, it rewrites the `.clj.dll` bodies in place so the IL2CPP transpiler can consume them (and writes `link.xml` entries); on a Mono build the preprocessor only sweeps any leftover IL2CPP-only workarounds from a previous build. The runtime DLLs are loaded the same way under either backend. -4. Coexistence with stock ClojureCLR: if a strong-named `Clojure.dll` is found under `Assets` (projects that keep ClojureCLR for Editor work and MAGIC for shipped builds), every MAGIC-compiled `.clj.dll` is imported with Editor loading off, because the stock runtime probe-loads `clojure.core.clj` at init and a MAGIC DLL answering that probe fails to load. With the exclusion active, the Editor logs `Assembly '...clj.dll' will not be loaded due to errors: Assembly is incompatible with the editor` for the package's `Export` DLLs on every domain reload. These lines are expected and benign in this setup: they are Unity reporting the intended Editor exclusion, not a real failure. Player builds are unaffected. +4. Coexistence with stock ClojureCLR: if a strong-named `Clojure.dll` is found under `Assets` (projects that keep ClojureCLR for Editor work and MAGIC for shipped builds), every MAGIC-compiled `.clj.dll` is imported with Editor loading off, because the stock runtime probe-loads `clojure.core.clj` at init and a MAGIC DLL answering that probe fails to load. With this default variant the runtime ships Editor-loadable, so on an immutable (PackageCache) install the Editor logs `Assembly '...clj.dll' will not be loaded due to errors: Assembly is incompatible with the editor` for the package's `Export` DLLs on every domain reload. These lines are benign (Unity reporting the intended exclusion, not a failure), and player builds are unaffected. To silence them, use the [`.dual` variant](#package-variants), which ships the runtime excluded from the Editor by construction. + +## Package variants + +The package is shipped in two variants. They are identical except for one thing: whether the runtime `Runtime/Infrastructure/Export/*.clj.dll` plugins carry a `!UNITY_EDITOR` define constraint. That single difference decides whether the MAGIC runtime is visible to the Editor. + +| | `sg.flybot.magic.unity` (default) | `sg.flybot.magic.unity.dual` | +|---|---|---| +| Runtime in the Editor | yes (loadable) | no (`!UNITY_EDITOR`) | +| MAGIC in Editor Play mode | works | not available (use stock ClojureCLR) | +| Stock ClojureCLR alongside | probe clash, handled by the coexistence guard, with benign console noise | no clash, no noise (runtime is simply absent from the Editor) | +| Player builds (Mono / IL2CPP) | identical | identical | + +Choose the **default** if your project runs MAGIC in the Editor (Play mode, edit-mode tooling) and has no stock ClojureCLR. Choose **`.dual`** if your Editor runs stock ClojureCLR (REPL / hot-reload) and MAGIC only ships in player builds: the runtime is excluded from the Editor by the define constraint, so Unity never attempts to load it there and prints no narration. + +`magic-unity-dual/` is generated from `magic-unity/` by `bb gen-unity-dual` (the DLLs are byte-identical copies; only the 46 runtime `.meta`s and the package name differ) and is kept in sync by `bb check-drift`. The in-repo coexistence repro that validates both variants is `magic-unity-coexist/` (`bb coexist-noise` for the dual variant, `bb coexist-noise magic-only` to reproduce the noise). ## API diff --git a/magic-unity/package.json b/magic-unity/package.json index 21d4efa9..339958f8 100644 --- a/magic-unity/package.json +++ b/magic-unity/package.json @@ -1,6 +1,6 @@ { "name": "sg.flybot.magic.unity", - "version": "0.6.0", + "version": "0.7.0", "displayName": "MAGIC Unity Integration", "description": "The integration of the MAGIC Clojure compiler into Unity", "unity": "2021.2", diff --git a/unity-examples/magic-unity-coexist/.gitignore b/unity-examples/magic-unity-coexist/.gitignore new file mode 100644 index 00000000..a857dd21 --- /dev/null +++ b/unity-examples/magic-unity-coexist/.gitignore @@ -0,0 +1,40 @@ +# Unity-generated, machine-local +Library/ +Temp/ +Logs/ +Obj/ +Build/ +Builds/ +MemoryCaptures/ +UserSettings/ + +# Unity-generated IDE project files +*.csproj +*.unityproj +*.sln +*.suo +*.tmp +*.user +*.userprefs +*.pidb +*.booproj +*.svd +*.pdb +*.mdb +*.opendb +*.VC.db + +# The immutable package tarball: a build artifact repacked from magic-unity by +# `bb coexist-noise`. The PackageCache install of this tgz is what reproduces +# the noise (a mutable file: install writes the editor-off flip back and the +# narration never appears). +/magic-unity.tgz + +# Resolved against the repacked tgz hash; regenerated every run. +Packages/packages-lock.json + +# Would only appear if someone runs a build; not part of the editor repro. +Assets/Plugins/Magic/ +Assets/Plugins/Magic.meta +Assets/link.xml +Assets/link.xml.meta diff --git a/magic-unity-smoke/Assets/Editor.meta b/unity-examples/magic-unity-coexist/Assets/Editor.meta similarity index 100% rename from magic-unity-smoke/Assets/Editor.meta rename to unity-examples/magic-unity-coexist/Assets/Editor.meta diff --git a/unity-examples/magic-unity-coexist/Assets/Editor/CoexistenceProbe.cs b/unity-examples/magic-unity-coexist/Assets/Editor/CoexistenceProbe.cs new file mode 100644 index 00000000..ef9a5873 --- /dev/null +++ b/unity-examples/magic-unity-coexist/Assets/Editor/CoexistenceProbe.cs @@ -0,0 +1,62 @@ +using System; +using System.Linq; +using System.Reflection; +using UnityEditor; +using UnityEngine; + +// Headless assertion helper for the coexistence repro. Reproduces the exact +// init-time probe stock ClojureCLR's RT runs (Assembly.Load("clojure.core.clj")) +// and reports the editor-domain state the #25 guard is responsible for. +// +// In a correctly guarded coexisting editor the expected steady state is: +// preloaded-clj=0 core-clj-loadable=false clojure-versions=[1.11.0.0] +// i.e. the fork clj.dll plugins are excluded from the editor domain, so the +// stock probe fails (the fork DLL is not there to answer it) and only stock +// 1.11.0 wins the Clojure.dll dedup. If the guard regresses, the probe +// resolves the fork clojure.core.clj and the TypeLoadException storm returns. +// +// Run headless with -executeMethod CoexistenceProbe.Run; grep the log for the +// single [CoexistenceProbe] marker line alongside the narration-line count. +public static class CoexistenceProbe +{ + public static void Run() + { + var preloaded = AppDomain.CurrentDomain.GetAssemblies() + .Select(a => a.GetName().Name) + .Where(n => n.EndsWith(".clj", StringComparison.OrdinalIgnoreCase)) + .OrderBy(n => n) + .ToArray(); + + bool coreLoadable; + string loadDetail; + try + { + var asm = Assembly.Load("clojure.core.clj"); + coreLoadable = asm != null; + loadDetail = asm?.GetName().FullName ?? "null"; + } + catch (Exception e) + { + coreLoadable = false; + loadDetail = e.GetType().Name; + } + + var clojureVersions = AppDomain.CurrentDomain.GetAssemblies() + .Where(a => a.GetName().Name == "Clojure") + .Select(a => a.GetName().Version.ToString()) + .OrderBy(v => v) + .ToArray(); + + var forkExportCljEditorOff = PluginImporter.GetAllImporters() + .Count(i => !i.isNativePlugin + && i.assetPath.EndsWith(".clj.dll", StringComparison.OrdinalIgnoreCase) + && i.assetPath.Contains("/Runtime/Infrastructure/Export/") + && !i.GetCompatibleWithEditor()); + + Debug.Log($"[CoexistenceProbe] preloaded-clj={preloaded.Length} " + + $"core-clj-loadable={coreLoadable.ToString().ToLowerInvariant()} " + + $"core-clj-load={loadDetail} " + + $"clojure-versions=[{string.Join(",", clojureVersions)}] " + + $"export-clj-editor-off={forkExportCljEditorOff}"); + } +} diff --git a/unity-examples/magic-unity-coexist/Assets/Editor/CoexistenceProbe.cs.meta b/unity-examples/magic-unity-coexist/Assets/Editor/CoexistenceProbe.cs.meta new file mode 100644 index 00000000..a307cbeb --- /dev/null +++ b/unity-examples/magic-unity-coexist/Assets/Editor/CoexistenceProbe.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 95722c3bbfe44bbbbb32310834fc1ac5 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/magic-unity-smoke/Assets/Plugins.meta b/unity-examples/magic-unity-coexist/Assets/Plugins.meta similarity index 100% rename from magic-unity-smoke/Assets/Plugins.meta rename to unity-examples/magic-unity-coexist/Assets/Plugins.meta diff --git a/unity-examples/magic-unity-coexist/Assets/Plugins/clojure-clr.meta b/unity-examples/magic-unity-coexist/Assets/Plugins/clojure-clr.meta new file mode 100644 index 00000000..1b9c2394 --- /dev/null +++ b/unity-examples/magic-unity-coexist/Assets/Plugins/clojure-clr.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 4bad0fd9bc4414d56b07bc92af71662d +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/unity-examples/magic-unity-coexist/Assets/Plugins/clojure-clr/clojure.1.11.0.meta b/unity-examples/magic-unity-coexist/Assets/Plugins/clojure-clr/clojure.1.11.0.meta new file mode 100644 index 00000000..11d759ff --- /dev/null +++ b/unity-examples/magic-unity-coexist/Assets/Plugins/clojure-clr/clojure.1.11.0.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: bab7cb974e7a74f3986053a5e80ce6ee +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/unity-examples/magic-unity-coexist/Assets/Plugins/clojure-clr/clojure.1.11.0/net462.meta b/unity-examples/magic-unity-coexist/Assets/Plugins/clojure-clr/clojure.1.11.0/net462.meta new file mode 100644 index 00000000..9be0933a --- /dev/null +++ b/unity-examples/magic-unity-coexist/Assets/Plugins/clojure-clr/clojure.1.11.0/net462.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 76893e13072e54301bd4d2763047ad57 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/unity-examples/magic-unity-coexist/Assets/Plugins/clojure-clr/clojure.1.11.0/net462/Clojure.Source.dll b/unity-examples/magic-unity-coexist/Assets/Plugins/clojure-clr/clojure.1.11.0/net462/Clojure.Source.dll new file mode 100644 index 00000000..e3a55f16 Binary files /dev/null and b/unity-examples/magic-unity-coexist/Assets/Plugins/clojure-clr/clojure.1.11.0/net462/Clojure.Source.dll differ diff --git a/unity-examples/magic-unity-coexist/Assets/Plugins/clojure-clr/clojure.1.11.0/net462/Clojure.Source.dll.meta b/unity-examples/magic-unity-coexist/Assets/Plugins/clojure-clr/clojure.1.11.0/net462/Clojure.Source.dll.meta new file mode 100644 index 00000000..98a5eccd --- /dev/null +++ b/unity-examples/magic-unity-coexist/Assets/Plugins/clojure-clr/clojure.1.11.0/net462/Clojure.Source.dll.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: cca3660a76d9f456e8af3d5ef53059fc +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 1 + settings: + DefaultValueInitialized: true + - first: + Windows Store Apps: WindowsStoreApps + second: + enabled: 0 + settings: + CPU: AnyCPU + userData: + assetBundleName: + assetBundleVariant: diff --git a/unity-examples/magic-unity-coexist/Assets/Plugins/clojure-clr/clojure.1.11.0/net462/Clojure.dll b/unity-examples/magic-unity-coexist/Assets/Plugins/clojure-clr/clojure.1.11.0/net462/Clojure.dll new file mode 100644 index 00000000..a1ce629f Binary files /dev/null and b/unity-examples/magic-unity-coexist/Assets/Plugins/clojure-clr/clojure.1.11.0/net462/Clojure.dll differ diff --git a/unity-examples/magic-unity-coexist/Assets/Plugins/clojure-clr/clojure.1.11.0/net462/Clojure.dll.meta b/unity-examples/magic-unity-coexist/Assets/Plugins/clojure-clr/clojure.1.11.0/net462/Clojure.dll.meta new file mode 100644 index 00000000..d363f34c --- /dev/null +++ b/unity-examples/magic-unity-coexist/Assets/Plugins/clojure-clr/clojure.1.11.0/net462/Clojure.dll.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: ec4c67f35d756435098457560362b41b +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 1 + settings: + DefaultValueInitialized: true + - first: + Windows Store Apps: WindowsStoreApps + second: + enabled: 0 + settings: + CPU: AnyCPU + userData: + assetBundleName: + assetBundleVariant: diff --git a/unity-examples/magic-unity-coexist/Assets/Plugins/clojure-clr/clojure.core.specs.alpha.0.2.62.meta b/unity-examples/magic-unity-coexist/Assets/Plugins/clojure-clr/clojure.core.specs.alpha.0.2.62.meta new file mode 100644 index 00000000..0a760d16 --- /dev/null +++ b/unity-examples/magic-unity-coexist/Assets/Plugins/clojure-clr/clojure.core.specs.alpha.0.2.62.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 30f684d9e4fd64f72bcc4af166906317 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/unity-examples/magic-unity-coexist/Assets/Plugins/clojure-clr/clojure.core.specs.alpha.0.2.62/netstandard2.0.meta b/unity-examples/magic-unity-coexist/Assets/Plugins/clojure-clr/clojure.core.specs.alpha.0.2.62/netstandard2.0.meta new file mode 100644 index 00000000..24b0601e --- /dev/null +++ b/unity-examples/magic-unity-coexist/Assets/Plugins/clojure-clr/clojure.core.specs.alpha.0.2.62/netstandard2.0.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 04a01aa48797b40e5b2354705b9a7a51 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/unity-examples/magic-unity-coexist/Assets/Plugins/clojure-clr/clojure.core.specs.alpha.0.2.62/netstandard2.0/clojure.core.specs.alpha.dll b/unity-examples/magic-unity-coexist/Assets/Plugins/clojure-clr/clojure.core.specs.alpha.0.2.62/netstandard2.0/clojure.core.specs.alpha.dll new file mode 100644 index 00000000..b7c5ba36 Binary files /dev/null and b/unity-examples/magic-unity-coexist/Assets/Plugins/clojure-clr/clojure.core.specs.alpha.0.2.62/netstandard2.0/clojure.core.specs.alpha.dll differ diff --git a/unity-examples/magic-unity-coexist/Assets/Plugins/clojure-clr/clojure.core.specs.alpha.0.2.62/netstandard2.0/clojure.core.specs.alpha.dll.meta b/unity-examples/magic-unity-coexist/Assets/Plugins/clojure-clr/clojure.core.specs.alpha.0.2.62/netstandard2.0/clojure.core.specs.alpha.dll.meta new file mode 100644 index 00000000..93e46e7c --- /dev/null +++ b/unity-examples/magic-unity-coexist/Assets/Plugins/clojure-clr/clojure.core.specs.alpha.0.2.62/netstandard2.0/clojure.core.specs.alpha.dll.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 21c9f23fdbc7a4f228d0f40a0e7e3808 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 1 + settings: + DefaultValueInitialized: true + - first: + Windows Store Apps: WindowsStoreApps + second: + enabled: 0 + settings: + CPU: AnyCPU + userData: + assetBundleName: + assetBundleVariant: diff --git a/unity-examples/magic-unity-coexist/Assets/Plugins/clojure-clr/clojure.spec.alpha.0.3.218.meta b/unity-examples/magic-unity-coexist/Assets/Plugins/clojure-clr/clojure.spec.alpha.0.3.218.meta new file mode 100644 index 00000000..deee08ff --- /dev/null +++ b/unity-examples/magic-unity-coexist/Assets/Plugins/clojure-clr/clojure.spec.alpha.0.3.218.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 480fc4c64e1c04510be857dceccf7295 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/unity-examples/magic-unity-coexist/Assets/Plugins/clojure-clr/clojure.spec.alpha.0.3.218/netstandard2.0.meta b/unity-examples/magic-unity-coexist/Assets/Plugins/clojure-clr/clojure.spec.alpha.0.3.218/netstandard2.0.meta new file mode 100644 index 00000000..c204e1c3 --- /dev/null +++ b/unity-examples/magic-unity-coexist/Assets/Plugins/clojure-clr/clojure.spec.alpha.0.3.218/netstandard2.0.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: af44d5a49153f404f87b1f27c56f9cef +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/unity-examples/magic-unity-coexist/Assets/Plugins/clojure-clr/clojure.spec.alpha.0.3.218/netstandard2.0/clojure.spec.alpha.dll b/unity-examples/magic-unity-coexist/Assets/Plugins/clojure-clr/clojure.spec.alpha.0.3.218/netstandard2.0/clojure.spec.alpha.dll new file mode 100644 index 00000000..f49e93ae Binary files /dev/null and b/unity-examples/magic-unity-coexist/Assets/Plugins/clojure-clr/clojure.spec.alpha.0.3.218/netstandard2.0/clojure.spec.alpha.dll differ diff --git a/unity-examples/magic-unity-coexist/Assets/Plugins/clojure-clr/clojure.spec.alpha.0.3.218/netstandard2.0/clojure.spec.alpha.dll.meta b/unity-examples/magic-unity-coexist/Assets/Plugins/clojure-clr/clojure.spec.alpha.0.3.218/netstandard2.0/clojure.spec.alpha.dll.meta new file mode 100644 index 00000000..90dc6a37 --- /dev/null +++ b/unity-examples/magic-unity-coexist/Assets/Plugins/clojure-clr/clojure.spec.alpha.0.3.218/netstandard2.0/clojure.spec.alpha.dll.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: c24af1ec4550d4daca311d0a0f5f4699 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 1 + settings: + DefaultValueInitialized: true + - first: + Windows Store Apps: WindowsStoreApps + second: + enabled: 0 + settings: + CPU: AnyCPU + userData: + assetBundleName: + assetBundleVariant: diff --git a/unity-examples/magic-unity-coexist/Assets/Plugins/clojure-clr/clojure.test.check.1.1.1.meta b/unity-examples/magic-unity-coexist/Assets/Plugins/clojure-clr/clojure.test.check.1.1.1.meta new file mode 100644 index 00000000..f2d67a75 --- /dev/null +++ b/unity-examples/magic-unity-coexist/Assets/Plugins/clojure-clr/clojure.test.check.1.1.1.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: d73433f7c290f4ad5a3386e9e7fc1799 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/unity-examples/magic-unity-coexist/Assets/Plugins/clojure-clr/clojure.test.check.1.1.1/netstandard2.0.meta b/unity-examples/magic-unity-coexist/Assets/Plugins/clojure-clr/clojure.test.check.1.1.1/netstandard2.0.meta new file mode 100644 index 00000000..0c1cb0d9 --- /dev/null +++ b/unity-examples/magic-unity-coexist/Assets/Plugins/clojure-clr/clojure.test.check.1.1.1/netstandard2.0.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 08d77f26b7338499d86c296133db0c69 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/unity-examples/magic-unity-coexist/Assets/Plugins/clojure-clr/clojure.test.check.1.1.1/netstandard2.0/clojure.test.check.dll b/unity-examples/magic-unity-coexist/Assets/Plugins/clojure-clr/clojure.test.check.1.1.1/netstandard2.0/clojure.test.check.dll new file mode 100644 index 00000000..86e78443 Binary files /dev/null and b/unity-examples/magic-unity-coexist/Assets/Plugins/clojure-clr/clojure.test.check.1.1.1/netstandard2.0/clojure.test.check.dll differ diff --git a/unity-examples/magic-unity-coexist/Assets/Plugins/clojure-clr/clojure.test.check.1.1.1/netstandard2.0/clojure.test.check.dll.meta b/unity-examples/magic-unity-coexist/Assets/Plugins/clojure-clr/clojure.test.check.1.1.1/netstandard2.0/clojure.test.check.dll.meta new file mode 100644 index 00000000..b5a82a71 --- /dev/null +++ b/unity-examples/magic-unity-coexist/Assets/Plugins/clojure-clr/clojure.test.check.1.1.1/netstandard2.0/clojure.test.check.dll.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: e80a206ac8c5d488b8be92252cdcc25f +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 1 + settings: + DefaultValueInitialized: true + - first: + Windows Store Apps: WindowsStoreApps + second: + enabled: 0 + settings: + CPU: AnyCPU + userData: + assetBundleName: + assetBundleVariant: diff --git a/unity-examples/magic-unity-coexist/Assets/Plugins/clojure-clr/dynamiclanguageruntime.1.3.2.meta b/unity-examples/magic-unity-coexist/Assets/Plugins/clojure-clr/dynamiclanguageruntime.1.3.2.meta new file mode 100644 index 00000000..ce58add1 --- /dev/null +++ b/unity-examples/magic-unity-coexist/Assets/Plugins/clojure-clr/dynamiclanguageruntime.1.3.2.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: d2bc442bc58ce4c309e79051ed099fdd +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/unity-examples/magic-unity-coexist/Assets/Plugins/clojure-clr/dynamiclanguageruntime.1.3.2/net45.meta b/unity-examples/magic-unity-coexist/Assets/Plugins/clojure-clr/dynamiclanguageruntime.1.3.2/net45.meta new file mode 100644 index 00000000..a6685e2f --- /dev/null +++ b/unity-examples/magic-unity-coexist/Assets/Plugins/clojure-clr/dynamiclanguageruntime.1.3.2/net45.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: b5a0627562426452495dee4a96d06583 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/unity-examples/magic-unity-coexist/Assets/Plugins/clojure-clr/dynamiclanguageruntime.1.3.2/net45/Microsoft.Dynamic.dll b/unity-examples/magic-unity-coexist/Assets/Plugins/clojure-clr/dynamiclanguageruntime.1.3.2/net45/Microsoft.Dynamic.dll new file mode 100644 index 00000000..6004a976 Binary files /dev/null and b/unity-examples/magic-unity-coexist/Assets/Plugins/clojure-clr/dynamiclanguageruntime.1.3.2/net45/Microsoft.Dynamic.dll differ diff --git a/unity-examples/magic-unity-coexist/Assets/Plugins/clojure-clr/dynamiclanguageruntime.1.3.2/net45/Microsoft.Dynamic.dll.meta b/unity-examples/magic-unity-coexist/Assets/Plugins/clojure-clr/dynamiclanguageruntime.1.3.2/net45/Microsoft.Dynamic.dll.meta new file mode 100644 index 00000000..fd3ea75f --- /dev/null +++ b/unity-examples/magic-unity-coexist/Assets/Plugins/clojure-clr/dynamiclanguageruntime.1.3.2/net45/Microsoft.Dynamic.dll.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 43e537dc69a2a4f2ebcc58de121f23a9 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 1 + settings: + DefaultValueInitialized: true + - first: + Windows Store Apps: WindowsStoreApps + second: + enabled: 0 + settings: + CPU: AnyCPU + userData: + assetBundleName: + assetBundleVariant: diff --git a/unity-examples/magic-unity-coexist/Assets/Plugins/clojure-clr/dynamiclanguageruntime.1.3.2/net45/Microsoft.Dynamic.xml b/unity-examples/magic-unity-coexist/Assets/Plugins/clojure-clr/dynamiclanguageruntime.1.3.2/net45/Microsoft.Dynamic.xml new file mode 100644 index 00000000..34b011a2 --- /dev/null +++ b/unity-examples/magic-unity-coexist/Assets/Plugins/clojure-clr/dynamiclanguageruntime.1.3.2/net45/Microsoft.Dynamic.xml @@ -0,0 +1,6582 @@ + + + + Microsoft.Dynamic + + + + + Provides binding semantics for a language. This include conversions as well as support + for producing rules for actions. These optimized rules are used for calling methods, + performing operators, and getting members using the ActionBinder's conversion semantics. + + + + + Determines if the binder should allow access to non-public members. + + By default the binder does not allow access to non-public members. Base classes + can inherit and override this value to customize whether or not private binding + is available. + + + + + Converts an object at runtime into the specified type. + + + + + Determines if a conversion exists from fromType to toType at the specified narrowing level. + toNotNullable is true if the target variable doesn't allow null values. + + + + + Provides ordering for two parameter types if there is no conversion between the two parameter types. + + + + + Converts the provided expression to the given type. The expression is safe to evaluate multiple times. + + + + + Gets the members that are visible from the provided type of the specified name. + + The default implemetnation first searches the type, then the flattened heirachy of the type, and then + registered extension methods. + + + + + Called when a set is attempting to assign to a field or property from a derived class through the base class. + + The default behavior is to allow the assignment. + + + + + Creates an ErrorInfo object when a static property is accessed from an instance member. The default behavior is throw + an exception indicating that static members properties be accessed via an instance. Languages can override this to + customize the exception, message, or to produce an ErrorInfo object which reads or writes to the property being accessed. + + The static property being accessed through an instance + True if the user is assigning to the property, false if the user is reading from the property + The parameters being used to access the property. This includes the instance as the first entry, any index parameters, and the + value being assigned as the last entry if isAssignment is true. + + + + + Provides a way for the binder to provide a custom error message when lookup fails. Just + doing this for the time being until we get a more robust error return mechanism. + + Deprecated, use the non-generic version instead + + + + + Gets the extension members of the given name from the provided type. Base classes are also + searched for their extension members. Once any of the types in the inheritance hierarchy + provide an extension member the search is stopped. + + + + + Gets the extension members of the given name from the provided type. Subclasses of the + type and their extension members are not searched. + + + + + Provides an opportunity for languages to replace all MemberTracker's with their own type. + + Alternatlely a language can expose MemberTracker's directly. + + The member which is being returned to the user. + Tthe type which the memberTrack was accessed from + + + + + TODO: Alternatively, it should be sufficient to remember indices for this, list, dict and block. + + + + + Convention for an individual argument at a callsite. + + Multiple different callsites can match against a single declaration. + Some argument kinds can be "unrolled" into multiple arguments, such as list and dictionary. + + + + + Simple unnamed positional argument. + In Python: foo(1,2,3) are all simple arguments. + + + + + Argument with associated name at the callsite + In Python: foo(a=1) + + + + + Argument containing a list of arguments. + In Python: foo(*(1,2*2,3)) would match 'def foo(a,b,c)' with 3 declared arguments such that (a,b,c)=(1,4,3). + it could also match 'def foo(*l)' with 1 declared argument such that l=(1,4,3) + + + + + Argument containing a dictionary of named arguments. + In Python: foo(**{'a':1, 'b':2}) + + + + + Richly represents the signature of a callsite. + + + + + Array of additional meta information about the arguments, such as named arguments. + Null for a simple signature that's just an expression list. eg: foo(a*b,c,d) + + + + + Number of arguments in the signature. + + + + + All arguments are unnamed and matched by position. + + + + + True if the OldCallAction includes an ArgumentInfo of ArgumentKind.Dictionary or ArgumentKind.Named. + + + + + Gets the number of positional arguments the user provided at the call site. + + + + + Gets the index into _args array indicating the first post-splat argument or -1 of there are no splatted arguments. + For call site f(a,b,*c,d) and preSplatLimit == 1 and postSplatLimit == 2 + args would be (a,b,c[0],c[n-2],c[n-1],d) with splat index 3, where n = c.Count. + + + + + The number of arguments not counting the collapsed ones. + + + + + Gets the number of hidden arguments (used for error reporting). + + + + + Gets the total number of visible arguments passed to the call site including collapsed ones. + + + + + Binds named arguments to the parameters. Returns a permutation of indices that captures the relationship between + named arguments and their corresponding parameters. Checks for duplicate and unbound named arguments. + Ensures that for all i: namedArgs[i] binds to parameters[args.Length + bindingPermutation[i]] + + + + + ArgBuilder provides an argument value used by the MethodBinder. One ArgBuilder exists for each + physical parameter defined on a method. + + Contrast this with ParameterWrapper which represents the logical argument passed to the method. + + + + + Gets the priority. + + + + + The number of actual arguments consumed by this builder. + + + + + Provides the Expression which provides the value to be passed to the argument. + If null is returned the argument is skipped (not passed to the callee). + + + + + Returns the type required for the argument or null if the ArgBuilder + does not consume a type. + + + + + Provides an Expression which will update the provided value after a call to the method. May + return null if no update is required. + + + + + If the argument produces a return value (e.g. a ref or out value) this provides + the additional value to be returned. + + + + + An assignable value that is passed to a byref parameter + After the call it will contain the updated value + + + + + Indicates the specific type of failure, if any, from binding to a method. + + + + + The binding succeeded. Only one method was applicable or had the best conversion. + + + + + More than one method was applicable for the provided parameters and no method was considered the best. + + + + + There are no overloads that match the number of parameters required for the call + + + + + None of the target method(s) can successfully be called. The failure can be due to: + 1. Arguments could not be successfully converted for the call + 2. Keyword arguments could not be assigned to positional arguments + 3. Keyword arguments could be assigned but would result in an argument being assigned + multiple times (keyword and positional arguments conflit or dupliate keyword arguments). + + + + + Actual arguments cannot be constructed. + + + + + No method is callable. For example, all methods have an unbound generic parameter. + + + + + Encapsulates the result of an attempt to bind to one or methods using the OverloadResolver. + + Users should first check the Result property to see if the binding was successful or + to determine the specific type of failure that occured. If the binding was successful + MakeExpression can then be called to create an expression which calls the method. + If the binding was a failure callers can then create a custom error message based upon + the reason the call failed. + + + + + Creates a new BindingTarget when the method binding has succeeded. + + + + + Creates a new BindingTarget when the method binding has failed due to an incorrect argument count + + + + + Creates a new BindingTarget when the method binding has failued due to + one or more arguments which could not be converted or assigned to corresponding parameters. + + + + + Creates a new BindingTarget when the match was ambiguous + + + + + Other failure. + + + + + Gets the result of the attempt to bind. + + + + + Gets an Expression which calls the binding target if the method binding succeeded. + + Throws InvalidOperationException if the binding failed. + + + + + Returns the method if the binding succeeded, or null if no method was applicable. + + + + + Returns the selected overload if the binding succeeded, or null if no one was applicable. + + + + + Gets the name of the method as supplied to the OverloadResolver. + + + + + Returns the MethodTarget if the binding succeeded, or null if no method was applicable. + + + + + Returns the methods which don't have any matches or null if Result == BindingResult.AmbiguousMatch + + + + + Returns the methods and their associated conversion failures if Result == BindingResult.CallFailure. + + + + + Returns the acceptable number of arguments which can be passed to the method if Result == BindingResult.IncorrectArgumentCount. + + + + + Returns the total number of arguments provided to the call. 0 if the call succeeded or failed for a reason other + than argument count mismatch. + + + + + Gets the MetaObjects which we originally did binding against in their restricted form. + + The members of the array correspond to each of the arguments. All members of the array + have a value. + + + + + Returns the return type of the binding, or null if no method was applicable. + + + + + Gets the NarrowingLevel of the method if the call succeeded. + If the call failed returns NarrowingLevel.None. + + + + + Returns true if the binding was succesful, false if it failed. + This is an alias for BindingTarget.Result == BindingResult.Success. + + + + + Represents the reason why a call to a specific method could not be performed by the OverloadResolver. + + The reason for the failure is specified by the CallFailureReason property. Once this property + has been consulted the other properties can be consulted for more detailed information regarding + the failure. + + If reason is ConversionFailure the ConversionResults property will be non-null. + If reason is UnassignableKeyword the KeywordArguments property will be non-null and include + the keywords which could not be assigned. + If reason is DuplicateKeyword the KeywordArguments property will be non-null and include + the keywords which were duplicated (either by the keywords themselves or by positional + arguments); also the PositionalArguments will be non-null and include the positions of positional + arguments (if any, 0 otherwise) that were duplicated by the corresponding keyword arguments. + + MethodTarget is always set and indicates the method which failed to bind. + + + + + Gets the MethodTarget which the call failed for. + + + + + Gets the reason for the call failure which determines the other + properties of the CallFailure which should be consulted. + + + + + Gets a list of ConversionResult's for each parameter indicating + whether the conversion was successful or failed and the types + being converted. + This property has a meaningful value only when Reason == ConversionFailure + + + + + Gets the list of keyword arguments that were either duplicated or + unassignable. + This property has a meaningful value only when Reason == UnassignableKeyword or DuplicateKeyword + + + + + Gets 1-based positions of positional arguments that were duplicated + by the corresponding (by index) keyword arguments from KeywordArguments. + Value 0 of the position means that no positional argument is duplicated by the corresponding keyword argument. + The list may be shorter than KeywordArguments, in such case all missing elements are assumed 0. + This property has a meaningful value only when Reason == DuplicateKeyword + + + + + Default value, their was no CallFailure. + + + + + One of more parameters failed to be converted + + + + + One or more keyword arguments could not be successfully assigned to a positional argument + + + + + One or more keyword arguments were duplicated or would have taken the spot of a + provided positional argument. + + + + + Type arguments could not be inferred + + + + + Represents a collection of MethodCandidate's which all accept the + same number of logical parameters. For example a params method + and a method with 3 parameters would both be a CandidateSet for 3 parameters. + + + + + Represents information about a failure to convert an argument from one + type to another. + + + + + Value of the argument or null if it is not available. + + + + + Argument actual type or its limit type if the value not known. + DynamicNull if the argument value is null. + + + + + ArgBuilder which provides a default parameter value for a method call. + + + + + The number of actual arguments consumed by this builder. + + + + + ArgBuilder which provides a value for a keyword argument. + + The KeywordArgBuilder calculates its position at emit time using it's initial + offset within the keyword arguments, the number of keyword arguments, and the + total number of arguments provided by the user. It then delegates to an + underlying ArgBuilder which only receives the single correct argument. + + Delaying the calculation of the position to emit time allows the method binding to be + done without knowing the exact the number of arguments provided by the user. Hence, + the method binder can be dependent only on the set of method overloads and keyword names, + but not the user arguments. While the number of user arguments could be determined + upfront, the current MethodBinder does not have this design. + + + + + The underlying builder should expect a single parameter as KeywordArgBuilder is responsible + for calculating the correct parameter to use + + + + + + Updates fields/properties of the returned value with unused keyword parameters. + + + + + MethodCandidate represents the different possible ways of calling a method or a set of method overloads. + A single method can result in multiple MethodCandidates. Some reasons include: + - Every optional parameter or parameter with a default value will result in a candidate + - The presence of ref and out parameters will add a candidate for languages which want to return the updated values as return values. + - ArgumentKind.List and ArgumentKind.Dictionary can result in a new candidate per invocation since the list might be different every time. + + Each MethodCandidate represents the parameter type for the candidate using ParameterWrapper. + + + + + Builds a new MethodCandidate which takes count arguments and the provided list of keyword arguments. + + The basic idea here is to figure out which parameters map to params or a dictionary params and + fill in those spots w/ extra ParameterWrapper's. + + + + + Narrowing conversions are conversions that cannot be proved to always succeed, conversions that are + known to possibly lose information, and conversions across domains of types sufficiently different + to merit narrowing notation like casts. + + Its upto every language to define the levels for conversions. The narrowling levels can be used by + for method overload resolution, where the overload is based on the parameter types (and not the number + of parameters). + + + + + Conversions at this level do not do any narrowing. Typically, this will include + implicit numeric conversions, Type.IsAssignableFrom, StringBuilder to string, etc. + + + + + Language defined prefered narrowing conversion. First level that introduces narrowing + conversions. + + + + + Language defined preferred narrowing conversion. Second level that introduces narrowing + conversions and should have more conversions than One. + + + + + Language defined preferred narrowing conversion. Third level that introduces narrowing + conversions and should have more conversions that Two. + + + + + A somewhat meaningful conversion is possible, but it will quite likely be lossy. + For eg. BigInteger to an Int32, Boolean to Int32, one-char string to a char, + larger number type to a smaller numeric type (where there is no overflow), etc + + + + + Builds the argument for an out argument when not passed a StrongBox. The out parameter + is returned as an additional return value. + + + + + Defines a method overload abstraction for the purpose of overload resolution. + It provides the overload resolver the metadata it needs to perform the resolution. + + + WARNING: This is a temporary API that will undergo breaking changes in future versions. + + + + + Null for constructors. + + + + + The method arity can vary, i.e. the method has params array or params dict parameters. + + + + + Represents a method overload that is bound to a . + + + Not thread safe. + WARNING: This is a temporary API that will undergo breaking changes in future versions. + + + + + Provides binding and overload resolution to .NET methods. + + MethodBinder's can be used for: + generating new AST code for calling a method + calling a method via reflection at runtime + (not implemented) performing an abstract call + + MethodBinder's support default arguments, optional arguments, by-ref (in and out), and keyword arguments. + + Implementation Details: + + The MethodBinder works by building up a CandidateSet for each number of effective arguments that can be + passed to a set of overloads. For example a set of overloads such as: + foo(object a, object b, object c) + foo(int a, int b) + + would have 2 target sets - one for 3 parameters and one for 2 parameters. For parameter arrays + we fallback and create the appropriately sized CandidateSet on demand. + + Each CandidateSet consists of a set of MethodCandidate's. Each MethodCandidate knows the flattened + parameters that could be received. For example for a function such as: + foo(params int[] args) + + When this method is in a CandidateSet of size 3 the MethodCandidate takes 3 parameters - all of them + ints; if it's in a CandidateSet of size 4 it takes 4 parameters. Effectively a MethodCandidate is + a simplified view that allows all arguments to be treated as required positional arguments. + + Each MethodCandidate in turn refers to a MethodTarget. The MethodTarget is composed of a set + of ArgBuilder's and a ReturnBuilder which know how to consume the positional arguments and pass + them to the appropriate argument of the destination method. This includes routing keyword + arguments to the correct position, providing the default values for optional arguments, etc... + + After binding is finished the MethodCandidates are thrown away and a BindingTarget is returned. + The BindingTarget indicates whether the binding was successful and if not any additional information + that should be reported to the user about the failed binding. It also exposes the MethodTarget which + allows consumers to get the flattened list of required parameters for the call. MethodCandidates + are not exposed and are an internal implementation detail of the MethodBinder. + + + + + Resolves a method overload and returns back a BindingTarget. + + The BindingTarget can then be tested for the success or particular type of + failure that prevents the method from being called. If successfully bound the BindingTarget + contains a list of argument meta-objects with additional restrictions that ensure the selection + of the particular overload. + + + + + Checks to see if the language allows named arguments to be bound to instance fields or + properties and turned into setters. By default this is only allowed on contructors. + + + + + Gets an expression that evaluates to the result of GetByRefArray operation. + + + + + Allow to bind an array/dictionary instance or a null reference to params array/dictionary parameter. + + + + + Checks whether the given parameter may be mapped to by a keyword argument. + + + If overriden, the derived class may only add more constraints to the constraints from the base class. + + + base.AllowByKeywordArgument(method, parameter) + && AdditionalCheckIfByKeywordAllowed(method, parameter); + ]]> + + + + + + + Called before arguments binding. + + + A bitmask that indicates (set bits) the parameters that were mapped by this method. + A default mapping will be constructed for the remaining parameters (cleared bits). + + + + + Return null if arguments cannot be constructed and overload resolution should produce an error. + + + + + Determines whether given overloads are overloaded on index-th parameter (the types of the index-th parameters are the same). + + + + + Selects the best (of two) candidates for conversion from actualType + + + + + Provides ordering for two parameter types if there is no conversion between the two parameter types. + + + + + The method is called each time an item of lazily splatted argument is needed. + + + + + Gets the next argument to consume. + + + + + Maps out parameters to return args and ref parameters to ones that don't accept StrongBox. + + + + + ParameterWrapper represents the logical view of a parameter. For eg. the byref-reduced signature + of a method with byref parameters will be represented using a ParameterWrapper of the underlying + element type, since the logical view of the byref-reduced signature is that the argument will be + passed by value (and the updated value is included in the return value). + + Contrast this with ArgBuilder which represents the real physical argument passed to the method. + + + + + ParameterInfo is not available. + + + + + True if the wrapper represents a params-array parameter (false for parameters created by expansion of a params-array). + + + + + True if the wrapper represents a params-dict parameter (false for parameters created by expansion of a params-dict). + + + + + Creates a parameter that represents an expanded item of params-array. + + + + + Builds the parameter for a params dictionary argument - this collects all the extra name/value + pairs provided to the function into a SymbolDictionary which is passed to the function. + + + + + An argument that the user wants to explicitly pass by-reference (with copy-in copy-out semantics). + The user passes a StrongBox[T] object whose value will get updated when the call returns. + + + + + True if there are restrictions beyond just simple type restrictions + + + + + Creates a ReturnBuilder + + the type the ReturnBuilder will leave on the stack + + + + Builds a parameter for a reference argument when a StrongBox has not been provided. The + updated return value is returned as one of the resulting return values. + + + + + SimpleArgBuilder produces the value produced by the user as the argument value. It + also tracks information about the original parameter and is used to create extended + methods for params arrays and param dictionary functions. + + + + + Parameter info is not available for this argument. + + + + + Type and whether the parameter is a params-array or params-dictionary is derived from info. + + + + + Gets the index of actual argument expression. + + + + + Gets the generic arguments for method based upon the constraints discovered during + type inference. Returns null if not all generic arguments had their types inferred. + + + + + Creates a new set of arg builders for the given generic method definition which target the new + parameters. + + + + + Creates a new list of ParameterWrappers for the generic method replacing the old parameters with the new ones. + + + + + Gets the generic type arguments sorted so that the type arguments + that are depended upon by other type arguments are sorted before + their dependencies. + + + + + Checks to see if the x type parameter is dependent upon the y type parameter. + + + + + Builds a mapping based upon generic parameter constraints between related generic + parameters. This is then used to sort the generic parameters so that we can process + the least dependent parameters first. For example given the method: + + void Foo{T0, T1}(T0 x, T1 y) where T0 : T1 + + We need to first infer the type information for T1 before we infer the type information + for T0 so that we can ensure the constraints are correct. + + + + + Returns a mapping from generic type parameter to the input DMOs which map to it. + + + + + Adds any additional ArgumentInputs entries for the given object and parameter type. + + + + + Walks the nested generic hierarchy to construct all of the generic parameters referred + to by this type. For example if getting the generic parameters for the x parameter on + the method: + + void Foo{T0, T1}(Dictionary{T0, T1} x); + + We would add both typeof(T0) and typeof(T1) to the list of generic arguments. + + + + + Maps a single type parameter to the possible parameters and DynamicMetaObjects + we can get inference from. For example for the signature: + + void Foo{T0, T1}(T0 x, T1 y, IList{T1} z); + + We would have one ArgumentInput for T0 which holds onto the DMO providing the argument + value for x. We would also have one ArgumentInput for T1 which holds onto the 2 DMOs + for y and z. Associated with y would be a GenericParameterInferer and associated with + z would be a ConstructedParameterInferer. + + + + + Provides generic type inference for a single parameter. + + + For example: + M{T}(T x) + M{T}(IList{T} x) + M{T}(ref T x) + M{T}(T[] x) + M{T}(ref Dictionary{T,T}[] x) + + + + + Provides generic type inference for a single parameter. + + + For example: + M{T}(T x) + M{T}(IList{T} x) + M{T}(ref T x) + M{T}(T[] x) + M{T}(ref Dictionary{T,T}[] x) + + + + + Checks if the constraints are violated by the given input for the specified generic method parameter. + + This method must be supplied with a mapping for any dependent generic method type parameters which + this one can be constrained to. For example for the signature "void Foo{T0, T1}(T0 x, T1 y) where T0 : T1". + we cannot know if the constraints are violated unless we know what we have calculated T1 to be. + + + + + Finds all occurences of genericParameter in openType and the corresponding concrete types in closedType. + Returns true iff all occurences of the generic parameter in the open type correspond to the same concrete type in the closed type + and this type satisfies given constraints. Returns the concrete type in match if so. + + + + + Implemented by DynamicMetaObject subclasses when the associated object + can participate in generic method type inference. This interface + is used when the inference engine is attempting to perform type inference + for a parameter which is typed to a delegate type. + + + + + Returns the type inferred for parameterType when performing + inference for a conversion to delegateType. + + + + + Provides information about the result of a custom object which dynamically infers back types. + Currently only used for invokable objects to feedback the types for a delegate type. + + + + + A tree rewriter which will find dynamic sites which consume dynamic sites and + turn them into a single combo dynamic site. The combo dynamic site will then run the + individual meta binders and produce the resulting code in a single dynamic site. + + + + + A reducible node which we use to generate the combo dynamic sites. Each time we encounter + a dynamic site we replace it with a ComboDynamicSiteExpression. When a child of a dynamic site + turns out to be a ComboDynamicSiteExpression we will then merge the child with the parent updating + the binding mapping info. If any of the inputs cause side effects then we'll stop the combination. + + + + + A binder which can combine multiple binders into a single dynamic site. The creator + of this needs to perform the mapping of parameters, constants, and sub-site expressions + and provide a List of BinderMappingInfo representing this data. From there the ComboBinder + just processes the list to create the resulting code. + + + + + Provides a mapping for inputs of combo action expressions. The input can map + to either an input of the new dynamic site, an input of a previous DynamicExpression, + or a ConstantExpression which has been pulled out of the dynamic site arguments. + + + + + Contains the mapping information for a single Combo Binder. This includes the original + meta-binder and the mapping of parameters, sub-sites, and constants into the binding. + + + + + Builds up a series of conditionals when the False clause isn't yet known. We can + keep appending conditions and if true's. Each subsequent true branch becomes the + false branch of the previous condition and body. Finally a non-conditional terminating + branch must be added. + + + + + Adds a new conditional and body. The first call this becomes the top-level + conditional, subsequent calls will have it added as false statement of the + previous conditional. + + + + + Adds the non-conditional terminating node. + + + + + Adds the non-conditional terminating node. + + + + + Gets the resulting meta object for the full body. FinishCondition + must have been called. + + + + + Adds a variable which will be scoped at the level of the final expression. + + + + + Determines the result of a conversion action. The result can either result in an exception, a value that + has been successfully converted or default(T), or a true/false result indicating if the value can be converted. + + + + + Attempts to perform available implicit conversions and throws if there are no available conversions. + + + + + Attempst to perform available implicit and explicit conversions and throws if there are no available conversions. + + + + + Attempts to perform available implicit conversions and returns default(ReturnType) if no conversions can be performed. + + If the return type of the rule is a value type then the return value will be zero-initialized. If the return type + of the rule is object or another class then the return type will be null (even if the conversion is to a value type). + This enables ImplicitTry to be used to do TryConvertTo even if the type is value type (and the difference between + null and a real value can be distinguished). + + + + + Attempts to perform available implicit and explicit conversions and returns default(ReturnType) if no conversions + can be performed. + + If the return type of the rule is a value type then the return value will be zero-initialized. If the return type + of the rule is object or another class then the return type will be null (even if the conversion is to a value type). + This enables ExplicitTry to be used to do TryConvertTo even if the type is value type (and the difference between + null and a real value can be distinguished). + + + + + A custom member tracker which enables languages to plug in arbitrary + members into the lookup process. + + + + + Provides binding semantics for a language. This include conversions as well as support + for producing rules for actions. These optimized rules are used for calling methods, + performing operators, and getting members using the ActionBinder's conversion semantics. + + + + + Checks if the conversion is to object and produces a target if it is. + + + + + Checks if any conversions are available and if so builds the target for that conversion. + + + + + Checks if the conversion can be handled by a simple cast. + + + + + Checks if the conversion can be handled by calling a user-defined conversion method. + + + + + Helper that checkes both types to see if either one defines the specified conversion + method. + + + + + Checks if any of the members of the MemberGroup provide the applicable conversion and + if so uses it to build a conversion rule. + + + + + Checks if the conversion is to applicable by extracting the value from Extensible of T. + + + + + Checks if there's an implicit numeric conversion for primitive data types. + + + + + Checks if there's a conversion to/from Nullable of T. + + + + + Checks to see if there's a conversion of null to a reference type + + + + + Helper to produce an error when a conversion cannot occur + + + + + Helper to produce a rule which just boxes a value type + + + + + Helper to produce a conversion rule by calling the helper method to do the convert + + + + + Helper to produce a conversion rule by calling the helper method to do the convert + + + + + Helper to produce a conversion rule by calling the method to do the convert. This version takes the parameter + to be passed to the conversion function and we call it w/ our own value or w/ our Extensible.Value. + + + + + Helper to wrap explicit conversion call into try/catch incase it throws an exception. If + it throws the default value is returned. + + + + + Helper to produce a rule when no conversion is required (the strong type of the expression + input matches the type we're converting to or has an implicit conversion at the IL level) + + + + + Helper to produce a rule when no conversion is required from an extensible type's + underlying storage to the type we're converting to. The type of extensible type + matches the type we're converting to or has an implicit conversion at the IL level. + + + + + Helper to extract the value from an Extensible of T + + + + + Helper to convert a null value to nullable of T + + + + + Helper to produce the rule for converting T to Nullable of T + + + + + Helper to produce the rule for converting T to Nullable of T + + + + + Returns a value which indicates failure when a OldConvertToAction of ImplicitTry or ExplicitTry. + + + + + Helper to extract the Value of an Extensible of T from the + expression being converted. + + + + + Helper that checks if fromType is an Extensible of T or a subtype of + Extensible of T and if so returns the T. Otherwise it returns fromType. + + This is used to treat extensible types the same as their underlying types. + + + + + Creates a target which returns null for a reference type. + + + + + Provides a way for the binder to provide a custom error message when lookup fails. Just + doing this for the time being until we get a more robust error return mechanism. + + + + + Called when the user is accessing a protected or private member on a get. + + The default implementation allows access to the fields or properties using reflection. + + + + + Provides a way for the binder to provide a custom error message when lookup fails. Just + doing this for the time being until we get a more robust error return mechanism. + + + + if a member-injector is defined-on or registered-for this type call it + + + + Helper class for flowing information about the GetMember request. + + + + + Builds a MetaObject for performing a member get. Supports all built-in .NET members, the OperatorMethod + GetBoundMember, and StrongBox instances. + + + The name of the member to retrieve. This name is not processed by the DefaultBinder and + is instead handed off to the GetMember API which can do name mangling, case insensitive lookups, etc... + + + The MetaObject from which the member is retrieved. + + + Returns a DynamicMetaObject which represents the value that will be returned when the member is accessed. + + The returned DynamicMetaObject may be strongly typed to a value type which needs boxing before being + returned from a standard DLR GetMemberBinder. The language is responsible for performing any boxing + so that it has an opportunity to perform custom boxing. + + + + + Builds a MetaObject for performing a member get. Supports all built-in .NET members, the OperatorMethod + GetBoundMember, and StrongBox instances. + + + The name of the member to retrieve. This name is not processed by the DefaultBinder and + is instead handed off to the GetMember API which can do name mangling, case insensitive lookups, etc... + + + The MetaObject from which the member is retrieved. + + + Provides overload resolution and method binding for any calls which need to be performed for the GetMember. + + + Returns a DynamicMetaObject which represents the value that will be returned when the member is accessed. + + The returned DynamicMetaObject may be strongly typed to a value type which needs boxing before being + returned from a standard DLR GetMemberBinder. The language is responsible for performing any boxing + so that it has an opportunity to perform custom boxing. + + + + + Builds a MetaObject for performing a member get. Supports all built-in .NET members, the OperatorMethod + GetBoundMember, and StrongBox instances. + + + The name of the member to retrieve. This name is not processed by the DefaultBinder and + is instead handed off to the GetMember API which can do name mangling, case insensitive lookups, etc... + + + The MetaObject from which the member is retrieved. + + + An OverloadResolverFactory which can be used for performing overload resolution and method binding. + + + True if the operation should return Operation.Failed on failure, false if it + should return the exception produced by MakeMissingMemberError. + + + The meta object to be used if the get results in an error. + + + Returns a DynamicMetaObject which represents the value that will be returned when the member is accessed. + + The returned DynamicMetaObject may be strongly typed to a value type which needs boxing before being + returned from a standard DLR GetMemberBinder. The language is responsible for performing any boxing + so that it has an opportunity to perform custom boxing. + + + + + Builds a MetaObject for performing a member get. Supports all built-in .NET members, the OperatorMethod + GetBoundMember, and StrongBox instances. + + + The name of the member to retrieve. This name is not processed by the DefaultBinder and + is instead handed off to the GetMember API which can do name mangling, case insensitive lookups, etc... + + + The MetaObject from which the member is retrieved. + + + True if the operation should return Operation.Failed on failure, false if it + should return the exception produced by MakeMissingMemberError. + + + The meta object to be used if the get results in an error. + + + Returns a DynamicMetaObject which represents the value that will be returned when the member is accessed. + + The returned DynamicMetaObject may be strongly typed to a value type which needs boxing before being + returned from a standard DLR GetMemberBinder. The language is responsible for performing any boxing + so that it has an opportunity to perform custom boxing. + + + + if a member-injector is defined-on or registered-for this type call it + + + + Helper class for flowing information about the GetMember request. + + + + + Provides default binding for performing a call on the specified meta objects. + + The signature describing the call + The meta object to be called. + + Additional meta objects are the parameters for the call as specified by the CallSignature in the CallAction. + + A MetaObject representing the call or the error. + + + + Provides default binding for performing a call on the specified meta objects. + + The signature describing the call + The meta object to be called. + + Additional meta objects are the parameters for the call as specified by the CallSignature in the CallAction. + + Overload resolver factory. + A MetaObject representing the call or the error. + + + + Provides default binding for performing a call on the specified meta objects. + + The signature describing the call + The meta object to be called. + + Additional meta objects are the parameters for the call as specified by the CallSignature in the CallAction. + + Overload resolver factory. + The result should the object be uncallable. + A MetaObject representing the call or the error. + + + + Gets a TargetInfo object for performing a call on this object. + + If this object is a delegate we bind to the Invoke method. + If this object is a MemberGroup or MethodGroup we bind to the methods in the member group. + If this object is a BoundMemberTracker we bind to the methods with the bound instance. + If the underlying type has defined an operator Call method we'll bind to that method. + + + + + Binds to the methods in a method group. + + + + + Binds to the methods in a member group. + + TODO: We should really only have either MemberGroup or MethodGroup, not both. + + + + + Binds to the BoundMemberTracker and uses the instance in the tracker and restricts + based upon the object instance type. + + + + + Binds to the Invoke method on a delegate if this is a delegate type. + + + + + Attempts to bind to an operator Call method. + + + + + Encapsulates information about the target of the call. This includes an implicit instance for the call, + the methods that we'll be calling as well as any restrictions required to perform the call. + + + + + Performs binding against a set of overloaded methods using the specified arguments. The arguments are + consumed as specified by the CallSignature object. + + Overload resolver. + The methods to be called + A meta object which results from the call. + + + + Performs binding against a set of overloaded methods using the specified arguments. The arguments are + consumed as specified by the CallSignature object. + + Overload resolver. + The methods to be called + The name of the method or null to use the name from targets. + A meta object which results from the call. + + + + Performs binding against a set of overloaded methods using the specified arguments. The arguments are + consumed as specified by the CallSignature object. + + Overload resolver. + The methods to be called + Additional restrictions which should be applied to the resulting MetaObject. + A meta object which results from the call. + + + + Performs binding against a set of overloaded methods using the specified arguments. The arguments are + consumed as specified by the CallSignature object. + + Overload resolver. + The methods to be called + Additional restrictions which should be applied to the resulting MetaObject. + The name of the method or null to use the name from targets. + A meta object which results from the call. + + + + Performs binding against a set of overloaded methods using the specified arguments. The arguments are + consumed as specified by the CallSignature object. + + TODO. + TODO. + Overload resolver. + The methods to be called + Additional restrictions which should be applied to the resulting MetaObject. + The resulting binding target which can be used for producing error information. + The name of the method or null to use the name from targets. + A meta object which results from the call. + + + + Makes test for param arrays and param dictionary parameters. + + + + + Pulls out the right argument to build the splat test. MakeParamsTest makes the actual test. + + + + + Builds the restrictions for calling with a splatted argument array. Ensures that the + argument is still an ICollection of object and that it has the same number of arguments. + + + + + Builds the restrictions for calling with keyword arguments. The restrictions include + tests on the individual keys of the dictionary to ensure they have the same names. + + + + + Creates the MetaObject for indexing directly into arrays or indexing into objects which have + default members. Returns null if we're not an indexing operation. + + + + + Creates the MetaObject for indexing directly into arrays or indexing into objects which have + default members. Returns null if we're not an indexing operation. + + + + + Creates the meta object for the rest of the operations: comparisons and all other + ExpressionType. If the operation cannot be completed a MetaObject which indicates an + error will be returned. + + + + + Creates the meta object for the rest of the operations: comparisons and all other + ExpressionType. If the operation cannot be completed a MetaObject which indicates an + error will be returned. + + + + + Produces a rule for comparing a value to null - supports comparing object references and nullable types. + + + + + Builds a MetaObject for performing a member get. Supports all built-in .NET members, the OperatorMethod + GetBoundMember, and StrongBox instances. + + + The name of the member to retrieve. This name is not processed by the DefaultBinder and + is instead handed off to the GetMember API which can do name mangling, case insensitive lookups, etc... + + + The MetaObject from which the member is retrieved. + + + The value being assigned to the target member. + + + + + Builds a MetaObject for performing a member get. Supports all built-in .NET members, the OperatorMethod + GetBoundMember, and StrongBox instances. + + + The name of the member to retrieve. This name is not processed by the DefaultBinder and + is instead handed off to the GetMember API which can do name mangling, case insensitive lookups, etc... + + + The MetaObject from which the member is retrieved. + + + The value being assigned to the target member. + + + Provides overload resolution and method binding for any calls which need to be performed for the SetMember. + + + + + Builds a MetaObject for performing a member get. Supports all built-in .NET members, the OperatorMethod + GetBoundMember, and StrongBox instances. + + + The name of the member to retrieve. This name is not processed by the DefaultBinder and + is instead handed off to the GetMember API which can do name mangling, case insensitive lookups, etc... + + + The MetaObject from which the member is retrieved. + + + The value being assigned to the target member. + + + Provides a DynamicMetaObject that is to be used as the result if the member cannot be set. If null then then a language + specific error code is provided by ActionBinder.MakeMissingMemberErrorForAssign which can be overridden by the language. + + + + + Builds a MetaObject for performing a member get. Supports all built-in .NET members, the OperatorMethod + GetBoundMember, and StrongBox instances. + + + The name of the member to retrieve. This name is not processed by the DefaultBinder and + is instead handed off to the GetMember API which can do name mangling, case insensitive lookups, etc... + + + The MetaObject from which the member is retrieved. + + + The value being assigned to the target member. + + + Provides overload resolution and method binding for any calls which need to be performed for the SetMember. + + + Provides a DynamicMetaObject that is to be used as the result if the member cannot be set. If null then then a language + specific error code is provided by ActionBinder.MakeMissingMemberErrorForAssign which can be overridden by the language. + + + + if a member-injector is defined-on or registered-for this type call it + + + + Returns true if the method should not be displayed in the stack frame. + + + + + Encapsulates information about the result that should be produced when + a OldDynamicAction cannot be performed. The ErrorInfo can hold one of: + an expression which creates an Exception to be thrown + an expression which produces a value which should be returned + directly to the user and represents an error has occured (for + example undefined in JavaScript) + an expression which produces a value which should be returned + directly to the user but does not actually represent an error. + + ErrorInfo's are produced by an ActionBinder in response to a failed + binding. + + + + + Private constructor - consumers must use static From* factories + to create ErrorInfo objects. + + + + + Creates a new ErrorInfo which represents an exception that should + be thrown. + + + + + Creates a new ErrorInfo which represents a value which should be + returned to the user. + + + + + Crates a new ErrorInfo which represents a value which should be returned + to the user but does not represent an error. + + + + + + + The ErrorInfo expression produces an exception + + + + + The ErrorInfo expression produces a value which represents the error (e.g. undefined) + + + + + The ErrorInfo expression produces a value which is not an error + + + + + A MetaObject which was produced as the result of a failed binding. + + + + + Doesn't need to check PrivateBinding setting: no method that is part of the event is public the entire event is private. + If the code has already a reference to the event tracker instance for a private event its "static-ness" is not influenced + by private-binding setting. + + + + + Gets the stub list for a COM Object. For COM objects we store the stub list + directly on the object using the Marshal APIs. This allows us to not have + any circular references to deal with via weak references which are challenging + in the face of COM. + + + + + Holds on a list of delegates hooked to the event. + We need the list because we cannot enumerate the delegates hooked to CLR event and we need to do so in + handler removal (we need to do custom delegate comparison there). If BCL enables the enumeration we could remove this. + + + + + Storage for the handlers - a key value pair of the callable object and the delegate handler. + + + + + Storage for the handlers - a key value pair of the callable object and the delegate handler. + + The delegate handler is closed over the callable object. Therefore as long as the object is alive the + delegate will stay alive and so will the callable object. That means it's fine to have a weak reference + to both of these objects. + + + + + Represents extension method. + + + + + Gets the declaring type of the extension method. Since this is an extension method, + the declaring type is in fact the type this extension method extends, + not Method.DeclaringType + + + + + Implemented by binders which support light exceptions. Dynamic objects + binding against a binder which implements this interface can check + SupportsLightThrow to see if the binder currently supports safely + returning a light exception. Light exceptions can be created with + LightException.Throw. + + Binders also need to implement GetlightBinder. This method + returns a new call site binder which may return light exceptions if + the binder supports them. + + + + + Returns true if a callsite binding against this binder can + return light exceptions. + + + + + Gets a binder which will support light exception if one is + available. + + + + + Interceptor prototype. The interceptor is a call site binder that wraps + a real call site binder and can perform arbitrary operations on the expression + trees that the wrapped binder produces: + * Dumping the trees + * Additional rewriting + * Static compilation + * ... + + + + + MemberGroups are a collection of MemberTrackers which are commonly produced + on-demand to talk about the available members. They can consist of a mix of + different member types or multiple membes of the same type. + + The most common source of MemberGroups is from ActionBinder.GetMember. From here + the DLR will perform binding to the MemberTrackers frequently producing the value + resulted from the user. If the result of the action produces a member it's self + the ActionBinder can provide the value exposed to the user via ReturnMemberTracker. + + ActionBinder provides default functionality for both getting members from a type + as well as exposing the members to the user. Getting members from the type maps + closely to reflection and exposing them to the user exposes the MemberTrackers + directly. + + + + + Specifies the action for which the default binder is requesting a member. + + + + + Represents a logical member of a type. The member could either be real concrete member on a type or + an extension member. + + This seperates the "physical" members that .NET knows exist on types from the members that + logically exist on a type. It also provides other abstractions above the level of .NET reflection + such as MemberGroups and NamespaceTracker's. + + It also provides a wrapper around the reflection APIs which cannot be extended from partial trust. + + + + + We ensure we only produce one MemberTracker for each member which logically lives on the declaring type. So + for example if you get a member from a derived class which is declared on the base class it should be the same + as getting the member from the base class. That’s easy enough until you get into extension members – here there + might be one extension member which is being applied to multiple types. Therefore we need to take into account the + extension type when ensuring that we only have 1 MemberTracker ever created. + + + + + The type of member tracker. + + + + + The logical declaring type of the member. + + + + + The name of the member. + + + + + Gets the expression that creates the value. + + Returns null if it's an error to get the value. The caller can then call GetErrorForGet to get + the correct error Expression (or null if they should provide a default). + + + + + Gets an expression that assigns a value to the left hand side. + + Returns null if it's an error to assign to. The caller can then call GetErrorForSet to + get the correct error Expression (or null if a default error should be provided). + + + + + Gets an expression that assigns a value to the left hand side. + + Returns null if it's an error to assign to. The caller can then call GetErrorForSet to + get the correct error Expression (or null if a default error should be provided). + + + + + Gets an expression that performs a call on the object using the specified arguments. + + Returns null if it's an error to perform the specific operation. The caller can then call + GetErrorsForDoCall to get the correct error Expression (or null if a default error should be provided). + + + + + Returns the error associated with getting the value. + + A null return value indicates that the default error message should be provided by the caller. + + + + + Returns the error associated with accessing this member via a bound instance. + + A null return value indicates that the default error message should be provided by the caller. + + + + + Helper for getting values that have been bound. Called from BoundMemberTracker. Custom member + trackers can override this to provide their own behaviors when bound to an instance. + + + + + Helper for setting values that have been bound. Called from BoundMemberTracker. Custom member + trackers can override this to provide their own behaviors when bound to an instance. + + + + + Helper for setting values that have been bound. Called from BoundMemberTracker. Custom member + trackers can override this to provide their own behaviors when bound to an instance. + + + + + Binds the member tracker to the specified instance rturning a new member tracker if binding + is possible. If binding is not possible the existing member tracker will be returned. For example + binding to a static field results in returning the original MemberTracker. Binding to an instance + field results in a new BoundMemberTracker which will get GetBoundValue/SetBoundValue to pass the + instance through. + + + + + MethodGroup's represent a unique collection of method's. Typically this + unique set is all the methods which are overloaded by the same name including + methods with different arity. These methods represent a single logically + overloaded element of a .NET type. + + The base DLR binders will produce MethodGroup's when provided with a MemberGroup + which contains only methods. The MethodGroup's will be unique instances per + each unique group of methods. + + + + + Returns a BuiltinFunction bound to the provided type arguments. Returns null if the binding + cannot be performed. + + + + + NamespaceTracker represent a CLS namespace. + + + + + Loads all the types from all assemblies that contribute to the current namespace (but not child namespaces) + + + + + Populates the tree with nodes for each part of the namespace + + + Full namespace name. It can be null (for top-level types) + + + + + As a fallback, so if the type does exist in any assembly. This would happen if a new type was added + that was not in the hardcoded list of types. + This code is not accurate because: + 1. We dont deal with generic types (TypeCollision). + 2. Previous calls to GetCustomMemberNames (eg. "from foo import *" in Python) would not have included this type. + 3. This does not deal with new namespaces added to the assembly + + + + + This stores all the public non-nested type names in a single namespace and from a single assembly. + This allows inspection of the namespace without eagerly loading all the types. Eagerly loading + types slows down startup, increases working set, and is semantically incorrect as it can trigger + TypeLoadExceptions sooner than required. + + + + + Marks a method as not having side effects. used by the combo binder + to allow calls to methods. + + + + + OperatorInfo provides a mapping from DLR ExpressionType to their associated .NET methods. + + + + + Given an operator returns the OperatorInfo associated with the operator or null + + + + + Gets the operator the OperatorInfo provides info for. + + + + + Gets the primary method name associated with the method. + This method name is usally in the form of op_Operator (e.g. op_Addition). + + + + + Gets the secondary method name associated with the method. + This method name is usually a standard .NET method name with pascal casing (e.g. Add). + + + + + Represents a logical Property as a member of a Type. This Property can either be a real + concrete Property on a type (implemented with a ReflectedPropertyTracker) or an extension + property (implemented with an ExtensionPropertyTracker). + + + + + Represents the top reflected package which contains extra information such as + all the assemblies loaded and the built-in modules. + + + + + returns the package associated with the specified namespace and + updates the associated module to mark the package as imported. + + + + + Ensures that the assembly is loaded + + + true if the assembly was loaded for the first time. + false if the assembly had already been loaded before + + + + When an (interop) assembly is loaded, we scan it to discover the GUIDs of COM interfaces so that we can + associate the type definition with COM objects with that GUID. + Since scanning all loaded assemblies can be expensive, in the future, we might consider a more explicit + user binder to trigger scanning of COM types. + + + + Specifies that the member is a constructor, representing a ConstructorTracker + + + Specifies that the member is an event, representing a EventTracker + + + Specifies that the member is a field, representing a FieldTracker + + + Specifies that the member is a method, representing a MethodTracker + + + Specifies that the member is a property, representing a PropertyTracker + + + Specifies that the member is a property, representing a TypeTracker + + + Specifies that the member is a namespace, representing a NamespaceTracker + + + Specifies that the member is a group of method overloads, representing a MethodGroup + + + Specifies that the member is a group of types that very by arity, representing a TypeGroup + + + Specifies that the member is a custom meber, represetning a CustomTracker + + + Specifies that the member is a bound to an instance, representing a BoundMemberTracker + + + + A TypeCollision is used when we have a collision between + two types with the same name. Currently this is only possible w/ generic + methods that should logically have arity as a portion of their name. For eg: + System.EventHandler and System.EventHandler[T] + System.Nullable and System.Nullable[T] + System.IComparable and System.IComparable[T] + + The TypeCollision provides an indexer but also is a real type. When used + as a real type it is the non-generic form of the type. + + The indexer allows the user to disambiguate between the generic and + non-generic versions. Therefore users must always provide additional + information to get the generic version. + + + + The merged list so far. Could be null + The new type(s) to add to the merged list + The merged list. Could be a TypeTracker or TypeGroup + + + Gets the arity of generic parameters + + + No non-generic type is represented by this group. + + + + This returns the DeclaringType of all the types in the TypeGroup + + + + + This returns the base name of the TypeGroup (the name shared by all types minus arity) + + + + + This will return the result only for the non-generic type if one exists, and will throw + an exception if all types in the TypeGroup are generic + + + + + This will return the result only for the non-generic type if one exists, and will throw + an exception if all types in the TypeGroup are generic + + + + + Enables implicit Type to TypeTracker conversions accross dynamic languages. + + + + + Factory methods. + + + + + Null coalescing expression + {result} ::= ((tmp = {_left}) == null) ? {right} : tmp + '??' operator in C#. + + + + + True coalescing expression. + {result} ::= IsTrue(tmp = {left}) ? {right} : tmp + Generalized AND semantics. + + + + + False coalescing expression. + {result} ::= IsTrue(tmp = {left}) ? tmp : {right} + Generalized OR semantics. + + + + + True coalescing expression. + {result} ::= IsTrue(tmp = {left}) ? {right} : tmp + Generalized AND semantics. + + + + + False coalescing expression. + {result} ::= IsTrue(tmp = {left}) ? tmp : {right} + Generalized OR semantics. + + + + + Wraps the given value in a WeakReference and returns a tree that will retrieve + the value from the WeakReference. + + + + + Creates a generator with type IEnumerable{T}, where T is the label.Type + + + + + + + + Creates new instance of the LambdaBuilder with the specified name and return type. + + Return type of the lambda being built. + Name for the lambda being built. + new LambdaBuilder instance + + + + The helper to create the AST method call node. Will add conversions (Utils.Convert) + to parameters and instance if necessary. + + + + + The helper to create the AST method call node. Will add conversions (Utils.Convert) + to parameters and instance if necessary. + + + + + The complex call helper to create the AST method call node. + Will add conversions (Expression.Convert()), deals with default parameter values and params arrays. + + + + + Converts an expression to a void type. + + An to convert to void. + An that has the property equal to and the and property set to void. + + + + Returns an expression that boxes a given value. Uses boxed objects cache for Int32 and Boolean types. + + + + + Determines whether specified expression type represents an assignment. + + + True if the expression type represents an assignment. + + + Note that some other nodes can also assign to variables, members or array items: + MemberInit, NewArrayInit, Call with ref params, New with ref params, Dynamic with ref params. + + + + + Determines if the left child of the given expression is read or written to or both. + + + + + Returns null if no expression was added into the builder. + If only a single expression was added returns it. + Otherwise returns a containing the expressions added to the builder. + + + + + If the number of items added to the builder is greater than 4 returns a read-only collection builder containing all the items. + Returns null otherwise. + + + + + Wrapping a tree in this node enables jumps from finally blocks + It does this by generating control-flow logic in the tree + + Reducing this node requires a full tree walk of its body + (but not nested lambdas) + + WARNING: this node cannot contain jumps across blocks, because it + assumes any unknown jumps are jumps to an outer scope. + + + + + The purpose of this rewriter is simple: ETs do not allow jumps (break, continue, return, goto) + that would go through a finally/fault. So we replace them with code that instead stores a flag, + and then jumps to the end of the finally/fault. At the end of the try-finally, we emit a switch + that then jumps to the correct label. + + A few things that make this more complicated: + + 1. If a finally contains a jump out, then jumps in the try/catch need to be replaced as well. + It's to support cases like this: + # returns 234 + def foo(): + try: return 123 + finally: return 234 + + We need to replace the "return 123" because after it jumps, we'll go to the finally, which + might decide to jump again, but once the IL finally exits, it ignores the finally jump and + keeps going with the original jump. The moral of the story is: if any jumps in finally are + rewritten, try/catch jumps must be also. + + 2. To generate better code, we only have one state variable, so if we have to jump out of + multiple finallys we just keep jumping. It looks sort of like this: + foo: + try { ... } finally { + try { ... } finally { + ... + if (...) { + // was: goto foo; + $flow = 1; goto endInnerFinally; + } + ... + endInnerFinally: + } + switch ($flow) { + case 1: goto endOuterFinally; + } + ... + endOuterFinally: + } + switch ($flow) { + case 1: $flow = 0; goto foo; + } + ... + + + + + + A parameterless generator, that is of type IEnumerable, IEnumerable{T}, + IEnumerator, or IEnumerator{T}. Its body can contain a series of + YieldExpressions. Each call into MoveNext on the enumerator reenters + the generator, and executes until it reaches a YieldReturn or YieldBreak + expression + + + + + The label used by YieldBreak and YieldReturn expressions to yield + from this generator + + + + + The body of the generator, which can contain YieldBreak and + YieldReturn expressions + + + + + Indicates whether the lhs instances are preserved when assignments + are made to expressions containing yields. + + + + + When finding a yield return or yield break, this rewriter flattens out + containing blocks, scopes, and expressions with stack state. All + scopes encountered have their variables promoted to the generator's + closure, so they survive yields. + + + + + Makes an assignment to this variable. Pushes the assignment as far + into the right side as possible, to allow jumps into it. + + + + + Returns true if the expression remains constant no matter when it is evaluated. + + + + + Implemented by expressions which can provide a version which is aware of light exceptions. + + Normally these expressions will simply reduce to a version which throws a real exception. + When the expression is used inside of a region of code which supports light exceptions + the light exception re-writer will call ReduceForLightExceptions. The expression can + then return a new expression which can return a light exception rather than throwing + a real .NET exception. + + + + + The builder for creating the LambdaExpression node. + + Since the nodes require that parameters and variables are created + before hand and then passed to the factories creating LambdaExpression + this builder keeps track of the different pieces and at the end creates + the LambdaExpression. + + TODO: This has some functionality related to CodeContext that should be + removed, in favor of languages handling their own local scopes + + + + + The name of the lambda. + Currently anonymous/unnamed lambdas are not allowed. + + + + + Return type of the lambda being created. + + + + + List of lambda's local variables for direct manipulation. + + + + + List of lambda's parameters for direct manipulation + + + + + The params array argument, if any. + + + + + The body of the lambda. This must be non-null. + + + + + The generated lambda should have dictionary of locals + instead of allocating them directly on the CLR stack. + + + + + The scope is visible (default). Invisible if false. + + + + + Creates a parameter on the lambda with a given name and type. + + Parameters maintain the order in which they are created, + however custom ordering is possible via direct access to + Parameters collection. + + + + + Creates a parameter on the lambda with a given name and type. + + Parameters maintain the order in which they are created, + however custom ordering is possible via direct access to + Parameters collection. + + + + + adds existing parameter to the lambda. + + Parameters maintain the order in which they are created, + however custom ordering is possible via direct access to + Parameters collection. + + + + + Creates a hidden parameter on the lambda with a given name and type. + + Parameters maintain the order in which they are created, + however custom ordering is possible via direct access to + Parameters collection. + + + + + Creates a params array argument on the labmda. + + The params array argument is added to the signature immediately. Before the lambda is + created, the builder validates that it is still the last (since the caller can modify + the order of parameters explicitly by maniuplating the parameter list) + + + + + Creates a local variable with specified name and type. + TODO: simplify by pushing logic into callers + + + + + Creates a local variable with specified name and type. + TODO: simplify by pushing logic into callers + + + + + Creates a temporary variable with specified name and type. + + + + + Adds the temporary variable to the list of variables maintained + by the builder. This is useful in cases where the variable is + created outside of the builder. + + + + + Creates the LambdaExpression from the builder. + After this operation, the builder can no longer be used to create other instances. + + Desired type of the lambda. + New LambdaExpression instance. + + + + Creates the LambdaExpression from the builder. + After this operation, the builder can no longer be used to create other instances. + + New LambdaExpression instance. + + + + Creates the generator LambdaExpression from the builder. + After this operation, the builder can no longer be used to create other instances. + + New LambdaExpression instance. + + + + Fixes up lambda body and parameters to match the signature of the given delegate if needed. + + + + + + Validates that the builder has enough information to create the lambda. + + + + + Provides a method call to a method which may return light exceptions. + + The call is to a method which supports light exceptions. When reducing + an additional check and throw is added. When a block code of is re-written + for light exceptions this instead reduces to not throw a .NET exception. + + + + + Internal re-writer class which creates code which is light exception aware. + + + + + Class used to be avoid overhead of creating expression trees when we're usually + + + + + Adds light exception handling to the provided expression which + is light exception aware. + + + + + Expression which produces a light exception value. This should be constructed + with the expression which creates the exception and this method will then call + a helper method which wraps the exception in our internal light exception class. + + + + + Represents either a YieldBreak or YieldReturn in a GeneratorExpression + If Value is non-null, it's a YieldReturn; otherwise it's a YieldBreak + and executing it will stop enumeration of the generator, causing + MoveNext to return false. + + + + + The value yieled from this expression, if it is a yield return + + + + + Gets the label used to yield from this generator + + + + + These are some generally useful helper methods. Currently the only methods are those to + cached boxed representations of commonly used primitive types so that they can be shared. + This is useful to most dynamic languages that use object as a universal type. + + The methods in RuntimeHelepers are caleld by the generated code. From here the methods may + dispatch to other parts of the runtime to get bulk of the work done, but the entry points + should be here. + + + + + Used by prologue code that is injected in lambdas to ensure that delegate signature matches what + lambda body expects. Such code typically unwraps subset of the params array manually, + but then passes the rest in bulk if lambda body also expects params array. + + This calls ArrayUtils.ShiftLeft, but performs additional checks that + ArrayUtils.ShiftLeft assumes. + + + + + A singleton boxed boolean true. + + + + + A singleton boxed boolean false. + + + + + Gets a singleton boxed value for the given integer if possible, otherwise boxes the integer. + + The value to box. + The boxed value. + + + + Helper method to create an instance. Work around for Silverlight where Activator.CreateInstance + is SecuritySafeCritical. + + TODO: Why can't we just emit the right thing for default(T)? + It's always null for reference types and it's well defined for value types + + + + + EventInfo.EventHandlerType getter is marked SecuritySafeCritical in CoreCLR + This method is to get to the property without using Reflection + + + + + + + Provides the test to see if an interpreted call site should switch over to being compiled. + + + + + Enables an object to be serializable to an Expression tree. The expression tree can then + be emitted into an assembly enabling the de-serialization of the object. + + + + + Wraps all arguments passed to a dynamic site with more arguments than can be accepted by a Func/Action delegate. + The binder generating a rule for such a site should unwrap the arguments first and then perform a binding to them. + + + + + Gets the number of items in _arguments that represent the arguments. + + + + + Helper methods that calls are generated to from the default DLR binders. + + + + + Helper function to combine an object array with a sequence of additional parameters that has been splatted for a function call. + + + + + EventInfo.EventHandlerType getter is marked SecuritySafeCritical in CoreCLR + This method is to get to the property without using Reflection + + + + + + + The MethodBinder will perform normal method binding. + + + + + The MethodBinder will return the languages definition of NotImplemented if the arguments are + incompatible with the signature. + + + + + The MethodBinder will set properties/fields for unused keyword arguments on the instance + that gets returned from the method. + + + + + The delegate representing the DLR Main function + + + + + Implements explicit casts supported by the runtime. + + + Implements explicit casts supported by the runtime. + + + + + Explicitly casts the object to a given type (and returns it as object) + + + + + Represents the context that is flowed for doing Compiler. Languages can derive + from this class to provide additional contextual information. + + + + + Gets the source unit currently being compiled in the CompilerContext. + + + + + Gets the sink for parser callbacks (e.g. brace matching, etc.). + + + + + Gets the current error sink. + + + + + Gets the compiler specific options. + + + + + Abstract base class used for optimized thread-safe dictionaries which have a set + of pre-defined string keys. + + Implementers derive from this class and override the GetExtraKeys, TrySetExtraValue, + and TryGetExtraValue methods. When looking up a value first the extra keys will be + searched using the optimized Try*ExtraValue functions. If the value isn't found there + then the value is stored in the underlying .NET dictionary. + + This dictionary can store object values in addition to string values. It also supports + null keys. + + + + + Gets a list of the extra keys that are cached by the the optimized implementation + of the module. + + + + + Try to set the extra value and return true if the specified key was found in the + list of extra values. + + + + + Try to get the extra value and returns true if the specified key was found in the + list of extra values. Returns true even if the value is Uninitialized. + + + + + Used as the value for the ScriptingRuntimeHelpers.GetDelegate method caching system + + + + + Generates stub to receive the CLR call and then call the dynamic language code. + + + + + Used as the key for the LanguageContext.GetDelegate method caching system + + + + + An attribute that is applied to saved ScriptCode's to be used to re-create the ScriptCode + from disk. + + + + + Gets names stored in optimized scope. + + + + + Provides a mechanism for providing documentation stored in an assembly as metadata. + + Applying this attribute will enable documentation to be provided to the user at run-time + even if XML Documentation files are unavailable. + + + + + Provides support for converting objects to delegates using the DLR binders + available by the provided language context. + + Primarily this supports converting objects implementing IDynamicMetaObjectProvider + to the appropriate delegate type. + + If the provided object is already a delegate of the appropriate type then the + delegate will simply be returned. + + + + + Creates a delegate with a given signature that could be used to invoke this object from non-dynamic code (w/o code context). + A stub is created that makes appropriate conversions/boxing and calls the object. + The stub should be executed within a context of this object's language. + + The converted delegate. + The object is either a subclass of Delegate but not the requested type or does not implement IDynamicMetaObjectProvider. + + + + Represents the type of a null value. + + + + + Private constructor is never called since 'null' is the only valid instance. + + + + + Updates an exception before it's getting re-thrown so + we can present a reasonable stack trace to the user. + + + + + Returns all the stack traces associates with an exception + + + + + Marks a class in the assembly as being an extension type for another type. + + + + + Marks a type in the assembly as being an extension type for another type. + + The type which is being extended + The type which provides the extension members. + + + + The type which contains extension members which are added to the type being extended. + + + + + The type which is being extended by the extension type. + + + + + Indicates that a DynamicMetaObject might be convertible to a CLR type. + + + + + Given an ID returns the object associated with that ID. + + + + + Gets a unique ID for an object + + + + + Goes over the hashtable and removes empty entries + + + + + Weak-ref wrapper caches the weak reference, our hash code, and the object ID. + + + + + WrapperComparer treats Wrapper as transparent envelope + + + + + Provides a list of all the members of an instance. + + + + + Indicates that a MetaObject is already representing a restricted type. Useful + when we're already restricted to a known type but this isn't captured in + the type info (e.g. the type is not sealed). + + + + + A useful interface for taking slices of numeric arrays, inspired by Python's Slice objects. + + + + + The starting index of the slice or null if no first index defined + + + + + The ending index of the slice or null if no ending index defined + + + + + The length of step to take + + + + + Internal class which binds a LanguageContext, StreamContentProvider, and Encoding together to produce + a TextContentProvider which reads binary data with the correct language semantics. + + + + + Provides support for light exceptions. These exceptions are propagated by + returning an instance of a private wrapper class containing the exception. Code + which is aware of light exceptions will branch to apporiate exception handling + blocks when in a try and otherwise return the value up the stack. This avoids + using the underlying CLR exception mechanism with overhead such as creating stack + traces. + + When a light exception reaches the boundary of code which is not light exception + aware the caller must check to see if a light exception is being thrown and if + so raise a .NET exception. + + This class provides methods for re-writing expression trees to support light exceptions, + methods to create light throw objects, check if an object is a light + throw object, and turn such an object back into a .NET Exception which can be thrown. + + Light exceptions also don't build up stack traces or interoperate with filter blocks + via 2-pass exception handling. + + + + + Rewrites the provided expression to support light exceptions. + + Calls to the returned expression, if not from other light-weight aware calls, + need to call GetLightException on return to see if an exception was thrown + and if so throw it. + + + + + Returns a new expression which will lazily reduce to a light + expression re-written version of the same expression. + + + + + Returns a new expression which is re-written for light exceptions + but will throw an exception if it escapes the expression. If this + expression is part of a larger experssion which is later re-written + for light exceptions then it will propagate the light exception up. + + + + + Returns an object which represents a light exception. + + + + + Returns an object which represents a light exception. + + + + + Returns an object which represents a light exception. + + + + + If the binder supports light exceptions then a light exception throwing expression is returned. + + Otherwise a normal throwing expression is returned. + + + + + If the binder supports light exceptions then a light exception throwing expression is returned. + + Otherwise a normal throwing expression is returned. + + + + + Throws the exception if the value represents a light exception + + + + + Wraps the expression in a check and rethrow. + + + + + Checks to see if the provided value is a light exception. + + + + + Gets the light exception from an object which may contain a light + exception. Returns null if the object is not a light exception. + + Used for throwing the exception at non-light exception boundaries. + + + + + Returns true if the call site binder is a light exception binder and supports + light throws. Returns false otherwise. + + + + + + + Sealed wrapper class to indicate something is a light exception. + + + + + Marks a method which may return a light exception. Such + methods need to have their return value checked and the exception + will need to be thrown if the caller is not light exception aware. + + + + + Creates a dictionary of locals in this scope + + + + + Returns Microsoft.Scripting.Runtime.DynamicNull if the object contains a null value, + otherwise, returns self.LimitType + + + + + Returns Microsoft.Scripting.Runtime.DynamicNull if the object contains a null value, + otherwise, returns self.RuntimeType + + + + + Event args for when a ScriptScope has had its contents changed. + + + + + Creates a new ModuleChangeEventArgs object with the specified name and type. + + + + + Creates a nwe ModuleChangeEventArgs with the specified name, type, and changed value. + + + + + Gets the name of the symbol that has changed. + + + + + Gets the way in which the symbol has changed: Set or Delete. + + + + + Gets the symbol has been set provides the new value. + + + + + The way in which a module has changed : Set or Delete + + + + + A new value has been set in the module (or a previous value has changed). + + + + + A value has been removed from the module. + + + + + A NullTextContentProvider to be provided when we have a pre-compiled ScriptCode which doesn't + have source code associated with it. + + + + + Singleton instance returned from an operator method when the operator method cannot provide a value. + + + + + Represents an ops-extension method which is added as an operator. + + The name must be a well-formed name such as "Add" that matches the CLS + naming conventions for adding overloads associated with op_* methods. + + + + + Efficiently tracks (line,column) information as text is added, and + collects line mappings between the original and generated source code + so we can generate correct debugging information later + + + + + Marks the current position of the writer as corresponding to the + original location passed in + + the line pragma corresponding to the + current position in the generated code + + + + Represents an ops-extension method which is used to implement a property. + + + + + Provides a cache of reflection members. Only one set of values is ever handed out per a + specific request. + + + + + TODO: Make me private again + + + + + Indicates an extension method should be added as a static method, not a instance method. + + + + + Sets the current position inside current token or one character behind it. + + + + + Sets the current position inside current token or one character behind it. + A relative displacement with respect to the current position in the token is specified. + + + + + Marks token end. Enables to read the current token. + + + + + Marks token start. It means the buffer can drop the current token. + Can be called even if no token has been read yet. + + + + + Reads till the end of line and returns the character that stopped the reading. + The returned character is not skipped. + + + + + Resizes an array to a speficied new size and copies a portion of the original array into its beginning. + + + + + Provides services for loading XAML and binding events to dynamic language code definitions. + + + + + Loads XAML from the specified stream and returns the deserialized object. Any event handlers + are bound to methods defined in the provided Scope and converted using the provided DynamicOperations + object. + + + + + Loads XAML from the specified filename and returns the deserialized object. Any event handlers + are bound to methods defined in the provided Scope and converted using the provided DynamicOperations + object. + + + + + Loads XAML from the specified XmlReader and returns the deserialized object. Any event handlers + are bound to methods defined in the provided Scope and converted using the provided DynamicOperations + object. + + + + + Loads XAML from the specified TextReader and returns the deserialized object. Any event handlers + are bound to methods defined in the provided Scope and converted using the provided DynamicOperations + object. + + + + + Loads XAML from the specified XamlXmlReader and returns the deserialized object. Any event handlers + are bound to methods defined in the provided Scope and converted using the provided DynamicOperations + object. + + + + + Returns the list of x:Name'd objects that we saw and should set on the root object. + + + + + Dummy, should never be called + + + + + Stores information needed to emit debugging symbol information for a + source file, in particular the file name and unique language identifier + + + + + Gets the source file name. + + + + + Gets the language's unique identifier, if any. + + + + + Gets the language vendor's unique identifier, if any. + + + + + ArgBuilder provides an argument value used by the MethodBinder. One ArgBuilder exists for each + physical parameter defined on a method. + + Contrast this with ParameterWrapper which represents the logical argument passed to the method. + + + + + Provides the Expression which provides the value to be passed to the argument. + + + + + Provides the Expression which provides the value to be passed to the argument. + This method is called when result is intended to be used ByRef. + + + + + Provides an Expression which will update the provided value after a call to the method. + May return null if no update is required. + + + + + Provides the implementation of performing AddAssign and SubtractAssign binary operations. + + The binder provided by the call site. + The handler for the operation. + The result of the operation. + true if the operation is complete, false if the call site should determine behavior. + + + + Adds a handler to an event. + + The handler to be added. + The original event with handler added. + + + + Removes handler from the event. + + The handler to be removed. + The original event with handler removed. + + + + Provides helper methods to bind COM objects dynamically. + + + + + Determines if an object is a COM object. + + The object to test. + true if the object is a COM object, false otherwise. + + + + Tries to perform binding of the dynamic get member operation. + + An instance of the that represents the details of the dynamic operation. + The target of the dynamic operation. + The new representing the result of the binding. + true if member evaluation may be delayed. + true if operation was bound successfully; otherwise, false. + + + + Tries to perform binding of the dynamic get member operation. + + An instance of the that represents the details of the dynamic operation. + The target of the dynamic operation. + The new representing the result of the binding. + true if operation was bound successfully; otherwise, false. + + + + Tries to perform binding of the dynamic set member operation. + + An instance of the that represents the details of the dynamic operation. + The target of the dynamic operation. + The representing the value for the set member operation. + The new representing the result of the binding. + true if operation was bound successfully; otherwise, false. + + + + Tries to perform binding of the dynamic invoke operation. + + An instance of the that represents the details of the dynamic operation. + The target of the dynamic operation. + An array of instances - arguments to the invoke member operation. + The new representing the result of the binding. + true if operation was bound successfully; otherwise, false. + + + + Tries to perform binding of the dynamic invoke member operation. + + An instance of the that represents the details of the dynamic operation. + The target of the dynamic operation. + An array of instances - arguments to the invoke member operation. + The new representing the result of the binding. + true if operation was bound successfully; otherwise, false. + + + + Tries to perform binding of the dynamic get index operation. + + An instance of the that represents the details of the dynamic operation. + The target of the dynamic operation. + An array of instances - arguments to the invoke member operation. + The new representing the result of the binding. + true if operation was bound successfully; otherwise, false. + + + + Tries to perform binding of the dynamic set index operation. + + An instance of the that represents the details of the dynamic operation. + The target of the dynamic operation. + An array of instances - arguments to the invoke member operation. + The representing the value for the set index operation. + The new representing the result of the binding. + true if operation was bound successfully; otherwise, false. + + + + Tries to perform binding of the dynamic Convert operation. + + An instance of the that represents the details of the dynamic operation. + The target of the dynamic operation. + The new representing the result of the binding. + true if operation was bound successfully; otherwise, false. + + + + Gets the member names associated with the object. + This function can operate only with objects for which returns true. + + The object for which member names are requested. + The collection of member names. + + + + Gets the member names of the data-like members associated with the object. + This function can operate only with objects for which returns true. + + The object for which member names are requested. + The collection of member names. + + + + Gets the data-like members and associated data for an object. + This function can operate only with objects for which returns true. + + The object for which data members are requested. + The enumeration of names of data members for which to retrieve values. + The collection of pairs that represent data member's names and their data. + + + + Special binder that indicates special semantics for COM GetMember operation. + + + + + ComEventSinksContainer is just a regular list with a finalizer. + This list is usually attached as a custom data for RCW object and + is finalized whenever RCW is finalized. + + + + + Layout of the IDispatch vtable + + + + + Invokes the object. If it falls back, just produce an error. + + + + + Splats the arguments to another nested dynamic site, which does the + real invocation of the IDynamicMetaObjectProvider. + + + + + Create a stub for the target of the optimized lopop. + + + + + + Gets expressions to access all the arguments. This includes the instance argument. + + + + + The ComObject class wraps a runtime-callable-wrapper and enables it to be used with the Dynamic Language Runtime and the C# dynamic keyword. + + + + + Gets a that wraps the runtime-callable-wrapper, or creates one if none currently exists. + + + + + + The parameter description of a method defined in a type library + + + + + Creates a representation for the paramter of a COM method + + + + + Creates a representation for the return value of a COM method + TODO: Return values should be represented by a different type + + + + + DBNull.Value if there is no default value + + + + + Look for typeinfo using IDispatch.GetTypeInfo + + + + Some COM objects just dont expose typeinfo. In these cases, this method will return null. + Some COM objects do intend to expose typeinfo, but may not be able to do so if the type-library is not properly + registered. This will be considered as acceptable or as an error condition depending on throwIfMissingExpectedTypeInfo + + + + + This method should be called when typeinfo is not available for an object. The function + will check if the typeinfo is expected to be missing. This can include error cases where + the same error is guaranteed to happen all the time, on all machines, under all circumstances. + In such cases, we just have to operate without the typeinfo. + + However, if accessing the typeinfo is failing in a transient way, we might want to throw + an exception so that we will eagerly predictably indicate the problem. + + + + + This class contains methods that either cannot be expressed in C#, or which require writing unsafe code. + Callers of these methods need to use them extremely carefully as incorrect use could cause GC-holes + and other problems. + + + + + + Ensure that "value" is a local variable in some caller's frame. So converting + the byref to an IntPtr is a safe operation. Alternatively, we could also allow + allowed "value" to be a pinned object. + + + + + We will emit an indirect call to an unmanaged function pointer from the vtable of the given interface pointer. + This approach can take only ~300 instructions on x86 compared with ~900 for Marshal.Release. We are relying on + the JIT-compiler to do pinvoke-stub-inlining and calling the pinvoke target directly. + + + + + We will emit an indirect call to an unmanaged function pointer from the vtable of the given IDispatch interface pointer. + It is not possible to express this in C#. Using an indirect pinvoke call allows us to do our own marshalling. + We can allocate the Variant arguments cheaply on the stack. We are relying on the JIT-compiler to do + pinvoke-stub-inlining and calling the pinvoke target directly. + The alternative of calling via a managed interface declaration of IDispatch would have a performance + penalty of going through a CLR stub that would have to re-push the arguments on the stack, etc. + Marshal.GetDelegateForFunctionPointer could be used here, but its too expensive (~2000 instructions on x86). + + + + + Cached information from a TLB. Only information that is required is saved. CoClasses are used + for event hookup. Enums are stored for accessing symbolic names from scripts. + + + + + Reads the latest registered type library for the corresponding GUID, + reads definitions of CoClass'es and Enum's from this library + and creates a IDynamicMetaObjectProvider that allows to instantiate coclasses + and get actual values for the enums. + + Type Library Guid + ComTypeLibDesc object + + + + Gets an ITypeLib object from OLE Automation compatible RCW , + reads definitions of CoClass'es and Enum's from this library + and creates a IDynamicMetaObjectProvider that allows to instantiate coclasses + and get actual values for the enums. + + OLE automation compatible RCW + ComTypeLibDesc object + + + + This represents a bound dispmember on a IDispatch object. + + + + + This is similar to ComTypes.EXCEPINFO, but lets us do our own custom marshaling + + + + + An object that implements IDispatch + + This currently has the following issues: + 1. If we prefer ComObjectWithTypeInfo over IDispatchComObject, then we will often not + IDispatchComObject since implementations of IDispatch often rely on a registered type library. + If we prefer IDispatchComObject over ComObjectWithTypeInfo, users get a non-ideal experience. + 2. IDispatch cannot distinguish between properties and methods with 0 arguments (and non-0 + default arguments?). So obj.foo() is ambiguous as it could mean invoking method foo, + or it could mean invoking the function pointer returned by property foo. + We are attempting to find whether we need to call a method or a property by examining + the ITypeInfo associated with the IDispatch. ITypeInfo tell's use what parameters the method + expects, is it a method or a property, what is the default property of the object, how to + create an enumerator for collections etc. + 3. IronPython processes the signature and converts ref arguments into return values. + However, since the signature of a DispMethod is not available beforehand, this conversion + is not possible. There could be other signature conversions that may be affected. How does + VB6 deal with ref arguments and IDispatch? + + We also support events for IDispatch objects: + Background: + COM objects support events through a mechanism known as Connect Points. + Connection Points are separate objects created off the actual COM + object (this is to prevent circular references between event sink + and event source). When clients want to sink events generated by + COM object they would implement callback interfaces (aka source + interfaces) and hand it over (advise) to the Connection Point. + + Implementation details: + When IDispatchComObject.TryGetMember request is received we first check + whether the requested member is a property or a method. If this check + fails we will try to determine whether an event is requested. To do + so we will do the following set of steps: + 1. Verify the COM object implements IConnectionPointContainer + 2. Attempt to find COM object's coclass's description + a. Query the object for IProvideClassInfo interface. Go to 3, if found + b. From object's IDispatch retrieve primary interface description + c. Scan coclasses declared in object's type library. + d. Find coclass implementing this particular primary interface + 3. Scan coclass for all its source interfaces. + 4. Check whether to any of the methods on the source interfaces matches + the request name + + Once we determine that TryGetMember requests an event we will return + an instance of BoundDispEvent class. This class has InPlaceAdd and + InPlaceSubtract operators defined. Calling InPlaceAdd operator will: + 1. An instance of ComEventSinksContainer class is created (unless + RCW already had one). This instance is hanged off the RCW in attempt + to bind the lifetime of event sinks to the lifetime of the RCW itself, + meaning event sink will be collected once the RCW is collected (this + is the same way event sinks lifetime is controlled by PIAs). + Notice: ComEventSinksContainer contains a Finalizer which will go and + unadvise all event sinks. + Notice: ComEventSinksContainer is a list of ComEventSink objects. + 2. Unless we have already created a ComEventSink for the required + source interface, we will create and advise a new ComEventSink. Each + ComEventSink implements a single source interface that COM object + supports. + 3. ComEventSink contains a map between method DISPIDs to the + multicast delegate that will be invoked when the event is raised. + 4. ComEventSink implements IReflect interface which is exposed as + custom IDispatch to COM consumers. This allows us to intercept calls + to IDispatch.Invoke and apply custom logic - in particular we will + just find and invoke the multicast delegate corresponding to the invoked + dispid. + + + + + ArgBuilder which always produces null. + + + + + SimpleArgBuilder produces the value produced by the user as the argument value. It + also tracks information about the original parameter and is used to create extended + methods for params arrays and param dictionary functions. + + + + + If a managed user type (as opposed to a primitive type or a COM object) is passed as an argument to a COM call, we need + to determine the VarEnum type we will marshal it as. We have the following options: + 1. Raise an exception. Languages with their own version of primitive types would not be able to call + COM methods using the language's types (for eg. strings in IronRuby are not System.String). An explicit + cast would be needed. + 2. We could marshal it as VT_DISPATCH. Then COM code will be able to access all the APIs in a late-bound manner, + but old COM components will probably malfunction if they expect a primitive type. + 3. We could guess which primitive type is the closest match. This will make COM components be as easily + accessible as .NET methods. + 4. We could use the type library to check what the expected type is. However, the type library may not be available. + + VarEnumSelector implements option # 3 + + + + + Gets the managed type that an object needs to be coverted to in order for it to be able + to be represented as a Variant. + + In general, there is a many-to-many mapping between Type and VarEnum. However, this method + returns a simple mapping that is needed for the current implementation. The reason for the + many-to-many relation is: + 1. Int32 maps to VT_I4 as well as VT_ERROR, and Decimal maps to VT_DECIMAL and VT_CY. However, + this changes if you throw the wrapper types into the mix. + 2. There is no Type to represent COM types. __ComObject is a private type, and Object is too + general. + + + + + Creates a family of COM types such that within each family, there is a completely non-lossy + conversion from a type to an earlier type in the family. + + + + + Get the (one representative type for each) primitive type families that the argument can be converted to + + + + + If there is more than one type family that the argument can be converted to, we will throw a + AmbiguousMatchException instead of randomly picking a winner. + + + + + Is there a unique primitive type that has the best conversion for the argument + + + + + Get the COM Variant type that argument should be marshaled as for a call to COM + + + + + Variant is the basic COM type for late-binding. It can contain any other COM data type. + This type definition precisely matches the unmanaged data layout so that the struct can be passed + to and from COM calls. + + + + + Primitive types are the basic COM types. It includes valuetypes like ints, but also reference types + like BStrs. It does not include composite types like arrays and user-defined COM types (IUnknown/IDispatch). + + + + + Get the managed object representing the Variant. + + + + + + Release any unmanaged memory associated with the Variant + + + + + + Helper method for generated code + + + + + VariantBuilder handles packaging of arguments into a Variant for a call to IDispatch.Invoke + + + + + This class implements an event sink for a particular RCW. + Unlike the implementation of events in TlbImp'd assemblies, + we will create only one event sink per RCW (theoretically RCW might have + several ComEventSink evenk sinks - but all these implement different source intefaces). + Each ComEventSink contains a list of ComEventSinkMethod objects - which represent + a single method on the source interface an a multicast delegate to redirect + the calls. Notice that we are chaining multicast delegates so that same + ComEventSinkMedhod can invoke multiple event handlers). + + ComEventSink implements an IDisposable pattern to Unadvise from the connection point. + Typically, when RCW is finalized the corresponding Dispose will be triggered by + ComEventSinksContainer finalizer. Notice that lifetime of ComEventSinksContainer + is bound to the lifetime of the RCW. + + + + + Contains a methods DISPID (in a string formatted of "[DISPID=N]" + and a chained list of delegates to invoke + + + + + ComEventSinkProxy class is responsible for handling QIs for sourceIid + on instances of ComEventSink. + + Background: When a COM even sink advises to a connection point it is + supposed to hand over the dispinterface. Now, some hosts will trust + the COM client to pass the correct pointer, but some will not. + E.g. Excel's implementation of Connection Points will not cause a + QI on the pointer that has been passed, however Word will QI the + pointer to return the required interface. + + ComEventSink does not, strongly speaking, implements the interface + that it claims to implement - it is just "faking" it by using IReflect. + Thus, Word's QIs on the pointer passed to ICP::Advise would fail. To + prevent this we take advangate of RealProxy's ability of + "dressing up" like other classes and hence successfully respond to QIs + for interfaces that it does not really support( it is OK to say + "I implement this interface" for event sinks only since the common + practice is to use IDistpach.Invoke when calling into event sinks). + + + + + Strongly-typed and parameterized string factory. + + + Strongly-typed and parameterized string factory. + + + + + A string like "COM object is expected." + + + + + A string like "Cannot perform call." + + + + + A string like "COM object does not support events." + + + + + A string like "COM object does not support specified source interface." + + + + + A string like "Marshal.SetComObjectData failed." + + + + + A string like "This method exists only to keep the compiler happy." + + + + + A string like "Unexpected VarEnum {0}." + + + + + A string like "Error while invoking {0}." + + + + + A string like "Error while invoking {0}." + + + + + A string like "Error while invoking {0}. Named arguments are not supported." + + + + + A string like "Error while invoking {0}." + + + + + A string like "Could not convert argument {0} for call to {1}." + + + + + A string like "Error while invoking {0}. A required parameter was omitted." + + + + + A string like "ResolveComReference.CannotRetrieveTypeInformation." + + + + + A string like "IDispatch::GetIDsOfNames behaved unexpectedly for {0}." + + + + + A string like "Attempting to wrap an unsupported enum type." + + + + + A string like "Attempting to pass an event handler of an unsupported type." + + + + + A string like "Could not get dispatch ID for {0} (error: {1})." + + + + + A string like "There are valid conversions from {0} to {1}." + + + + + A string like "Variant.GetAccessor cannot handle {0}." + + + + + A string like "Cannot access member {1} declared on type {0} because the type contains generic parameters." + + + + + A string like "Type '{0}' is missing or cannot be loaded." + + + + + A string like "static property "{0}" of "{1}" can only be read through a type, not an instance" + + + + + A string like "static property "{0}" of "{1}" can only be assigned to through a type, not an instance" + + + + + A string like "Method precondition violated" + + + + + A string like "Invalid argument value" + + + + + A string like "Non-empty string required" + + + + + A string like "Non-empty collection required" + + + + + A string like "must by an Exception instance" + + + + + A string like "Type of test must be bool" + + + + + A string like "Type of the expression must be bool" + + + + + A string like "Empty string is not a valid path." + + + + + A string like "Invalid delegate type (Invoke method not found)." + + + + + A string like "expected only static property" + + + + + A string like "Property doesn't exist on the provided type" + + + + + A string like "Field doesn't exist on provided type" + + + + + A string like "Type doesn't have constructor with a given signature" + + + + + A string like "Type doesn't have a method with a given name." + + + + + A string like "Type doesn't have a method with a given name and signature." + + + + + A string like "Count must be non-negative." + + + + + A string like "arrayType must be an array type" + + + + + A string like "Either code or target must be specified." + + + + + A string like "Type parameter is {0}. Expected a delegate." + + + + + A string like "Cannot cast from type '{0}' to type '{1}" + + + + + A string like "unknown member type: '{0}'. " + + + + + A string like "RuleBuilder can only be used with delegates whose first argument is CallSite." + + + + + A string like "no instance for call." + + + + + A string like "Missing Test." + + + + + A string like "Missing Target." + + + + + A string like "The operation requires a non-generic type for {0}, but this represents generic types only" + + + + + A string like "Invalid operation: '{0}'" + + + + + A string like "Finally already defined." + + + + + A string like "Can not have fault and finally." + + + + + A string like "Fault already defined." + + + + + A string like "Cannot create default value for type {0}." + + + + + A string like "Unhandled convert: {0}" + + + + + A string like "{0}.{1} has no publiclly visible method." + + + + + A string like "Global/top-level local variable names must be unique." + + + + + A string like "Generating code from non-serializable CallSiteBinder." + + + + + A string like "Specified path is invalid." + + + + + A string like "Dictionaries are not hashable." + + + + + A string like "language already registered." + + + + + A string like "The method or operation is not implemented." + + + + + A string like "No exception." + + + + + A string like "Extension type {0} must be public." + + + + + A string like "Already initialized." + + + + + A string like "CreateScopeExtension must return a scope extension." + + + + + A string like "Invalid number of parameters for the service." + + + + + A string like "Invalid type of argument {0}; expecting {1}." + + + + + A string like "Cannot change non-caching value." + + + + + A string like "Field {0} is read-only" + + + + + A string like "Property {0} is read-only" + + + + + A string like "Expected event from {0}.{1}, got event from {2}.{3}." + + + + + A string like "expected bound event, got {0}." + + + + + A string like "Expected type {0}, got {1}." + + + + + A string like "can only write to member {0}." + + + + + A string like "No code to compile." + + + + + A string like "Invalid stream type: {0}." + + + + + A string like "Queue empty." + + + + + A string like "Enumeration has not started. Call MoveNext." + + + + + A string like "Enumeration already finished." + + + + + A string like "can't add another casing for identifier {0}" + + + + + A string like "can't add new identifier {0}" + + + + + A string like "Type '{0}' doesn't provide a suitable public constructor or its implementation is faulty: {1}" + + + + + A string like "Invalid output directory." + + + + + A string like "Invalid assembly name or file extension." + + + + + A string like "Cannot emit constant {0} ({1})" + + + + + A string like "No implicit cast from {0} to {1}" + + + + + A string like "No explicit cast from {0} to {1}" + + + + + A string like "name '{0}' not defined" + + + + + A string like "No default value for a given type." + + + + + A string like "Specified language provider type is not registered." + + + + + A string like "can't read from property" + + + + + A string like "can't write to property" + + + + + A string like "Cannot create instance of {0} because it contains generic parameters" + + + + + A string like "Non-verifiable assembly generated: {0}:\nAssembly preserved as {1}\nError text:\n{2}\n" + + + + + Strongly-typed and parameterized exception factory. + + + Strongly-typed and parameterized exception factory. + + + + + ArgumentException with message like "COM object does not support events." + + + + + ArgumentException with message like "COM object does not support specified source interface." + + + + + InvalidOperationException with message like "Marshal.SetComObjectData failed." + + + + + InvalidOperationException with message like "This method exists only to keep the compiler happy." + + + + + InvalidOperationException with message like "Unexpected VarEnum {0}." + + + + + System.Reflection.TargetParameterCountException with message like "Error while invoking {0}." + + + + + MissingMemberException with message like "Error while invoking {0}." + + + + + ArgumentException with message like "Error while invoking {0}. Named arguments are not supported." + + + + + OverflowException with message like "Error while invoking {0}." + + + + + ArgumentException with message like "Could not convert argument {0} for call to {1}." + + + + + ArgumentException with message like "Error while invoking {0}. A required parameter was omitted." + + + + + InvalidOperationException with message like "ResolveComReference.CannotRetrieveTypeInformation." + + + + + ArgumentException with message like "IDispatch::GetIDsOfNames behaved unexpectedly for {0}." + + + + + InvalidOperationException with message like "Attempting to wrap an unsupported enum type." + + + + + InvalidOperationException with message like "Attempting to pass an event handler of an unsupported type." + + + + + MissingMemberException with message like "Could not get dispatch ID for {0} (error: {1})." + + + + + System.Reflection.AmbiguousMatchException with message like "There are valid conversions from {0} to {1}." + + + + + NotImplementedException with message like "Variant.GetAccessor cannot handle {0}." + + + + + ArgumentException with message like "Either code or target must be specified." + + + + + InvalidOperationException with message like "Type parameter is {0}. Expected a delegate." + + + + + InvalidOperationException with message like "Cannot cast from type '{0}' to type '{1}" + + + + + InvalidOperationException with message like "unknown member type: '{0}'. " + + + + + InvalidOperationException with message like "RuleBuilder can only be used with delegates whose first argument is CallSite." + + + + + InvalidOperationException with message like "no instance for call." + + + + + InvalidOperationException with message like "Missing Test." + + + + + InvalidOperationException with message like "Missing Target." + + + + + TypeLoadException with message like "The operation requires a non-generic type for {0}, but this represents generic types only" + + + + + ArgumentException with message like "Invalid operation: '{0}'" + + + + + InvalidOperationException with message like "Finally already defined." + + + + + InvalidOperationException with message like "Can not have fault and finally." + + + + + InvalidOperationException with message like "Fault already defined." + + + + + ArgumentException with message like "Cannot create default value for type {0}." + + + + + ArgumentException with message like "Unhandled convert: {0}" + + + + + InvalidOperationException with message like "{0}.{1} has no publiclly visible method." + + + + + ArgumentException with message like "Global/top-level local variable names must be unique." + + + + + ArgumentException with message like "Generating code from non-serializable CallSiteBinder." + + + + + ArgumentException with message like "Specified path is invalid." + + + + + ArgumentTypeException with message like "Dictionaries are not hashable." + + + + + InvalidOperationException with message like "language already registered." + + + + + NotImplementedException with message like "The method or operation is not implemented." + + + + + InvalidOperationException with message like "No exception." + + + + + ArgumentException with message like "Extension type {0} must be public." + + + + + InvalidOperationException with message like "Already initialized." + + + + + InvalidImplementationException with message like "CreateScopeExtension must return a scope extension." + + + + + ArgumentException with message like "Invalid number of parameters for the service." + + + + + ArgumentException with message like "Invalid type of argument {0}; expecting {1}." + + + + + ArgumentException with message like "Cannot change non-caching value." + + + + + MissingMemberException with message like "Field {0} is read-only" + + + + + MissingMemberException with message like "Property {0} is read-only" + + + + + ArgumentException with message like "Expected event from {0}.{1}, got event from {2}.{3}." + + + + + ArgumentTypeException with message like "expected bound event, got {0}." + + + + + ArgumentTypeException with message like "Expected type {0}, got {1}." + + + + + MemberAccessException with message like "can only write to member {0}." + + + + + InvalidOperationException with message like "No code to compile." + + + + + ArgumentException with message like "Invalid stream type: {0}." + + + + + InvalidOperationException with message like "Queue empty." + + + + + InvalidOperationException with message like "Enumeration has not started. Call MoveNext." + + + + + InvalidOperationException with message like "Enumeration already finished." + + + + + InvalidOperationException with message like "can't add another casing for identifier {0}" + + + + + InvalidOperationException with message like "can't add new identifier {0}" + + + + + ArgumentException with message like "Invalid output directory." + + + + + ArgumentException with message like "Invalid assembly name or file extension." + + + + + ArgumentException with message like "Cannot emit constant {0} ({1})" + + + + + ArgumentException with message like "No implicit cast from {0} to {1}" + + + + + ArgumentException with message like "No explicit cast from {0} to {1}" + + + + + MissingMemberException with message like "name '{0}' not defined" + + + + + ArgumentException with message like "No default value for a given type." + + + + + ArgumentException with message like "Specified language provider type is not registered." + + + + + InvalidOperationException with message like "can't read from property" + + + + + InvalidOperationException with message like "can't write to property" + + + + + ArgumentException with message like "Cannot create instance of {0} because it contains generic parameters" + + + + + System.Security.VerificationException with message like "Non-verifiable assembly generated: {0}:\nAssembly preserved as {1}\nError text:\n{2}\n" + + + + + Used by compilers to provide additional debug information about LambdaExpression to DebugContext + + + + + Implemented by compilers to allow the traceback engine to get additional information. + + + + + Provides services to compilers for instrumenting code with tracebacks. + + + + + Creates a new instance of DebugContext + + + + + Transforms a LambdaExpression to a debuggable LambdaExpression + + + + + Transforms a LambdaExpression to a debuggable LambdaExpression + + + + + Resets a state associated with a source file that's maintained in the DebugContext + + + + + Threads + + + + + Hook + + + + + Thread + + + + + FrameOrder + + + + + Variables + + + + + CurrentSequencePointIndex + + + + + // This method is called from the generator to update the frame with generator's locals + + + + + Remaps the frame's state to use the generator for execution. + + Int32.MaxValue to map to latest version + + + + DebuggableLambdaBuilder is used to transform a DLR expression tree into a debuggable lambda expression. + + + + + Used to wrap a lambda that was already a generator prior to transform. + + + + + Used to rewrite expressions containing DebugInfoExpressions. + + + + + Combines source file and span. Also provides Contains and Intersects functionality. + + + + + Implementation of IDebugRuntimeVariables, which wraps IRuntimeVariables + FunctionInfo/DebugMarker + + + + + Default implementation of BaseDebugThread, which uses DLR's RuntimeVariablesExpression for lifting locals. + + + + + Default implementation of IDebugThreadFactory, which uses DLR's RuntimeVariablesExpression for lifting locals. + + + + + SequencePoints + + + + + Gets the name. + + + + + Gets the custom payload. + + + + + GetTraceLocations + + + + + + Callback that is fired by the traceback engine + + + + + Used to extract locals information from expressions. + + + + + Strongly-typed and parameterized string factory. + + + + + IDebugRuntimeVariables is used to wrap IRuntimeVariables and add properties for retrieving + FunctionInfo and DebugMarker from debuggable labmdas. + + + + + IDebugThreadFactory is used to abstract how frames and local variables are maintained at run/debug time. + + + + + Implements IRuntimeVariables in a way that preserves scoping within the lambda. + + + + + TraceSession. + + Basically holds a list of last encountered DebugFrame instances + (one per running thread). + + + + + Used to provide information about locals/parameters at debug time. + + + + + Index within byref variables list or within strongbox variables list. + + + + + Index within the combined list. + + + + + Gets the variable type. + + + + + Gets the name. + + + + + Gets or sets a value indicating whether it is a parameter. + + + + + This class holds onto internal debugging options used in this assembly. + These options can be set via environment variables DLR_{option-name}. + Boolean options map "true" to true and other values to false. + + These options are for internal debugging only, and should not be + exposed through any public APIs. + + + + + True if the MethodBase is method which is going to construct an object + + + + + Returns the System.Type for any object, including null. The type of null + is represented by None.Type and all other objects just return the + result of Object.GetType + + + + + Simply returns a Type[] from calling GetType on each element of args. + + + + + EMITTED + Used by default method binder to check types of splatted arguments. + + + + + Given a MethodInfo which may be declared on a non-public type this attempts to + return a MethodInfo which will dispatch to the original MethodInfo but is declared + on a public type. + + Returns the original method if the method if a public version cannot be found. + + + + + Non-public types can have public members that we find when calling type.GetMember(...). This + filters out the non-visible members by attempting to resolve them to the correct visible type. + + If no correct visible type can be found then the member is not visible and we won't call it. + + + + + Sees if two MemberInfos point to the same underlying construct in IL. This + ignores the ReflectedType property which exists on MemberInfos which + causes direct comparisons to be false even if they are the same member. + + + + + Returns a value which indicates failure when a OldConvertToAction of ImplicitTry or + ExplicitTry. + + + + + Creates an interpreted delegate for the lambda. + + The lambda to compile. + A delegate which can interpret the lambda. + + + + Creates an interpreted delegate for the lambda. + + The lambda to compile. + The number of iterations before the interpreter starts compiling + A delegate which can interpret the lambda. + + + + Creates an interpreted delegate for the lambda. + + The lambda's delegate type. + The lambda to compile. + A delegate which can interpret the lambda. + + + + Creates an interpreted delegate for the lambda. + + The lambda to compile. + The number of iterations before the interpreter starts compiling + A delegate which can interpret the lambda. + + + + Compiles the lambda into a method definition. + + the lambda to compile + A which will be used to hold the lambda's IL. + A parameter that indicates if debugging information should be emitted to a PDB symbol store. + + + + Compiles the LambdaExpression. + + If the lambda is compiled with emitDebugSymbols, it will be + generated into a TypeBuilder. Otherwise, this method is the same as + calling LambdaExpression.Compile() + + This is a workaround for a CLR limitiation: DynamicMethods cannot + have debugging information. + + the lambda to compile + true to generate a debuggable method, false otherwise + the compiled delegate + + + + Compiles the LambdaExpression, emitting it into a new type, and + optionally making it debuggable. + + This is a workaround for a CLR limitiation: DynamicMethods cannot + have debugging information. + + the lambda to compile + Debugging information generator used by the compiler to mark sequence points and annotate local variables. + True if debug symbols (PDBs) are emitted by the . + the compiled delegate + + + + Removes all live objects and places them in static fields of a type. + + + + + Reduces the provided DynamicExpression into site.Target(site, *args). + + + + + Tests to see if the expression is a constant with the given value. + + The expression to examine + The constant value to check for. + true/false + + + + Tests to see if the expression is a constant with the given value. + + The expression to examine + The constant value to check for. + true/false + + + + Provides a simple expression which enables embedding FieldBuilder's + in an AST before the type is complete. + + + + + Begins a catch block. + + + + + Begins an exception block for a filtered exception. + + + + + Begins an exception block for a non-filtered exception. + + + + + + Begins an exception fault block + + + + + Begins a finally block + + + + + Ends an exception block. + + + + + Begins a lexical scope. + + + + + Ends a lexical scope. + + + + + Declares a local variable of the specified type. + + + + + Declares a local variable of the specified type, optionally + pinning the object referred to by the variable. + + + + + Declares a new label. + + + + + Marks the label at the current position. + + + + + Emits an instruction. + + + + + Emits an instruction with a byte argument. + + + + + Emits an instruction with the metadata token for the specified contructor. + + + + + Emits an instruction with a double argument. + + + + + Emits an instruction with the metadata token for the specified field. + + + + + Emits an instruction with a float argument. + + + + + Emits an instruction with an int argument. + + + + + Emits an instruction with a label argument. + + + + + Emits an instruction with multiple target labels (switch). + + + + + Emits an instruction with a reference to a local variable. + + + + + Emits an instruction with a long argument. + + + + + Emits an instruction with the metadata token for a specified method. + + + + + Emits an instruction with a signed byte argument. + + + + + Emits an instruction with a short argument. + + + + + Emits an instruction with a signature token. + + + + + Emits an instruction with a string argument. + + + + + Emits an instruction with the metadata token for a specified type argument. + + + + + Emits a call or a virtual call to the varargs method. + + + + + Emits an unmanaged indirect call instruction. + + + + + Emits a managed indirect call instruction. + + + + + Marks a sequence point. + + + + + Specifies the namespace to be used in evaluating locals and watches for the + current active lexical scope. + + + + + Emits a Ldind* instruction for the appropriate type + + + + + Emits a Stind* instruction for the appropriate type. + + + + + Emits a Stelem* instruction for the appropriate type. + + + + + Boxes the value of the stack. No-op for reference types. Void is + converted to a null reference. For almost all value types this + method will box them in the standard way. Int32 and Boolean are + handled with optimized conversions that reuse the same object for + small values. For Int32 this is purely a performance optimization. + For Boolean this is use to ensure that True and False are always + the same objects. + + + + + Emits an array of constant values provided in the given list. + The array is strongly typed. + + + + + Emits an array of values of count size. The items are emitted via the callback + which is provided with the current item index to emit. + + + + + Emits an array construction code. + The code assumes that bounds for all dimensions + are already emitted. + + + + + Emits default(T) + Semantics match C# compiler behavior + + + + + A simple dictionary of queues, keyed off a particular type + This is useful for storing free lists of variables + + + + + Helper class to remove methods w/ identical signatures. Used for GetDefaultMembers + which returns members from all types in the hierarchy. + + + + + Directory where snippet assembly will be saved if SaveSnippets is set. + + + + + Save snippets to an assembly (see also SnippetsDirectory, SnippetsFileName). + + + + + Serializes constants and dynamic sites so the code can be saved to disk + + + + + Gets the Compiler associated with the Type Initializer (cctor) creating it if necessary. + + + + + Command line hosting service. + + + + + Scope is not remotable, and this only works in the same AppDomain. + + + + + Executes the comand line - depending upon the options provided we will + either run a single file, a single command, or enter the interactive loop. + + + + + Runs the command line. Languages can override this to provide custom behavior other than: + 1. Running a single command + 2. Running a file + 3. Entering the interactive console loop. + + + + + + Runs the specified filename + + + + + Starts the interactive loop. Performs any initialization necessary before + starting the loop and then calls RunInteractiveLoop to start the loop. + + Returns the exit code when the interactive loop is completed. + + + + + Runs the interactive loop. Repeatedly parse and run interactive actions + until an exit code is received. If any exceptions are unhandled displays + them to the console + + + + + Attempts to run a single interaction and handle any language-specific + exceptions. Base classes can override this and call the base implementation + surrounded with their own exception handling. + + Returns null if successful and execution should continue, or an exit code. + + + + + Parses a single interactive command or a set of statements and executes it. + + Returns null if successful and execution should continue, or the appropiate exit code. + + We check if the code read is an interactive command or statements is by checking for NewLine + If the code contains NewLine, it's a set of statements (most probably from SendToConsole) + If the code does not contain a NewLine, it's an interactive command typed by the user at the prompt + + + + + Private helper function to see if we should treat the current input as a blank link. + + We do this if we only have auto-indent text. + + + + + Read a statement, which can potentially be a multiple-line statement suite (like a class declaration). + + Should the console session continue, or did the user indicate + that it should be terminated? + Expression to evaluate. null for empty input + + + + Gets the next level for auto-indentation + + + + + Core functionality to implement an interactive console. This should be derived for concrete implementations + + + + + Console Host entry-point .exe name. + + + + + Request (from another thread) the console REPL loop to terminate + + The caller can specify the exitCode corresponding to the event triggering + the termination. This will be returned from CommandLine.Run + + + + To be called from entry point. + + + + + + + + name == null means that the argument doesn't specify an option; the value contains the entire argument + name == "" means that the option name is empty (argument separator); the value is null then + + + + + Literal script command given using -c option + + + + + Filename to execute passed on the command line options. + + + + + Only print the version of the script interpreter and exit + + + + + Used to dispatch a single interactive command. It can be used to control things like which Thread + the command is executed on, how long the command is allowed to execute, etc + + + + + Handles input and output for the console. It is comparable to System.IO.TextReader, + System.IO.TextWriter, System.Console, etc + + + + + Read a single line of interactive input, or a block of multi-line statements. + + An event-driven GUI console can implement this method by creating a thread that + blocks and waits for an event indicating that input is available + + The indentation level to be used for the current suite of a compound statement. + The console can ignore this argument if it does not want to support auto-indentation + null if the input stream has been closed. A string with a command to execute otherwise. + It can be a multi-line string which should be processed as block of statements + + + + On error. + + + + Supports detecting the remote runtime being killed, and starting up a new one. + + Threading model: + + ConsoleRestartManager creates a separate thread on which to create and execute the consoles. + There are usually atleast three threads involved: + + 1. Main app thread: Instantiates ConsoleRestartManager and accesses its APIs. This thread has to stay + responsive to user input and so the ConsoleRestartManager APIs cannot be long-running or blocking. + Since the remote runtime process can terminate asynchronously, the current RemoteConsoleHost can + change at any time (if auto-restart is enabled). The app should typically not care which instance of + RemoteConsoleHost is currently being used. The flowchart of this thread is: + Create ConsoleRestartManager + ConsoleRestartManager.Start + Loop: + Respond to user input | Send user input to console for execution | BreakExecution | RestartConsole | GetMemberNames + ConsoleRestartManager.Terminate + TODO: Currently, BreakExecution and GetMemberNames are called by the main thread synchronously. + Since they execute code in the remote runtime, they could take arbitrarily long. We should change + this so that the main app thread can never be blocked indefinitely. + + 2. Console thread: Dedicated thread for creating RemoteConsoleHosts and executing code (which could + take a long time or block indefinitely). + Wait for ConsoleRestartManager.Start to be called + Loop: + Create RemoteConsoleHost + Wait for signal for: + Execute code | RestartConsole | Process.Exited + + 3. CompletionPort async callbacks: + Process.Exited | Process.OutputDataReceived | Process.ErrorDataReceived + + 4. Finalizer thred + Some objects may have a Finalize method (which possibly calls Dispose). Not many (if any) types + should have a Finalize method. + + + + + + Accessing _remoteConsoleHost from a thread other than console thread can result in race. + If _remoteConsoleHost is accessed while holding _accessLock, it is guaranteed to be + null or non-disposed. + + + + + This is created on the "creating thread", and goes on standby. Start needs to be called for activation. + + A host might want one of two behaviors: + 1. Keep the REPL loop alive indefinitely, even when a specific instance of the RemoteConsoleHost terminates normally + 2. Close the REPL loop when an instance of the RemoteConsoleHost terminates normally, and restart the loop + only if the instance terminates abnormally. + + + + Needs to be called for activation. + + + + + Request (from another thread) the console REPL loop to terminate + + + + + This allows the RemoteConsoleHost to abort a long-running operation. The RemoteConsoleHost itself + does not know which ThreadPool thread might be processing the remote call, and so it needs + cooperation from the remote runtime server. + + + + + Since OnOutputDataReceived is sent async, it can arrive late. The remote console + cannot know if all output from the current command has been received. So + RemoteCommandDispatcher writes out a marker to indicate the end of the output + + + + + Aborts the current active call to Execute by doing Thread.Abort + + true if a Thread.Abort was actually called. false if there is no active call to Execute + + + + Customize the CommandLine for remote scenarios + + + + + CommandDispatcher to ensure synchronize output from the remote runtime + + + + + ConsoleHost where the ScriptRuntime is hosted in a separate process (referred to as the remote runtime server) + + The RemoteConsoleHost spawns the remote runtime server and specifies an IPC channel name to use to communicate + with each other. The remote runtime server creates and initializes a ScriptRuntime and a ScriptEngine, and publishes + it over the specified IPC channel at a well-known URI. Note that the RemoteConsoleHost cannot easily participate + in the initialization of the ScriptEngine as classes like LanguageContext are not remotable. + + The RemoteConsoleHost then starts the interactive loop and executes commands on the ScriptEngine over the remoting channel. + The RemoteConsoleHost listens to stdout of the remote runtime server and echos it locally to the user. + + + + + Called if the remote runtime process exits by itself. ie. without the remote console killing it. + + + + + Allows the console to customize the environment variables, working directory, etc. + + At the least, processInfo.FileName should be initialized + + + + Aborts the current active call to Execute by doing Thread.Abort + + true if a Thread.Abort was actually called. false if there is no active call to Execute + + + + The remote runtime server uses this class to publish an initialized ScriptEngine and ScriptRuntime + over a remoting channel. + + + + + Publish objects so that the host can use it, and then block indefinitely (until the input stream is open). + + Note that we should publish only one object, and then have other objects be accessible from it. Publishing + multiple objects can cause problems if the client does a call like "remoteProxy1(remoteProxy2)" as remoting + will not be able to know if the server object for both the proxies is on the same server. + + The IPC channel that the remote console expects to use to communicate with the ScriptEngine + A intialized ScriptScope that is ready to start processing script commands + + + + Keybindings and cursor movement style. + + + + + Class managing the command history. + + + + + List of available options + + + + + Cursor position management + + + + + Beginning position of the cursor - top coordinate. + + + + + Beginning position of the cursor - left coordinate. + + + + + The console input buffer. + + + + + Current position - index into the input buffer + + + + + The number of white-spaces displayed for the auto-indenation of the current line + + + + + Length of the output currently rendered on screen. + + + + + Command history + + + + + Tab options available in current context + + + + + Cursort anchor - position of cursor when the routine was called + + + + + The command line that this console is attached to. + + + + + The current edit mode of the console. + + + + + Displays the next option in the option list, + or beeps if no options available for current input prefix. + If no input prefix, simply print tab. + + + + + + + Handle the enter key. Adds the current input (if not empty) to the history. + + + The input string. + + + + The number of arguments including "this" for instance methods. + + + + Instruction can't be created due to insufficient privileges. + + + Instruction can't be created due to insufficient privileges. + + + + Gets the next type or null if no more types are available. + + + + + Uses reflection to create new instance of the appropriate ReflectedCaller + + + + + Fast creation works if we have a known primitive types for the entire + method siganture. If we have any non-primitive types then FastCreate + falls back to SlowCreate which works for all types. + + Fast creation is fast because it avoids using reflection (MakeGenericType + and Activator.CreateInstance) to create the types. It does this through + calling a series of generic methods picking up each strong type of the + signature along the way. When it runs out of types it news up the + appropriate CallInstruction with the strong-types that have been built up. + + One relaxation is that for return types which are non-primitive types + we can fallback to object due to relaxed delegates. + + + + + This instruction implements a goto expression that can jump out of any expression. + It pops values (arguments) from the evaluation stack that the expression tree nodes in between + the goto expression and the target label node pushed and not consumed yet. + A goto expression can jump into a node that evaluates arguments only if it carries + a value and jumps right after the first argument (the carried value will be used as the first argument). + Goto can jump into an arbitrary child of a BlockExpression since the block doesn’t accumulate values + on evaluation stack as its child expressions are being evaluated. + + Goto needs to execute any finally blocks on the way to the target label. + + { + f(1, 2, try { g(3, 4, try { goto L } finally { ... }, 6) } finally { ... }, 7, 8) + L: ... + } + + The goto expression here jumps to label L while having 4 items on evaluation stack (1, 2, 3 and 4). + The jump needs to execute both finally blocks, the first one on stack level 4 the + second one on stack level 2. So, it needs to jump the first finally block, pop 2 items from the stack, + run second finally block and pop another 2 items from the stack and set instruction pointer to label L. + + Goto also needs to rethrow ThreadAbortException iff it jumps out of a catch handler and + the current thread is in "abort requested" state. + + + + + The first instruction of finally block. + + + + + The last instruction of finally block. + + + + + The last instruction of a catch exception handler. + + + + + The last instruction of a fault exception handler. + + + + + Implements dynamic call site with many arguments. Wraps the arguments into . + + + + + Attaches a cookie to the last emitted instruction. + + + + Instruction can't be created due to insufficient privileges. + + + + Contains compiler state corresponding to a LabelTarget + See also LabelScopeInfo. + + + + + Returns true if we can jump into this node + + + + + A single interpreted frame might be represented by multiple subsequent Interpreter.Run CLR frames. + This method filters out the duplicate CLR frames. + + + + + A simple forth-style stack machine for executing Expression trees + without the need to compile to IL and then invoke the JIT. This trades + off much faster compilation time for a slower execution performance. + For code that is only run a small number of times this can be a + sweet spot. + + The core loop in the interpreter is the RunInstructions method. + + + + + Runs instructions within the given frame. + + + Interpreted stack frames are linked via Parent reference so that each CLR frame of this method corresponds + to an interpreted stack frame in the chain. It is therefore possible to combine CLR stack traces with + interpreted stack traces by aligning interpreted frames to the frames of this method. + Each group of subsequent frames of Run method corresponds to a single interpreted frame. + + + + + Manages creation of interpreted delegates. These delegates will get + compiled if they are executed often enough. + + + + + true if the compiled delegate has the same type as the lambda; + false if the type was changed for interpretation. + + + + + Used by LightLambda to get the compiled delegate. + + + + + Create a compiled delegate for the LightLambda, and saves it so + future calls to Run will execute the compiled code instead of + interpreting. + + + + + Provides notification that the LightLambda has been compiled. + + + + + Visits a LambdaExpression, replacing the constants with direct accesses + to their StrongBox fields. This is very similar to what + ExpressionQuoter does for LambdaCompiler. + + Also inserts debug information tracking similar to what the interpreter + would do. + + + + + Local variable mapping. + + + + + The variable that holds onto the StrongBox{object}[] closure from + the interpreter + + + + + A stack of variables that are defined in nested scopes. We search + this first when resolving a variable in case a nested scope shadows + one of our variable instances. + + + + + Walks the lambda and produces a higher order function, which can be + used to bind the lambda to a closure array from the interpreter. + + The lambda to bind. + Variables which are being accessed defined in the outer scope. + A delegate that can be called to produce a delegate bound to the passed in closure array. + + + + Provides a list of variables, supporing read/write of the values + + + + + Gets a copy of the local variables which are defined in the current scope. + + + + + + Checks to see if the given variable is defined within the current local scope. + + + + + Gets the variables which are defined in an outer scope and available within the current scope. + + + + + Tracks where a variable is defined and what range of instructions it's used in + + + + + marks a field, class, or struct as being safe to have statics which can be accessed + from multiple runtimes. + + Static fields which are not read-only or marked with this attribute will be flagged + by a test which looks for state being shared between runtimes. Before applying this + attribute you should ensure that it is safe to share the state. This is typically + state which is lazy initialized or state which is caching values which are identical + in all runtimes and are immutable. + + + + + Sets the value at the given index for a tuple of the given size. This set supports + walking through nested tuples to get the correct final index. + + + + + Gets the value at the given index for a tuple of the given size. This get + supports walking through nested tuples to get the correct final index. + + + + + Gets the unbound generic Tuple type which has at lease size slots or null if a large enough tuple is not available. + + + + + Creates a generic tuple with the specified types. + + If the number of slots fits within the maximum tuple size then we simply + create a single tuple. If it's greater then we create nested tuples + (e.g. a Tuple`2 which contains a Tuple`128 and a Tuple`8 if we had a size of 136). + + + + + Gets the number of usable slots in the provided Tuple type including slots available in nested tuples. + + + + + Creates a new instance of tupleType with the specified args. If the tuple is a nested + tuple the values are added in their nested forms. + + + + + Gets the values from a tuple including unpacking nested values. + + + + + Gets the series of properties that needs to be accessed to access a logical item in a potentially nested tuple. + + + + + Gets the series of properties that needs to be accessed to access a logical item in a potentially nested tuple. + + + + + Provides an expression for creating a tuple with the specified values. + + + + + This class is useful for quickly collecting performance counts for expensive + operations. Usually this means operations involving either reflection or + code gen. Long-term we need to see if this can be plugged better into the + standard performance counter architecture. + + + + + temporary categories for quick investigation, use a custom key if you + need to track multiple items, and if you want to keep it then create + a new Categories entry and rename all your temporary entries. + + + + + Gets custom data to be serialized when saving script codes to disk. + + + + + ScriptCode is an instance of compiled code that is bound to a specific LanguageContext + but not a specific ScriptScope. The code can be re-executed multiple times in different + scopes. Hosting API counterpart for this class is CompiledCode. + + + + + This takes an assembly name including extension and saves the provided ScriptCode objects into the assembly. + + The provided script codes can constitute code from multiple languages. The assemblyName can be either a fully qualified + or a relative path. The DLR will simply save the assembly to the desired location. The assembly is created by the DLR and + if a file already exists than an exception is raised. + + The DLR determines the internal format of the ScriptCode and the DLR can feel free to rev this as appropriate. + + + + + This will take an assembly object which the user has loaded and return a new set of ScriptCode’s which have + been loaded into the provided ScriptDomainManager. + + If the language associated with the ScriptCode’s has not already been loaded the DLR will load the + LanguageContext into the ScriptDomainManager based upon the saved LanguageContext type. + + If the LanguageContext or the version of the DLR the language was compiled against is unavailable a + TypeLoadException will be raised unless policy has been applied by the administrator to redirect bindings. + + + + + Provides a StreamContentProvider for a stream of content backed by a file on disk. + + + + + Converts a generic ICollection of T into an array of T. + + If the collection is already an array of T the original collection is returned. + + + + + Converts a generic ICollection of T into an array of R using a given conversion. + + If the collection is already an array of R the original collection is returned. + + + + + Provides a dictionary-like object used for caches which holds onto a maximum + number of elements specified at construction time. + + This class is not thread safe. + + + + + Creates a dictionary-like object used for caches. + + The maximum number of elements to store. + + + + Tries to get the value associated with 'key', returning true if it's found and + false if it's not present. + + + + + Adds a new element to the cache, replacing and moving it to the front if the + element is already present. + + + + + Returns the value associated with the given key, or throws KeyNotFoundException + if the key is not present. + + + + + Not all .NET enumerators throw exceptions if accessed in an invalid state. This type + can be used to throw exceptions from enumerators implemented in IronPython. + + + + + Wraps the provided enumerable into a ReadOnlyCollection{T} + + Copies all of the data into a new array, so the data can't be + changed after creation. The exception is if the enumerable is + already a ReadOnlyCollection{T}, in which case we just return it. + + + + + Allows wrapping of proxy types (like COM RCWs) to expose their IEnumerable functionality + which is supported after casting to IEnumerable, even though Reflection will not indicate + IEnumerable as a supported interface + + + + + Requires the specified index to point inside the array. + + Array is null. + Index is outside the array. + + + + Requires the specified index to point inside the array. + + Index is outside the array. + + + + Requires the specified index to point inside the array or at the end + + Array is null. + Index is outside the array. + + + + Requires the specified index to point inside the array or at the end + + Array is null. + Index is outside the array. + + + + Requires the range [offset, offset + count] to be a subset of [0, array.Count]. + + Offset or count are out of range. + + + + Requires the range [offset, offset + count] to be a subset of [0, array.Count]. + + Offset or count are out of range. + + + + Requires the range [offset, offset + count] to be a subset of [0, array.Count]. + + Array is null. + Offset or count are out of range. + + + + Requires the range [offset, offset + count] to be a subset of [0, array.Count]. + + String is null. + Offset or count are out of range. + + + + Requires the array and all its items to be non-null. + + + + + Requires the enumerable collection and all its items to be non-null. + + + + + List optimized for few writes and multiple reads. It provides thread-safe read and write access. + Iteration is not thread-safe by default, but GetCopyForRead allows for iteration + without taking a lock. + + + + + Gets a copy of the contents of the list. The copy will not change even if the original + CopyOnWriteList object is modified. This method should be used to iterate the list in + a thread-safe way if no lock is taken. Iterating on the original list is not guaranteed + to be thread-safe. + + The returned copy should not be modified by the caller. + + + + Presents a flat enumerable view of multiple dictionaries + + + + + Returns the list of expressions represented by the instances. + + An array of instances to extract expressions from. + The array of expressions. + + + + Creates an instance of for a runtime value and the expression that represents it during the binding process. + + The runtime value to be represented by the . + An expression to represent this during the binding process. + The new instance of . + + + + Produces an interpreted binding using the given binder which falls over to a compiled + binding after hitCount tries. + + This method should be called whenever an interpreted binding is required. Sometimes it will + return a compiled binding if a previous binding was produced and it's hit count was exhausted. + In this case the binder will not be called back for a new binding - the previous one will + be used. + + The delegate type being used for the call site + The binder used for the call site + The number of calls before the binder should switch to a compiled mode. + The arguments that are passed for the binding (as received in a BindDelegate call) + A delegate which represents the interpreted binding. + + + + Expression which reduces to the normal test but under the interpreter adds a count down + check which enables compiling when the count down is reached. + + + + + Base class for storing information about the binding that a specific rule is applicable for. + + We have a derived generic class but this class enables us to refer to it w/o having the + generic type information around. + + This class tracks both the count down to when we should compile. When we compile we + take the Expression[T] that was used before and compile it. While this is happening + we continue to allow the interpreted code to run. When the compilation is complete we + store a thread static which tells us what binding failed and the current rule is no + longer functional. Finally the language binder will call us again and we'll retrieve + and return the compiled overload. + + + + + A hybrid dictionary which compares based upon object identity. + + + + + Seeks the first character of a specified line in the text stream. + + The reader. + Line number. The current position is assumed to be line #1. + + Returns true if the line is found, false otherwise. + + + + + Reads characters to a string until end position or a terminator is reached. + Doesn't include the terminator into the resulting string. + Returns null, if the reader is at the end position. + + + + + Reads characters until end position or a terminator is reached. + Returns true if the character has been found (the reader is positioned right behind the character), + false otherwise. + + + + + Calculates the quotient of two 32-bit signed integers rounded towards negative infinity. + + Dividend. + Divisor. + The quotient of the specified numbers rounded towards negative infinity, or (int)Floor((double)x/(double)y). + is 0. + The caller must check for overflow (x = Int32.MinValue, y = -1) + + + + Calculates the quotient of two 64-bit signed integers rounded towards negative infinity. + + Dividend. + Divisor. + The quotient of the specified numbers rounded towards negative infinity, or (int)Floor((double)x/(double)y). + is 0. + The caller must check for overflow (x = Int64.MinValue, y = -1) + + + + Calculates the remainder of floor division of two 32-bit signed integers. + + Dividend. + Divisor. + The remainder of of floor division of the specified numbers, or x - (int)Floor((double)x/(double)y) * y. + is 0. + + + + Calculates the remainder of floor division of two 32-bit signed integers. + + Dividend. + Divisor. + The remainder of of floor division of the specified numbers, or x - (int)Floor((double)x/(double)y) * y. + is 0. + + + + Behaves like Math.Round(value, MidpointRounding.AwayFromZero) + Needed because CoreCLR doesn't support this particular overload of Math.Round + + + + + Behaves like Math.Round(value, precision, MidpointRounding.AwayFromZero) + However, it works correctly on negative precisions and cases where precision is + outside of the [-15, 15] range. + + (This function is also needed because CoreCLR lacks this overload.) + + + + + Evaluates a polynomial in v0 where the coefficients are ordered in increasing degree + + + + + Evaluates a polynomial in v0 where the coefficients are ordered in increasing degree + if reverse is false, and increasing degree if reverse is true. + + + + + A numerically precise version of sin(v0 * pi) + + + + + A numerically precise version of |sin(v0 * pi)| + + + + + Take the quotient of the 2 polynomials forming the Lanczos approximation + with N=13 and G=13.144565 + + + + + Computes the Gamma function on positive values, using the Lanczos approximation. + Lanczos parameters are N=13 and G=13.144565. + + + + + Computes the Log-Gamma function on positive values, using the Lanczos approximation. + Lanczos parameters are N=13 and G=13.144565. + + + + + Thread safe dictionary that allows lazy-creation where readers will block for + the creation of the lazily created value. Call GetOrCreateValue w/ a key + and a callback function. If the value exists it is returned, if not the create + callback is called (w/o any locks held). The create call back will only be called + once for each key. + + + + + Helper class which stores the published value + + + + + Converts a boxed enum value to the underlying integer value. + + + + + Creates an open delegate for the given (dynamic)method. + + + + + Creates a closed delegate for the given (dynamic)method. + + + + + Gets a Func of CallSite, object * paramCnt, object delegate type + that's suitable for use in a non-strongly typed call site. + + + + + Returns true if the specified parameter is mandatory, i.e. is not optional and doesn't have a default value. + + + + + Yields all ancestors of the given type including the type itself. + Does not include implemented interfaces. + + + + + Like Type.GetInterfaces, but only returns the interfaces implemented by this type + and not its parents. + + + + + Enumerates extension methods in given assembly. Groups the methods by declaring namespace. + Uses a global cache if is true. + + + + + Binds occurances of generic parameters in against corresponding types in . + Invokes (parameter, type) for each such binding. + Returns false if the is structurally different from or if the binder returns false. + + + + + Determines if a given type matches the type that the method extends. + The match might be non-trivial if the extended type is an open generic type with constraints. + + + + + Splits text and optionally indents first lines - breaks along words, not characters. + + + + + Dictionary[TKey, TValue] is not thread-safe in the face of concurrent reads and writes. SynchronizedDictionary + provides a thread-safe implementation. It holds onto a Dictionary[TKey, TValue] instead of inheriting from + it so that users who need to do manual synchronization can access the underlying Dictionary[TKey, TValue]. + + + + + This returns the raw unsynchronized Dictionary[TKey, TValue]. Users are responsible for locking + on it before accessing it. Also, it should not be arbitrarily handed out to other code since deadlocks + can be caused if other code incorrectly locks on it. + + + + + Provides fast strongly typed thread local storage. This is significantly faster than + Thread.GetData/SetData. + + + + + True if the caller will guarantee that all cleanup happens as the thread + unwinds. + + This is typically used in a case where the thread local is surrounded by + a try/finally block. The try block pushes some state, the finally block + restores the previous state. Therefore when the thread exits the thread + local is back to it's original state. This allows the ThreadLocal object + to not check the current owning thread on retrieval. + + + + + Gets or sets the value for the current thread. + + + + + Gets the current value if its not == null or calls the provided function + to create a new value. + + + + + Calls the provided update function with the current value and + replaces the current value with the result of the function. + + + + + Replaces the current value with a new one and returns the old value. + + + + + Gets the StorageInfo for the current thread. + + + + + Called when the fast path storage lookup fails. if we encountered the Empty storage + during the initial fast check then spin until we hit non-empty storage and try the fast + path again. + + + + + Creates the StorageInfo for the thread when one isn't already present. + + + + + Helper class for storing the value. We need to track if a ManagedThreadId + has been re-used so we also store the thread which owns the value. + + + + + Caches type member lookup. + + + When enumerating members (methods, properties, events) of a type (declared or inherited) Reflection enumerates all + runtime members of the type and its base types and caches the result. + When looking for a member of a specific name Reflection still enumerates all and filters out those that don't match the name. + That's inefficient when looking for members of multiple names one by one. + Instead we build a map of name to member list and then answer subsequent queries by simply looking up the dictionary. + + + + + Returns a numerical code of the size of a type. All types get both a horizontal + and vertical code. Types that are lower in both dimensions have implicit conversions + to types that are higher in both dimensions. + + + + + Represents an array that has value equality. + + + + + Simple class for tracking a list of items and enumerating over them. + The items are stored in weak references; if the objects are collected, + they will not be seen when enumerating. + + The type of the collection element. + + + + Similar to Dictionary[TKey,TValue], but it also ensures that the keys will not be kept alive + if the only reference is from this collection. The value will be kept alive as long as the key + is alive. + + This currently has a limitation that the caller is responsible for ensuring that an object used as + a key is not also used as a value in *any* instance of a WeakHash. Otherwise, it will result in the + object being kept alive forever. This effectively means that the owner of the WeakHash should be the + only one who has access to the object used as a value. + + Currently, there is also no guarantee of how long the values will be kept alive even after the keys + get collected. This could be fixed by triggerring CheckCleanup() to be called on every garbage-collection + by having a dummy watch-dog object with a finalizer which calls CheckCleanup(). + + + + + Check if any of the keys have gotten collected + + Currently, there is also no guarantee of how long the values will be kept alive even after the keys + get collected. This could be fixed by triggerring CheckCleanup() to be called on every garbage-collection + by having a dummy watch-dog object with a finalizer which calls CheckCleanup(). + + + + + Changes the semantics of GC handle to return null instead of throwing + an . + + + + diff --git a/unity-examples/magic-unity-coexist/Assets/Plugins/clojure-clr/dynamiclanguageruntime.1.3.2/net45/Microsoft.Dynamic.xml.meta b/unity-examples/magic-unity-coexist/Assets/Plugins/clojure-clr/dynamiclanguageruntime.1.3.2/net45/Microsoft.Dynamic.xml.meta new file mode 100644 index 00000000..c8e648fa --- /dev/null +++ b/unity-examples/magic-unity-coexist/Assets/Plugins/clojure-clr/dynamiclanguageruntime.1.3.2/net45/Microsoft.Dynamic.xml.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: c2db3ea74c8bf4ac892d31a8153cc3b2 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/unity-examples/magic-unity-coexist/Assets/Plugins/clojure-clr/dynamiclanguageruntime.1.3.2/net45/Microsoft.Scripting.Metadata.dll b/unity-examples/magic-unity-coexist/Assets/Plugins/clojure-clr/dynamiclanguageruntime.1.3.2/net45/Microsoft.Scripting.Metadata.dll new file mode 100644 index 00000000..fb560b71 Binary files /dev/null and b/unity-examples/magic-unity-coexist/Assets/Plugins/clojure-clr/dynamiclanguageruntime.1.3.2/net45/Microsoft.Scripting.Metadata.dll differ diff --git a/unity-examples/magic-unity-coexist/Assets/Plugins/clojure-clr/dynamiclanguageruntime.1.3.2/net45/Microsoft.Scripting.Metadata.dll.meta b/unity-examples/magic-unity-coexist/Assets/Plugins/clojure-clr/dynamiclanguageruntime.1.3.2/net45/Microsoft.Scripting.Metadata.dll.meta new file mode 100644 index 00000000..0dfe8ec9 --- /dev/null +++ b/unity-examples/magic-unity-coexist/Assets/Plugins/clojure-clr/dynamiclanguageruntime.1.3.2/net45/Microsoft.Scripting.Metadata.dll.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 5898c9d6482234e49b378f476f50dda9 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 1 + settings: + DefaultValueInitialized: true + - first: + Windows Store Apps: WindowsStoreApps + second: + enabled: 0 + settings: + CPU: AnyCPU + userData: + assetBundleName: + assetBundleVariant: diff --git a/unity-examples/magic-unity-coexist/Assets/Plugins/clojure-clr/dynamiclanguageruntime.1.3.2/net45/Microsoft.Scripting.Metadata.xml b/unity-examples/magic-unity-coexist/Assets/Plugins/clojure-clr/dynamiclanguageruntime.1.3.2/net45/Microsoft.Scripting.Metadata.xml new file mode 100644 index 00000000..a03cad53 --- /dev/null +++ b/unity-examples/magic-unity-coexist/Assets/Plugins/clojure-clr/dynamiclanguageruntime.1.3.2/net45/Microsoft.Scripting.Metadata.xml @@ -0,0 +1,373 @@ + + + + Microsoft.Scripting.Metadata + + + + + Represents a block in memory. + + + + + Reads data from a memory block. Maintains a position. + + + + + Reads zero terminated sequence of bytes of given maximal length and converts it into an ASCII string. + + + + + Zero terminated, UTF8 encoded sequence of bytes representing a name in metadata (a type name, a member name, etc). + The name is bound to the module it was retrieved from. The module is kept alive until all its metadata names are collected. + Doesn't cache hashcode, byte or character count. + + + + + Gets the module whose metadata tables this instance represents. + Null if the tables reflect unloaded module file. + + + + + Gets the path of the module whose metadata tables this instance represents. + Null for in-memory modules that are not backed by a file. + + The path is not accessible in partial trust. + + + + Returns AssemblyDef for manifest modules, null token otherwise. + + + + + Token is null or represents a row in a metadata table. + + + + + Gets the number of records in the view. + If the view is over an entire table this operation is O(1), + otherwise it might take up to O(log(#records in the table)). + + + + + Module table entry (0x00 tokens). + + + + + TypeRef table entry (0x01 tokens). + + + + + AssemblyRef: + If the target type is defined in a different Assembly from the current module. + TypeRef: + Target type is nested in TypeRef. + ModuleRef: + Target type is defined in another module within the same Assembly as this one. + ModuleDef: + If the target type is defined in the current module (this should not occur in a CLI "compressed metadata" module). + Null token: + There shall be a row in the ExportedType table for this Type - its Implementation field shall contain + a File token or an AssemblyRef token that says where the type is defined. + + + + + TypeDef table entry (0x02 tokens). + + + + + Flags field in TypeDef table. + + + + + Finds a nesting type-def. The search time is logarithmic in the number of nested types defined in the owning module. + Returns a null token if this is not a nested type-def. + + + + + O(log(#generic parameters in module)) + + + + + This typedef represents a container of global functions and fields (manufactured <Module> type). + + + + + Combines Field (0x04 tokens), FieldRVA (0x1d tokens) and Constant (0x0B) table entries. + + + + + Flags field in the Field table. + + + + + O(log(#fields, parameters and properties with default value)). + Returns if the field doesn't have a default value. + + + + + Returns null reference iff the field has no RVA. + If size is 0 the memory block will span over the rest of the data section. + O(log(#fields with RVAs)). + + + + + Finds type-def that declares this field. The search time is logarithmic in the number of types defined in the owning module. + + + + + MethodDef table entry (0x06 tokens). + + + + + ImplFlags field in the MethodDef table. + + + + + Flags field in the MethodDef table. + + + + + Returns a null reference iff the method has no body. + If size is 0 the memory block will span over the rest of the data section. + + + + + Finds type-def that declares this method. The search time is logarithmic in the number of types defined in the owning module. + + + + + O(log(#generic parameters in module)) + + + + + Param table entry (0x08 tokens). + + + + + Value greater or equal to zero and less than or equal to the number of parameters in owner method. + A value of 0 refers to the owner method's return type; its parameters are then numbered from 1 onwards. + Not all parameters need to have a corresponding ParamDef entry. + + + + + O(log(#fields, parameters and properties with default value)). + Returns if the field doesn't have a default value. + + + + + Binary searches MethodDef table for a method that declares this parameter. + + + + + InterfaceImpl table entry (0x09 tokens). + TODO: we might not need this - TypeDef.ImplementedInterfaces might be a special enumerator that directly returns InterfaceType tokens. + + + + + Could be a null token in EnC scenarios. + + + + + TypeDef, TypeRef, or TypeSpec. + + + + + MemberRef table entry (0x0A tokens). + Stores MethodRefs and FieldRefs. + + + + + TypeRef or TypeDef: + If the class that defines the member is defined in another module. + Note that it is unusual, but valid, to use a TypeRef token when the member is defined in this same module, + in which case, its TypeDef token can be used instead. + ModuleRef: + If the member is defined, in another module of the same assembly, as a global function or variable. + MethodDef: + When used to supply a call-site signature for a vararg method that is defined in this module. + The Name shall match the Name in the corresponding MethodDef row. + The Signature shall match the Signature in the target method definition + TypeSpec: + If the member is a member of a generic type + + + + + CustomAttribute table entry (0x0C tokens). + + + + + Any token except the CustomAttribute. + + + + + Returns the value of Type column in the CustomAttribute table. + MethodDef or MemberRef. + + + + + Value blob. + + + + + StandAloneSig table entry (0x11 token). + + + + + Combines information from PropertyMap (0x15), MethodSemantics (0x18) and Property (0x17) tables. + + + + + O(log(#fields, parameters and properties with default value)). + Returns if the field doesn't have a default value. + + + + + Finds type-def that declares this property. The search time is logarithmic in the number of types with properties defined in the owning module. + + + + + Combines information from EventMap (0x15), MethodSemantics (0x18) and Event (0x17) tables. + + + + + Finds type-def that declares this event. The search time is logarithmic in the number of types with events defined in the owning module. + + + + + ModuleRef table entry (0x1A tokens). + + + + + TypeSpec table entry (0x1B tokens). + + + + + Assembly table entry (0x20 tokens). + + + + + Assembly table entry (0x23 tokens). + + + + + File table entry (0x26 tokens). + + + + + ExportedType table entry (0x27 tokens). + + + + + Forwarded type: AssemblyRef + Nested types: ExportedType + Type in another module of this assembly: FileDef + + + + + ManifestResource table entry (0x28 tokens). + + + + + NestedClass table entry (0x29 tokens). + TODO: Don't need if we exposed nested types enumeration on type-def directly and build TypeNesting mapping lazily. + + + + + GenericParam table entry (0x2A tokens). + + + + + Value greater or equal to zero and less than or equal to the number of parameters in owner method/type. + All generic parameters are listed in the table. + + + + + TypeDef or MethodDef. + + + + + GenericParamConstraint table entry (0x2C tokens). + + + + + TypeDef, TypeRef, or TypeSpec. + + + + + MethodSpec table entry (0x2B tokens). + Used when decoding IL instructions. + + + + + MethodDef or MethodRef. + + + + + We need to be able to construct tokens out of byte-code. + + + + diff --git a/unity-examples/magic-unity-coexist/Assets/Plugins/clojure-clr/dynamiclanguageruntime.1.3.2/net45/Microsoft.Scripting.Metadata.xml.meta b/unity-examples/magic-unity-coexist/Assets/Plugins/clojure-clr/dynamiclanguageruntime.1.3.2/net45/Microsoft.Scripting.Metadata.xml.meta new file mode 100644 index 00000000..f366fda5 --- /dev/null +++ b/unity-examples/magic-unity-coexist/Assets/Plugins/clojure-clr/dynamiclanguageruntime.1.3.2/net45/Microsoft.Scripting.Metadata.xml.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: e1bf8fe331b984cdcbee94fc42c9a75f +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/unity-examples/magic-unity-coexist/Assets/Plugins/clojure-clr/dynamiclanguageruntime.1.3.2/net45/Microsoft.Scripting.dll b/unity-examples/magic-unity-coexist/Assets/Plugins/clojure-clr/dynamiclanguageruntime.1.3.2/net45/Microsoft.Scripting.dll new file mode 100644 index 00000000..c6b44711 Binary files /dev/null and b/unity-examples/magic-unity-coexist/Assets/Plugins/clojure-clr/dynamiclanguageruntime.1.3.2/net45/Microsoft.Scripting.dll differ diff --git a/unity-examples/magic-unity-coexist/Assets/Plugins/clojure-clr/dynamiclanguageruntime.1.3.2/net45/Microsoft.Scripting.dll.meta b/unity-examples/magic-unity-coexist/Assets/Plugins/clojure-clr/dynamiclanguageruntime.1.3.2/net45/Microsoft.Scripting.dll.meta new file mode 100644 index 00000000..967a9310 --- /dev/null +++ b/unity-examples/magic-unity-coexist/Assets/Plugins/clojure-clr/dynamiclanguageruntime.1.3.2/net45/Microsoft.Scripting.dll.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: e1ede29e1fe3045dfae721f46edfb74e +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 1 + settings: + DefaultValueInitialized: true + - first: + Windows Store Apps: WindowsStoreApps + second: + enabled: 0 + settings: + CPU: AnyCPU + userData: + assetBundleName: + assetBundleVariant: diff --git a/unity-examples/magic-unity-coexist/Assets/Plugins/clojure-clr/dynamiclanguageruntime.1.3.2/net45/Microsoft.Scripting.xml b/unity-examples/magic-unity-coexist/Assets/Plugins/clojure-clr/dynamiclanguageruntime.1.3.2/net45/Microsoft.Scripting.xml new file mode 100644 index 00000000..cbed2642 --- /dev/null +++ b/unity-examples/magic-unity-coexist/Assets/Plugins/clojure-clr/dynamiclanguageruntime.1.3.2/net45/Microsoft.Scripting.xml @@ -0,0 +1,3840 @@ + + + + Microsoft.Scripting + + + + + Class that represents compiler options. + Note that this class is likely to change when hosting API becomes part of .Net + + + + + This overload will be called when a SourceUnit is not available. This can happen if the code is being executed remotely, + since SourceUnit cannot be marshaled across AppDomains. + + + + + Hosting API counterpart for . + + + + + Engine that compiled this code. + + + + + Default scope for this code. + + + + + Executes code in a default scope. + + + + + Execute code within a given scope and returns the result. + + + + + Executes code in in a default scope and converts to a given type. + + + + + Execute code within a given scope and converts result to a given type. + + + + + Executes the code in an empty scope. + Returns an ObjectHandle wrapping the resulting value of running the code. + + + + + Executes the code in the specified scope. + Returns an ObjectHandle wrapping the resulting value of running the code. + + + + + Executes the code in an empty scope. + Returns an ObjectHandle wrapping the resulting value of running the code. + + If an exception is thrown the exception is caught and an ObjectHandle to + the exception is provided. + + + Use this API to handle non-serializable exceptions (exceptions might not be serializable due to security restrictions) + or if an exception serialization loses information. + + + + + Executes the expression in the specified scope and return a result. + Returns an ObjectHandle wrapping the resulting value of running the code. + + If an exception is thrown the exception is caught and an ObjectHandle to + the exception is provided. + + + Use this API to handle non-serializable exceptions (exceptions might not be serializable due to security restrictions) + or if an exception serialization loses information. + + + + + Provides documentation against live objects for use in a REPL window. + + + + + Gets the available members defined on the provided object. + + + + + Gets the overloads available for the provided object if it is invokable. + + + + + Gets the available members on the provided remote object. + + + + + Gets the overloads available for the provided remote object if it is invokable. + + + + + The host can use this class to track for errors reported during script parsing and compilation. + Hosting API counterpart for . + + + + + Bridges ErrorSink and ErrorListener. + Errors reported by language compilers to ErrorSink are forwarded to the ErrorListener provided by the host. + + + This proxy is created in the scenario when the compiler is processing a single SourceUnit. + Therefore it could maintain one to one mapping from SourceUnit to ScriptSource. + In a case, which shouldn't happen, that the compiler reports an error in a different SourceUnit we just create + a new instance of the ScriptSource each time. + + TODO: Consider compilation of multiple source units and creating a hashtable mapping SourceUnits to ScriptSources + within the context of compilation unit. + + + + + Bridges ErrorListener and ErrorSink. It provides the reverse functionality as ErrorSinkProxyListener + + + + + Stores information needed to setup a language + + + + + Creates a new LanguageSetup + + assembly qualified type name of the language + provider + + + + Creates a new LanguageSetup with the provided options + TODO: remove this overload? + + + + + Creates a new LanguageSetup with the provided options + + + + + Gets an option as a strongly typed value. + + + + + The assembly qualified type name of the language provider + + + + + Display name of the language. If empty, it will be set to the first + name in the Names list. + + + + + Case-insensitive language names. + + + + + Case-insensitive file extension, optionally starts with a dot. + + + + + Option names are case-sensitive. + + + + + Provides documentation about a member in a live object. + + + + + The name of the member + + + + + The kind of the member if it's known. + + + + + Specifies the type of member. + + + + + ObjectOperations provide a large catalogue of object operations such as member access, conversions, + indexing, and things like addition. There are several introspection and tool support services available + for more advanced hosts. + + You get ObjectOperation instances from ScriptEngine, and they are bound to their engines for the semantics + of the operations. There is a default instance of ObjectOperations you can share across all uses of the + engine. However, very advanced hosts can create new instances. + + + + + Returns true if the object can be called, false if it cannot. + + Even if an object is callable Call may still fail if an incorrect number of arguments or type of arguments are provided. + + + + + Invokes the provided object with the given parameters and returns the result. + + The prefered way of calling objects is to convert the object to a strongly typed delegate + using the ConvertTo methods and then invoking that delegate. + + + + + Invokes a member on the provided object with the given parameters and returns the result. + + + + + Creates a new instance from the provided object using the given parameters, and returns the result. + + + + + Gets the member name from the object obj. Throws an exception if the member does not exist or is write-only. + + + + + Gets the member name from the object obj and converts it to the type T. Throws an exception if the + member does not exist, is write-only, or cannot be converted. + + + + + Gets the member name from the object obj. Returns true if the member is successfully retrieved and + stores the value in the value out param. + + + + + Returns true if the object has a member named name, false if the member does not exist. + + + + + Removes the member name from the object obj. + + + + + Sets the member name on object obj to value. + + + + + Sets the member name on object obj to value. This overload can be used to avoid + boxing and casting of strongly typed members. + + + + + Gets the member name from the object obj. Throws an exception if the member does not exist or is write-only. + + + + + Gets the member name from the object obj and converts it to the type T. Throws an exception if the + member does not exist, is write-only, or cannot be converted. + + + + + Gets the member name from the object obj. Returns true if the member is successfully retrieved and + stores the value in the value out param. + + + + + Returns true if the object has a member named name, false if the member does not exist. + + + + + Removes the member name from the object obj. + + + + + Sets the member name on object obj to value. + + + + + Sets the member name on object obj to value. This overload can be used to avoid + boxing and casting of strongly typed members. + + + + + Converts the object obj to the type T. The conversion will be explicit or implicit depending on + what the langauge prefers. + + + + + Converts the object obj to the type type. The conversion will be explicit or implicit depending on + what the langauge prefers. + + + + + Converts the object obj to the type T. Returns true if the value can be converted, false if it cannot. + + The conversion will be explicit or implicit depending on what the langauge prefers. + + + + + Converts the object obj to the type type. Returns true if the value can be converted, false if it cannot. + + The conversion will be explicit or implicit depending on what the langauge prefers. + + + + + Converts the object obj to the type T including explicit conversions which may lose information. + + + + + Converts the object obj to the type type including explicit conversions which may lose information. + + + + + Converts the object obj to the type T including explicit conversions which may lose information. + + Returns true if the value can be converted, false if it cannot. + + + + + Converts the object obj to the type type including explicit conversions which may lose information. + + Returns true if the value can be converted, false if it cannot. + + + + + Converts the object obj to the type T including implicit conversions. + + + + + Converts the object obj to the type type including implicit conversions. + + + + + Converts the object obj to the type T including implicit conversions. + + Returns true if the value can be converted, false if it cannot. + + + + + Converts the object obj to the type type including implicit conversions. + + Returns true if the value can be converted, false if it cannot. + + + + + Performs a generic unary operation on the specified target and returns the result. + + + + + Performs a generic unary operation on the strongly typed target and returns the value as the specified type + + + + + Performs the generic binary operation on the specified targets and returns the result. + + + + + Peforms the generic binary operation on the specified strongly typed targets and returns + the strongly typed result. + + + + + Performs addition on the specified targets and returns the result. Throws an exception + if the operation cannot be performed. + + + + + Performs subtraction on the specified targets and returns the result. Throws an exception + if the operation cannot be performed. + + + + + Raises the first object to the power of the second object. Throws an exception + if the operation cannot be performed. + + + + + Multiplies the two objects. Throws an exception + if the operation cannot be performed. + + + + + Divides the first object by the second object. Throws an exception + if the operation cannot be performed. + + + + + Performs modulus of the 1st object by the second object. Throws an exception + if the operation cannot be performed. + + + + + Shifts the left object left by the right object. Throws an exception if the + operation cannot be performed. + + + + + Shifts the left object right by the right object. Throws an exception if the + operation cannot be performed. + + + + + Performs a bitwise-and of the two operands. Throws an exception if the operation + cannot be performed. + + + + + Performs a bitwise-or of the two operands. Throws an exception if the operation + cannot be performed. + + + + + Performs a exclusive-or of the two operands. Throws an exception if the operation + cannot be performed. + + + + + Compares the two objects and returns true if the left object is less than the right object. + Throws an exception if hte comparison cannot be performed. + + + + + Compares the two objects and returns true if the left object is greater than the right object. + Throws an exception if hte comparison cannot be performed. + + + + + Compares the two objects and returns true if the left object is less than or equal to the right object. + Throws an exception if hte comparison cannot be performed. + + + + + Compares the two objects and returns true if the left object is greater than or equal to the right object. + Throws an exception if hte comparison cannot be performed. + + + + + Compares the two objects and returns true if the left object is equal to the right object. + Throws an exception if the comparison cannot be performed. + + + + + Compares the two objects and returns true if the left object is not equal to the right object. + Throws an exception if hte comparison cannot be performed. + + + + + Returns a string which describes the object as it appears in source code + + + + + Returns a string representation of the object in a language specific object display format. + + + + + Returns a list of strings which contain the known members of the object. + + + + + Returns a string providing documentation for the specified object. + + + + + Returns a list of signatures applicable for calling the specified object in a form displayable to the user. + + + + + Returns true if the remote object is callable. + + + + + Invokes the specified remote object with the specified remote parameters. + + Though delegates are preferable for calls they may not always be usable for remote objects. + + + + + Invokes the specified remote object with the local parameters which will be serialized + to the remote app domain. + + + + + Creates a new remote instance from the provided remote object using the given parameters, and returns the result. + + + + + Creates a new remote instance from the provided remote object using the given parameters, and returns the result. + + + + + Sets the remote object as a member on the provided remote object. + + + + + Sets the member name on the remote object obj to value. This overload can be used to avoid + boxing and casting of strongly typed members. + + + + + Gets the member name on the remote object. Throws an exception if the member is not defined or + is write-only. + + + + + Gets the member name on the remote object. Throws an exception if the member is not defined or + is write-only. + + + + + Gets the member name on the remote object. Returns false if the member is not defined or + is write-only. + + + + + Tests to see if the member name is defined on the remote object. + + + + + Removes the member from the remote object + + + + + Converts the remote object into the specified type returning a handle to + the new remote object. The conversion will be explicit or implicit depending on + what the langauge prefers. + + + + + Converts the remote object into the specified type returning a handle to + the new remote object. The conversion will be explicit or implicit depending on + what the langauge prefers. + + + + + Converts the remote object into the specified type returning a handle to + the new remote object. Returns true if the value can be converted, + false if it cannot. The conversion will be explicit or implicit depending on + what the langauge prefers. + + + + + Converts the remote object into the specified type returning a handle to + the new remote object. Returns true if the value can be converted, + false if it cannot. The conversion will be explicit or implicit depending on + what the langauge prefers. + + + + + Converts the object obj to the type T including explicit conversions which may lose information. + + + + + Converts the object obj to the type type including explicit conversions which may lose information. + + + + + Converts the object obj to the type T including explicit conversions which may lose information. + + Returns true if the value can be converted, false if it cannot. + + + + + Converts the object obj to the type type including explicit conversions which may lose information. + + Returns true if the value can be converted, false if it cannot. + + + + + Converts the object obj to the type T including implicit conversions. + + + + + Converts the object obj to the type type including implicit conversions. + + + + + Converts the object obj to the type T including implicit conversions. + + Returns true if the value can be converted, false if it cannot. + + + + + Converts the object obj to the type type including implicit conversions. + + Returns true if the value can be converted, false if it cannot. + + + + + Unwraps the remote object and converts it into the specified type before + returning it. + + + + + Performs the specified unary operator on the remote object. + + + + + Performs the specified binary operator on the remote object. + + + + + Adds the two remote objects. Throws an exception if the operation cannot be performed. + + + + + Subtracts the 1st remote object from the second. Throws an exception if the operation cannot be performed. + + + + + Raises the 1st remote object to the power of the 2nd. Throws an exception if the operation cannot be performed. + + + + + Multiplies the two remote objects. Throws an exception if the operation cannot be performed. + + + + + Divides the 1st remote object by the 2nd. Throws an exception if the operation cannot be performed. + + + + + Performs modulus on the 1st remote object by the 2nd. Throws an exception if the operation cannot be performed. + + + + + Shifts the 1st remote object left by the 2nd remote object. Throws an exception if the operation cannot be performed. + + + + + Shifts the 1st remote object right by the 2nd remote object. Throws an exception if the operation cannot be performed. + + + + + Performs bitwise-and on the two remote objects. Throws an exception if the operation cannot be performed. + + + + + Performs bitwise-or on the two remote objects. Throws an exception if the operation cannot be performed. + + + + + Performs exclusive-or on the two remote objects. Throws an exception if the operation cannot be performed. + + + + + Compares the two remote objects and returns true if the 1st is less than the 2nd. Throws an exception if the operation cannot be performed. + + + + + Compares the two remote objects and returns true if the 1st is greater than the 2nd. Throws an exception if the operation cannot be performed. + + + + + Compares the two remote objects and returns true if the 1st is less than or equal to the 2nd. Throws an exception if the operation cannot be performed. + + + + + Compares the two remote objects and returns true if the 1st is greater than or equal to than the 2nd. Throws an exception if the operation cannot be performed. + + + + + Compares the two remote objects and returns true if the 1st is equal to the 2nd. Throws an exception if the operation cannot be performed. + + + + + Compares the two remote objects and returns true if the 1st is not equal to the 2nd. Throws an exception if the operation cannot be performed. + + + + + Returns a string representation of the object in a langauge specific object display format. + + + + + Returns a list of strings which contain the known members of the remote object. + + + + + Returns a string providing documentation for the specified remote object. + + + + + Returns a list of signatures applicable for calling the specified object in a form displayable to the user. + + + + + Helper to unwrap an object - in the future maybe we should validate the current app domain. + + + + + Helper to unwrap multiple objects + + + + + Provides documentation for a single overload of an invokable object. + + + + + The name of the invokable object. + + + + + The documentation for the overload or null if no documentation is available. + + + + + The parameters for the invokable object. + + + + + Information about the return value. + + + + + Provides documentation for a single parameter. + + + + + The name of the parameter + + + + + The type name of the parameter or null if no type information is available. + + + + + Provides addition information about the parameter such as if it's a parameter array. + + + + + Gets the documentation string for this parameter or null if no documentation is available. + + + + + Indications extra information about a parameter such as if it's a parameter array. + + + + + Advanced APIs for HAPI providers. These methods should not be used by hosts. + They are provided for other hosting API implementers that would like to leverage existing HAPI and + extend it with language specific functionality, for example. + + + + is a null reference. + is remote. + + + e is a null reference. + is remote. + + + is a null reference. + is remote. + + + is a null reference. + is remote. + + + is a null reference. + is remote. + + + is a null reference. + is remote. + + + is a null reference. + is a null reference. + is a transparent proxy. + + + + Performs a callback in the ScriptEngine's app domain and returns the result. + + + + + Creates a new DocumentationOperations object from the given DocumentationProvider. + + + + + Represents a language in Hosting API. + Hosting API counterpart for . + + + + + Returns a default ObjectOperations for the engine. + + Because an ObjectOperations object caches rules for the types of + objects and operations it processes, using the default ObjectOperations for + many objects could degrade the caching benefits. Eventually the cache for + some operations could degrade to a point where ObjectOperations stops caching and + does a full search for an implementation of the requested operation for the given objects. + + Another reason to create a new ObjectOperations instance is to have it bound + to the specific view of a ScriptScope. Languages may attach per-language + behavior to a ScriptScope which would alter how the operations are performed. + + For simple hosting situations, this is sufficient behavior. + + + + + + + Returns a new ObjectOperations object. See the Operations property for why you might want to call this. + + + + + Returns a new ObjectOperations object that inherits any semantics particular to the provided ScriptScope. + + See the Operations property for why you might want to call this. + + + + + Executes an expression. The execution is not bound to any particular scope. + + The engine doesn't support code execution. + is a null reference. + + + + Executes an expression within the specified scope. + + The engine doesn't support code execution. + is a null reference. + is a null reference. + + + + Executes an expression within a new scope and converts result to the given type. + + The engine doesn't support code execution. + is a null reference. + + + + Executes an expression within the specified scope and converts result to the given type. + + The engine doesn't support code execution. + is a null reference. + is a null reference. + + + + Executes content of the specified file in a new scope and returns that scope. + + The engine doesn't support code execution. + is a null reference. + + + + Executes content of the specified file against the given scope. + + The . + The engine doesn't support code execution. + is a null reference. + is a null reference. + + + + Executes the expression in the specified scope and return a result. + Returns an ObjectHandle wrapping the resulting value of running the code. + + + + + Executes the code in an empty scope. + Returns an ObjectHandle wrapping the resulting value of running the code. + + + + + Executes the expression in the specified scope and return a result. + Returns an ObjectHandle wrapping the resulting value of running the code. + + If an exception is thrown the exception is caught and an ObjectHandle to + the exception is provided. + + + Use this API in case the exception is not serializable (for example, due to security restrictions) or its serialization + loses information that you need to access. + + + + + Executes the code in an empty scope. + Returns an ObjectHandle wrapping the resulting value of running the code. + + If an exception is thrown the exception is caught and an ObjectHandle to + the exception is provided. + + + Use this API in case the exception is not serializable (for example, due to security restrictions) or its serialization + loses information that you need to access. + + + + + Creates a new ScriptScope using the default storage container + + + + + Creates a new ScriptScope whose storage contains the provided dictionary of objects + + Accesses to the ScriptScope will turn into get,set, and delete members against this dictionary + + + + + Creates a new ScriptScope whose storage is an arbitrary object. + + Accesses to the ScriptScope will turn into get, set, and delete members against the object. + + + + + This method returns the ScriptScope in which a ScriptSource of given path was executed. + + The ScriptSource.Path property is the key to finding the ScriptScope. Hosts need + to make sure they create a ScriptSource and set its Path property appropriately. + + GetScope is primarily useful for tools that need to map files to their execution scopes. For example, + an editor and interpreter tool might run a file Foo that imports or requires a file Bar. + + The editor's user might later open the file Bar and want to execute expressions in its context. + The tool would need to find Bar's ScriptScope for setting the appropriate context in its interpreter window. + This method helps with this scenario. + + + + + Return a ScriptSource object from string contents with the current engine as the language binding. + + The default SourceCodeKind is AutoDetect. + + The ScriptSource's Path property defaults to null. + + + + + Return a ScriptSource object from string contents with the current engine as the language binding. + + The ScriptSource's Path property defaults to null. + + + + + Return a ScriptSource object from string contents with the current engine as the language binding. + + The default SourceCodeKind is AutoDetect. + + + + + Return a ScriptSource object from string contents. These are helpers for creating ScriptSources' with the right language binding. + + + + + Return a ScriptSource object from file contents with the current engine as the language binding. + + The path's extension does NOT have to be in ScriptRuntime.GetRegisteredFileExtensions + or map to this language engine with ScriptRuntime.GetEngineByFileExtension. + + The default SourceCodeKind is File. + + The ScriptSource's Path property will be the path argument. + + The encoding defaults to the default encoding of the language. + + + + + Return a ScriptSource object from file contents with the current engine as the language binding. + + The path's extension does NOT have to be in ScriptRuntime.GetRegisteredFileExtensions + or map to this language engine with ScriptRuntime.GetEngineByFileExtension. + + The default SourceCodeKind is File. + + The ScriptSource's Path property will be the path argument. + + + + + Return a ScriptSource object from file contents with the current engine as the language binding. + + The path's extension does NOT have to be in ScriptRuntime.GetRegisteredFileExtensions + or map to this language engine with ScriptRuntime.GetEngineByFileExtension. + + The ScriptSource's Path property will be the path argument. + + + + + This method returns a ScriptSource object from a System.CodeDom.CodeObject. + This is a factory method for creating a ScriptSources with this language binding. + + The expected CodeDom support is extremely minimal for syntax-independent expression of semantics. + + Languages may do more, but hosts should only expect CodeMemberMethod support, + and only sub nodes consisting of the following: + CodeSnippetStatement + CodeSnippetExpression + CodePrimitiveExpression + CodeMethodInvokeExpression + CodeExpressionStatement (for holding MethodInvoke) + + + + + This method returns a ScriptSource object from a System.CodeDom.CodeObject. + This is a factory method for creating a ScriptSources with this language binding. + + The expected CodeDom support is extremely minimal for syntax-independent expression of semantics. + + Languages may do more, but hosts should only expect CodeMemberMethod support, + and only sub nodes consisting of the following: + CodeSnippetStatement + CodeSnippetExpression + CodePrimitiveExpression + CodeMethodInvokeExpression + CodeExpressionStatement (for holding MethodInvoke) + + + + + This method returns a ScriptSource object from a System.CodeDom.CodeObject. + This is a factory method for creating a ScriptSources with this language binding. + + The expected CodeDom support is extremely minimal for syntax-independent expression of semantics. + + Languages may do more, but hosts should only expect CodeMemberMethod support, + and only sub nodes consisting of the following: + CodeSnippetStatement + CodeSnippetExpression + CodePrimitiveExpression + CodeMethodInvokeExpression + CodeExpressionStatement (for holding MethodInvoke) + + + + + This method returns a ScriptSource object from a System.CodeDom.CodeObject. + This is a factory method for creating a ScriptSources with this language binding. + + The expected CodeDom support is extremely minimal for syntax-independent expression of semantics. + + Languages may do more, but hosts should only expect CodeMemberMethod support, + and only sub nodes consisting of the following: + CodeSnippetStatement + CodeSnippetExpression + CodePrimitiveExpression + CodeMethodInvokeExpression + CodeExpressionStatement (for holding MethodInvoke) + + + + + These methods return ScriptSource objects from stream contents with the current engine as the language binding. + + The default SourceCodeKind is File. + + The encoding defaults to the default encoding of the language. + + + + + These methods return ScriptSource objects from stream contents with the current engine as the language binding. + + The default SourceCodeKind is File. + + + + + These methods return ScriptSource objects from stream contents with the current engine as the language binding. + + The encoding defaults to Encoding.Default. + + + + + This method returns a ScriptSource with the content provider supplied with the current engine as the language binding. + + This helper lets you own the content provider so that you can implement a stream over internal host data structures, such as an editor's text representation. + + + + + This method returns a language-specific service. + + It provides a point of extensibility for a language implementation + to offer more functionality than the standard engine members discussed here. + + Commonly available services include: + TokenCategorizer + Provides standardized tokenization of source code + ExceptionOperations + Provides formatting of exception objects. + DocumentationProvidera + Provides documentation for live object. + + + + + This property returns readon-only LanguageOptions this engine is using. + + + The values are determined during runtime initialization and read-only afterwards. + You can change the settings via a configuration file or explicitly using ScriptRuntimeSetup class. + + + + + This property returns the ScriptRuntime for the context in which this engine executes. + + + + + This property returns the engine's version as a string. The format is language-dependent. + + + + + Sets the search paths used by the engine for loading files when a script wants + to import or require another file of code. + + The language doesn't allow to set search paths. + + + + Gets the search paths used by the engine for loading files when a script wants + to import or require another file of code. + + + + + ScriptHost is collocated with ScriptRuntime in the same app-domain. + The host can implement a derived class to consume some notifications and/or + customize operations like TryGetSourceUnit,ResolveSourceUnit, etc. + + The areguments to the the constructor of the derived class are specified in ScriptRuntimeSetup + instance that enters ScriptRuntime initialization. + + If the host is remote with respect to DLR (i.e. also with respect to ScriptHost) + and needs to access objects living in its app-domain it can pass MarshalByRefObject + as an argument to its ScriptHost subclass constructor. + + + + + The runtime the host is attached to. + + + + + Invoked after the initialization of the associated Runtime is finished. + The host can override this method to perform additional initialization of runtime (like loading assemblies etc.). + + + + + Invoked after a new language is loaded into the Runtime. + The host can override this method to perform additional initialization of language engines. + + + + + Provides hosting to DLR. Forwards DLR requests to the ScriptHost. + + + + + Provides host-redirectable IO streams used by DLR languages for default IO. + + + + + Used if the host stores the output as binary data. + + Binary stream to write data to. + Encoding used to convert textual data written to the output by the script. + + + + Used if the host handles both kinds of data (textual and binary) by itself. + + + + + Represents a Dynamic Language Runtime in Hosting API. + Hosting API counterpart for . + + + + + Creates ScriptRuntime in the current app-domain and initialized according to the the specified settings. + Creates an instance of host class specified in the setup and associates it with the created runtime. + Both Runtime and ScriptHost are collocated in the current app-domain. + + + + + Creates a new runtime with languages set up according to the current application configuration + (using System.Configuration). + + + + + Creates ScriptRuntime in the current app-domain and initialized according to the the specified settings. + Creates an instance of host class specified in the setup and associates it with the created runtime. + Both Runtime and ScriptHost are collocated in the specified app-domain. + + + + + + + + + Gets engine for the specified language. + + + + + Looks up the engine for the specified language. If the engine hasn't been created in this Runtime, it is instantiated here. + The method doesn't lock nor send notifications to the host. + + + + + path is empty, contains one or more of the invalid characters defined in GetInvalidPathChars or doesn't have an extension. + + + + path is null + file extension does not map to language engine + language does not have any search paths + file does exist in language's search path + + + + This property returns the "global object" or name bindings of the ScriptRuntime as a ScriptScope. + + You can set the globals scope, which you might do if you created a ScriptScope with an + IAttributesCollection so that your host could late bind names. + + + + + This method walks the assembly's namespaces and name bindings to ScriptRuntime.Globals + to represent the types available in the assembly. Each top-level namespace name gets + bound in Globals to a dynamic object representing the namespace. Within each top-level + namespace object, nested namespace names are bound to dynamic objects representing each + tier of nested namespaces. When this method encounters the same namespace-qualified name, + it merges names together objects representing the namespaces. + + + + + + Stores information needed to setup a ScriptRuntime + + + + + The list of language setup information for languages to load into + the runtime + + + + + Indicates that the script runtime is in debug mode. + This means: + + 1) Symbols are emitted for debuggable methods (methods associated with SourceUnit). + 2) Debuggable methods are emitted to non-collectable types (this is due to CLR limitations on dynamic method debugging). + 3) JIT optimization is disabled for all methods + 4) Languages may disable optimizations based on this value. + + + + + Ignore CLR visibility checks + + + + + Can be any derived class of ScriptHost. When set, it allows the + host to override certain methods to control behavior of the runtime + + + + + Option names are case-sensitive. + + + + + Arguments passed to the host type when it is constructed + + + + + Reads setup from .NET configuration system (.config files). + If there is no configuration available returns an empty setup. + + + + + Reads setup from a specified XML stream. + + + + + Reads setup from a specified XML file. + + + + + A ScriptScope is a unit of execution for code. It consists of a global Scope which + all code executes in. A ScriptScope can have an arbitrary initializer and arbitrary + reloader. + + ScriptScope is not thread safe. Host should either lock when multiple threads could + access the same module or should make a copy for each thread. + + Hosting API counterpart for . + + + + + Gets an engine for the language associated with this scope. + Returns invariant engine if the scope is language agnostic. + + + + + Gets a value stored in the scope under the given name. + + The specified name is not defined in the scope. + is a null reference. + + + + Gets a value stored in the scope under the given name. + Converts the result to the specified type using the conversion that the language associated with the scope defines. + If no language is associated with the scope, the default CLR conversion is attempted. + + The specified name is not defined in the scope. + is a null reference. + + + + Tries to get a value stored in the scope under the given name. + + is a null reference. + + + + Tries to get a value stored in the scope under the given name. + Converts the result to the specified type using the conversion that the language associated with the scope defines. + If no language is associated with the scope, the default CLR conversion is attempted. + + is a null reference. + + + + Sets the name to the specified value. + + is a null reference. + + + + Gets a handle for a value stored in the scope under the given name. + + The specified name is not defined in the scope. + is a null reference. + + + + Tries to get a handle for a value stored in the scope under the given name. + Returns true if there is such name, false otherwise. + + is a null reference. + + + + Sets the name to the specified value. + + + The value held by the handle isn't from the scope's app-domain and isn't serializable or MarshalByRefObject. + + or is a null reference. + + + + Determines if this context or any outer scope contains the defined name. + + is a null reference. + + + + Removes the variable of the given name from this scope. + + true if the value existed in the scope before it has been removed. + is a null reference. + + + + Gets a list of variable names stored in the scope. + + + + + Gets an array of variable names and their values stored in the scope. + + + + + Hosting counterpart for . + + + + + Identification of the source unit. Assigned by the host. + The format and semantics is host dependent (could be a path on file system or URL). + null for anonymous script source. + Cannot be an empty string. + + + + + Compile the ScriptSource into CompileCode object that can be executed + repeatedly in its default scope or in other scopes without having to recompile the code. + + Code cannot be compiled. + + + + Errors are reported to the specified listener. + Returns null if the parser cannot compile the code due to errors. + + + + + Errors are reported to the specified listener. + Returns null if the parser cannot compile the code due to error(s). + + + + + Errors are reported to the specified listener. + Returns null if the parser cannot compile the code due to error(s). + + + + + Executes the code in the specified scope. + Returns an object that is the resulting value of running the code. + + When the ScriptSource is a file or statement, the engine decides what is + an appropriate value to return. Some languages return the value produced + by the last expression or statement, but languages that are not expression + based may return null. + + Code cannot be compiled. + + + + Executes the source code. The execution is not bound to any particular scope. + + + + + Executes the code in a specified scope and converts the result to the specified type. + The conversion is language specific. + + + + + Executes the code in an empty scope and converts the result to the specified type. + The conversion is language specific. + + + + + Executes the code in an empty scope. + Returns an ObjectHandle wrapping the resulting value of running the code. + + + + + Executes the code in the specified scope. + Returns an ObjectHandle wrapping the resulting value of running the code. + + + + + Executes the code in an empty scope. + Returns an ObjectHandle wrapping the resulting value of running the code. + + If an exception is thrown the exception is caught and an ObjectHandle to + the exception is provided. + + + Use this API to handle non-serializable exceptions (exceptions might not be serializable due to security restrictions) + or if an exception serialization loses information. + + + + + Executes the expression in the specified scope and return a result. + Returns an ObjectHandle wrapping the resulting value of running the code. + + If an exception is thrown the exception is caught and an ObjectHandle to + the exception is provided. + + + Use this API to handle non-serializable exceptions (exceptions might not be serializable due to security restrictions) + or if an exception serialization loses information. + + + + + Runs a specified code as if it was a program launched from OS command shell. + and returns a process exit code indicating the success or error condition + of executing the code. + + Exact behavior depends on the language. Some languages have a dedicated "exit" exception that + carries the exit code, in which case the exception is cought and the exit code is returned. + The default behavior returns the result of program's execution converted to an integer + using a language specific conversion. + + Code cannot be compiled. + + + + Detects the encoding of the content. + + + An encoding that is used by the reader of the script source to transcode its content to Unicode text. + Null if the content is already textual and no transcoding is performed. + + + Note that the default encoding specified when the script source is created could be overridden by + an encoding that is found in the content preamble (Unicode BOM or a language specific encoding preamble). + In that case the preamble encoding is returned. Otherwise, the default encoding is returned. + + An I/O error occurs. + + + + Reads specified range of lines (or less) from the source unit. + + 1-based number of the first line to fetch. + The number of lines to fetch. + + Which character sequences are considered line separators is language specific. + If language doesn't specify otherwise "\r", "\n", "\r\n" are recognized line separators. + + An I/O error occurs. + + + + Reads a specified line. + + 1-based line number. + Line content. Line separator is not included. + An I/O error occurs. + + Which character sequences are considered line separators is language specific. + If language doesn't specify otherwise "\r", "\n", "\r\n" are recognized line separators. + + + + + Gets script source content. + + Entire content. + An I/O error occurs. + + The result includes language specific preambles (e.g. "#coding:UTF-8" encoding preamble recognized by Ruby), + but not the preamble defined by the content encoding (e.g. BOM). + The entire content of the source unit is encoded by single encoding (if it is read from binary stream). + + + + + The current internal state of the scanner. + + + + + The current startLocation of the scanner. + + + + + Move the tokenizer past the next token and return its category. + + The token information associated with the token just scanned. + + + + Move the tokenizer past the next token. + + False if the end of stream has been reached, true otherwise. + + + + Get all tokens over a block of the stream. + + + + The scanner should return full tokens. If startLocation + length lands in the middle of a token, the full token + should be returned. + + s + Tokens are read until at least given amount of characters is read or the stream ends. + A enumeration of tokens. + + + + Scan from startLocation to at least startLocation + length. + + Tokens are read until at least given amount of characters is read or the stream ends. + + This method is used to determine state at arbitrary startLocation. + + False if the end of stream has been reached, true otherwise. + + + + This structure represents an immutable integer interval that describes a range of values, from Start to End. + + It is closed on the left and open on the right: [Start .. End). + + + + + Dynamically choose between interpreting, simple compilation and compilation + that takes advantage of runtime history. + + + + + The number of iterations before the interpreter starts compiling.s + + + + + Display exception detail (callstack) when exception gets caught + + + + + Whether to gather performance statistics. + + + + + Initial file search paths provided by the host. + + + + + Reads an option whose value is expected to be a collection of non-null strings. + Reaturns a read-only copy of the option's value. + + + + + Abstracts system operations that are used by DLR and could potentially be platform specific. + The host can implement its PAL to adapt DLR to the platform it is running on. + For example, the Silverlight host adapts some file operations to work against files on the server. + + + + Invalid path. + + + Invalid path. + + + + Represents a language context. Typically there is at most 1 context + associated with each language, but some languages may use more than one context + to identify code that should be treated differently. Contexts are used during + member and operator lookup. + + + + + Registers a language within the system with the specified name. + + + + + Looks up the context ID for the specified context identifier + + + + + Singleton for each language. + + + + + Must not be called under a lock as it can potentially call a user code. + + The language context's implementation failed to instantiate. + + + + Gets a value indicating whether the application is in debug mode. + This means: + + 1) Symbols are emitted for debuggable methods (methods associated with SourceUnit). + 2) Debuggable methods are emitted to non-collectable types (this is due to CLR limitations on dynamic method debugging). + 3) JIT optimization is disabled for all methods + 4) Languages may disable optimizations based on this value. + + + + + Ignore CLR visibility checks. + + + + + Provides language specific documentation for live objects. + + + + + ObjectOperations provide a large catalogue of object operations such as member access, conversions, + indexing, and things like addition. There are several introspection and tool support services available + for more advanced hosts. + + You get ObjectOperation instances from ScriptEngine, and they are bound to their engines for the semantics + of the operations. There is a default instance of ObjectOperations you can share across all uses of the + engine. However, very advanced hosts can create new instances. + + + + a dictionary of SiteKey's which are used to cache frequently used operations, logically a set + + + the # of sites we had created at the last cleanup + + + the total number of sites we've ever created + + + the number of sites required before we'll try cleaning up the cache... + + + the minimum difference between the average that is required to remove + + + the maximum number we'll remove on a single cache cleanup + + + the number of sites we should clear after if we can't make progress cleaning up otherwise + + + + Calls the provided object with the given parameters and returns the result. + + The prefered way of calling objects is to convert the object to a strongly typed delegate + using the ConvertTo methods and then invoking that delegate. + + + + + Invokes a member on the provided object with the given parameters and returns the result. + + + + + Invokes a member on the provided object with the given parameters and returns the result. + + + + + Creates a new instance from the provided object using the given parameters, and returns the result. + + + + + Gets the member name from the object obj. Throws an exception if the member does not exist or is write-only. + + + + + Gets the member name from the object obj and converts it to the type T. Throws an exception if the + member does not exist, is write-only, or cannot be converted. + + + + + Gets the member name from the object obj. Returns true if the member is successfully retrieved and + stores the value in the value out param. + + + + + Returns true if the object has a member named name, false if the member does not exist. + + + + + Removes the member name from the object obj. + + + + + Sets the member name on object obj to value. + + + + + Sets the member name on object obj to value. This overload can be used to avoid + boxing and casting of strongly typed members. + + + + + Gets the member name from the object obj. Throws an exception if the member does not exist or is write-only. + + + + + Gets the member name from the object obj and converts it to the type T. The conversion will be explicit or implicit + depending on what the langauge prefers. Throws an exception if the member does not exist, is write-only, or cannot be converted. + + + + + Gets the member name from the object obj. Returns true if the member is successfully retrieved and + stores the value in the value out param. + + + + + Returns true if the object has a member named name, false if the member does not exist. + + + + + Removes the member name from the object obj. Returns true if the member was successfully removed + or false if the member does not exist. + + + + + Sets the member name on object obj to value. + + + + + Sets the member name on object obj to value. This overload can be used to avoid + boxing and casting of strongly typed members. + + + + + Converts the object obj to the type T. The conversion will be explicit or implicit + depending on what the langauge prefers. + + + + + Converts the object obj to the type type. The conversion will be explicit or implicit + depending on what the langauge prefers. + + + + + Converts the object obj to the type T. Returns true if the value can be converted, false if it cannot. + + The conversion will be explicit or implicit depending on what the langauge prefers. + + + + + Converts the object obj to the type type. Returns true if the value can be converted, false if it cannot. + + The conversion will be explicit or implicit depending on what the langauge prefers. + + + + + Convers the object obj to the type T including explicit conversions which may lose information. + + + + + Converts the object obj to the type type including explicit conversions which may lose information. + + + + + Converts the object obj to the type type including explicit conversions which may lose information. + + Returns true if the value can be converted, false if it cannot. + + + + + Converts the object obj to the type T. Returns true if the value can be converted, false if it cannot. + + + + + Convers the object obj to the type T including implicit conversions. + + + + + Converts the object obj to the type type including implicit conversions. + + + + + Converts the object obj to the type type including implicit conversions. + + Returns true if the value can be converted, false if it cannot. + + + + + Converts the object obj to the type T. Returns true if the value can be converted, false if it cannot. + + + + + Performs a generic unary operation on the strongly typed target and returns the value as the specified type + + + + + Peforms the generic binary operation on the specified strongly typed targets and returns + the strongly typed result. + + + + + Returns a list of strings which contain the known members of the object. + + + + + Returns a string representation of the object in a language specific object display format. + + + + + Gets or creates a dynamic site w/ the specified type parameters for the provided binder. + + + This will either get the site from the cache or create a new site and return it. The cache + may be cleaned if it's gotten too big since the last usage. + + + + + Gets or creates a dynamic site w/ the specified type parameters for the provided binder. + + + This will either get the site from the cache or create a new site and return it. The cache + may be cleaned if it's gotten too big since the last usage. + + + + + Gets or creates a dynamic site w/ the specified type parameters for the provided binder. + + + This will either get the site from the cache or create a new site and return it. The cache + may be cleaned if it's gotten too big since the last usage. + + + + + Gets or creates a dynamic site w/ the specified type parameters for the provided binder. + + + This will either get the site from the cache or create a new site and return it. The cache + may be cleaned if it's gotten too big since the last usage. + + + + + Gets or creates a dynamic site w/ the specified type parameters for the provided binder. + + + This will either get the site from the cache or create a new site and return it. The cache + may be cleaned if it's gotten too big since the last usage. + + + + + Helper to create to get or create the dynamic site - called by the GetSite methods. + + + + + Removes items from the cache that have the lowest usage... + + + + + Helper class for tracking all of our unique dynamic sites and their + usage patterns. We hash on the combination of the binder and site type. + + We also track the hit count and the key holds the site associated w/ the + key. Logically this is a set based upon the binder and site-type but we + store it in a dictionary. + + + + + DLR requires any Hosting API provider to implement this class and provide its instance upon Runtime initialization. + DLR calls on it to perform basic host/system dependent operations. + + + + + Abstracts system operations that are used by DLR and could potentially be platform specific. + + + + + Helper for storing information about stack frames. + + + + + Singleton LanguageContext which represents a language-neutral LanguageContext + + + + + Internal class which binds a LanguageContext, StreamContentProvider, and Encoding together to produce + a TextContentProvider which reads binary data with the correct language semantics. + + + + + Provides language specific facilities which are typically called by the runtime. + + + + + Provides the ContextId which includes members that should only be shown for this LanguageContext. + + ContextId's are used for filtering by Scope's. + + + + + Gets the ScriptDomainManager that this LanguageContext is running within. + + + + + Whether the language can parse code and create source units. + + + + + Gets the scope associated with a file, or null if none was available + + + + + Creates a new ScriptScope using the default storage container + + + + + Creates a new ScriptScope whose storage contains the provided dictionary of objects + + Accesses to the ScriptScope will turn into get,set, and delete members against this dictionary + + + + + Creates a new ScriptScope whose storage is an arbitrary object. + + Accesses to the ScriptScope will turn into get, set, and delete members against the object. + + + + + Provides access to setting variables in scopes. + + By default this goes through ObjectOperations which can be rather slow. + Languages can override this to provide fast customized access which avoids + ObjectOperations. Languages can provide fast access to commonly used scope + types for that language. Typically this includes ScopeStorage and any other + classes which the language themselves uses for backing of a Scope. + + + + + Provides access to try getting variables in scopes. + + By default this goes through ObjectOperations which can be rather slow. + Languages can override this to provide fast customized access which avoids + ObjectOperations. Languages can provide fast access to commonly used scope + types for that language. Typically this includes ScopeStorage and any other + classes which the language themselves uses for backing of a Scope. + + + + + Provides access to getting variables in scopes and converting the result. + + By default this goes through ObjectOperations which can be rather slow. + Languages can override this to provide fast customized access which avoids + ObjectOperations. Languages can provide fast access to commonly used scope + types for that language. Typically this includes ScopeStorage and any other + classes which the language themselves uses for backing of a Scope. + + + + + Provides access to getting variables in scopes. + + By default this goes through ObjectOperations which can be rather slow. + Languages can override this to provide fast customized access which avoids + ObjectOperations. Languages can provide fast access to commonly used scope + types for that language. Typically this includes ScopeStorage and any other + classes which the language themselves uses for backing of a Scope. + + + + + Provides a text reader for source code that is to be read from a given stream. + + The stream open for reading. The stream must also allow seeking. + An encoding that should be used if the stream doesn't have Unicode or language specific preamble. + the path of the source unit if available + The reader. + An I/O error occurs. + + + + Creates the language specific CompilerOptions object for compilation of code not bound to any particular scope. + The language should flow any relevant options from LanguageContext to the newly created options instance. + + + + + Creates the language specific CompilerOptions object for compilation of code bound to a given scope. + + + + + Parses the source code within a specified compiler context. + The source unit to parse is held on by the context. + + null on failure. + Could also set the code properties and line/file mappings on the source unit. + + + + Creates a conversion binder. + + If explicitCast is true then the binder should do explicit conversions. + If explicitCast is false then the binder should do implicit conversions. + + If explicitCast is null it is up to the language to select the conversions + which closest match their normal behavior. + + + + + Gets the member names associated with the object + By default, only returns IDO names + + + + + Returns a string representation of the object in a language specific object display format. + + Dynamic sites container that could be used for any dynamic dispatches necessary for formatting. + Object to format. + A string representation of object. + + + + This attribute marks a parameter that is not allowed to be null. + It is used by the method binding infrastructure to generate better error + messages and method selection. + + + + + This attribute marks a parameter whose type is an array that is not allowed to have null items. + It is used by the method binding infrastructure to generate better error + messages and method selection. + + + + + Wraps a an IDictionary[object, object] and exposes it as an IDynamicMetaObjectProvider so that + users can access string attributes using member accesses. + + + + + Represents a host-provided variables for executable code. The variables are + typically backed by a host-provided dictionary. Languages can also associate per-language + information with the context by using scope extensions. This can be used for tracking + state which is used across multiple executions, for providing custom forms of + storage (for example object keyed access), or other language specific semantics. + + Scope objects are thread-safe as long as their underlying storage is thread safe. + + Script hosts can choose to use thread safe or thread unsafe modules but must be sure + to constrain the code they right to be single-threaded if using thread unsafe + storage. + + + + + Creates a new scope with a new empty thread-safe dictionary. + + + + + Creates a new scope which is backed by an arbitrary object for it's storage. + + + + + + Gets the ScopeExtension associated with the provided ContextId. + + + + + Sets the ScopeExtension to the provided value for the given ContextId. + + The extension can only be set once. The returned value is either the new ScopeExtension + if no value was previously set or the previous value. + + + + + Gets or sets a collection of environment variables. + + + + + Event for when a host calls LoadAssembly. After hooking this + event languages will need to call GetLoadedAssemblyList to + get any assemblies which were loaded before the language was + loaded. + + + + + Only host should redirect I/O. + + + + + Exposes a IDictionary[string, object] as a dynamic object. Gets/sets/deletes turn + into accesses on the underlying dictionary. + + + + + The current internal state of the scanner. + + + + + The current startLocation of the scanner. + + + + + Move the tokenizer past the next token and return its category. + + The token information associated with the token just scanned. + + + + Move the tokenizer past the next token. + + False if the end of stream has been reached, true otherwise. + + + + Get all tokens over a block of the stream. + + + + The scanner should return full tokens. If startLocation + length lands in the middle of a token, the full token + should be returned. + + + Tokens are read until at least given amount of characters is read or the stream ends. + A enumeration of tokens. + + + + Scan from startLocation to at least startLocation + length. + + The mininum number of characters to process while getting tokens. + + This method is used to determine state at arbitrary startLocation. + + False if the end of stream has been reached, true otherwise. + + + + This attribute is used to mark a parameter that can accept any keyword arguments that + are not bound to normal parameters. The extra keyword arguments will be + passed in a dictionary which is created for the call. + + Most languages which support params dictionaries will support the following types: + + IReadOnlyDictionary<string, anything>
+ IReadOnlyDictionary<object, anything>
+ IDictionary<string, anything>
+ IDictionary<object, anything>
+ Dictionary<string, anything>
+ Dictionary<object, anything>
+ IDictionary +
+ + For languages which don't have language level support the user will be required to + create and populate the dictionary by hand. + + This attribute is the dictionary equivalent of the System.ParamArrayAttribute. +
+ + public static void KeywordArgFunction([ParamDictionary]IDictionary<string, object> dict) { + foreach (var v in dict) { + Console.WriteLine("Key: {0} Value: {1}", v.Key, v.Value); + } + } + + Called from Python: + + KeywordArgFunction(a = 2, b = "abc") + + will print: + Key: a Value = 2 + Key: b Value = abc + +
+ + + Provides optimized and cacheable support for scope storage. + + This is the default object used for storing values in a scope. + + + + The implementation uses a case-insensitive dictionary which holds + onto ScopeVariableIgnoreCase objects. The SVIC's hold onto ScopeVariable + objects for each possible casing. + + + + + Gets the named value from the scope optionally ignoring case. + + If the named value is not present an InvalidOperationException is raised. + + + + + Attempts to get the named value from the scope optionally ignoring the case. + + Returns true if the value is present, false if it is not. + + + + + Sets the named value in the scope optionally ignoring the case. + + + + + Deletes the named value from the scope optionally ignoring the case. + + + + + Checks if the named value is present in the scope optionally ignoring the case. + + + + + Gets the IScopeVariable for the scope optionally ignoring case. + + The IScopeVariable can be held onto and get/set/deleted without performing + a dictionary lookup on subsequent accesses. + + + + + Gets the ScopeVariable for the scope in a case-sensitive manner. + + The ScopeVariable can be held onto and get/set/deleted without performing + a dictionary lookup on subsequent accesses. + + + + + Gets the ScopeVariableIgnoreCase for the scope in a case-insensitive manner. + + The ScopeVariable can be held onto and get/set/deleted without performing + a dictionary lookup on subsequent accesses. + + + + + Provides convenient case-sensitive value access. + + + + + Returns all of the member names which currently have values in the scope. + + The list contains all available casings. + + + + + Returns all of the member names and their associated values from the scope. + + The list contains all available casings. + + + + + Provides a common interface for accessing both case sensitive and + case insensitive variable storage. + + + + + True if the scope has a value, false if it does not. + + + + + Atempts to get the value. If a value is assigned it returns true otherwise + it returns false. + + + + + Sets the current value in the scope. + + + + + Removes the current value from the scope. + + + + + Boxes the value for storage in a scope. Languages or consumers of the scope + can save this value and use it to get/set the current value in the scope for + commonly accessed values. + + ScopeVariables are case sensitive and will only refer to a single value. + + + + + True if the scope has a value, false if it does not. + + + + + Atempts to get the value. If a value is assigned it returns true otherwise + it returns false. + + + + + Sets the current value in the scope. + + + + + Removes the current value from the scope. + + + + + Boxes the value for storage in a scope. Languages or consumers of the scope + can save this value and use it to get/set the current value in the scope for + commonly accessed values. + + ScopeVariablesIgnoreCase are case insensitive and may access different casings + depending on how other gets/sets occur in the scope. + + + + + True if the scope has a value, false if it does not. + + + + + Atempts to get the value. If a value is assigned it returns true otherwise + it returns false. + + + + + Sets the current value in the scope. + + + + + Removes the current value from the scope. + + + + + ScriptCode is an instance of compiled code that is bound to a specific LanguageContext + but not a specific ScriptScope. The code can be re-executed multiple times in different + scopes. Hosting API counterpart for this class is CompiledCode. + + + + + Provides a factory to create streams over one source of binary content. + + StreamContentProvider's are used when opening a file of an unknown encoding. The + StreamContentProvider will be wrapped in a TextContentProvider provided by the language + which can support a language specific way of interpreting the binary data into text. + + For example some languages allow a marker at the beginning of the file which specifies + the encoding of the rest of the file. + + + + + Creates a new Stream which is backed by the content the StreamContentProvider was created for. + + For example if the StreamContentProvider was backing a file then GetStream re-opens the file and returns + the new stream. + + This method may be called multiple times. For example once to compile the code and again to get + the source code to display error messages. + + + + + See also Microsoft.VisualStudio.Package.TokenTriggers. + + + + + Source code is a syntactically correct. + + + + + Source code represents an empty statement/expression. + + + + + Source code is already invalid and no suffix can make it syntactically correct. + + + + + Last token is incomplete. Source code can still be completed correctly. + + + + + Last statement is incomplete. Source code can still be completed correctly. + + + + + Defines a kind of the source code. The parser sets its initial state accordingly. + + + + + The code is an expression. + + + + + The code is a sequence of statements. + + + + + The code is a single statement. + + + + + The code is a content of a file. + + + + + The code is an interactive command. + + + + + The language parser auto-detects the kind. A syntax error is reported if it is not able to do so. + + + + + Converts a generic ICollection of T into an array of T. + + If the collection is already an array of T the original collection is returned. + + + + + Wraps the provided enumerable into a ReadOnlyCollection{T} + + Copies all of the data into a new array, so the data can't be + changed after creation. The exception is if the enumerable is + already a ReadOnlyCollection{T}, in which case we just return it. + + + + + Console input stream (Console.OpenStandardInput) has a bug that manifests itself if reading small amounts of data. + This class wraps the standard input stream with a buffer that ensures that enough data are read from the underlying stream. + + + + + Requires the range [offset, offset + count] to be a subset of [0, array.Count]. + + Offset or count are out of range. + + + + Requires the range [offset, offset + count] to be a subset of [0, array.Count]. + + Offset or count are out of range. + + + + Requires the array and all its items to be non-null. + + + + + Requires the enumerable collection and all its items to be non-null. + + + + + Requires the range [offset, offset + count] to be a subset of [0, array.Count]. + + Array is null. + Offset or count are out of range. + + + + Emits an object delegate(CallSite, object * paramCount, object) that's suitable for use in a non-strongly typed call site. + Use this helper only for delegates with more parameters than Func has. + + + + + Source code reader. + + + + + Gets the encoding that is used by the reader to convert binary data read from an underlying binary stream. + Null if the reader is reading from a textual source (not performing any byte to character transcoding). + + + + + Seeks the first character of a specified line in the text stream. + + Line number. The current position is assumed to be line #1. + + Returns true if the line is found, false otherwise. + + + + + Provides a StreamContentProvider for a stream of content backed by a file on disk. + + + + + Represents a location in source code. + + + + + Creates a new source location. + + The index in the source stream the location represents (0-based). + The line in the source stream the location represents (1-based). + The column in the source stream the location represents (1-based). + + + + The index in the source stream the location represents (0-based). + + + + + The line in the source stream the location represents (1-based). + + + + + The column in the source stream the location represents (1-based). + + + + + Compares two specified location values to see if they are equal. + + One location to compare. + The other location to compare. + True if the locations are the same, False otherwise. + + + + Compares two specified location values to see if they are not equal. + + One location to compare. + The other location to compare. + True if the locations are not the same, False otherwise. + + + + Compares two specified location values to see if one is before the other. + + One location to compare. + The other location to compare. + True if the first location is before the other location, False otherwise. + + + + Compares two specified location values to see if one is after the other. + + One location to compare. + The other location to compare. + True if the first location is after the other location, False otherwise. + + + + Compares two specified location values to see if one is before or the same as the other. + + One location to compare. + The other location to compare. + True if the first location is before or the same as the other location, False otherwise. + + + + Compares two specified location values to see if one is after or the same as the other. + + One location to compare. + The other location to compare. + True if the first location is after or the same as the other location, False otherwise. + + + + Compares two specified location values. + + One location to compare. + The other location to compare. + 0 if the locations are equal, -1 if the left one is less than the right one, 1 otherwise. + + + + A location that is valid but represents no location at all. + + + + + An invalid location. + + + + + A minimal valid location. + + + + + Whether the location is a valid location. + + True if the location is valid, False otherwise. + + + + Stores the location of a span of text in a source file. + + + + + Constructs a new span with a specific start and end location. + + The beginning of the span. + The end of the span. + + + + The start location of the span. + + + + + The end location of the span. Location of the first character behind the span. + + + + + Length of the span (number of characters inside the span). + + + + + A valid span that represents no location. + + + + + An invalid span. + + + + + Whether the locations in the span are valid. + + + + + Compares two specified Span values to see if they are equal. + + One span to compare. + The other span to compare. + True if the spans are the same, False otherwise. + + + + Compares two specified Span values to see if they are not equal. + + One span to compare. + The other span to compare. + True if the spans are not the same, False otherwise. + + + + Identification of the source unit. Assigned by the host. + The format and semantics is host dependent (could be a path on file system or URL). + Empty string for anonymous source units. + + + + + LanguageContext of the language of the unit. + + + + + Reads specified range of lines (or less) from the source unit. + Line numbers starts with 1. + + + + + Errors are reported to the specified sink. + Returns null if the parser cannot compile the code due to error(s). + + + + + Executes against a specified scope. + + + + + Executes against a specified scope and reports errors to the given error sink. + + + + + Executes in a new scope created by the language. + + + + + Executes in a new scope created by the language. + + + + + Executes in a new scope created by the language. + + + + + Unmapped span. + + + + + Provides a factory to create TextReader's over one source of textual content. + + TextContentProvider's are used when reading from a source which is already decoded + or has a known specific decoding. + + For example a text editor might provide a TextContentProvider whose backing is + an in-memory text buffer that the user can actively edit. + + + + + Creates a new TextReader which is backed by the content the TextContentProvider was created for. + + This method may be called multiple times. For example once to compile the code and again to get + the source code to display error messages. + + + + + A token marking an end of stream. + + + + + A space, tab, or newline. + + + + + A block comment. + + + + + A single line comment. + + + + + A documentation comment. + + + + + A numeric literal. + + + + + A character literal. + + + + + A string literal. + + + + + A regular expression literal. + + + + + A keyword. + + + + + A directive (e.g. #line). + + + + + A punctuation character that has a specific meaning in a language. + + + + + A token that operates as a separator between two language elements. + + + + + An identifier (variable, $variable, @variable, @@variable, $variable$, function!, function?, [variable], i'variable', ...) + + + + + Braces, parenthesis, brackets. + + + + + Errors. + + + + + Strongly-typed and parameterized string factory. + + + + + A string like "Cannot access member {1} declared on type {0} because the type contains generic parameters." + + + + + A string like "Type '{0}' is missing or cannot be loaded." + + + + + A string like "static property "{0}" of "{1}" can only be read through a type, not an instance" + + + + + A string like "static property "{0}" of "{1}" can only be assigned to through a type, not an instance" + + + + + A string like "Method precondition violated" + + + + + A string like "Invalid argument value" + + + + + A string like "Non-empty string required" + + + + + A string like "Non-empty collection required" + + + + + A string like "must by an Exception instance" + + + + + A string like "Type of test must be bool" + + + + + A string like "Type of the expression must be bool" + + + + + A string like "Empty string is not a valid path." + + + + + A string like "Invalid delegate type (Invoke method not found)." + + + + + A string like "expected only static property" + + + + + A string like "Property doesn't exist on the provided type" + + + + + A string like "Field doesn't exist on provided type" + + + + + A string like "Type doesn't have constructor with a given signature" + + + + + A string like "Type doesn't have a method with a given name." + + + + + A string like "Type doesn't have a method with a given name and signature." + + + + + A string like "Count must be non-negative." + + + + + A string like "arrayType must be an array type" + + + + + A string like "Either code or target must be specified." + + + + + A string like "Type parameter is {0}. Expected a delegate." + + + + + A string like "Cannot cast from type '{0}' to type '{1}" + + + + + A string like "unknown member type: '{0}'. " + + + + + A string like "RuleBuilder can only be used with delegates whose first argument is CallSite." + + + + + A string like "no instance for call." + + + + + A string like "Missing Test." + + + + + A string like "Missing Target." + + + + + A string like "The operation requires a non-generic type for {0}, but this represents generic types only" + + + + + A string like "Invalid operation: '{0}'" + + + + + A string like "Finally already defined." + + + + + A string like "Can not have fault and finally." + + + + + A string like "Fault already defined." + + + + + A string like "Cannot create default value for type {0}." + + + + + A string like "Unhandled convert: {0}" + + + + + A string like "{0}.{1} has no publiclly visible method." + + + + + A string like "Global/top-level local variable names must be unique." + + + + + A string like "Generating code from non-serializable CallSiteBinder." + + + + + A string like "Specified path is invalid." + + + + + A string like "Dictionaries are not hashable." + + + + + A string like "language already registered." + + + + + A string like "The method or operation is not implemented." + + + + + A string like "No exception." + + + + + A string like "Extension type {0} must be public." + + + + + A string like "Already initialized." + + + + + A string like "CreateScopeExtension must return a scope extension." + + + + + A string like "Invalid number of parameters for the service." + + + + + A string like "Invalid type of argument {0}; expecting {1}." + + + + + A string like "Cannot change non-caching value." + + + + + A string like "Field {0} is read-only" + + + + + A string like "Property {0} is read-only" + + + + + A string like "Expected event from {0}.{1}, got event from {2}.{3}." + + + + + A string like "expected bound event, got {0}." + + + + + A string like "Expected type {0}, got {1}." + + + + + A string like "can only write to member {0}." + + + + + A string like "No code to compile." + + + + + A string like "Invalid stream type: {0}." + + + + + A string like "Queue empty." + + + + + A string like "Enumeration has not started. Call MoveNext." + + + + + A string like "Enumeration already finished." + + + + + A string like "can't add another casing for identifier {0}" + + + + + A string like "can't add new identifier {0}" + + + + + A string like "Type '{0}' doesn't provide a suitable public constructor or its implementation is faulty: {1}" + + + + + A string like "Invalid output directory." + + + + + A string like "Invalid assembly name or file extension." + + + + + A string like "Cannot emit constant {0} ({1})" + + + + + A string like "No implicit cast from {0} to {1}" + + + + + A string like "No explicit cast from {0} to {1}" + + + + + A string like "name '{0}' not defined" + + + + + A string like "No default value for a given type." + + + + + A string like "Specified language provider type is not registered." + + + + + A string like "can't read from property" + + + + + A string like "can't write to property" + + + + + A string like "Cannot create instance of {0} because it contains generic parameters" + + + + + A string like "Non-verifiable assembly generated: {0}:\nAssembly preserved as {1}\nError text:\n{2}\n" + + + + + Strongly-typed and parameterized exception factory. + + + + + ArgumentException with message like "Either code or target must be specified." + + + + + InvalidOperationException with message like "Type parameter is {0}. Expected a delegate." + + + + + InvalidOperationException with message like "Cannot cast from type '{0}' to type '{1}" + + + + + InvalidOperationException with message like "unknown member type: '{0}'. " + + + + + InvalidOperationException with message like "RuleBuilder can only be used with delegates whose first argument is CallSite." + + + + + InvalidOperationException with message like "no instance for call." + + + + + InvalidOperationException with message like "Missing Test." + + + + + InvalidOperationException with message like "Missing Target." + + + + + TypeLoadException with message like "The operation requires a non-generic type for {0}, but this represents generic types only" + + + + + ArgumentException with message like "Invalid operation: '{0}'" + + + + + InvalidOperationException with message like "Finally already defined." + + + + + InvalidOperationException with message like "Can not have fault and finally." + + + + + InvalidOperationException with message like "Fault already defined." + + + + + ArgumentException with message like "Cannot create default value for type {0}." + + + + + ArgumentException with message like "Unhandled convert: {0}" + + + + + InvalidOperationException with message like "{0}.{1} has no publiclly visible method." + + + + + ArgumentException with message like "Global/top-level local variable names must be unique." + + + + + ArgumentException with message like "Generating code from non-serializable CallSiteBinder." + + + + + ArgumentException with message like "Specified path is invalid." + + + + + ArgumentTypeException with message like "Dictionaries are not hashable." + + + + + InvalidOperationException with message like "language already registered." + + + + + NotImplementedException with message like "The method or operation is not implemented." + + + + + InvalidOperationException with message like "No exception." + + + + + ArgumentException with message like "Extension type {0} must be public." + + + + + InvalidOperationException with message like "Already initialized." + + + + + InvalidImplementationException with message like "CreateScopeExtension must return a scope extension." + + + + + ArgumentException with message like "Invalid number of parameters for the service." + + + + + ArgumentException with message like "Invalid type of argument {0}; expecting {1}." + + + + + ArgumentException with message like "Cannot change non-caching value." + + + + + MissingMemberException with message like "Field {0} is read-only" + + + + + MissingMemberException with message like "Property {0} is read-only" + + + + + ArgumentException with message like "Expected event from {0}.{1}, got event from {2}.{3}." + + + + + ArgumentTypeException with message like "expected bound event, got {0}." + + + + + ArgumentTypeException with message like "Expected type {0}, got {1}." + + + + + MemberAccessException with message like "can only write to member {0}." + + + + + InvalidOperationException with message like "No code to compile." + + + + + ArgumentException with message like "Invalid stream type: {0}." + + + + + InvalidOperationException with message like "Queue empty." + + + + + InvalidOperationException with message like "Enumeration has not started. Call MoveNext." + + + + + InvalidOperationException with message like "Enumeration already finished." + + + + + InvalidOperationException with message like "can't add another casing for identifier {0}" + + + + + InvalidOperationException with message like "can't add new identifier {0}" + + + + + ArgumentException with message like "Invalid output directory." + + + + + ArgumentException with message like "Invalid assembly name or file extension." + + + + + ArgumentException with message like "Cannot emit constant {0} ({1})" + + + + + ArgumentException with message like "No implicit cast from {0} to {1}" + + + + + ArgumentException with message like "No explicit cast from {0} to {1}" + + + + + MissingMemberException with message like "name '{0}' not defined" + + + + + ArgumentException with message like "No default value for a given type." + + + + + ArgumentException with message like "Specified language provider type is not registered." + + + + + InvalidOperationException with message like "can't read from property" + + + + + InvalidOperationException with message like "can't write to property" + + + + + ArgumentException with message like "Cannot create instance of {0} because it contains generic parameters" + + + + + System.Security.VerificationException with message like "Non-verifiable assembly generated: {0}:\nAssembly preserved as {1}\nError text:\n{2}\n" + + +
+
diff --git a/unity-examples/magic-unity-coexist/Assets/Plugins/clojure-clr/dynamiclanguageruntime.1.3.2/net45/Microsoft.Scripting.xml.meta b/unity-examples/magic-unity-coexist/Assets/Plugins/clojure-clr/dynamiclanguageruntime.1.3.2/net45/Microsoft.Scripting.xml.meta new file mode 100644 index 00000000..ff98f1b0 --- /dev/null +++ b/unity-examples/magic-unity-coexist/Assets/Plugins/clojure-clr/dynamiclanguageruntime.1.3.2/net45/Microsoft.Scripting.xml.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 6756c4980de594b9eba9e99fc1a46d41 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/unity-examples/magic-unity-coexist/Packages/manifest.json b/unity-examples/magic-unity-coexist/Packages/manifest.json new file mode 100644 index 00000000..165afaee --- /dev/null +++ b/unity-examples/magic-unity-coexist/Packages/manifest.json @@ -0,0 +1,5 @@ +{ + "dependencies": { + "sg.flybot.magic.unity.dual": "file:../magic-unity.tgz" + } +} diff --git a/magic-unity-smoke/ProjectSettings/AudioManager.asset b/unity-examples/magic-unity-coexist/ProjectSettings/AudioManager.asset similarity index 100% rename from magic-unity-smoke/ProjectSettings/AudioManager.asset rename to unity-examples/magic-unity-coexist/ProjectSettings/AudioManager.asset diff --git a/magic-unity-smoke/ProjectSettings/ClusterInputManager.asset b/unity-examples/magic-unity-coexist/ProjectSettings/ClusterInputManager.asset similarity index 100% rename from magic-unity-smoke/ProjectSettings/ClusterInputManager.asset rename to unity-examples/magic-unity-coexist/ProjectSettings/ClusterInputManager.asset diff --git a/magic-unity-smoke/ProjectSettings/DynamicsManager.asset b/unity-examples/magic-unity-coexist/ProjectSettings/DynamicsManager.asset similarity index 100% rename from magic-unity-smoke/ProjectSettings/DynamicsManager.asset rename to unity-examples/magic-unity-coexist/ProjectSettings/DynamicsManager.asset diff --git a/magic-unity-smoke/ProjectSettings/EditorBuildSettings.asset b/unity-examples/magic-unity-coexist/ProjectSettings/EditorBuildSettings.asset similarity index 100% rename from magic-unity-smoke/ProjectSettings/EditorBuildSettings.asset rename to unity-examples/magic-unity-coexist/ProjectSettings/EditorBuildSettings.asset diff --git a/magic-unity-smoke/ProjectSettings/EditorSettings.asset b/unity-examples/magic-unity-coexist/ProjectSettings/EditorSettings.asset similarity index 100% rename from magic-unity-smoke/ProjectSettings/EditorSettings.asset rename to unity-examples/magic-unity-coexist/ProjectSettings/EditorSettings.asset diff --git a/magic-unity-smoke/ProjectSettings/GraphicsSettings.asset b/unity-examples/magic-unity-coexist/ProjectSettings/GraphicsSettings.asset similarity index 100% rename from magic-unity-smoke/ProjectSettings/GraphicsSettings.asset rename to unity-examples/magic-unity-coexist/ProjectSettings/GraphicsSettings.asset diff --git a/magic-unity-smoke/ProjectSettings/InputManager.asset b/unity-examples/magic-unity-coexist/ProjectSettings/InputManager.asset similarity index 100% rename from magic-unity-smoke/ProjectSettings/InputManager.asset rename to unity-examples/magic-unity-coexist/ProjectSettings/InputManager.asset diff --git a/magic-unity-smoke/ProjectSettings/MemorySettings.asset b/unity-examples/magic-unity-coexist/ProjectSettings/MemorySettings.asset similarity index 100% rename from magic-unity-smoke/ProjectSettings/MemorySettings.asset rename to unity-examples/magic-unity-coexist/ProjectSettings/MemorySettings.asset diff --git a/magic-unity-smoke/ProjectSettings/NavMeshAreas.asset b/unity-examples/magic-unity-coexist/ProjectSettings/NavMeshAreas.asset similarity index 100% rename from magic-unity-smoke/ProjectSettings/NavMeshAreas.asset rename to unity-examples/magic-unity-coexist/ProjectSettings/NavMeshAreas.asset diff --git a/magic-unity-smoke/ProjectSettings/PackageManagerSettings.asset b/unity-examples/magic-unity-coexist/ProjectSettings/PackageManagerSettings.asset similarity index 100% rename from magic-unity-smoke/ProjectSettings/PackageManagerSettings.asset rename to unity-examples/magic-unity-coexist/ProjectSettings/PackageManagerSettings.asset diff --git a/magic-unity-smoke/ProjectSettings/Physics2DSettings.asset b/unity-examples/magic-unity-coexist/ProjectSettings/Physics2DSettings.asset similarity index 100% rename from magic-unity-smoke/ProjectSettings/Physics2DSettings.asset rename to unity-examples/magic-unity-coexist/ProjectSettings/Physics2DSettings.asset diff --git a/magic-unity-smoke/ProjectSettings/PresetManager.asset b/unity-examples/magic-unity-coexist/ProjectSettings/PresetManager.asset similarity index 100% rename from magic-unity-smoke/ProjectSettings/PresetManager.asset rename to unity-examples/magic-unity-coexist/ProjectSettings/PresetManager.asset diff --git a/unity-examples/magic-unity-coexist/ProjectSettings/ProjectSettings.asset b/unity-examples/magic-unity-coexist/ProjectSettings/ProjectSettings.asset new file mode 100644 index 00000000..3cf1499c --- /dev/null +++ b/unity-examples/magic-unity-coexist/ProjectSettings/ProjectSettings.asset @@ -0,0 +1,678 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!129 &1 +PlayerSettings: + m_ObjectHideFlags: 0 + serializedVersion: 26 + productGUID: 43cd46c012de94581a9b8b93550bef47 + AndroidProfiler: 0 + AndroidFilterTouchesWhenObscured: 0 + AndroidEnableSustainedPerformanceMode: 0 + defaultScreenOrientation: 4 + targetDevice: 2 + useOnDemandResources: 0 + accelerometerFrequency: 60 + companyName: DefaultCompany + productName: magic-unity-coexist + defaultCursor: {fileID: 0} + cursorHotspot: {x: 0, y: 0} + m_SplashScreenBackgroundColor: {r: 0.12156863, g: 0.12156863, b: 0.1254902, a: 1} + m_ShowUnitySplashScreen: 1 + m_ShowUnitySplashLogo: 1 + m_SplashScreenOverlayOpacity: 1 + m_SplashScreenAnimation: 1 + m_SplashScreenLogoStyle: 1 + m_SplashScreenDrawMode: 0 + m_SplashScreenBackgroundAnimationZoom: 1 + m_SplashScreenLogoAnimationZoom: 1 + m_SplashScreenBackgroundLandscapeAspect: 1 + m_SplashScreenBackgroundPortraitAspect: 1 + m_SplashScreenBackgroundLandscapeUvs: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 + m_SplashScreenBackgroundPortraitUvs: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 + m_SplashScreenLogos: [] + m_VirtualRealitySplashScreen: {fileID: 0} + m_HolographicTrackingLossScreen: {fileID: 0} + defaultScreenWidth: 1920 + defaultScreenHeight: 1080 + defaultScreenWidthWeb: 960 + defaultScreenHeightWeb: 600 + m_StereoRenderingPath: 0 + m_ActiveColorSpace: 0 + unsupportedMSAAFallback: 0 + m_SpriteBatchVertexThreshold: 300 + m_MTRendering: 1 + mipStripping: 0 + numberOfMipsStripped: 0 + numberOfMipsStrippedPerMipmapLimitGroup: {} + m_StackTraceTypes: 010000000100000001000000010000000100000001000000 + iosShowActivityIndicatorOnLoading: -1 + androidShowActivityIndicatorOnLoading: -1 + iosUseCustomAppBackgroundBehavior: 0 + allowedAutorotateToPortrait: 1 + allowedAutorotateToPortraitUpsideDown: 1 + allowedAutorotateToLandscapeRight: 1 + allowedAutorotateToLandscapeLeft: 1 + useOSAutorotation: 1 + use32BitDisplayBuffer: 1 + preserveFramebufferAlpha: 0 + disableDepthAndStencilBuffers: 0 + androidStartInFullscreen: 1 + androidRenderOutsideSafeArea: 1 + androidUseSwappy: 1 + androidBlitType: 0 + androidResizableWindow: 0 + androidDefaultWindowWidth: 1920 + androidDefaultWindowHeight: 1080 + androidMinimumWindowWidth: 400 + androidMinimumWindowHeight: 300 + androidFullscreenMode: 1 + androidAutoRotationBehavior: 1 + androidPredictiveBackSupport: 1 + defaultIsNativeResolution: 1 + macRetinaSupport: 1 + runInBackground: 0 + captureSingleScreen: 0 + muteOtherAudioSources: 0 + Prepare IOS For Recording: 0 + Force IOS Speakers When Recording: 0 + audioSpatialExperience: 0 + deferSystemGesturesMode: 0 + hideHomeButton: 0 + submitAnalytics: 1 + usePlayerLog: 1 + dedicatedServerOptimizations: 0 + bakeCollisionMeshes: 0 + forceSingleInstance: 0 + useFlipModelSwapchain: 1 + resizableWindow: 0 + useMacAppStoreValidation: 0 + macAppStoreCategory: public.app-category.games + gpuSkinning: 0 + xboxPIXTextureCapture: 0 + xboxEnableAvatar: 0 + xboxEnableKinect: 0 + xboxEnableKinectAutoTracking: 0 + xboxEnableFitness: 0 + visibleInBackground: 1 + allowFullscreenSwitch: 1 + fullscreenMode: 1 + xboxSpeechDB: 0 + xboxEnableHeadOrientation: 0 + xboxEnableGuest: 0 + xboxEnablePIXSampling: 0 + metalFramebufferOnly: 0 + xboxOneResolution: 0 + xboxOneSResolution: 0 + xboxOneXResolution: 3 + xboxOneMonoLoggingLevel: 0 + xboxOneLoggingLevel: 1 + xboxOneDisableEsram: 0 + xboxOneEnableTypeOptimization: 0 + xboxOnePresentImmediateThreshold: 0 + switchQueueCommandMemory: 1048576 + switchQueueControlMemory: 16384 + switchQueueComputeMemory: 262144 + switchNVNShaderPoolsGranularity: 33554432 + switchNVNDefaultPoolsGranularity: 16777216 + switchNVNOtherPoolsGranularity: 16777216 + switchGpuScratchPoolGranularity: 2097152 + switchAllowGpuScratchShrinking: 0 + switchNVNMaxPublicTextureIDCount: 0 + switchNVNMaxPublicSamplerIDCount: 0 + switchNVNGraphicsFirmwareMemory: 32 + switchMaxWorkerMultiple: 8 + stadiaPresentMode: 0 + stadiaTargetFramerate: 0 + vulkanNumSwapchainBuffers: 3 + vulkanEnableSetSRGBWrite: 0 + vulkanEnablePreTransform: 0 + vulkanEnableLateAcquireNextImage: 0 + vulkanEnableCommandBufferRecycling: 1 + loadStoreDebugModeEnabled: 0 + visionOSBundleVersion: 1.0 + tvOSBundleVersion: 1.0 + bundleVersion: 1.0 + preloadedAssets: [] + metroInputSource: 0 + wsaTransparentSwapchain: 0 + m_HolographicPauseOnTrackingLoss: 1 + xboxOneDisableKinectGpuReservation: 1 + xboxOneEnable7thCore: 1 + vrSettings: + enable360StereoCapture: 0 + isWsaHolographicRemotingEnabled: 0 + enableFrameTimingStats: 0 + enableOpenGLProfilerGPURecorders: 1 + allowHDRDisplaySupport: 0 + useHDRDisplay: 0 + hdrBitDepth: 0 + m_ColorGamuts: 00000000 + targetPixelDensity: 30 + resolutionScalingMode: 0 + resetResolutionOnWindowResize: 0 + androidSupportedAspectRatio: 1 + androidMaxAspectRatio: 2.1 + applicationIdentifier: {} + buildNumber: + Standalone: 0 + VisionOS: 0 + iPhone: 0 + tvOS: 0 + overrideDefaultApplicationIdentifier: 0 + AndroidBundleVersionCode: 1 + AndroidMinSdkVersion: 22 + AndroidTargetSdkVersion: 0 + AndroidPreferredInstallLocation: 1 + aotOptions: + stripEngineCode: 1 + iPhoneStrippingLevel: 0 + iPhoneScriptCallOptimization: 0 + ForceInternetPermission: 0 + ForceSDCardPermission: 0 + CreateWallpaper: 0 + APKExpansionFiles: 0 + keepLoadedShadersAlive: 0 + StripUnusedMeshComponents: 0 + strictShaderVariantMatching: 0 + VertexChannelCompressionMask: 4054 + iPhoneSdkVersion: 988 + iOSSimulatorArchitecture: 0 + iOSTargetOSVersionString: 12.0 + tvOSSdkVersion: 0 + tvOSSimulatorArchitecture: 0 + tvOSRequireExtendedGameController: 0 + tvOSTargetOSVersionString: 12.0 + VisionOSSdkVersion: 0 + VisionOSTargetOSVersionString: 1.0 + uIPrerenderedIcon: 0 + uIRequiresPersistentWiFi: 0 + uIRequiresFullScreen: 1 + uIStatusBarHidden: 1 + uIExitOnSuspend: 0 + uIStatusBarStyle: 0 + appleTVSplashScreen: {fileID: 0} + appleTVSplashScreen2x: {fileID: 0} + tvOSSmallIconLayers: [] + tvOSSmallIconLayers2x: [] + tvOSLargeIconLayers: [] + tvOSLargeIconLayers2x: [] + tvOSTopShelfImageLayers: [] + tvOSTopShelfImageLayers2x: [] + tvOSTopShelfImageWideLayers: [] + tvOSTopShelfImageWideLayers2x: [] + iOSLaunchScreenType: 0 + iOSLaunchScreenPortrait: {fileID: 0} + iOSLaunchScreenLandscape: {fileID: 0} + iOSLaunchScreenBackgroundColor: + serializedVersion: 2 + rgba: 0 + iOSLaunchScreenFillPct: 100 + iOSLaunchScreenSize: 100 + iOSLaunchScreenCustomXibPath: + iOSLaunchScreeniPadType: 0 + iOSLaunchScreeniPadImage: {fileID: 0} + iOSLaunchScreeniPadBackgroundColor: + serializedVersion: 2 + rgba: 0 + iOSLaunchScreeniPadFillPct: 100 + iOSLaunchScreeniPadSize: 100 + iOSLaunchScreeniPadCustomXibPath: + iOSLaunchScreenCustomStoryboardPath: + iOSLaunchScreeniPadCustomStoryboardPath: + iOSDeviceRequirements: [] + iOSURLSchemes: [] + macOSURLSchemes: [] + iOSBackgroundModes: 0 + iOSMetalForceHardShadows: 0 + metalEditorSupport: 1 + metalAPIValidation: 1 + metalCompileShaderBinary: 0 + iOSRenderExtraFrameOnPause: 0 + iosCopyPluginsCodeInsteadOfSymlink: 0 + appleDeveloperTeamID: + iOSManualSigningProvisioningProfileID: + tvOSManualSigningProvisioningProfileID: + VisionOSManualSigningProvisioningProfileID: + iOSManualSigningProvisioningProfileType: 0 + tvOSManualSigningProvisioningProfileType: 0 + VisionOSManualSigningProvisioningProfileType: 0 + appleEnableAutomaticSigning: 0 + iOSRequireARKit: 0 + iOSAutomaticallyDetectAndAddCapabilities: 1 + appleEnableProMotion: 0 + shaderPrecisionModel: 0 + clonedFromGUID: 00000000000000000000000000000000 + templatePackageId: + templateDefaultScene: + useCustomMainManifest: 0 + useCustomLauncherManifest: 0 + useCustomMainGradleTemplate: 0 + useCustomLauncherGradleManifest: 0 + useCustomBaseGradleTemplate: 0 + useCustomGradlePropertiesTemplate: 0 + useCustomGradleSettingsTemplate: 0 + useCustomProguardFile: 0 + AndroidTargetArchitectures: 1 + AndroidTargetDevices: 0 + AndroidSplashScreenScale: 0 + androidSplashScreen: {fileID: 0} + AndroidKeystoreName: + AndroidKeyaliasName: + AndroidEnableArmv9SecurityFeatures: 0 + AndroidBuildApkPerCpuArchitecture: 0 + AndroidTVCompatibility: 0 + AndroidIsGame: 1 + AndroidEnableTango: 0 + androidEnableBanner: 1 + androidUseLowAccuracyLocation: 0 + androidUseCustomKeystore: 0 + m_AndroidBanners: + - width: 320 + height: 180 + banner: {fileID: 0} + androidGamepadSupportLevel: 0 + chromeosInputEmulation: 1 + AndroidMinifyRelease: 0 + AndroidMinifyDebug: 0 + AndroidValidateAppBundleSize: 1 + AndroidAppBundleSizeToValidate: 200 + m_BuildTargetIcons: [] + m_BuildTargetPlatformIcons: [] + m_BuildTargetBatching: [] + m_BuildTargetShaderSettings: [] + m_BuildTargetGraphicsJobs: [] + m_BuildTargetGraphicsJobMode: [] + m_BuildTargetGraphicsAPIs: [] + m_BuildTargetVRSettings: [] + m_DefaultShaderChunkSizeInMB: 16 + m_DefaultShaderChunkCount: 0 + openGLRequireES31: 0 + openGLRequireES31AEP: 0 + openGLRequireES32: 0 + m_TemplateCustomTags: {} + mobileMTRendering: + Android: 1 + VisionOS: 1 + iPhone: 1 + tvOS: 1 + m_BuildTargetGroupLightmapEncodingQuality: [] + m_BuildTargetGroupHDRCubemapEncodingQuality: [] + m_BuildTargetGroupLightmapSettings: [] + m_BuildTargetGroupLoadStoreDebugModeSettings: [] + m_BuildTargetNormalMapEncoding: [] + m_BuildTargetDefaultTextureCompressionFormat: [] + playModeTestRunnerEnabled: 0 + runPlayModeTestAsEditModeTest: 0 + actionOnDotNetUnhandledException: 1 + enableInternalProfiler: 0 + logObjCUncaughtExceptions: 1 + enableCrashReportAPI: 0 + cameraUsageDescription: + locationUsageDescription: + microphoneUsageDescription: + bluetoothUsageDescription: + macOSTargetOSVersion: 10.13.0 + switchNMETAOverride: + switchNetLibKey: + switchSocketMemoryPoolSize: 6144 + switchSocketAllocatorPoolSize: 128 + switchSocketConcurrencyLimit: 14 + switchScreenResolutionBehavior: 2 + switchUseCPUProfiler: 0 + switchEnableFileSystemTrace: 0 + switchLTOSetting: 0 + switchApplicationID: 0x01004b9000490000 + switchNSODependencies: + switchCompilerFlags: + switchTitleNames_0: + switchTitleNames_1: + switchTitleNames_2: + switchTitleNames_3: + switchTitleNames_4: + switchTitleNames_5: + switchTitleNames_6: + switchTitleNames_7: + switchTitleNames_8: + switchTitleNames_9: + switchTitleNames_10: + switchTitleNames_11: + switchTitleNames_12: + switchTitleNames_13: + switchTitleNames_14: + switchTitleNames_15: + switchPublisherNames_0: + switchPublisherNames_1: + switchPublisherNames_2: + switchPublisherNames_3: + switchPublisherNames_4: + switchPublisherNames_5: + switchPublisherNames_6: + switchPublisherNames_7: + switchPublisherNames_8: + switchPublisherNames_9: + switchPublisherNames_10: + switchPublisherNames_11: + switchPublisherNames_12: + switchPublisherNames_13: + switchPublisherNames_14: + switchPublisherNames_15: + switchIcons_0: {fileID: 0} + switchIcons_1: {fileID: 0} + switchIcons_2: {fileID: 0} + switchIcons_3: {fileID: 0} + switchIcons_4: {fileID: 0} + switchIcons_5: {fileID: 0} + switchIcons_6: {fileID: 0} + switchIcons_7: {fileID: 0} + switchIcons_8: {fileID: 0} + switchIcons_9: {fileID: 0} + switchIcons_10: {fileID: 0} + switchIcons_11: {fileID: 0} + switchIcons_12: {fileID: 0} + switchIcons_13: {fileID: 0} + switchIcons_14: {fileID: 0} + switchIcons_15: {fileID: 0} + switchSmallIcons_0: {fileID: 0} + switchSmallIcons_1: {fileID: 0} + switchSmallIcons_2: {fileID: 0} + switchSmallIcons_3: {fileID: 0} + switchSmallIcons_4: {fileID: 0} + switchSmallIcons_5: {fileID: 0} + switchSmallIcons_6: {fileID: 0} + switchSmallIcons_7: {fileID: 0} + switchSmallIcons_8: {fileID: 0} + switchSmallIcons_9: {fileID: 0} + switchSmallIcons_10: {fileID: 0} + switchSmallIcons_11: {fileID: 0} + switchSmallIcons_12: {fileID: 0} + switchSmallIcons_13: {fileID: 0} + switchSmallIcons_14: {fileID: 0} + switchSmallIcons_15: {fileID: 0} + switchManualHTML: + switchAccessibleURLs: + switchLegalInformation: + switchMainThreadStackSize: 1048576 + switchPresenceGroupId: + switchLogoHandling: 0 + switchReleaseVersion: 0 + switchDisplayVersion: 1.0.0 + switchStartupUserAccount: 0 + switchSupportedLanguagesMask: 0 + switchLogoType: 0 + switchApplicationErrorCodeCategory: + switchUserAccountSaveDataSize: 0 + switchUserAccountSaveDataJournalSize: 0 + switchApplicationAttribute: 0 + switchCardSpecSize: -1 + switchCardSpecClock: -1 + switchRatingsMask: 0 + switchRatingsInt_0: 0 + switchRatingsInt_1: 0 + switchRatingsInt_2: 0 + switchRatingsInt_3: 0 + switchRatingsInt_4: 0 + switchRatingsInt_5: 0 + switchRatingsInt_6: 0 + switchRatingsInt_7: 0 + switchRatingsInt_8: 0 + switchRatingsInt_9: 0 + switchRatingsInt_10: 0 + switchRatingsInt_11: 0 + switchRatingsInt_12: 0 + switchLocalCommunicationIds_0: + switchLocalCommunicationIds_1: + switchLocalCommunicationIds_2: + switchLocalCommunicationIds_3: + switchLocalCommunicationIds_4: + switchLocalCommunicationIds_5: + switchLocalCommunicationIds_6: + switchLocalCommunicationIds_7: + switchParentalControl: 0 + switchAllowsScreenshot: 1 + switchAllowsVideoCapturing: 1 + switchAllowsRuntimeAddOnContentInstall: 0 + switchDataLossConfirmation: 0 + switchUserAccountLockEnabled: 0 + switchSystemResourceMemory: 16777216 + switchSupportedNpadStyles: 22 + switchNativeFsCacheSize: 32 + switchIsHoldTypeHorizontal: 1 + switchSupportedNpadCount: 8 + switchEnableTouchScreen: 1 + switchSocketConfigEnabled: 0 + switchTcpInitialSendBufferSize: 32 + switchTcpInitialReceiveBufferSize: 64 + switchTcpAutoSendBufferSizeMax: 256 + switchTcpAutoReceiveBufferSizeMax: 256 + switchUdpSendBufferSize: 9 + switchUdpReceiveBufferSize: 42 + switchSocketBufferEfficiency: 4 + switchSocketInitializeEnabled: 1 + switchNetworkInterfaceManagerInitializeEnabled: 1 + switchDisableHTCSPlayerConnection: 0 + switchUseNewStyleFilepaths: 1 + switchUseLegacyFmodPriorities: 0 + switchUseMicroSleepForYield: 1 + switchEnableRamDiskSupport: 0 + switchMicroSleepForYieldTime: 25 + switchRamDiskSpaceSize: 12 + ps4NPAgeRating: 12 + ps4NPTitleSecret: + ps4NPTrophyPackPath: + ps4ParentalLevel: 11 + ps4ContentID: ED1633-NPXX51362_00-0000000000000000 + ps4Category: 0 + ps4MasterVersion: 01.00 + ps4AppVersion: 01.00 + ps4AppType: 0 + ps4ParamSfxPath: + ps4VideoOutPixelFormat: 0 + ps4VideoOutInitialWidth: 1920 + ps4VideoOutBaseModeInitialWidth: 1920 + ps4VideoOutReprojectionRate: 60 + ps4PronunciationXMLPath: + ps4PronunciationSIGPath: + ps4BackgroundImagePath: + ps4StartupImagePath: + ps4StartupImagesFolder: + ps4IconImagesFolder: + ps4SaveDataImagePath: + ps4SdkOverride: + ps4BGMPath: + ps4ShareFilePath: + ps4ShareOverlayImagePath: + ps4PrivacyGuardImagePath: + ps4ExtraSceSysFile: + ps4NPtitleDatPath: + ps4RemotePlayKeyAssignment: -1 + ps4RemotePlayKeyMappingDir: + ps4PlayTogetherPlayerCount: 0 + ps4EnterButtonAssignment: 2 + ps4ApplicationParam1: 0 + ps4ApplicationParam2: 0 + ps4ApplicationParam3: 0 + ps4ApplicationParam4: 0 + ps4DownloadDataSize: 0 + ps4GarlicHeapSize: 2048 + ps4ProGarlicHeapSize: 2560 + playerPrefsMaxSize: 32768 + ps4Passcode: tx2HstM9ouVSysD5Oy3HCuo53tVbWHri + ps4pnSessions: 1 + ps4pnPresence: 1 + ps4pnFriends: 1 + ps4pnGameCustomData: 1 + playerPrefsSupport: 0 + enableApplicationExit: 0 + resetTempFolder: 1 + restrictedAudioUsageRights: 0 + ps4UseResolutionFallback: 0 + ps4ReprojectionSupport: 0 + ps4UseAudio3dBackend: 0 + ps4UseLowGarlicFragmentationMode: 1 + ps4SocialScreenEnabled: 0 + ps4ScriptOptimizationLevel: 2 + ps4Audio3dVirtualSpeakerCount: 14 + ps4attribCpuUsage: 0 + ps4PatchPkgPath: + ps4PatchLatestPkgPath: + ps4PatchChangeinfoPath: + ps4PatchDayOne: 0 + ps4attribUserManagement: 0 + ps4attribMoveSupport: 0 + ps4attrib3DSupport: 0 + ps4attribShareSupport: 0 + ps4attribExclusiveVR: 0 + ps4disableAutoHideSplash: 0 + ps4videoRecordingFeaturesUsed: 0 + ps4contentSearchFeaturesUsed: 0 + ps4CompatibilityPS5: 0 + ps4AllowPS5Detection: 0 + ps4GPU800MHz: 1 + ps4attribEyeToEyeDistanceSettingVR: 0 + ps4IncludedModules: [] + ps4attribVROutputEnabled: 0 + monoEnv: + splashScreenBackgroundSourceLandscape: {fileID: 0} + splashScreenBackgroundSourcePortrait: {fileID: 0} + blurSplashScreenBackground: 1 + spritePackerPolicy: + webGLMemorySize: 32 + webGLExceptionSupport: 1 + webGLNameFilesAsHashes: 0 + webGLShowDiagnostics: 0 + webGLDataCaching: 1 + webGLDebugSymbols: 0 + webGLEmscriptenArgs: + webGLModulesDirectory: + webGLTemplate: APPLICATION:Default + webGLAnalyzeBuildSize: 0 + webGLUseEmbeddedResources: 0 + webGLCompressionFormat: 1 + webGLWasmArithmeticExceptions: 0 + webGLLinkerTarget: 1 + webGLThreadsSupport: 0 + webGLDecompressionFallback: 0 + webGLInitialMemorySize: 32 + webGLMaximumMemorySize: 2048 + webGLMemoryGrowthMode: 2 + webGLMemoryLinearGrowthStep: 16 + webGLMemoryGeometricGrowthStep: 0.2 + webGLMemoryGeometricGrowthCap: 96 + webGLPowerPreference: 2 + scriptingDefineSymbols: {} + additionalCompilerArguments: {} + platformArchitecture: {} + scriptingBackend: + Standalone: 1 + il2cppCompilerConfiguration: {} + il2cppCodeGeneration: {} + managedStrippingLevel: + Standalone: 0 + incrementalIl2cppBuild: {} + suppressCommonWarnings: 1 + allowUnsafeCode: 0 + useDeterministicCompilation: 1 + additionalIl2CppArgs: + scriptingRuntimeVersion: 1 + gcIncremental: 1 + gcWBarrierValidation: 0 + apiCompatibilityLevelPerPlatform: {} + m_RenderingPath: 1 + m_MobileRenderingPath: 1 + metroPackageName: magic-unity-smoke + metroPackageVersion: + metroCertificatePath: + metroCertificatePassword: + metroCertificateSubject: + metroCertificateIssuer: + metroCertificateNotAfter: 0000000000000000 + metroApplicationDescription: magic-unity-smoke + wsaImages: {} + metroTileShortName: + metroTileShowName: 0 + metroMediumTileShowName: 0 + metroLargeTileShowName: 0 + metroWideTileShowName: 0 + metroSupportStreamingInstall: 0 + metroLastRequiredScene: 0 + metroDefaultTileSize: 1 + metroTileForegroundText: 2 + metroTileBackgroundColor: {r: 0.13333334, g: 0.17254902, b: 0.21568628, a: 0} + metroSplashScreenBackgroundColor: {r: 0.12941177, g: 0.17254902, b: 0.21568628, a: 1} + metroSplashScreenUseBackgroundColor: 0 + syncCapabilities: 0 + platformCapabilities: {} + metroTargetDeviceFamilies: {} + metroFTAName: + metroFTAFileTypes: [] + metroProtocolName: + vcxProjDefaultLanguage: + XboxOneProductId: + XboxOneUpdateKey: + XboxOneSandboxId: + XboxOneContentId: + XboxOneTitleId: + XboxOneSCId: + XboxOneGameOsOverridePath: + XboxOnePackagingOverridePath: + XboxOneAppManifestOverridePath: + XboxOneVersion: 1.0.0.0 + XboxOnePackageEncryption: 0 + XboxOnePackageUpdateGranularity: 2 + XboxOneDescription: + XboxOneLanguage: + - enus + XboxOneCapability: [] + XboxOneGameRating: {} + XboxOneIsContentPackage: 0 + XboxOneEnhancedXboxCompatibilityMode: 0 + XboxOneEnableGPUVariability: 1 + XboxOneSockets: {} + XboxOneSplashScreen: {fileID: 0} + XboxOneAllowedProductIds: [] + XboxOnePersistentLocalStorageSize: 0 + XboxOneXTitleMemory: 8 + XboxOneOverrideIdentityName: + XboxOneOverrideIdentityPublisher: + vrEditorSettings: {} + cloudServicesEnabled: {} + luminIcon: + m_Name: + m_ModelFolderPath: + m_PortalFolderPath: + luminCert: + m_CertPath: + m_SignPackage: 1 + luminIsChannelApp: 0 + luminVersion: + m_VersionCode: 1 + m_VersionName: + hmiPlayerDataPath: + hmiForceSRGBBlit: 1 + embeddedLinuxEnableGamepadInput: 1 + hmiLogStartupTiming: 0 + hmiCpuConfiguration: + apiCompatibilityLevel: 6 + activeInputHandler: 0 + windowsGamepadBackendHint: 0 + cloudProjectId: + framebufferDepthMemorylessMode: 0 + qualitySettingsNames: [] + projectName: + organizationId: + cloudEnabled: 0 + legacyClampBlendShapeWeights: 0 + hmiLoadingImage: {fileID: 0} + platformRequiresReadableAssets: 0 + virtualTexturingSupportEnabled: 0 + insecureHttpOption: 0 diff --git a/magic-unity-smoke/ProjectSettings/ProjectVersion.txt b/unity-examples/magic-unity-coexist/ProjectSettings/ProjectVersion.txt similarity index 100% rename from magic-unity-smoke/ProjectSettings/ProjectVersion.txt rename to unity-examples/magic-unity-coexist/ProjectSettings/ProjectVersion.txt diff --git a/magic-unity-smoke/ProjectSettings/QualitySettings.asset b/unity-examples/magic-unity-coexist/ProjectSettings/QualitySettings.asset similarity index 100% rename from magic-unity-smoke/ProjectSettings/QualitySettings.asset rename to unity-examples/magic-unity-coexist/ProjectSettings/QualitySettings.asset diff --git a/magic-unity-smoke/ProjectSettings/SceneTemplateSettings.json b/unity-examples/magic-unity-coexist/ProjectSettings/SceneTemplateSettings.json similarity index 100% rename from magic-unity-smoke/ProjectSettings/SceneTemplateSettings.json rename to unity-examples/magic-unity-coexist/ProjectSettings/SceneTemplateSettings.json diff --git a/magic-unity-smoke/ProjectSettings/TagManager.asset b/unity-examples/magic-unity-coexist/ProjectSettings/TagManager.asset similarity index 100% rename from magic-unity-smoke/ProjectSettings/TagManager.asset rename to unity-examples/magic-unity-coexist/ProjectSettings/TagManager.asset diff --git a/magic-unity-smoke/ProjectSettings/TimeManager.asset b/unity-examples/magic-unity-coexist/ProjectSettings/TimeManager.asset similarity index 100% rename from magic-unity-smoke/ProjectSettings/TimeManager.asset rename to unity-examples/magic-unity-coexist/ProjectSettings/TimeManager.asset diff --git a/magic-unity-smoke/ProjectSettings/UnityConnectSettings.asset b/unity-examples/magic-unity-coexist/ProjectSettings/UnityConnectSettings.asset similarity index 100% rename from magic-unity-smoke/ProjectSettings/UnityConnectSettings.asset rename to unity-examples/magic-unity-coexist/ProjectSettings/UnityConnectSettings.asset diff --git a/magic-unity-smoke/ProjectSettings/VFXManager.asset b/unity-examples/magic-unity-coexist/ProjectSettings/VFXManager.asset similarity index 100% rename from magic-unity-smoke/ProjectSettings/VFXManager.asset rename to unity-examples/magic-unity-coexist/ProjectSettings/VFXManager.asset diff --git a/magic-unity-smoke/ProjectSettings/VersionControlSettings.asset b/unity-examples/magic-unity-coexist/ProjectSettings/VersionControlSettings.asset similarity index 100% rename from magic-unity-smoke/ProjectSettings/VersionControlSettings.asset rename to unity-examples/magic-unity-coexist/ProjectSettings/VersionControlSettings.asset diff --git a/unity-examples/magic-unity-coexist/README.md b/unity-examples/magic-unity-coexist/README.md new file mode 100644 index 00000000..cfb744d2 --- /dev/null +++ b/unity-examples/magic-unity-coexist/README.md @@ -0,0 +1,107 @@ +# magic-unity-coexist + +A minimal Unity project that reproduces the **stock-ClojureCLR coexistence +noise** in-repo, so the magic repository can validate fixes to that bug class +without the private consumer project where it was first observed. + +## What it reproduces + +On every editor open or domain reload, a consumer that keeps stock ClojureCLR +in the editor (for REPL and hot-reload) while shipping the MAGIC fork runtime in +player builds prints one ERROR line per package Export `*.clj.dll`: + +``` +Assembly 'Packages/sg.flybot.magic.unity/Runtime/Infrastructure/Export/clojure.core_clr.clj.dll' will not be loaded due to errors: +Assembly is incompatible with the editor +``` + +plus one benign `Duplicate assembly 'Clojure.dll'` dedup line. At MAGIC v0.6.0 +the baseline is **46** narration lines. They are benign: Unity is narrating the +intended editor exclusion from issue #25, not a real failure. This project +exists to make that narration measurable and to let a silencing patch prove it +went to zero without regressing the exclusion. + +## Why the noise happens (and why this setup is the only way to see it) + +Two ingredients are both required: + +1. **A foreign stock `Clojure.dll` under `Assets/`.** `StockClojureCoexistence` + scans the filesystem for a strong-named `Clojure.dll`; finding one flips + every fork `*.clj.dll` plugin to editor-loading-off (issue #25: stock + `RT` probe-loads `clojure.core.clj` at init and a fork DLL answering that + probe throws a `TypeLoadException` storm). This project vendors the exact + stock layout under `Assets/Plugins/clojure-clr/` (Clojure 1.11.0 net462 + + DLR 1.3.2 + spec packages), marked Editor-only, identical to the consumer. + +2. **An immutable (PackageCache) install of the package.** The narration is a + *mismatch*: Unity reads the shipped `.meta` (editor-compatible) to decide the + editor candidate set, then the baked import artifact excludes the DLL, so it + narrates. On a mutable `file:` install the flip is written back to the + on-disk `.meta`, the mismatch disappears, and the narration never appears. + That is exactly why the standard `magic-unity-smoke` project (a `file:` + install) never shows this, and why `bb coexist-noise` installs the package + from a repacked tarball, which Unity resolves into a read-only PackageCache. + +The standalone `magic-unity-smoke` project deliberately has no stock ClojureCLR, +so it has no coexistence and never narrates. This project is its coexistence +counterpart. + +## Running it + +``` +bb coexist-noise # tests the dual variant: expect 0 narration lines +bb coexist-noise magic-only # tests the default variant: expect 46 lines (the problem) +``` + +From the repo root. The task: + +1. regenerates `magic-unity-dual` from `magic-unity` (`bb gen-unity-dual`), then + packs the chosen variant into `magic-unity.tgz` (a UPM tarball, the immutable + install); +2. writes `Packages/manifest.json` with the dependency key that matches the + packed variant's `package.json` name (mismatched names make UPM refuse to + resolve, which would look like a false "0 narration" pass); +3. forces a fresh PackageCache resolve (deletes the lock and the cached + package); +4. launches Unity 2022.3.62f3 headless twice: a cold import, then a domain + reload that runs `CoexistenceProbe`; +5. reports the narration-line count, the dedup-line count, and the probe state, + and asserts the expected outcome for the variant. + +The tarball, `Packages/packages-lock.json`, and `Logs/` are build artifacts and +are gitignored. The vendored `Assets/Plugins/clojure-clr/` tree is committed: it +is the fixture. The committed `manifest.json` pins the dual variant (the +default test target). + +Quit any GUI Unity holding this project first; batchmode exits 134 otherwise. + +### GUI + +Open `magic-unity-coexist` in Unity Hub (2022.3.62f3) after running +`bb coexist-noise magic-only` once (so the magic-only tarball is resolved and the +problem is present). Watch `~/Library/Logs/Unity/Editor.log` on a domain reload +(for example, by re-saving any script) for the 46 lines. + +## What each variant must prove + +- **Dual variant** (`bb coexist-noise`): **0** narration lines, and the probe + still reports `core-clj-loadable=false` with `preloaded-clj=0` (the runtime + `clj.dll`s stay out of the editor domain, so a stock `RT` init cannot resolve + them: issue #25 stays fixed). The `Duplicate assembly 'Clojure.dll'` dedup + line remains (benign, and confirms the package actually resolved). A run that + reports 0 narration but no probe line is INCONCLUSIVE, not a pass: the package + likely failed to resolve. +- **Magic-only variant** (`bb coexist-noise magic-only`): **46** narration lines, + reproducing exactly what a coexistence consumer of the default package sees. + This is the problem the dual variant solves. + +Player builds are unaffected by either variant: the Export DLLs are discovered +for IL2CPP through player compilation references, independent of editor +visibility. Confirm in `magic-unity-smoke` (`nos dotnet/build` then Build & Run +IL2CPP) that the player path is unchanged. + +The `CoexistenceProbe` marker line in the editor log carries the per-run state: + +``` +[CoexistenceProbe] preloaded-clj=0 core-clj-loadable=false core-clj-load=FileNotFoundException clojure-versions=[1.11.0.0] export-clj-editor-off=46 +``` diff --git a/magic-unity-smoke/.gitignore b/unity-examples/magic-unity-smoke/.gitignore similarity index 100% rename from magic-unity-smoke/.gitignore rename to unity-examples/magic-unity-smoke/.gitignore diff --git a/magic-unity-smoke/Assets/Clojure.meta b/unity-examples/magic-unity-smoke/Assets/Clojure.meta similarity index 100% rename from magic-unity-smoke/Assets/Clojure.meta rename to unity-examples/magic-unity-smoke/Assets/Clojure.meta diff --git a/magic-unity-smoke/Assets/Clojure/smoke.meta b/unity-examples/magic-unity-smoke/Assets/Clojure/smoke.meta similarity index 100% rename from magic-unity-smoke/Assets/Clojure/smoke.meta rename to unity-examples/magic-unity-smoke/Assets/Clojure/smoke.meta diff --git a/magic-unity-smoke/Assets/Clojure/smoke/control_flow.clj b/unity-examples/magic-unity-smoke/Assets/Clojure/smoke/control_flow.clj similarity index 100% rename from magic-unity-smoke/Assets/Clojure/smoke/control_flow.clj rename to unity-examples/magic-unity-smoke/Assets/Clojure/smoke/control_flow.clj diff --git a/magic-unity-smoke/Assets/Clojure/smoke/control_flow.clj.meta b/unity-examples/magic-unity-smoke/Assets/Clojure/smoke/control_flow.clj.meta similarity index 100% rename from magic-unity-smoke/Assets/Clojure/smoke/control_flow.clj.meta rename to unity-examples/magic-unity-smoke/Assets/Clojure/smoke/control_flow.clj.meta diff --git a/magic-unity-smoke/Assets/Clojure/smoke/letfn_cases.clj b/unity-examples/magic-unity-smoke/Assets/Clojure/smoke/letfn_cases.clj similarity index 100% rename from magic-unity-smoke/Assets/Clojure/smoke/letfn_cases.clj rename to unity-examples/magic-unity-smoke/Assets/Clojure/smoke/letfn_cases.clj diff --git a/magic-unity-smoke/Assets/Clojure/smoke/letfn_cases.clj.meta b/unity-examples/magic-unity-smoke/Assets/Clojure/smoke/letfn_cases.clj.meta similarity index 100% rename from magic-unity-smoke/Assets/Clojure/smoke/letfn_cases.clj.meta rename to unity-examples/magic-unity-smoke/Assets/Clojure/smoke/letfn_cases.clj.meta diff --git a/magic-unity-smoke/Assets/Clojure/smoke/polymorphism.clj b/unity-examples/magic-unity-smoke/Assets/Clojure/smoke/polymorphism.clj similarity index 100% rename from magic-unity-smoke/Assets/Clojure/smoke/polymorphism.clj rename to unity-examples/magic-unity-smoke/Assets/Clojure/smoke/polymorphism.clj diff --git a/magic-unity-smoke/Assets/Clojure/smoke/polymorphism.clj.meta b/unity-examples/magic-unity-smoke/Assets/Clojure/smoke/polymorphism.clj.meta similarity index 100% rename from magic-unity-smoke/Assets/Clojure/smoke/polymorphism.clj.meta rename to unity-examples/magic-unity-smoke/Assets/Clojure/smoke/polymorphism.clj.meta diff --git a/magic-unity-smoke/Assets/Clojure/smoke/runner.clj b/unity-examples/magic-unity-smoke/Assets/Clojure/smoke/runner.clj similarity index 100% rename from magic-unity-smoke/Assets/Clojure/smoke/runner.clj rename to unity-examples/magic-unity-smoke/Assets/Clojure/smoke/runner.clj diff --git a/magic-unity-smoke/Assets/Clojure/smoke/runner.clj.meta b/unity-examples/magic-unity-smoke/Assets/Clojure/smoke/runner.clj.meta similarity index 100% rename from magic-unity-smoke/Assets/Clojure/smoke/runner.clj.meta rename to unity-examples/magic-unity-smoke/Assets/Clojure/smoke/runner.clj.meta diff --git a/magic-unity-smoke/Assets/Clojure/smoke/stdlib_1_10.clj b/unity-examples/magic-unity-smoke/Assets/Clojure/smoke/stdlib_1_10.clj similarity index 100% rename from magic-unity-smoke/Assets/Clojure/smoke/stdlib_1_10.clj rename to unity-examples/magic-unity-smoke/Assets/Clojure/smoke/stdlib_1_10.clj diff --git a/magic-unity-smoke/Assets/Clojure/smoke/stdlib_1_10.clj.meta b/unity-examples/magic-unity-smoke/Assets/Clojure/smoke/stdlib_1_10.clj.meta similarity index 100% rename from magic-unity-smoke/Assets/Clojure/smoke/stdlib_1_10.clj.meta rename to unity-examples/magic-unity-smoke/Assets/Clojure/smoke/stdlib_1_10.clj.meta diff --git a/magic-unity-smoke/Assets/Clojure/smoke/value_types.clj b/unity-examples/magic-unity-smoke/Assets/Clojure/smoke/value_types.clj similarity index 100% rename from magic-unity-smoke/Assets/Clojure/smoke/value_types.clj rename to unity-examples/magic-unity-smoke/Assets/Clojure/smoke/value_types.clj diff --git a/magic-unity-smoke/Assets/Clojure/smoke/value_types.clj.meta b/unity-examples/magic-unity-smoke/Assets/Clojure/smoke/value_types.clj.meta similarity index 100% rename from magic-unity-smoke/Assets/Clojure/smoke/value_types.clj.meta rename to unity-examples/magic-unity-smoke/Assets/Clojure/smoke/value_types.clj.meta diff --git a/unity-examples/magic-unity-smoke/Assets/Editor.meta b/unity-examples/magic-unity-smoke/Assets/Editor.meta new file mode 100644 index 00000000..ce746171 --- /dev/null +++ b/unity-examples/magic-unity-smoke/Assets/Editor.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 60e6fe3d025f0462889df8e0816cdd19 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/magic-unity-smoke/Assets/Editor/SmokeBootstrap.cs b/unity-examples/magic-unity-smoke/Assets/Editor/SmokeBootstrap.cs similarity index 100% rename from magic-unity-smoke/Assets/Editor/SmokeBootstrap.cs rename to unity-examples/magic-unity-smoke/Assets/Editor/SmokeBootstrap.cs diff --git a/magic-unity-smoke/Assets/Editor/SmokeBootstrap.cs.meta b/unity-examples/magic-unity-smoke/Assets/Editor/SmokeBootstrap.cs.meta similarity index 100% rename from magic-unity-smoke/Assets/Editor/SmokeBootstrap.cs.meta rename to unity-examples/magic-unity-smoke/Assets/Editor/SmokeBootstrap.cs.meta diff --git a/unity-examples/magic-unity-smoke/Assets/Plugins.meta b/unity-examples/magic-unity-smoke/Assets/Plugins.meta new file mode 100644 index 00000000..f73cbf55 --- /dev/null +++ b/unity-examples/magic-unity-smoke/Assets/Plugins.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 4a4f1fcfae6be430c883bb77b729a31e +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/magic-unity-smoke/Assets/Scripts.meta b/unity-examples/magic-unity-smoke/Assets/Scripts.meta similarity index 100% rename from magic-unity-smoke/Assets/Scripts.meta rename to unity-examples/magic-unity-smoke/Assets/Scripts.meta diff --git a/magic-unity-smoke/Assets/Scripts/SmokeTestRunner.cs b/unity-examples/magic-unity-smoke/Assets/Scripts/SmokeTestRunner.cs similarity index 100% rename from magic-unity-smoke/Assets/Scripts/SmokeTestRunner.cs rename to unity-examples/magic-unity-smoke/Assets/Scripts/SmokeTestRunner.cs diff --git a/magic-unity-smoke/Assets/Scripts/SmokeTestRunner.cs.meta b/unity-examples/magic-unity-smoke/Assets/Scripts/SmokeTestRunner.cs.meta similarity index 100% rename from magic-unity-smoke/Assets/Scripts/SmokeTestRunner.cs.meta rename to unity-examples/magic-unity-smoke/Assets/Scripts/SmokeTestRunner.cs.meta diff --git a/magic-unity-smoke/Assets/Smoke.unity b/unity-examples/magic-unity-smoke/Assets/Smoke.unity similarity index 100% rename from magic-unity-smoke/Assets/Smoke.unity rename to unity-examples/magic-unity-smoke/Assets/Smoke.unity diff --git a/magic-unity-smoke/Assets/Smoke.unity.meta b/unity-examples/magic-unity-smoke/Assets/Smoke.unity.meta similarity index 100% rename from magic-unity-smoke/Assets/Smoke.unity.meta rename to unity-examples/magic-unity-smoke/Assets/Smoke.unity.meta diff --git a/magic-unity-smoke/Packages/manifest.json b/unity-examples/magic-unity-smoke/Packages/manifest.json similarity index 50% rename from magic-unity-smoke/Packages/manifest.json rename to unity-examples/magic-unity-smoke/Packages/manifest.json index 8aaf8207..b9faffbe 100644 --- a/magic-unity-smoke/Packages/manifest.json +++ b/unity-examples/magic-unity-smoke/Packages/manifest.json @@ -1,6 +1,6 @@ { "dependencies": { - "sg.flybot.magic.unity": "file:../../magic-unity", + "sg.flybot.magic.unity": "file:../../../magic-unity", "com.unity.ugui": "1.0.0" } } diff --git a/magic-unity-smoke/Packages/packages-lock.json b/unity-examples/magic-unity-smoke/Packages/packages-lock.json similarity index 94% rename from magic-unity-smoke/Packages/packages-lock.json rename to unity-examples/magic-unity-smoke/Packages/packages-lock.json index ea865147..6af9a148 100644 --- a/magic-unity-smoke/Packages/packages-lock.json +++ b/unity-examples/magic-unity-smoke/Packages/packages-lock.json @@ -17,7 +17,7 @@ } }, "sg.flybot.magic.unity": { - "version": "file:../../magic-unity", + "version": "file:../../../magic-unity", "depth": 0, "source": "local", "dependencies": { diff --git a/unity-examples/magic-unity-smoke/ProjectSettings/AudioManager.asset b/unity-examples/magic-unity-smoke/ProjectSettings/AudioManager.asset new file mode 100644 index 00000000..df1e8090 --- /dev/null +++ b/unity-examples/magic-unity-smoke/ProjectSettings/AudioManager.asset @@ -0,0 +1,20 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!11 &1 +AudioManager: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Volume: 1 + Rolloff Scale: 1 + Doppler Factor: 1 + Default Speaker Mode: 2 + m_SampleRate: 0 + m_DSPBufferSize: 1024 + m_VirtualVoiceCount: 512 + m_RealVoiceCount: 32 + m_EnableOutputSuspension: 1 + m_SpatializerPlugin: + m_AmbisonicDecoderPlugin: + m_DisableAudio: 0 + m_VirtualizeEffects: 1 + m_RequestedDSPBufferSize: 0 diff --git a/unity-examples/magic-unity-smoke/ProjectSettings/ClusterInputManager.asset b/unity-examples/magic-unity-smoke/ProjectSettings/ClusterInputManager.asset new file mode 100644 index 00000000..e7886b26 --- /dev/null +++ b/unity-examples/magic-unity-smoke/ProjectSettings/ClusterInputManager.asset @@ -0,0 +1,6 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!236 &1 +ClusterInputManager: + m_ObjectHideFlags: 0 + m_Inputs: [] diff --git a/unity-examples/magic-unity-smoke/ProjectSettings/DynamicsManager.asset b/unity-examples/magic-unity-smoke/ProjectSettings/DynamicsManager.asset new file mode 100644 index 00000000..3e5f55bc --- /dev/null +++ b/unity-examples/magic-unity-smoke/ProjectSettings/DynamicsManager.asset @@ -0,0 +1,40 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!55 &1 +PhysicsManager: + m_ObjectHideFlags: 0 + serializedVersion: 14 + m_Gravity: {x: 0, y: -9.81, z: 0} + m_DefaultMaterial: {fileID: 0} + m_BounceThreshold: 2 + m_DefaultMaxDepenetrationVelocity: 10 + m_SleepThreshold: 0.005 + m_DefaultContactOffset: 0.01 + m_DefaultSolverIterations: 6 + m_DefaultSolverVelocityIterations: 1 + m_QueriesHitBackfaces: 0 + m_QueriesHitTriggers: 1 + m_EnableAdaptiveForce: 0 + m_ClothInterCollisionDistance: 0.1 + m_ClothInterCollisionStiffness: 0.2 + m_ContactsGeneration: 1 + m_LayerCollisionMatrix: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + m_SimulationMode: 0 + m_AutoSyncTransforms: 0 + m_ReuseCollisionCallbacks: 0 + m_InvokeCollisionCallbacks: 1 + m_ClothInterCollisionSettingsToggle: 0 + m_ClothGravity: {x: 0, y: -9.81, z: 0} + m_ContactPairsMode: 0 + m_BroadphaseType: 0 + m_WorldBounds: + m_Center: {x: 0, y: 0, z: 0} + m_Extent: {x: 250, y: 250, z: 250} + m_WorldSubdivisions: 8 + m_FrictionType: 0 + m_EnableEnhancedDeterminism: 0 + m_EnableUnifiedHeightmaps: 1 + m_ImprovedPatchFriction: 0 + m_SolverType: 0 + m_DefaultMaxAngularSpeed: 50 + m_FastMotionThreshold: 3.4028235e+38 diff --git a/unity-examples/magic-unity-smoke/ProjectSettings/EditorBuildSettings.asset b/unity-examples/magic-unity-smoke/ProjectSettings/EditorBuildSettings.asset new file mode 100644 index 00000000..03389a9b --- /dev/null +++ b/unity-examples/magic-unity-smoke/ProjectSettings/EditorBuildSettings.asset @@ -0,0 +1,11 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1045 &1 +EditorBuildSettings: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Scenes: + - enabled: 1 + path: Assets/Smoke.unity + guid: 8f6ad000f1e3748e6a33cbe27a6b7ae4 + m_configObjects: {} diff --git a/unity-examples/magic-unity-smoke/ProjectSettings/EditorSettings.asset b/unity-examples/magic-unity-smoke/ProjectSettings/EditorSettings.asset new file mode 100644 index 00000000..a5f77b09 --- /dev/null +++ b/unity-examples/magic-unity-smoke/ProjectSettings/EditorSettings.asset @@ -0,0 +1,47 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!159 &1 +EditorSettings: + m_ObjectHideFlags: 0 + serializedVersion: 12 + m_SerializationMode: 2 + m_LineEndingsForNewScripts: 1 + m_DefaultBehaviorMode: 0 + m_PrefabRegularEnvironment: {fileID: 0} + m_PrefabUIEnvironment: {fileID: 0} + m_SpritePackerMode: 0 + m_SpritePackerCacheSize: 10 + m_SpritePackerPaddingPower: 1 + m_Bc7TextureCompressor: 0 + m_EtcTextureCompressorBehavior: 1 + m_EtcTextureFastCompressor: 1 + m_EtcTextureNormalCompressor: 2 + m_EtcTextureBestCompressor: 4 + m_ProjectGenerationIncludedExtensions: txt;xml;fnt;cd;asmdef;asmref;rsp;java;cpp;c;mm;m;h + m_ProjectGenerationRootNamespace: + m_EnableTextureStreamingInEditMode: 1 + m_EnableTextureStreamingInPlayMode: 1 + m_EnableEditorAsyncCPUTextureLoading: 0 + m_AsyncShaderCompilation: 1 + m_PrefabModeAllowAutoSave: 1 + m_EnterPlayModeOptionsEnabled: 0 + m_EnterPlayModeOptions: 3 + m_GameObjectNamingDigits: 1 + m_GameObjectNamingScheme: 0 + m_AssetNamingUsesSpace: 1 + m_InspectorUseIMGUIDefaultInspector: 0 + m_UseLegacyProbeSampleCount: 0 + m_SerializeInlineMappingsOnOneLine: 1 + m_DisableCookiesInLightmapper: 0 + m_AssetPipelineMode: 1 + m_RefreshImportMode: 0 + m_CacheServerMode: 0 + m_CacheServerEndpoint: + m_CacheServerNamespacePrefix: default + m_CacheServerEnableDownload: 1 + m_CacheServerEnableUpload: 1 + m_CacheServerEnableAuth: 0 + m_CacheServerEnableTls: 0 + m_CacheServerValidationMode: 2 + m_CacheServerDownloadBatchSize: 128 + m_EnableEnlightenBakedGI: 0 diff --git a/unity-examples/magic-unity-smoke/ProjectSettings/GraphicsSettings.asset b/unity-examples/magic-unity-smoke/ProjectSettings/GraphicsSettings.asset new file mode 100644 index 00000000..2d513492 --- /dev/null +++ b/unity-examples/magic-unity-smoke/ProjectSettings/GraphicsSettings.asset @@ -0,0 +1,67 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!30 &1 +GraphicsSettings: + m_ObjectHideFlags: 0 + serializedVersion: 15 + m_Deferred: + m_Mode: 1 + m_Shader: {fileID: 69, guid: 0000000000000000f000000000000000, type: 0} + m_DeferredReflections: + m_Mode: 1 + m_Shader: {fileID: 74, guid: 0000000000000000f000000000000000, type: 0} + m_ScreenSpaceShadows: + m_Mode: 1 + m_Shader: {fileID: 64, guid: 0000000000000000f000000000000000, type: 0} + m_DepthNormals: + m_Mode: 1 + m_Shader: {fileID: 62, guid: 0000000000000000f000000000000000, type: 0} + m_MotionVectors: + m_Mode: 1 + m_Shader: {fileID: 75, guid: 0000000000000000f000000000000000, type: 0} + m_LightHalo: + m_Mode: 1 + m_Shader: {fileID: 105, guid: 0000000000000000f000000000000000, type: 0} + m_LensFlare: + m_Mode: 1 + m_Shader: {fileID: 102, guid: 0000000000000000f000000000000000, type: 0} + m_VideoShadersIncludeMode: 2 + m_AlwaysIncludedShaders: + - {fileID: 7, guid: 0000000000000000f000000000000000, type: 0} + - {fileID: 15104, guid: 0000000000000000f000000000000000, type: 0} + - {fileID: 15105, guid: 0000000000000000f000000000000000, type: 0} + - {fileID: 15106, guid: 0000000000000000f000000000000000, type: 0} + - {fileID: 10753, guid: 0000000000000000f000000000000000, type: 0} + - {fileID: 10770, guid: 0000000000000000f000000000000000, type: 0} + - {fileID: 10783, guid: 0000000000000000f000000000000000, type: 0} + m_PreloadedShaders: [] + m_PreloadShadersBatchTimeLimit: -1 + m_SpritesDefaultMaterial: {fileID: 10754, guid: 0000000000000000f000000000000000, type: 0} + m_CustomRenderPipeline: {fileID: 0} + m_TransparencySortMode: 0 + m_TransparencySortAxis: {x: 0, y: 0, z: 1} + m_DefaultRenderingPath: 1 + m_DefaultMobileRenderingPath: 1 + m_TierSettings: [] + m_LightmapStripping: 0 + m_FogStripping: 0 + m_InstancingStripping: 0 + m_BrgStripping: 0 + m_LightmapKeepPlain: 1 + m_LightmapKeepDirCombined: 1 + m_LightmapKeepDynamicPlain: 1 + m_LightmapKeepDynamicDirCombined: 1 + m_LightmapKeepShadowMask: 1 + m_LightmapKeepSubtractive: 1 + m_FogKeepLinear: 1 + m_FogKeepExp: 1 + m_FogKeepExp2: 1 + m_AlbedoSwatchInfos: [] + m_LightsUseLinearIntensity: 0 + m_LightsUseColorTemperature: 0 + m_DefaultRenderingLayerMask: 1 + m_LogWhenShaderIsCompiled: 0 + m_SRPDefaultSettings: {} + m_LightProbeOutsideHullStrategy: 1 + m_CameraRelativeLightCulling: 0 + m_CameraRelativeShadowCulling: 0 diff --git a/unity-examples/magic-unity-smoke/ProjectSettings/InputManager.asset b/unity-examples/magic-unity-smoke/ProjectSettings/InputManager.asset new file mode 100644 index 00000000..8068b205 --- /dev/null +++ b/unity-examples/magic-unity-smoke/ProjectSettings/InputManager.asset @@ -0,0 +1,296 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!13 &1 +InputManager: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Axes: + - serializedVersion: 3 + m_Name: Horizontal + descriptiveName: + descriptiveNegativeName: + negativeButton: left + positiveButton: right + altNegativeButton: a + altPositiveButton: d + gravity: 3 + dead: 0.001 + sensitivity: 3 + snap: 1 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Vertical + descriptiveName: + descriptiveNegativeName: + negativeButton: down + positiveButton: up + altNegativeButton: s + altPositiveButton: w + gravity: 3 + dead: 0.001 + sensitivity: 3 + snap: 1 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Fire1 + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: left ctrl + altNegativeButton: + altPositiveButton: mouse 0 + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Fire2 + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: left alt + altNegativeButton: + altPositiveButton: mouse 1 + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Fire3 + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: left shift + altNegativeButton: + altPositiveButton: mouse 2 + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Jump + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: space + altNegativeButton: + altPositiveButton: + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Mouse X + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: + altNegativeButton: + altPositiveButton: + gravity: 0 + dead: 0 + sensitivity: 0.1 + snap: 0 + invert: 0 + type: 1 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Mouse Y + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: + altNegativeButton: + altPositiveButton: + gravity: 0 + dead: 0 + sensitivity: 0.1 + snap: 0 + invert: 0 + type: 1 + axis: 1 + joyNum: 0 + - serializedVersion: 3 + m_Name: Mouse ScrollWheel + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: + altNegativeButton: + altPositiveButton: + gravity: 0 + dead: 0 + sensitivity: 0.1 + snap: 0 + invert: 0 + type: 1 + axis: 2 + joyNum: 0 + - serializedVersion: 3 + m_Name: Horizontal + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: + altNegativeButton: + altPositiveButton: + gravity: 0 + dead: 0.19 + sensitivity: 1 + snap: 0 + invert: 0 + type: 2 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Vertical + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: + altNegativeButton: + altPositiveButton: + gravity: 0 + dead: 0.19 + sensitivity: 1 + snap: 0 + invert: 1 + type: 2 + axis: 1 + joyNum: 0 + - serializedVersion: 3 + m_Name: Fire1 + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: joystick button 0 + altNegativeButton: + altPositiveButton: + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Fire2 + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: joystick button 1 + altNegativeButton: + altPositiveButton: + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Fire3 + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: joystick button 2 + altNegativeButton: + altPositiveButton: + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Jump + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: joystick button 3 + altNegativeButton: + altPositiveButton: + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Submit + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: return + altNegativeButton: + altPositiveButton: joystick button 0 + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Submit + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: enter + altNegativeButton: + altPositiveButton: space + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Cancel + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: escape + altNegativeButton: + altPositiveButton: joystick button 1 + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + m_UsePhysicalKeys: 1 diff --git a/unity-examples/magic-unity-smoke/ProjectSettings/MemorySettings.asset b/unity-examples/magic-unity-smoke/ProjectSettings/MemorySettings.asset new file mode 100644 index 00000000..5b5facec --- /dev/null +++ b/unity-examples/magic-unity-smoke/ProjectSettings/MemorySettings.asset @@ -0,0 +1,35 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!387306366 &1 +MemorySettings: + m_ObjectHideFlags: 0 + m_EditorMemorySettings: + m_MainAllocatorBlockSize: -1 + m_ThreadAllocatorBlockSize: -1 + m_MainGfxBlockSize: -1 + m_ThreadGfxBlockSize: -1 + m_CacheBlockSize: -1 + m_TypetreeBlockSize: -1 + m_ProfilerBlockSize: -1 + m_ProfilerEditorBlockSize: -1 + m_BucketAllocatorGranularity: -1 + m_BucketAllocatorBucketsCount: -1 + m_BucketAllocatorBlockSize: -1 + m_BucketAllocatorBlockCount: -1 + m_ProfilerBucketAllocatorGranularity: -1 + m_ProfilerBucketAllocatorBucketsCount: -1 + m_ProfilerBucketAllocatorBlockSize: -1 + m_ProfilerBucketAllocatorBlockCount: -1 + m_TempAllocatorSizeMain: -1 + m_JobTempAllocatorBlockSize: -1 + m_BackgroundJobTempAllocatorBlockSize: -1 + m_JobTempAllocatorReducedBlockSize: -1 + m_TempAllocatorSizeGIBakingWorker: -1 + m_TempAllocatorSizeNavMeshWorker: -1 + m_TempAllocatorSizeAudioWorker: -1 + m_TempAllocatorSizeCloudWorker: -1 + m_TempAllocatorSizeGfx: -1 + m_TempAllocatorSizeJobWorker: -1 + m_TempAllocatorSizeBackgroundWorker: -1 + m_TempAllocatorSizePreloadManager: -1 + m_PlatformMemorySettings: {} diff --git a/unity-examples/magic-unity-smoke/ProjectSettings/NavMeshAreas.asset b/unity-examples/magic-unity-smoke/ProjectSettings/NavMeshAreas.asset new file mode 100644 index 00000000..2e2e3696 --- /dev/null +++ b/unity-examples/magic-unity-smoke/ProjectSettings/NavMeshAreas.asset @@ -0,0 +1,93 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!126 &1 +NavMeshProjectSettings: + m_ObjectHideFlags: 0 + serializedVersion: 2 + areas: + - name: Walkable + cost: 1 + - name: Not Walkable + cost: 1 + - name: Jump + cost: 2 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + m_LastAgentTypeID: -887442657 + m_Settings: + - serializedVersion: 3 + agentTypeID: 0 + agentRadius: 0.5 + agentHeight: 2 + agentSlope: 45 + agentClimb: 0.75 + ledgeDropHeight: 0 + maxJumpAcrossDistance: 0 + minRegionArea: 2 + manualCellSize: 0 + cellSize: 0.16666667 + manualTileSize: 0 + tileSize: 256 + buildHeightMesh: 0 + maxJobWorkers: 0 + preserveTilesOutsideBounds: 0 + debug: + m_Flags: 0 + m_SettingNames: + - Humanoid diff --git a/unity-examples/magic-unity-smoke/ProjectSettings/PackageManagerSettings.asset b/unity-examples/magic-unity-smoke/ProjectSettings/PackageManagerSettings.asset new file mode 100644 index 00000000..79fdc86a --- /dev/null +++ b/unity-examples/magic-unity-smoke/ProjectSettings/PackageManagerSettings.asset @@ -0,0 +1,36 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &1 +MonoBehaviour: + m_ObjectHideFlags: 53 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 13964, guid: 0000000000000000e000000000000000, type: 0} + m_Name: + m_EditorClassIdentifier: + m_EnablePreReleasePackages: 0 + m_AdvancedSettingsExpanded: 1 + m_ScopedRegistriesSettingsExpanded: 1 + m_SeeAllPackageVersions: 0 + m_DismissPreviewPackagesInUse: 0 + oneTimeWarningShown: 0 + m_Registries: + - m_Id: main + m_Name: + m_Url: https://packages.unity.com + m_Scopes: [] + m_IsDefault: 1 + m_Capabilities: 7 + m_ConfigSource: 0 + m_UserSelectedRegistryName: + m_UserAddingNewScopedRegistry: 0 + m_RegistryInfoDraft: + m_Modified: 0 + m_ErrorMessage: + m_UserModificationsInstanceId: -888 + m_OriginalInstanceId: -890 + m_LoadAssets: 0 diff --git a/unity-examples/magic-unity-smoke/ProjectSettings/Physics2DSettings.asset b/unity-examples/magic-unity-smoke/ProjectSettings/Physics2DSettings.asset new file mode 100644 index 00000000..b71b65c4 --- /dev/null +++ b/unity-examples/magic-unity-smoke/ProjectSettings/Physics2DSettings.asset @@ -0,0 +1,48 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!19 &1 +Physics2DSettings: + m_ObjectHideFlags: 0 + serializedVersion: 6 + m_Gravity: {x: 0, y: -9.81} + m_DefaultMaterial: {fileID: 0} + m_VelocityIterations: 8 + m_PositionIterations: 3 + m_VelocityThreshold: 1 + m_MaxLinearCorrection: 0.2 + m_MaxAngularCorrection: 8 + m_MaxTranslationSpeed: 100 + m_MaxRotationSpeed: 360 + m_BaumgarteScale: 0.2 + m_BaumgarteTimeOfImpactScale: 0.75 + m_TimeToSleep: 0.5 + m_LinearSleepTolerance: 0.01 + m_AngularSleepTolerance: 2 + m_DefaultContactOffset: 0.01 + m_JobOptions: + serializedVersion: 2 + useMultithreading: 0 + useConsistencySorting: 0 + m_InterpolationPosesPerJob: 100 + m_NewContactsPerJob: 30 + m_CollideContactsPerJob: 100 + m_ClearFlagsPerJob: 200 + m_ClearBodyForcesPerJob: 200 + m_SyncDiscreteFixturesPerJob: 50 + m_SyncContinuousFixturesPerJob: 50 + m_FindNearestContactsPerJob: 100 + m_UpdateTriggerContactsPerJob: 100 + m_IslandSolverCostThreshold: 100 + m_IslandSolverBodyCostScale: 1 + m_IslandSolverContactCostScale: 10 + m_IslandSolverJointCostScale: 10 + m_IslandSolverBodiesPerJob: 50 + m_IslandSolverContactsPerJob: 50 + m_SimulationMode: 0 + m_QueriesHitTriggers: 1 + m_QueriesStartInColliders: 1 + m_CallbacksOnDisable: 1 + m_ReuseCollisionCallbacks: 1 + m_AutoSyncTransforms: 0 + m_GizmoOptions: 10 + m_LayerCollisionMatrix: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff diff --git a/unity-examples/magic-unity-smoke/ProjectSettings/PresetManager.asset b/unity-examples/magic-unity-smoke/ProjectSettings/PresetManager.asset new file mode 100644 index 00000000..67a94dae --- /dev/null +++ b/unity-examples/magic-unity-smoke/ProjectSettings/PresetManager.asset @@ -0,0 +1,7 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1386491679 &1 +PresetManager: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_DefaultPresets: {} diff --git a/magic-unity-smoke/ProjectSettings/ProjectSettings.asset b/unity-examples/magic-unity-smoke/ProjectSettings/ProjectSettings.asset similarity index 100% rename from magic-unity-smoke/ProjectSettings/ProjectSettings.asset rename to unity-examples/magic-unity-smoke/ProjectSettings/ProjectSettings.asset diff --git a/unity-examples/magic-unity-smoke/ProjectSettings/ProjectVersion.txt b/unity-examples/magic-unity-smoke/ProjectSettings/ProjectVersion.txt new file mode 100644 index 00000000..587f809d --- /dev/null +++ b/unity-examples/magic-unity-smoke/ProjectSettings/ProjectVersion.txt @@ -0,0 +1,2 @@ +m_EditorVersion: 2022.3.62f3 +m_EditorVersionWithRevision: 2022.3.62f3 (96770f904ca7) diff --git a/unity-examples/magic-unity-smoke/ProjectSettings/QualitySettings.asset b/unity-examples/magic-unity-smoke/ProjectSettings/QualitySettings.asset new file mode 100644 index 00000000..bb69fbfb --- /dev/null +++ b/unity-examples/magic-unity-smoke/ProjectSettings/QualitySettings.asset @@ -0,0 +1,322 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!47 &1 +QualitySettings: + m_ObjectHideFlags: 0 + serializedVersion: 5 + m_CurrentQuality: 5 + m_QualitySettings: + - serializedVersion: 3 + name: Very Low + pixelLightCount: 0 + shadows: 0 + shadowResolution: 0 + shadowProjection: 1 + shadowCascades: 1 + shadowDistance: 15 + shadowNearPlaneOffset: 3 + shadowCascade2Split: 0.33333334 + shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} + shadowmaskMode: 0 + skinWeights: 1 + globalTextureMipmapLimit: 1 + textureMipmapLimitSettings: [] + anisotropicTextures: 0 + antiAliasing: 0 + softParticles: 0 + softVegetation: 0 + realtimeReflectionProbes: 0 + billboardsFaceCameraPosition: 0 + useLegacyDetailDistribution: 0 + vSyncCount: 0 + realtimeGICPUUsage: 25 + lodBias: 0.3 + maximumLODLevel: 0 + enableLODCrossFade: 1 + streamingMipmapsActive: 0 + streamingMipmapsAddAllCameras: 1 + streamingMipmapsMemoryBudget: 512 + streamingMipmapsRenderersPerFrame: 512 + streamingMipmapsMaxLevelReduction: 2 + streamingMipmapsMaxFileIORequests: 1024 + particleRaycastBudget: 4 + asyncUploadTimeSlice: 2 + asyncUploadBufferSize: 16 + asyncUploadPersistentBuffer: 1 + resolutionScalingFixedDPIFactor: 1 + customRenderPipeline: {fileID: 0} + terrainQualityOverrides: 0 + terrainPixelError: 1 + terrainDetailDensityScale: 1 + terrainBasemapDistance: 1000 + terrainDetailDistance: 80 + terrainTreeDistance: 5000 + terrainBillboardStart: 50 + terrainFadeLength: 5 + terrainMaxTrees: 50 + excludedTargetPlatforms: [] + - serializedVersion: 3 + name: Low + pixelLightCount: 0 + shadows: 0 + shadowResolution: 0 + shadowProjection: 1 + shadowCascades: 1 + shadowDistance: 20 + shadowNearPlaneOffset: 3 + shadowCascade2Split: 0.33333334 + shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} + shadowmaskMode: 0 + skinWeights: 2 + globalTextureMipmapLimit: 0 + textureMipmapLimitSettings: [] + anisotropicTextures: 0 + antiAliasing: 0 + softParticles: 0 + softVegetation: 0 + realtimeReflectionProbes: 0 + billboardsFaceCameraPosition: 0 + useLegacyDetailDistribution: 0 + vSyncCount: 0 + realtimeGICPUUsage: 25 + lodBias: 0.4 + maximumLODLevel: 0 + enableLODCrossFade: 1 + streamingMipmapsActive: 0 + streamingMipmapsAddAllCameras: 1 + streamingMipmapsMemoryBudget: 512 + streamingMipmapsRenderersPerFrame: 512 + streamingMipmapsMaxLevelReduction: 2 + streamingMipmapsMaxFileIORequests: 1024 + particleRaycastBudget: 16 + asyncUploadTimeSlice: 2 + asyncUploadBufferSize: 16 + asyncUploadPersistentBuffer: 1 + resolutionScalingFixedDPIFactor: 1 + customRenderPipeline: {fileID: 0} + terrainQualityOverrides: 0 + terrainPixelError: 1 + terrainDetailDensityScale: 1 + terrainBasemapDistance: 1000 + terrainDetailDistance: 80 + terrainTreeDistance: 5000 + terrainBillboardStart: 50 + terrainFadeLength: 5 + terrainMaxTrees: 50 + excludedTargetPlatforms: [] + - serializedVersion: 3 + name: Medium + pixelLightCount: 1 + shadows: 1 + shadowResolution: 0 + shadowProjection: 1 + shadowCascades: 1 + shadowDistance: 20 + shadowNearPlaneOffset: 3 + shadowCascade2Split: 0.33333334 + shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} + shadowmaskMode: 0 + skinWeights: 2 + globalTextureMipmapLimit: 0 + textureMipmapLimitSettings: [] + anisotropicTextures: 1 + antiAliasing: 0 + softParticles: 0 + softVegetation: 0 + realtimeReflectionProbes: 0 + billboardsFaceCameraPosition: 0 + useLegacyDetailDistribution: 0 + vSyncCount: 1 + realtimeGICPUUsage: 25 + lodBias: 0.7 + maximumLODLevel: 0 + enableLODCrossFade: 1 + streamingMipmapsActive: 0 + streamingMipmapsAddAllCameras: 1 + streamingMipmapsMemoryBudget: 512 + streamingMipmapsRenderersPerFrame: 512 + streamingMipmapsMaxLevelReduction: 2 + streamingMipmapsMaxFileIORequests: 1024 + particleRaycastBudget: 64 + asyncUploadTimeSlice: 2 + asyncUploadBufferSize: 16 + asyncUploadPersistentBuffer: 1 + resolutionScalingFixedDPIFactor: 1 + customRenderPipeline: {fileID: 0} + terrainQualityOverrides: 0 + terrainPixelError: 1 + terrainDetailDensityScale: 1 + terrainBasemapDistance: 1000 + terrainDetailDistance: 80 + terrainTreeDistance: 5000 + terrainBillboardStart: 50 + terrainFadeLength: 5 + terrainMaxTrees: 50 + excludedTargetPlatforms: [] + - serializedVersion: 3 + name: High + pixelLightCount: 2 + shadows: 2 + shadowResolution: 1 + shadowProjection: 1 + shadowCascades: 2 + shadowDistance: 40 + shadowNearPlaneOffset: 3 + shadowCascade2Split: 0.33333334 + shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} + shadowmaskMode: 1 + skinWeights: 2 + globalTextureMipmapLimit: 0 + textureMipmapLimitSettings: [] + anisotropicTextures: 1 + antiAliasing: 0 + softParticles: 0 + softVegetation: 1 + realtimeReflectionProbes: 1 + billboardsFaceCameraPosition: 1 + useLegacyDetailDistribution: 0 + vSyncCount: 1 + realtimeGICPUUsage: 50 + lodBias: 1 + maximumLODLevel: 0 + enableLODCrossFade: 1 + streamingMipmapsActive: 0 + streamingMipmapsAddAllCameras: 1 + streamingMipmapsMemoryBudget: 512 + streamingMipmapsRenderersPerFrame: 512 + streamingMipmapsMaxLevelReduction: 2 + streamingMipmapsMaxFileIORequests: 1024 + particleRaycastBudget: 256 + asyncUploadTimeSlice: 2 + asyncUploadBufferSize: 16 + asyncUploadPersistentBuffer: 1 + resolutionScalingFixedDPIFactor: 1 + customRenderPipeline: {fileID: 0} + terrainQualityOverrides: 0 + terrainPixelError: 1 + terrainDetailDensityScale: 1 + terrainBasemapDistance: 1000 + terrainDetailDistance: 80 + terrainTreeDistance: 5000 + terrainBillboardStart: 50 + terrainFadeLength: 5 + terrainMaxTrees: 50 + excludedTargetPlatforms: [] + - serializedVersion: 3 + name: Very High + pixelLightCount: 3 + shadows: 2 + shadowResolution: 2 + shadowProjection: 1 + shadowCascades: 2 + shadowDistance: 70 + shadowNearPlaneOffset: 3 + shadowCascade2Split: 0.33333334 + shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} + shadowmaskMode: 1 + skinWeights: 4 + globalTextureMipmapLimit: 0 + textureMipmapLimitSettings: [] + anisotropicTextures: 2 + antiAliasing: 2 + softParticles: 1 + softVegetation: 1 + realtimeReflectionProbes: 1 + billboardsFaceCameraPosition: 1 + useLegacyDetailDistribution: 0 + vSyncCount: 1 + realtimeGICPUUsage: 50 + lodBias: 1.5 + maximumLODLevel: 0 + enableLODCrossFade: 1 + streamingMipmapsActive: 0 + streamingMipmapsAddAllCameras: 1 + streamingMipmapsMemoryBudget: 512 + streamingMipmapsRenderersPerFrame: 512 + streamingMipmapsMaxLevelReduction: 2 + streamingMipmapsMaxFileIORequests: 1024 + particleRaycastBudget: 1024 + asyncUploadTimeSlice: 2 + asyncUploadBufferSize: 16 + asyncUploadPersistentBuffer: 1 + resolutionScalingFixedDPIFactor: 1 + customRenderPipeline: {fileID: 0} + terrainQualityOverrides: 0 + terrainPixelError: 1 + terrainDetailDensityScale: 1 + terrainBasemapDistance: 1000 + terrainDetailDistance: 80 + terrainTreeDistance: 5000 + terrainBillboardStart: 50 + terrainFadeLength: 5 + terrainMaxTrees: 50 + excludedTargetPlatforms: [] + - serializedVersion: 3 + name: Ultra + pixelLightCount: 4 + shadows: 2 + shadowResolution: 2 + shadowProjection: 1 + shadowCascades: 4 + shadowDistance: 150 + shadowNearPlaneOffset: 3 + shadowCascade2Split: 0.33333334 + shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} + shadowmaskMode: 1 + skinWeights: 255 + globalTextureMipmapLimit: 0 + textureMipmapLimitSettings: [] + anisotropicTextures: 2 + antiAliasing: 2 + softParticles: 1 + softVegetation: 1 + realtimeReflectionProbes: 1 + billboardsFaceCameraPosition: 1 + useLegacyDetailDistribution: 0 + vSyncCount: 1 + realtimeGICPUUsage: 100 + lodBias: 2 + maximumLODLevel: 0 + enableLODCrossFade: 1 + streamingMipmapsActive: 0 + streamingMipmapsAddAllCameras: 1 + streamingMipmapsMemoryBudget: 512 + streamingMipmapsRenderersPerFrame: 512 + streamingMipmapsMaxLevelReduction: 2 + streamingMipmapsMaxFileIORequests: 1024 + particleRaycastBudget: 4096 + asyncUploadTimeSlice: 2 + asyncUploadBufferSize: 16 + asyncUploadPersistentBuffer: 1 + resolutionScalingFixedDPIFactor: 1 + customRenderPipeline: {fileID: 0} + terrainQualityOverrides: 0 + terrainPixelError: 1 + terrainDetailDensityScale: 1 + terrainBasemapDistance: 1000 + terrainDetailDistance: 80 + terrainTreeDistance: 5000 + terrainBillboardStart: 50 + terrainFadeLength: 5 + terrainMaxTrees: 50 + excludedTargetPlatforms: [] + m_TextureMipmapLimitGroupNames: [] + m_PerPlatformDefaultQuality: + Android: 2 + EmbeddedLinux: 5 + GameCoreScarlett: 5 + GameCoreXboxOne: 5 + LinuxHeadlessSimulation: 5 + Nintendo Switch: 5 + PS4: 5 + PS5: 5 + QNX: 5 + Server: 5 + Stadia: 5 + Standalone: 5 + VisionOS: 5 + WebGL: 3 + Windows Store Apps: 5 + XboxOne: 5 + iPhone: 2 + tvOS: 2 diff --git a/unity-examples/magic-unity-smoke/ProjectSettings/SceneTemplateSettings.json b/unity-examples/magic-unity-smoke/ProjectSettings/SceneTemplateSettings.json new file mode 100644 index 00000000..5e97f839 --- /dev/null +++ b/unity-examples/magic-unity-smoke/ProjectSettings/SceneTemplateSettings.json @@ -0,0 +1,121 @@ +{ + "templatePinStates": [], + "dependencyTypeInfos": [ + { + "userAdded": false, + "type": "UnityEngine.AnimationClip", + "defaultInstantiationMode": 0 + }, + { + "userAdded": false, + "type": "UnityEditor.Animations.AnimatorController", + "defaultInstantiationMode": 0 + }, + { + "userAdded": false, + "type": "UnityEngine.AnimatorOverrideController", + "defaultInstantiationMode": 0 + }, + { + "userAdded": false, + "type": "UnityEditor.Audio.AudioMixerController", + "defaultInstantiationMode": 0 + }, + { + "userAdded": false, + "type": "UnityEngine.ComputeShader", + "defaultInstantiationMode": 1 + }, + { + "userAdded": false, + "type": "UnityEngine.Cubemap", + "defaultInstantiationMode": 0 + }, + { + "userAdded": false, + "type": "UnityEngine.GameObject", + "defaultInstantiationMode": 0 + }, + { + "userAdded": false, + "type": "UnityEditor.LightingDataAsset", + "defaultInstantiationMode": 0 + }, + { + "userAdded": false, + "type": "UnityEngine.LightingSettings", + "defaultInstantiationMode": 0 + }, + { + "userAdded": false, + "type": "UnityEngine.Material", + "defaultInstantiationMode": 0 + }, + { + "userAdded": false, + "type": "UnityEditor.MonoScript", + "defaultInstantiationMode": 1 + }, + { + "userAdded": false, + "type": "UnityEngine.PhysicMaterial", + "defaultInstantiationMode": 0 + }, + { + "userAdded": false, + "type": "UnityEngine.PhysicsMaterial2D", + "defaultInstantiationMode": 0 + }, + { + "userAdded": false, + "type": "UnityEngine.Rendering.PostProcessing.PostProcessProfile", + "defaultInstantiationMode": 0 + }, + { + "userAdded": false, + "type": "UnityEngine.Rendering.PostProcessing.PostProcessResources", + "defaultInstantiationMode": 0 + }, + { + "userAdded": false, + "type": "UnityEngine.Rendering.VolumeProfile", + "defaultInstantiationMode": 0 + }, + { + "userAdded": false, + "type": "UnityEditor.SceneAsset", + "defaultInstantiationMode": 1 + }, + { + "userAdded": false, + "type": "UnityEngine.Shader", + "defaultInstantiationMode": 1 + }, + { + "userAdded": false, + "type": "UnityEngine.ShaderVariantCollection", + "defaultInstantiationMode": 1 + }, + { + "userAdded": false, + "type": "UnityEngine.Texture", + "defaultInstantiationMode": 0 + }, + { + "userAdded": false, + "type": "UnityEngine.Texture2D", + "defaultInstantiationMode": 0 + }, + { + "userAdded": false, + "type": "UnityEngine.Timeline.TimelineAsset", + "defaultInstantiationMode": 0 + } + ], + "defaultDependencyTypeInfo": { + "userAdded": false, + "type": "", + "defaultInstantiationMode": 1 + }, + "newSceneOverride": 0 +} \ No newline at end of file diff --git a/unity-examples/magic-unity-smoke/ProjectSettings/TagManager.asset b/unity-examples/magic-unity-smoke/ProjectSettings/TagManager.asset new file mode 100644 index 00000000..1c92a784 --- /dev/null +++ b/unity-examples/magic-unity-smoke/ProjectSettings/TagManager.asset @@ -0,0 +1,43 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!78 &1 +TagManager: + serializedVersion: 2 + tags: [] + layers: + - Default + - TransparentFX + - Ignore Raycast + - + - Water + - UI + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + m_SortingLayers: + - name: Default + uniqueID: 0 + locked: 0 diff --git a/unity-examples/magic-unity-smoke/ProjectSettings/TimeManager.asset b/unity-examples/magic-unity-smoke/ProjectSettings/TimeManager.asset new file mode 100644 index 00000000..558a017e --- /dev/null +++ b/unity-examples/magic-unity-smoke/ProjectSettings/TimeManager.asset @@ -0,0 +1,9 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!5 &1 +TimeManager: + m_ObjectHideFlags: 0 + Fixed Timestep: 0.02 + Maximum Allowed Timestep: 0.33333334 + m_TimeScale: 1 + Maximum Particle Timestep: 0.03 diff --git a/unity-examples/magic-unity-smoke/ProjectSettings/UnityConnectSettings.asset b/unity-examples/magic-unity-smoke/ProjectSettings/UnityConnectSettings.asset new file mode 100644 index 00000000..a88bee0f --- /dev/null +++ b/unity-examples/magic-unity-smoke/ProjectSettings/UnityConnectSettings.asset @@ -0,0 +1,36 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!310 &1 +UnityConnectSettings: + m_ObjectHideFlags: 0 + serializedVersion: 1 + m_Enabled: 0 + m_TestMode: 0 + m_EventOldUrl: https://api.uca.cloud.unity3d.com/v1/events + m_EventUrl: https://cdp.cloud.unity3d.com/v1/events + m_ConfigUrl: https://config.uca.cloud.unity3d.com + m_DashboardUrl: https://dashboard.unity3d.com + m_TestInitMode: 0 + CrashReportingSettings: + m_EventUrl: https://perf-events.cloud.unity3d.com + m_Enabled: 0 + m_LogBufferSize: 10 + m_CaptureEditorExceptions: 1 + UnityPurchasingSettings: + m_Enabled: 0 + m_TestMode: 0 + UnityAnalyticsSettings: + m_Enabled: 0 + m_TestMode: 0 + m_InitializeOnStartup: 1 + m_PackageRequiringCoreStatsPresent: 0 + UnityAdsSettings: + m_Enabled: 0 + m_InitializeOnStartup: 1 + m_TestMode: 0 + m_IosGameId: + m_AndroidGameId: + m_GameIds: {} + m_GameId: + PerformanceReportingSettings: + m_Enabled: 0 diff --git a/unity-examples/magic-unity-smoke/ProjectSettings/VFXManager.asset b/unity-examples/magic-unity-smoke/ProjectSettings/VFXManager.asset new file mode 100644 index 00000000..852348bc --- /dev/null +++ b/unity-examples/magic-unity-smoke/ProjectSettings/VFXManager.asset @@ -0,0 +1,18 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!937362698 &1 +VFXManager: + m_ObjectHideFlags: 0 + m_IndirectShader: {fileID: 0} + m_CopyBufferShader: {fileID: 0} + m_SortShader: {fileID: 0} + m_StripUpdateShader: {fileID: 0} + m_EmptyShader: {fileID: 0} + m_RenderPipeSettingsPath: + m_FixedTimeStep: 0.016666668 + m_MaxDeltaTime: 0.05 + m_MaxScrubTime: 30 + m_CompiledVersion: 0 + m_RuntimeVersion: 0 + m_RuntimeResources: {fileID: 0} + m_BatchEmptyLifetime: 300 diff --git a/unity-examples/magic-unity-smoke/ProjectSettings/VersionControlSettings.asset b/unity-examples/magic-unity-smoke/ProjectSettings/VersionControlSettings.asset new file mode 100644 index 00000000..dca28814 --- /dev/null +++ b/unity-examples/magic-unity-smoke/ProjectSettings/VersionControlSettings.asset @@ -0,0 +1,8 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!890905787 &1 +VersionControlSettings: + m_ObjectHideFlags: 0 + m_Mode: Visible Meta Files + m_CollabEditorSettings: + inProgressEnabled: 1 diff --git a/magic-unity-smoke/README.md b/unity-examples/magic-unity-smoke/README.md similarity index 98% rename from magic-unity-smoke/README.md rename to unity-examples/magic-unity-smoke/README.md index 5db9a8f2..b69c8ae7 100644 --- a/magic-unity-smoke/README.md +++ b/unity-examples/magic-unity-smoke/README.md @@ -10,7 +10,7 @@ Runtime regression suite for MAGIC's IL2CPP output. Catches bugs that only repro ## Run ```bash -cd magic-unity-smoke +cd unity-examples/magic-unity-smoke nos dotnet/build ``` diff --git a/magic-unity-smoke/deps.edn b/unity-examples/magic-unity-smoke/deps.edn similarity index 100% rename from magic-unity-smoke/deps.edn rename to unity-examples/magic-unity-smoke/deps.edn diff --git a/magic-unity-smoke/dotnet.clj b/unity-examples/magic-unity-smoke/dotnet.clj similarity index 100% rename from magic-unity-smoke/dotnet.clj rename to unity-examples/magic-unity-smoke/dotnet.clj diff --git a/version.edn b/version.edn index e07bf7ac..17f3140b 100644 --- a/version.edn +++ b/version.edn @@ -1 +1 @@ -{:version "0.6.0"} +{:version "0.7.0"}