anchor.diff:    Inline Caches
     =======================================================*)
     
  -    (* ==== Inline cache for property get operations ==== *)
  +    (*==== Inline cache for property get operations ====*)
   and GetCache =
     val mutable Name : string
     val mutable ClassId : int
  
positive.code:   }
  
    member x.Update (obj:Object, value:Box byref, env:Environment) =
      obj.Set(x, ref value)
      if x.ClassId <> obj.ClassId then
        obj.Put(x, ref value, env)
  
    static member New(name:string) =
      let cache = Dlr.Expr.constant (new SetCache(name))
      (
        cache, 
        Expr.field cache "ClassId", 
        Expr.field cache "Index", 
        Expr.field cache "Crawler"
      )
      
      (* ==== Inline cache for object create options ==== *)
  and NewCache =
    val mutable Class : Class
    val mutable ClassId : int
  
negative.code:   Object + Support objects
    =======================================================*)
  
      (*==== Class representing an objects hidden class ====*)
  and [<AllowNullLiteral>] Class =
    val mutable ClassId : int
    val mutable SubClasses : Dict<string, Class>
    val mutable Variables : Dict<string, int>
  
    new(classId, variables) = {
      ClassId = classId
      Variables = variables
      SubClasses = new Dict<string, Class>();
    }
  
    member x.GetSubClass (name:string, newId:int) =
      //Note: I hate interfacing with C# code
      let success, cls = x.SubClasses.TryGetValue name
      if success then cls
      else
        let variables = new Dict<string, int>(x.Variables)
        variables.Add(name, variables.Count)
        x.SubClasses.Add(name, new Class(newId, variables)) 
        x.SubClasses.[name]
  
    member x.GetIndex varName =
      x.Variables.TryGetValue(varName)
  
      (*==== A plain javascript object ====*)
  and [<AllowNullLiteral>] Object =
    val mutable ClassId : int
    val mutable Class : Class
  