bool GetPropIRGenerator::tryAttachDOMProxyUnshadowed(HandleObject obj, ObjOperandId objId, HandleId id) { MOZ_ASSERT(IsCacheableDOMProxy(obj)); RootedObject checkObj(cx_, obj->staticPrototype()); RootedNativeObject holder(cx_); RootedShape shape(cx_); NativeGetPropCacheability canCache = CanAttachNativeGetProp(cx_, checkObj, id, &holder, &shape, pc_, engine_, isTemporarilyUnoptimizable_); if (canCache == CanAttachNone) return false; maybeEmitIdGuard(id); writer.guardShape(objId, obj->maybeShape()); // Guard that our expando object hasn't started shadowing this property. CheckDOMProxyExpandoDoesNotShadow(writer, obj, id, objId); if (holder) { // Found the property on the prototype chain. Treat it like a native // getprop. GeneratePrototypeGuards(writer, obj, holder, objId); // Guard on the holder of the property. ObjOperandId holderId = writer.loadObject(holder); writer.guardShape(holderId, holder->lastProperty()); if (canCache == CanAttachReadSlot) { EmitLoadSlotResult(writer, holderId, holder, shape); writer.typeMonitorResult(); } else { // EmitCallGetterResultNoGuards expects |obj| to be the object the // property is on to do some checks. Since we actually looked at // checkObj, and no extra guards will be generated, we can just // pass that instead. MOZ_ASSERT(canCache == CanAttachCallGetter); EmitCallGetterResultNoGuards(writer, checkObj, holder, shape, objId); } } else { // Property was not found on the prototype chain. Deoptimize down to // proxy get call. writer.callProxyGetResult(objId, id); writer.typeMonitorResult(); } return true; }
bool GetPropIRGenerator::tryAttachDOMProxyShadowed(HandleObject obj, ObjOperandId objId) { MOZ_ASSERT(IsCacheableDOMProxy(obj)); writer.guardShape(objId, obj->maybeShape()); // No need for more guards: we know this is a DOM proxy, since the shape // guard enforces a given JSClass, so just go ahead and emit the call to // ProxyGet. writer.callProxyGetResult(objId, NameToId(name_)); writer.typeMonitorResult(); return true; }