Changeset 11566 in webkit for trunk/JavaScriptCore/kjs/nodes.cpp


Ignore:
Timestamp:
Dec 13, 2005, 1:24:53 PM (19 years ago)
Author:
andersca
Message:

2005-12-12 Anders Carlsson <[email protected]>

Reviewed by Darin.

  • bindings/runtime_array.cpp: (RuntimeArray::lengthGetter): (RuntimeArray::indexGetter):
  • bindings/runtime_array.h:
  • bindings/runtime_method.cpp: (RuntimeMethod::lengthGetter):
  • bindings/runtime_method.h:
  • bindings/runtime_object.cpp: (RuntimeObjectImp::fallbackObjectGetter): (RuntimeObjectImp::fieldGetter): (RuntimeObjectImp::methodGetter):
  • bindings/runtime_object.h:
  • kjs/array_instance.h:
  • kjs/array_object.cpp: (ArrayInstance::lengthGetter): (getProperty): Update for changes to PropertySlot::getValue and PropertySlot::GetValueFunc.
  • kjs/collector.cpp: (KJS::className): Handle GetterSetterType.
  • kjs/function.cpp: (KJS::FunctionImp::argumentsGetter): (KJS::FunctionImp::lengthGetter): (KJS::Arguments::mappedIndexGetter): (KJS::ActivationImp::argumentsGetter):
  • kjs/function.h: Update for changes to PropertySlot::getValue and PropertySlot::GetValueFunc.
  • kjs/grammar.y: Rework grammar parts for get set declarations directly in the object literal.
  • kjs/internal.cpp: (KJS::GetterSetterImp::mark): (KJS::GetterSetterImp::toPrimitive): (KJS::GetterSetterImp::toBoolean): (KJS::GetterSetterImp::toNumber): (KJS::GetterSetterImp::toString): (KJS::GetterSetterImp::toObject): Add type conversion functions. These aren't meant to be called.

(KJS::printInfo):
Handle GetterSetterType.

  • kjs/lookup.h: (KJS::staticFunctionGetter): (KJS::staticValueGetter): Update for changes to PropertySlot::GetValueFunc.
  • kjs/nodes.cpp: Refactor they way properties nodes are implemented. We now have a PropertyListNode which is a list of PropertyNodes. Each PropertyNode has a name (which is a PropertyNameNode) and an associated value node. PropertyNodes can be of different types. The Constant type is the old constant declaration and the Getter and Setter types are for property getters and setters. (ResolveNode::evaluate): Update for changes to PropertySlot::getValue.

(PropertyListNode::evaluate):
Go through all property nodes and set them on the newly created object. If the
property nodes are of type Getter or Setter, define getters and setters. Otherwise,
just add the properties like before.

(PropertyNode::evaluate):
This should never be called directly.

(PropertyNameNode::evaluate):
Rename from PropertyNode::evaluate.

(FunctionCallResolveNode::evaluate):
(FunctionCallBracketNode::evaluate):
(FunctionCallDotNode::evaluate):
(PostfixResolveNode::evaluate):
(PostfixBracketNode::evaluate):
(PostfixDotNode::evaluate):
(TypeOfResolveNode::evaluate):
(PrefixResolveNode::evaluate):
(PrefixBracketNode::evaluate):
(PrefixDotNode::evaluate):
(AssignResolveNode::evaluate):
(AssignDotNode::evaluate):
(AssignBracketNode::evaluate):
Update for changes to PropertySlot::getValue.

  • kjs/nodes.h: (KJS::PropertyNameNode::PropertyNameNode): Rename from PropertyNode.

(KJS::PropertyNode::):
(KJS::PropertyNode::PropertyNode):
New class, representing a single property.

(KJS::PropertyListNode::PropertyListNode):
Rename from PropertyValueNode.

(KJS::FuncExprNode::FuncExprNode):
Put ParameterNode parameter last, and make it optional.

(KJS::ObjectLiteralNode::ObjectLiteralNode):
Use a PropertyListNode here now.

  • kjs/nodes2string.cpp: (PropertyListNode::streamTo): Iterate through all property nodes.

(PropertyNode::streamTo):
Print out the name and value. Doesn't handle getters and setters currently.

(PropertyNameNode::streamTo):
Rename from PropertyNode::streamTo.

  • kjs/object.cpp: (KJS::JSObject::get): Update for changes to PropertySlot::getValue.

(KJS::JSObject::put):
If the property already exists and has a Setter, invoke
the setter function instead of setting the property directly.

(KJS::JSObject::defineGetter):
(KJS::JSObject::defineSetter):
New functions for defining property getters and setters on the object.

  • kjs/object.h: (KJS::GetterSetterImp::type): (KJS::GetterSetterImp::GetterSetterImp): (KJS::GetterSetterImp::getGetter): (KJS::GetterSetterImp::setGetter): (KJS::GetterSetterImp::getSetter): (KJS::GetterSetterImp::setSetter): New class for properties which have getters and setters defined. This class is only used internally and should never be seen from the outside.

(KJS::JSObject::getOwnPropertySlot):

If the property is a getter, call setGetterSlot on the property slot.

  • kjs/object_object.cpp: (ObjectPrototype::ObjectPrototype): Add defineGetter, defineSetter, lookupGetter, lookupSetter to prototype.

(ObjectProtoFunc::callAsFunction):
Implement handlers for new functions.

  • kjs/object_object.h: (KJS::ObjectProtoFunc::): Add ids for new functions.
  • kjs/property_slot.cpp: (KJS::PropertySlot::undefinedGetter): Update for changes to PropertySlot::GetValueFunc.

(KJS::PropertySlot::functionGetter):
Call the function getter object and return its value.

  • kjs/property_slot.h: (KJS::PropertySlot::getValue): Add a new argument which is the original object that getPropertySlot was called on.

(KJS::PropertySlot::setGetterSlot):
(KJS::PropertySlot::):
New function which sets a getter slot. When getValue is called on a
getter slot, the getter function object is invoked.

  • kjs/string_object.cpp: (StringInstance::lengthGetter): (StringInstance::indexGetter):
  • kjs/string_object.h: Update for changes to PropertySlot::GetValueFunc.
  • kjs/value.h: (KJS::): Add GetterSetterType and make GetterSetterImp a friend class of JSCell.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/JavaScriptCore/kjs/nodes.cpp

    r11527 r11566  
    278278
    279279    if (o->getPropertySlot(exec, ident, slot))
    280       return slot.getValue(exec, ident);
     280      return slot.getValue(exec, o, ident);
    281281   
    282282    ++iter;
     
    354354}
    355355
    356 // ------------------------------ PropertyValueNode ----------------------------
     356// ------------------------------ PropertyListNode -----------------------------
    357357
    358358// ECMA 11.1.5
    359 JSValue *PropertyValueNode::evaluate(ExecState *exec)
     359JSValue *PropertyListNode::evaluate(ExecState *exec)
    360360{
    361361  JSObject *obj = exec->lexicalInterpreter()->builtinObject()->construct(exec, List::empty());
    362362 
    363   for (PropertyValueNode *p = this; p; p = p->list.get()) {
    364     JSValue *n = p->name->evaluate(exec);
     363  for (PropertyListNode *p = this; p; p = p->list.get()) {
     364    JSValue *n = p->node->name->evaluate(exec);
    365365    KJS_CHECKEXCEPTIONVALUE
    366     JSValue *v = p->assign->evaluate(exec);
     366    JSValue *v = p->node->assign->evaluate(exec);
    367367    KJS_CHECKEXCEPTIONVALUE
    368 
    369     obj->put(exec, Identifier(n->toString(exec)), v);
     368   
     369    Identifier propertyName = Identifier(n->toString(exec));
     370    switch (p->node->type) {
     371      case PropertyNode::Getter:
     372        assert(v->isObject());
     373        obj->defineGetter(exec, propertyName, static_cast<JSObject *>(v));
     374        break;
     375      case PropertyNode::Setter:
     376        assert(v->isObject());
     377        obj->defineSetter(exec, propertyName, static_cast<JSObject *>(v));
     378        break;
     379      case PropertyNode::Constant:
     380        obj->put(exec, propertyName, v);
     381        break;
     382    }
    370383  }
    371384
     
    373386}
    374387
    375 // ------------------------------ PropertyNode ---------------------------------
    376 
     388// ------------------------------ PropertyNode -----------------------------
    377389// ECMA 11.1.5
    378 JSValue *PropertyNode::evaluate(ExecState *)
     390JSValue *PropertyNode::evaluate(ExecState *exec)
     391{
     392  assert(false);
     393  return jsNull();
     394}
     395
     396// ---------------------------- PropertyNameNode -------------------------------
     397
     398// ECMA 11.1.5
     399JSValue *PropertyNameNode::evaluate(ExecState *)
    379400{
    380401  JSValue *s;
     
    521542    base = *iter;
    522543    if (base->getPropertySlot(exec, ident, slot)) {
    523       JSValue *v = slot.getValue(exec, ident);
     544      JSValue *v = slot.getValue(exec, base, ident);
    524545      KJS_CHECKEXCEPTIONVALUE
    525546       
     
    570591  if (subscriptVal->getUInt32(i)) {
    571592    if (baseObj->getPropertySlot(exec, i, slot))
    572       funcVal = slot.getValue(exec, i);
     593      funcVal = slot.getValue(exec, baseObj, i);
    573594    else
    574595      funcVal = jsUndefined();
     
    621642  JSObject *baseObj = baseVal->toObject(exec);
    622643  PropertySlot slot;
    623   JSValue *funcVal = baseObj->getPropertySlot(exec, ident, slot) ? slot.getValue(exec, ident) : jsUndefined();
     644  JSValue *funcVal = baseObj->getPropertySlot(exec, ident, slot) ? slot.getValue(exec, baseObj, ident) : jsUndefined();
    624645  KJS_CHECKEXCEPTIONVALUE
    625646
     
    661682    base = *iter;
    662683    if (base->getPropertySlot(exec, m_ident, slot)) {
    663         JSValue *v = slot.getValue(exec, m_ident);
     684        JSValue *v = slot.getValue(exec, base, m_ident);
    664685
    665686        double n = v->toNumber(exec);
     
    691712  if (subscript->getUInt32(propertyIndex)) {
    692713    PropertySlot slot;
    693     JSValue *v = base->getPropertySlot(exec, propertyIndex, slot) ? slot.getValue(exec, propertyIndex) : jsUndefined();
     714    JSValue *v = base->getPropertySlot(exec, propertyIndex, slot) ? slot.getValue(exec, base, propertyIndex) : jsUndefined();
    694715    KJS_CHECKEXCEPTIONVALUE
    695716
     
    704725  Identifier propertyName(subscript->toString(exec));
    705726  PropertySlot slot;
    706   JSValue *v = base->getPropertySlot(exec, propertyName, slot) ? slot.getValue(exec, propertyName) : jsUndefined();
     727  JSValue *v = base->getPropertySlot(exec, propertyName, slot) ? slot.getValue(exec, base, propertyName) : jsUndefined();
    707728  KJS_CHECKEXCEPTIONVALUE
    708729
     
    724745
    725746  PropertySlot slot;
    726   JSValue *v = base->getPropertySlot(exec, m_ident, slot) ? slot.getValue(exec, m_ident) : jsUndefined();
     747  JSValue *v = base->getPropertySlot(exec, m_ident, slot) ? slot.getValue(exec, base, m_ident) : jsUndefined();
    727748  KJS_CHECKEXCEPTIONVALUE
    728749
     
    849870    base = *iter;
    850871    if (base->getPropertySlot(exec, m_ident, slot)) {
    851         JSValue *v = slot.getValue(exec, m_ident);
     872        JSValue *v = slot.getValue(exec, base, m_ident);
    852873        return typeStringForValue(v);
    853874    }
     
    887908    base = *iter;
    888909    if (base->getPropertySlot(exec, m_ident, slot)) {
    889         JSValue *v = slot.getValue(exec, m_ident);
     910        JSValue *v = slot.getValue(exec, base, m_ident);
    890911
    891912        double n = v->toNumber(exec);
     
    918939  if (subscript->getUInt32(propertyIndex)) {
    919940    PropertySlot slot;
    920     JSValue *v = base->getPropertySlot(exec, propertyIndex, slot) ? slot.getValue(exec, propertyIndex) : jsUndefined();
     941    JSValue *v = base->getPropertySlot(exec, propertyIndex, slot) ? slot.getValue(exec, base, propertyIndex) : jsUndefined();
    921942    KJS_CHECKEXCEPTIONVALUE
    922943
     
    932953  Identifier propertyName(subscript->toString(exec));
    933954  PropertySlot slot;
    934   JSValue *v = base->getPropertySlot(exec, propertyName, slot) ? slot.getValue(exec, propertyName) : jsUndefined();
     955  JSValue *v = base->getPropertySlot(exec, propertyName, slot) ? slot.getValue(exec, base, propertyName) : jsUndefined();
    935956  KJS_CHECKEXCEPTIONVALUE
    936957
     
    953974
    954975  PropertySlot slot;
    955   JSValue *v = base->getPropertySlot(exec, m_ident, slot) ? slot.getValue(exec, m_ident) : jsUndefined();
     976  JSValue *v = base->getPropertySlot(exec, m_ident, slot) ? slot.getValue(exec, base, m_ident) : jsUndefined();
    956977  KJS_CHECKEXCEPTIONVALUE
    957978
     
    12921313    v = m_right->evaluate(exec);
    12931314  } else {
    1294     JSValue *v1 = slot.getValue(exec, m_ident);
     1315    JSValue *v1 = slot.getValue(exec, base, m_ident);
    12951316    KJS_CHECKEXCEPTIONVALUE
    12961317    JSValue *v2 = m_right->evaluate(exec);
     
    13181339  } else {
    13191340    PropertySlot slot;
    1320     JSValue *v1 = base->getPropertySlot(exec, m_ident, slot) ? slot.getValue(exec, m_ident) : jsUndefined();
     1341    JSValue *v1 = base->getPropertySlot(exec, m_ident, slot) ? slot.getValue(exec, base, m_ident) : jsUndefined();
    13211342    KJS_CHECKEXCEPTIONVALUE
    13221343    JSValue *v2 = m_right->evaluate(exec);
     
    13481369    } else {
    13491370      PropertySlot slot;
    1350       JSValue *v1 = base->getPropertySlot(exec, propertyIndex, slot) ? slot.getValue(exec, propertyIndex) : jsUndefined();
     1371      JSValue *v1 = base->getPropertySlot(exec, propertyIndex, slot) ? slot.getValue(exec, base, propertyIndex) : jsUndefined();
    13511372      KJS_CHECKEXCEPTIONVALUE
    13521373      JSValue *v2 = m_right->evaluate(exec);
     
    13671388  } else {
    13681389    PropertySlot slot;
    1369     JSValue *v1 = base->getPropertySlot(exec, propertyName, slot) ? slot.getValue(exec, propertyName) : jsUndefined();
     1390    JSValue *v1 = base->getPropertySlot(exec, propertyName, slot) ? slot.getValue(exec, base, propertyName) : jsUndefined();
    13701391    KJS_CHECKEXCEPTIONVALUE
    13711392    JSValue *v2 = m_right->evaluate(exec);
Note: See TracChangeset for help on using the changeset viewer.