mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-11-02 07:05:24 +00:00
1b17519a11
This changes the allocation API, in the following way: js_malloc -> {cx->,rt->,OffTheBooks::}malloc js_calloc -> {cx->,rt->,OffTheBooks::}calloc js_realloc -> {cx->,rt->,OffTheBooks::}realloc js_free -> {cx->,rt->,Foreground::,UnwantedForeground::}free js_new -> {cx->,rt->,OffTheBooks::}new_ js_new_array -> {cx->,rt->,OffTheBooks::}new_array js_delete -> {cx->,rt->,Foreground::,UnwantedForeground::}delete_ This is to move as many allocations as possible through a JSContext (so that they may be aken into account by gcMallocBytes) and to move as many deallocations to the background as possible (except on error paths).
81 lines
3.0 KiB
Plaintext
Executable File
81 lines
3.0 KiB
Plaintext
Executable File
# /bin/bash
|
|
|
|
#----------------------------------------------------------------------------
|
|
# We must avoid using the vanilla new/new[] operators (and consequently, the
|
|
# vanilla delete/delete[] operators) in SpiderMonkey, see bug 624878 for why.
|
|
#
|
|
# This script:
|
|
# - Detects if any of the vanilla new/new[] operators are used in a file.
|
|
# Its exit code is 1 if it found some, and 0 if it didn't.
|
|
# - Doesn't detect delete/delete[] because it appears they can be present
|
|
# somehow due to virtual destructors, but this is ok because vanilla
|
|
# delete/delete[] calls don't make sense without corresponding new/new[]
|
|
# calls, and any explicit calls will be caught by Valgrind's mismatched
|
|
# alloc/free checking.
|
|
# - Doesn't detect the 'nothrow' variants, which are ok but probably still
|
|
# best avoided.
|
|
# - Is designed to only run on Linux (though it may also work on Mac); one
|
|
# platform will be enough to catch any violations.
|
|
#
|
|
# If this script fails:
|
|
# - You need to find the uses of vanilla new/delete and replace them with
|
|
# {js::OffTheBooks,JSContext,JSRuntime}::{new_,/array_new}.
|
|
# - Run this script on each of the .o files, that should narrow it down.
|
|
# - After that, one way to find them is to run 'objdump -r -C' on the
|
|
# relevant .o files. For example, you might search for 'operator new' and
|
|
# find a record like this:
|
|
#
|
|
# RELOCATION RECORDS FOR [.text._ZN3JSC14ExecutablePool6createEj]:
|
|
# OFFSET TYPE VALUE
|
|
# 00000009 R_386_PC32 __i686.get_pc_thunk.bx
|
|
# 0000000f R_386_GOTPC _GLOBAL_OFFSET_TABLE_
|
|
# 0000001b R_386_PLT32 operator new(unsigned int)
|
|
# 0000002e R_386_PC32 JSC::ExecutablePool::ExecutablePool(unsigned int)
|
|
# 0000004a R_386_PC32 JSC::ExecutablePool::~ExecutablePool()
|
|
# 00000052 R_386_PLT32 operator delete(void*)
|
|
#
|
|
# This says that vanilla 'new' and 'delete' are both used in
|
|
# JSC::ExecutablePool::create(unsigned int). This doesn't always work,
|
|
# though. (Nb: use 'c++filt' to demangle names like
|
|
# _ZN3JSC14ExecutablePool6createEj.)
|
|
#
|
|
# If that doesn't work, use grep.
|
|
#----------------------------------------------------------------------------
|
|
|
|
if [ -z $1 ] ; then
|
|
echo "usage: find_vanilla_new_calls <file>"
|
|
exit 1
|
|
fi
|
|
|
|
file=$1
|
|
|
|
if [ ! -f $file ] ; then
|
|
echo "TEST-UNEXPECTED-FAIL | find_vanilla_new_calls | file '$file' not found"
|
|
exit 1
|
|
fi
|
|
|
|
tmpfile1=`mktemp`
|
|
tmpfile2=`mktemp`
|
|
nm -C $file > $tmpfile1
|
|
|
|
# Need to double-escape '[' and ']' to stop grep from interpreting them
|
|
# specially.
|
|
grep 'operator new(unsigned int)' $tmpfile1 >> $tmpfile2
|
|
grep 'operator new(unsigned long)' $tmpfile1 >> $tmpfile2
|
|
grep 'operator new\\[\\](unsigned int)' $tmpfile1 >> $tmpfile2
|
|
grep 'operator new\\[\\](unsigned long)' $tmpfile1 >> $tmpfile2
|
|
rm -f $tmpfile1
|
|
|
|
if [ -s $tmpfile2 ] ; then
|
|
echo "TEST-UNEXPECTED-FAIL | find_vanilla_new_calls | found calls are listed below"
|
|
cat $tmpfile2
|
|
echo
|
|
rm -f $tmpfile2
|
|
exit 1
|
|
fi
|
|
|
|
echo "TEST-PASS | find_vanilla_new_calls | ok"
|
|
echo
|
|
|
|
exit 0
|