diff -r 000000000000 -r 6474c204b198 js/src/vm/Runtime-inl.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/js/src/vm/Runtime-inl.h Wed Dec 31 06:09:35 2014 +0100 @@ -0,0 +1,84 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- + * vim: set ts=8 sts=4 et sw=4 tw=99: + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#ifndef vm_Runtime_inl_h +#define vm_Runtime_inl_h + +#include "vm/Runtime.h" + +#include "jscompartment.h" + +#include "vm/Probes.h" + +#include "jsgcinlines.h" + +namespace js { + +inline bool +NewObjectCache::lookupProto(const Class *clasp, JSObject *proto, gc::AllocKind kind, EntryIndex *pentry) +{ + JS_ASSERT(!proto->is()); + return lookup(clasp, proto, kind, pentry); +} + +inline bool +NewObjectCache::lookupGlobal(const Class *clasp, js::GlobalObject *global, gc::AllocKind kind, EntryIndex *pentry) +{ + return lookup(clasp, global, kind, pentry); +} + +inline void +NewObjectCache::fillGlobal(EntryIndex entry, const Class *clasp, js::GlobalObject *global, gc::AllocKind kind, JSObject *obj) +{ + //JS_ASSERT(global == obj->getGlobal()); + return fill(entry, clasp, global, kind, obj); +} + +template +inline JSObject * +NewObjectCache::newObjectFromHit(JSContext *cx, EntryIndex entry_, js::gc::InitialHeap heap) +{ + // The new object cache does not account for metadata attached via callbacks. + JS_ASSERT(!cx->compartment()->hasObjectMetadataCallback()); + + JS_ASSERT(unsigned(entry_) < mozilla::ArrayLength(entries)); + Entry *entry = &entries[entry_]; + + JSObject *templateObj = reinterpret_cast(&entry->templateObject); + + // Do an end run around JSObject::type() to avoid doing AutoUnprotectCell + // on the templateObj, which is not a GC thing and can't use runtimeFromAnyThread. + types::TypeObject *type = templateObj->type_; + + if (type->shouldPreTenure()) + heap = gc::TenuredHeap; + + if (cx->runtime()->upcomingZealousGC()) + return nullptr; + + // Trigger an identical allocation to the one that notified us of OOM + // so that we trigger the right kind of GC automatically. + if (allowGC) { + mozilla::DebugOnly obj = + js::gc::AllocateObjectForCacheHit(cx, entry->kind, heap); + JS_ASSERT(!obj); + return nullptr; + } + + JS_ASSERT(allowGC == NoGC); + JSObject *obj = js::gc::AllocateObjectForCacheHit(cx, entry->kind, heap); + if (obj) { + copyCachedToObject(obj, templateObj, entry->kind); + probes::CreateObject(cx, obj); + return obj; + } + + return nullptr; +} + +} /* namespace js */ + +#endif /* vm_Runtime_inl_h */