#nowarn "9" open System open System.Reflection open System.Reflection.Emit open System.Runtime.InteropServices open System.Globalization module TypeTags = let [] Box = 0x00000000u let [] Bool = 0xFFFFFF01u let [] Number = 0xFFFFFF02u let [] Clr = 0xFFFFFF03u let [] String = 0xFFFFFF04u let [] Undefined = 0xFFFFFF05u let [] Object = 0xFFFFFF06u let [] Function = 0xFFFFFF07u let Names = Map.ofList [ (Box, "internal") (Bool, "boolean") (Number, "number") (Clr, "clr") (String, "string") (Undefined, "undefined") (Object, "object") (Function, "function")] let getName (tag:uint32) = Names.[tag] module Markers = let [] Number = 0xFFF8us let [] Tagged = 0xFFF9us type CommonObject = class end type FunctionObject = class end type ArrayObject = class end (* A dynamic value whose type is unknown at runtime. *) type [] [] BoxedValue = struct //Reference Types [] val mutable Clr : Object [] val mutable Object : CommonObject [] val mutable Array : ArrayObject [] val mutable Func : FunctionObject [] val mutable String : String [] val mutable Scope : BoxedValue array //Value Types [] val mutable Bool : bool [] val mutable Number : double //Type & Tag [] val mutable Tag : uint32 [] val mutable Marker : uint16 member x.IsNumber = x.Marker < Markers.Tagged member x.IsTagged = x.Marker > Markers.Number member x.IsString = x.IsTagged && x.Tag = TypeTags.String member x.IsObject = x.IsTagged && x.Tag >= TypeTags.Object member x.IsFunction = x.IsTagged && x.Tag >= TypeTags.Function member x.IsBoolean = x.IsTagged && x.Tag = TypeTags.Bool member x.IsUndefined = x.IsTagged && x.Tag = TypeTags.Undefined member x.IsClr = x.IsTagged && x.Tag = TypeTags.Clr end