void Object::setLookup(Managed *m, Lookup *l, const Value &value) { Scope scope(static_cast<Object *>(m)->engine()); ScopedObject o(scope, static_cast<Object *>(m)); ScopedString name(scope, scope.engine->current->compilationUnit->runtimeStrings[l->nameIndex]); InternalClass *c = o->internalClass(); uint idx = c->find(name); if (!o->isArrayObject() || idx != Heap::ArrayObject::LengthPropertyIndex) { if (idx != UINT_MAX && o->internalClass()->propertyData[idx].isData() && o->internalClass()->propertyData[idx].isWritable()) { l->classList[0] = o->internalClass(); l->index = idx; l->setter = idx < o->d()->vtable()->nInlineProperties ? Lookup::setter0Inline : Lookup::setter0; o->setProperty(idx, value); return; } if (idx != UINT_MAX) { o->putValue(idx, value); return; } } o->put(name, value); if (o->internalClass() == c) return; idx = o->internalClass()->find(name); if (idx == UINT_MAX) return; l->classList[0] = c; l->classList[3] = o->internalClass(); l->index = idx; if (!o->prototype()) { l->setter = Lookup::setterInsert0; return; } o = o->prototype(); l->classList[1] = o->internalClass(); if (!o->prototype()) { l->setter = Lookup::setterInsert1; return; } o = o->prototype(); l->classList[2] = o->internalClass(); if (!o->prototype()) { l->setter = Lookup::setterInsert2; return; } l->setter = Lookup::setterGeneric; }
void Object::setLookup(Managed *m, Lookup *l, const ValueRef value) { Scope scope(m->engine()); ScopedObject o(scope, static_cast<Object *>(m)); InternalClass *c = o->internalClass; uint idx = c->find(l->name); if (!o->isArrayObject() || idx != ArrayObject::LengthPropertyIndex) { if (idx != UINT_MAX && o->internalClass->propertyData[idx].isData() && o->internalClass->propertyData[idx].isWritable()) { l->classList[0] = o->internalClass; l->index = idx; l->setter = Lookup::setter0; o->memberData[idx] = *value; return; } if (idx != UINT_MAX) { o->putValue(o->propertyAt(idx), o->internalClass->propertyData[idx], value); return; } } ScopedString s(scope, l->name); o->put(s, value); if (o->internalClass == c) return; idx = o->internalClass->find(l->name); if (idx == UINT_MAX) return; l->classList[0] = c; l->classList[3] = o->internalClass; l->index = idx; if (!o->prototype()) { l->setter = Lookup::setterInsert0; return; } o = o->prototype(); l->classList[1] = o->internalClass; if (!o->prototype()) { l->setter = Lookup::setterInsert1; return; } o = o->prototype(); l->classList[2] = o->internalClass; if (!o->prototype()) { l->setter = Lookup::setterInsert2; return; } l->setter = Lookup::setterGeneric; }