int main(void) { lua_State *L = luaL_newstate(); luaL_openlibs(L); luaL_dofile(L, "src/main.lua"); nogc(L); return 0; }
JitCode* Linker::newCode(JSContext* cx, CodeKind kind) { JS::AutoAssertNoGC nogc(cx); if (masm.oom()) return fail(cx); masm.performPendingReadBarriers(); static const size_t ExecutableAllocatorAlignment = sizeof(void*); static_assert(CodeAlignment >= ExecutableAllocatorAlignment, "Unexpected alignment requirements"); // We require enough bytes for the code, header, and worst-case alignment padding. size_t bytesNeeded = masm.bytesNeeded() + sizeof(JitCodeHeader) + (CodeAlignment - ExecutableAllocatorAlignment); if (bytesNeeded >= MAX_BUFFER_SIZE) return fail(cx); // ExecutableAllocator requires bytesNeeded to be aligned. bytesNeeded = AlignBytes(bytesNeeded, ExecutableAllocatorAlignment); ExecutablePool* pool; uint8_t* result = (uint8_t*)cx->runtime()->jitRuntime()->execAlloc().alloc(cx, bytesNeeded, &pool, kind); if (!result) return fail(cx); // The JitCodeHeader will be stored right before the code buffer. uint8_t* codeStart = result + sizeof(JitCodeHeader); // Bump the code up to a nice alignment. codeStart = (uint8_t*)AlignBytes((uintptr_t)codeStart, CodeAlignment); MOZ_ASSERT(codeStart + masm.bytesNeeded() <= result + bytesNeeded); uint32_t headerSize = codeStart - result; JitCode* code = JitCode::New<NoGC>(cx, codeStart, bytesNeeded - headerSize, headerSize, pool, kind); if (!code) return fail(cx); if (masm.oom()) return fail(cx); awjc.emplace(result, bytesNeeded); code->copyFrom(masm); masm.link(code); if (masm.embedsNurseryPointers()) cx->runtime()->gc.storeBuffer().putWholeCell(code); return code; }
already_AddRefed<DominatorTree> HeapSnapshot::ComputeDominatorTree(ErrorResult& rv) { Maybe<JS::ubi::DominatorTree> maybeTree; { auto ccrt = CycleCollectedJSRuntime::Get(); MOZ_ASSERT(ccrt); auto rt = ccrt->Runtime(); MOZ_ASSERT(rt); JS::AutoCheckCannotGC nogc(rt); maybeTree = JS::ubi::DominatorTree::Create(rt, nogc, getRoot()); } if (maybeTree.isNothing()) { rv.Throw(NS_ERROR_OUT_OF_MEMORY); return nullptr; } return MakeAndAddRef<DominatorTree>(Move(*maybeTree), this, mParent); }