Exemple #1
0
        private void WritePropertyValue(TextWriter writer, Stack <RuntimeObject> stack, EcmaValue value)
        {
            switch (value.Type)
            {
            case EcmaValueType.Null:
                writer.Write("null");
                break;

            case EcmaValueType.Boolean:
                writer.Write(value.ToBoolean() ? "true" : "false");
                break;

            case EcmaValueType.Number:
                writer.Write(value.IsFinite ? value.ToString() : "null");
                break;

            case EcmaValueType.String:
                WriteString(writer, value.ToString());
                break;

            case EcmaValueType.Object:
                if (!value.IsCallable)
                {
                    if (EcmaArray.IsArray(value))
                    {
                        SerializeJsonArray(writer, stack, value.ToObject());
                    }
                    else
                    {
                        SerializeJsonObject(writer, stack, value.ToObject());
                    }
                }
                break;
            }
        }
Exemple #2
0
        public static EcmaValue GetOwnPropertyDescriptor(EcmaValue target, EcmaValue property)
        {
            EcmaPropertyDescriptor descriptor = target.ToObject().GetOwnProperty(EcmaPropertyKey.FromValue(property));

            if (descriptor == null)
            {
                return(default);
Exemple #3
0
        public static EcmaValue DefineProperty(EcmaValue target, EcmaValue property, EcmaValue attributes)
        {
            Guard.ArgumentIsObject(target);
            RuntimeObject obj = target.ToObject();

            obj.DefinePropertyOrThrow(EcmaPropertyKey.FromValue(property), EcmaPropertyDescriptor.FromValue(attributes));
            return(target);
        }
Exemple #4
0
        public static EcmaValue Entries(EcmaValue target)
        {
            List <EcmaValue> arr = new List <EcmaValue>();

            foreach (EcmaPropertyEntry e in target.ToObject().GetEnumerableOwnProperties(false))
            {
                arr.Add(e.ToValue());
            }
            return(new EcmaArray(arr));
        }
Exemple #5
0
 public static EcmaValue Freeze(EcmaValue obj)
 {
     if (obj.Type == EcmaValueType.Object)
     {
         if (!obj.ToObject().SetIntegrityLevel(RuntimeObjectIntegrityLevel.Frozen))
         {
             throw new EcmaTypeErrorException(InternalString.Error.PreventExtensionFailed);
         }
     }
     return(obj);
 }
Exemple #6
0
        public static EcmaValue DefineProperties(EcmaValue target, EcmaValue properties)
        {
            Guard.ArgumentIsObject(target);
            RuntimeObject dst = target.ToObject();

            foreach (EcmaPropertyEntry e in properties.ToObject().GetEnumerableOwnProperties(true))
            {
                dst.DefinePropertyOrThrow(e.Key, EcmaPropertyDescriptor.FromValue(e.Value));
            }
            return(target);
        }
Exemple #7
0
        public static EcmaValue Create(EcmaValue proto, EcmaValue properties)
        {
            if (proto.Type != EcmaValueType.Object && proto.Type != EcmaValueType.Null)
            {
                throw new EcmaTypeErrorException(InternalString.Error.PrototypeMustBeObjectOrNull);
            }
            RuntimeObject obj = Create(proto == EcmaValue.Null ? null : proto.ToObject());

            if (properties == default)
            {
                return(obj);
            }
            return(DefineProperties(obj, properties));
        }
Exemple #8
0
        public static bool InstanceOf(this EcmaValue thisValue, EcmaValue constructor)
        {
            if (constructor.Type != EcmaValueType.Object)
            {
                throw new EcmaTypeErrorException(InternalString.Error.NotFunction);
            }
            RuntimeObject obj           = constructor.ToObject();
            RuntimeObject instOfHandler = obj.GetMethod(Symbol.HasInstance);

            if (instOfHandler != null)
            {
                return(instOfHandler.Call(constructor, thisValue).ToBoolean());
            }
            if (!constructor.IsCallable)
            {
                throw new EcmaTypeErrorException(InternalString.Error.NotFunction);
            }
            return(obj.HasInstance(thisValue.ToObject()));
        }
Exemple #9
0
        public static EcmaValue CloneValue(EcmaValue value, EcmaValue[] transfer, RuntimeRealm targetRealm)
        {
            Guard.ArgumentNotNull(targetRealm, "targetRealm");
            bool isPrimitive = value.Type != EcmaValueType.Object;

            RuntimeObject[] transferList = transfer != null?transfer.Select(v => v.ToObject()).ToArray() : new RuntimeObject[0];

            RuntimeObject obj;

            if (isPrimitive)
            {
                obj     = new EcmaObject();
                obj[""] = value;
            }
            else
            {
                obj = value.ToObject();
            }
            obj = obj.Clone(targetRealm, transferList);
            return(isPrimitive ? obj[""] : obj);
        }
Exemple #10
0
        private static EcmaValue InternalizeJsonProperty(RuntimeObject holder, EcmaPropertyKey property, EcmaValue reviver)
        {
            EcmaValue value = holder.Get(property);

            if (value.Type == EcmaValueType.Object)
            {
                RuntimeObject obj = value.ToObject();
                if (EcmaArray.IsArray(value))
                {
                    for (long i = 0, length = value[WellKnownProperty.Length].ToLength(); i < length; i++)
                    {
                        EcmaValue newValue = InternalizeJsonProperty(obj, i, reviver);
                        if (newValue.Type == EcmaValueType.Undefined)
                        {
                            obj.Delete(i);
                        }
                        else
                        {
                            obj.CreateDataProperty(i, newValue);
                        }
                    }
                }
                else
                {
                    foreach (EcmaPropertyKey key in obj.GetEnumerableOwnPropertyKeys().ToArray())
                    {
                        EcmaValue newValue = InternalizeJsonProperty(obj, key, reviver);
                        if (newValue.Type == EcmaValueType.Undefined)
                        {
                            obj.Delete(key);
                        }
                        else
                        {
                            obj.CreateDataProperty(key, newValue);
                        }
                    }
                }
            }
            return(reviver.Call(holder, property.ToValue(), value));
        }
Exemple #11
0
        public static EcmaValue Many(EcmaValue iterable)
        {
            RuntimeFunctionInvocation invocation = RuntimeFunctionInvocation.Current;

            if (invocation == null || invocation.Generator == null)
            {
                throw new InvalidOperationException();
            }
            IGeneratorEnumerator other;

            if (invocation.Generator.Kind == GeneratorKind.Async)
            {
                other = new RecursiveYieldAsyncEnumerator(iterable.ToObject().GetAsyncIterator());
            }
            else if (iterable.GetUnderlyingObject() is IGeneratorEnumerable iterator)
            {
                other = new RecursiveYieldEnumerator(iterator);
            }
            else
            {
                other = new RecursiveYieldEnumerator(new EcmaIteratorEnumerator(iterable));
            }
            GeneratorDelegateEnumerator.GetCurrent().PushStack(other);
            return(default);
Exemple #12
0
 private void ResolveSelf(EcmaValue value, bool finalize)
 {
     if (value.Type == EcmaValueType.Object)
     {
         RuntimeObject obj = value.ToObject();
         if (obj == this)
         {
             SetStateFinalize(PromiseState.Rejected, new EcmaTypeErrorException(InternalString.Error.PromiseSelfResolution).ToValue());
             return;
         }
         try {
             RuntimeObject then = obj.GetMethod(WellKnownProperty.Then);
             if (then != null)
             {
                 then.Call(value, (PromiseResolver)ResolveSelf, (PromiseResolver)RejectSelf);
                 return;
             }
         } catch (Exception ex) {
             SetStateFinalize(PromiseState.Rejected, EcmaValueUtility.GetValueFromException(ex));
             return;
         }
     }
     SetState(PromiseState.Fulfilled, value, finalize);
 }
Exemple #13
0
 internal AsyncFromSyncIterator(EcmaValue value)
     : base(WellKnownObject.AsyncFromSyncIteratorPrototype)
 {
     this.target   = value.ToObject();
     this.iterator = new EcmaIteratorEnumerator(value);
 }
Exemple #14
0
 public EcmaArrayIterator(EcmaValue target, EcmaIteratorResultKind kind)
     : base(target.ToObject(), kind, WellKnownObject.ArrayIteratorPrototype)
 {
 }