Browse Source

Supporting lazily initialized objects

Sebastien Ros 9 years ago
parent
commit
3042aa9aa0
2 changed files with 21 additions and 4 deletions
  1. 8 4
      Jint/Native/Argument/ArgumentsObject.cs
  2. 13 0
      Jint/Native/Object/ObjectInstance.cs

+ 8 - 4
Jint/Native/Argument/ArgumentsObject.cs

@@ -25,7 +25,7 @@ namespace Jint.Native.Argument
         private Action<ArgumentsInstance> _initializer;
         private bool _initialized;
 
-        private void EnsureInitialized()
+        protected override void EnsureInitialized()
         {
             if(_initialized)
             {
@@ -42,10 +42,7 @@ namespace Jint.Native.Argument
             var obj = new ArgumentsInstance(engine, self => 
             {                
                 var len = args.Length;
-                self.Prototype = engine.Object.PrototypeObject;
-                self.Extensible = true;
                 self.FastAddProperty("length", len, true, false, true);
-                self.Strict = strict;
                 var map = engine.Object.Construct(Arguments.Empty);
                 var mappedNamed = new List<string>();
                 var indx = 0;
@@ -89,6 +86,13 @@ namespace Jint.Native.Argument
                 }
             });
 
+            // These properties are pre-initialized as their don't trigger
+            // the EnsureInitialized() event and are cheap
+            obj.Prototype = engine.Object.PrototypeObject;
+            obj.Extensible = true;
+            obj.Strict = strict;
+            
+
             return obj;
         }
 

+ 13 - 0
Jint/Native/Object/ObjectInstance.cs

@@ -39,16 +39,19 @@ namespace Jint.Native.Object
 
         public virtual IEnumerable<KeyValuePair<string, PropertyDescriptor>> GetOwnProperties()
         {
+            EnsureInitialized();
             return Properties;
         }
 
         public virtual bool HasOwnProperty(string p)
         {
+            EnsureInitialized();
             return Properties.ContainsKey(p);
         }
 
         public virtual void RemoveOwnProperty(string p)
         {
+            EnsureInitialized();
             Properties.Remove(p);
         }
 
@@ -95,6 +98,8 @@ namespace Jint.Native.Object
         /// <returns></returns>
         public virtual PropertyDescriptor GetOwnProperty(string propertyName)
         {
+            EnsureInitialized();
+
             PropertyDescriptor x;
             if (Properties.TryGetValue(propertyName, out x))
             {
@@ -121,6 +126,7 @@ namespace Jint.Native.Object
 
         protected virtual void SetOwnProperty(string propertyName, PropertyDescriptor desc)
         {
+            EnsureInitialized();
             Properties[propertyName] = desc;
         }
 
@@ -306,6 +312,8 @@ namespace Jint.Native.Object
         /// <returns></returns>
         public JsValue DefaultValue(Types hint)
         {
+            EnsureInitialized();
+
             if (hint == Types.String || (hint == Types.None && Class == "Date"))
             {
                 var toString = Get("toString").TryCast<ICallable>();
@@ -599,6 +607,11 @@ namespace Jint.Native.Object
             SetOwnProperty(name, value);
         }
 
+        protected virtual void EnsureInitialized()
+        {
+
+        }
+
         public override string ToString()
         {
             return TypeConverter.ToString(this);