/// <summary> /// 8.10.5 /// </summary> /// <param name="global"></param> /// <param name="obj"></param> /// <returns></returns> internal static Descriptor ToPropertyDesciptor(IGlobal global, JsDictionaryObject owner, string name, JsInstance jsInstance) { if (jsInstance.Class != JsInstance.CLASS_OBJECT) { throw new JsException(global.TypeErrorClass.New("The target object has to be an instance of an object")); } JsObject obj = (JsObject)jsInstance; if ((obj.HasProperty("value") || obj.HasProperty("writable")) && (obj.HasProperty("set") || obj.HasProperty("get"))) { throw new JsException(global.TypeErrorClass.New("The property cannot be both writable and have get/set accessors or cannot have both a value and an accessor defined")); } Descriptor desc; JsInstance result = null; if (obj.HasProperty("value")) { desc = new ValueDescriptor(owner, name, obj["value"]); } else { desc = new PropertyDescriptor(global, owner, name); } if (obj.TryGetProperty("enumerable", out result)) { desc.Enumerable = result.ToBoolean(); } if (obj.TryGetProperty("configurable", out result)) { desc.Configurable = result.ToBoolean(); } if (obj.TryGetProperty("writable", out result)) { desc.Writable = result.ToBoolean(); } if (obj.TryGetProperty("get", out result)) { if (!(result is JsFunction)) throw new JsException(global.TypeErrorClass.New("The getter has to be a function")); ((PropertyDescriptor)desc).GetFunction = (JsFunction)result; } if (obj.TryGetProperty("set", out result)) { if (!(result is JsFunction)) throw new JsException(global.TypeErrorClass.New("The setter has to be a function")); ((PropertyDescriptor)desc).SetFunction = (JsFunction)result; } return desc; }
public void Visit(PropertyDeclarationExpression expression) { switch (expression.Mode) { case PropertyExpressionType.Data: expression.Expression.Accept(this); Result = new ValueDescriptor(CurrentScope, expression.Name, Result); break; case PropertyExpressionType.Get: case PropertyExpressionType.Set: JsFunction get = null, set = null; if (expression.GetExpression != null) { expression.GetExpression.Accept(this); get = (JsFunction)Result; } if (expression.SetExpression != null) { expression.SetExpression.Accept(this); set = (JsFunction)Result; } Result = new PropertyDescriptor(Global, CurrentScope, expression.Name) { GetFunction = get, SetFunction = set, Enumerable = true }; break; default: break; } }
public void Visit(PropertyDeclarationExpression expression) { // previous result was the object in which we need to define a property var target = Result as JsDictionaryObject; switch (expression.Mode) { case PropertyExpressionType.Data: expression.Expression.Accept(this); Result = new ValueDescriptor(target, expression.Name, Result); break; case PropertyExpressionType.Get: case PropertyExpressionType.Set: JsFunction get = null, set = null; if (expression.GetExpression != null) { expression.GetExpression.Accept(this); get = (JsFunction)Result; } if (expression.SetExpression != null) { expression.SetExpression.Accept(this); set = (JsFunction)Result; } Result = new PropertyDescriptor(Global, target, expression.Name) { GetFunction = get, SetFunction = set, Enumerable = true }; break; default: break; } }