[JAEGER] Merge from tracemonkey.

This commit is contained in:
David Mandelin 2010-08-06 15:39:15 -07:00
commit 0c268b4fe8
86 changed files with 4915 additions and 7313 deletions

View File

@ -1138,12 +1138,26 @@
notificationbox.setAttribute("flex", "1");
notificationbox.appendChild(b);
b.setAttribute("flex", "1");
var position = this.tabs.length - 1;
var uniqueId = "panel" + Date.now() + position;
notificationbox.id = uniqueId;
t.linkedPanel = uniqueId;
t.linkedBrowser = b;
t._tPos = position;
if (t.previousSibling.selected)
t.setAttribute("afterselected", true);
// NB: this appendChild call causes us to run constructors for the
// browser element, which fires off a bunch of notifications. Some
// of those notifications can cause code to run that inspects our
// state, so it is important that the tab element is fully
// initialized by this point.
this.mPanelContainer.appendChild(notificationbox);
this.tabContainer.updateVisibility();
// wire up a progress listener for the new browser object.
var position = this.tabs.length - 1;
var tabListener = this.mTabProgressListener(t, b, blank);
const filter = Components.classes["@mozilla.org/appshell/component/browser-status-filter;1"]
.createInstance(Components.interfaces.nsIWebProgress);
@ -1155,14 +1169,6 @@
b._fastFind = this.fastFind;
b.droppedLinkHandler = handleDroppedLink;
var uniqueId = "panel" + Date.now() + position;
this.mPanelContainer.lastChild.id = uniqueId;
t.linkedPanel = uniqueId;
t.linkedBrowser = b;
t._tPos = position;
if (t.previousSibling.selected)
t.setAttribute("afterselected", true);
this.tabContainer.adjustTabstrip();
// Dispatch a new tab notification. We do this once we're

View File

@ -1,4 +1,4 @@
var expected = ["TabOpen", "onLocationChange", "onStateChange", "onLinkIconAvailable"];
var expected = ["TabOpen", "onStateChange", "onLocationChange", "onLinkIconAvailable"];
var actual = [];
var tabIndex = -1;
__defineGetter__("tab", function () gBrowser.tabs[tabIndex]);

View File

@ -344,27 +344,29 @@ nsInProcessTabChildGlobal::LoadFrameScript(const nsAString& aURL)
}
if (!dataString.IsEmpty()) {
JSAutoRequest ar(mCx);
jsval retval;
JSObject* global = nsnull;
mGlobal->GetJSObject(&global);
if (!global) {
return;
}
JSPrincipals* jsprin = nsnull;
mPrincipal->GetJSPrincipals(mCx, &jsprin);
nsContentUtils::XPConnect()->FlagSystemFilenamePrefix(url.get(), PR_TRUE);
nsContentUtils::ThreadJSContextStack()->Push(mCx);
PRBool tmp = mLoadingScript;
mLoadingScript = PR_TRUE;
JS_EvaluateUCScriptForPrincipals(mCx, global, jsprin,
(jschar*)dataString.get(),
dataString.Length(),
url.get(), 1, &retval);
//XXX Argh, JSPrincipals are manually refcounted!
JSPRINCIPALS_DROP(mCx, jsprin);
mLoadingScript = tmp;
{
// Need to scope JSAutoRequest to happen after Push but before Pop,
// at least for now. See bug 584673.
JSAutoRequest ar(mCx);
jsval retval;
JSObject* global = nsnull;
mGlobal->GetJSObject(&global);
if (global) {
JSPrincipals* jsprin = nsnull;
mPrincipal->GetJSPrincipals(mCx, &jsprin);
nsContentUtils::XPConnect()->FlagSystemFilenamePrefix(url.get(), PR_TRUE);
PRBool tmp = mLoadingScript;
mLoadingScript = PR_TRUE;
JS_EvaluateUCScriptForPrincipals(mCx, global, jsprin,
(jschar*)dataString.get(),
dataString.Length(),
url.get(), 1, &retval);
//XXX Argh, JSPrincipals are manually refcounted!
JSPRINCIPALS_DROP(mCx, jsprin);
mLoadingScript = tmp;
}
}
JSContext* unused;
nsContentUtils::ThreadJSContextStack()->Pop(&unused);
}

View File

@ -80,6 +80,13 @@ var focusableElements = [
"<iframe src=\"about:blank\" tabindex=\"1\"></iframe>",
"<iframe src=\"about:blank\" contenteditable=\"true\"></iframe>",
"<iframe></iframe>",
"<iframe tabindex=\"-1\"></iframe>",
"<iframe tabindex=\"0\"></iframe>",
"<iframe tabindex=\"0\" disabled></iframe>",
"<iframe tabindex=\"1\"></iframe>",
"<iframe disabled></iframe>",
"<img tabindex=\"-1\">",
"<img tabindex=\"0\">",
"<img tabindex=\"0\" disabled>",
@ -179,13 +186,6 @@ var nonFocusableElements = [
"<div tabindex=\"0\" disabled></div>",
"<div disabled></div>",
"<iframe></iframe>",
"<iframe tabindex=\"-1\"></iframe>",
"<iframe tabindex=\"0\"></iframe>",
"<iframe tabindex=\"0\" disabled></iframe>",
"<iframe tabindex=\"1\"></iframe>",
"<iframe disabled></iframe>",
"<img>",
"<img disabled>",
"<img contenteditable=\"true\">",
@ -280,12 +280,19 @@ var focusableInContentEditable = [
"<embed contenteditable=\"true\">",
"<iframe src=\"about:blank\"></iframe>",
"<iframe></iframe>",
"<iframe src=\"about:blank\" disabled></iframe>",
"<iframe disabled></iframe>",
"<iframe src=\"about:blank\" tabindex=\"-1\"></iframe>",
"<iframe tabindex=\"-1\"></iframe>",
"<iframe src=\"about:blank\" tabindex=\"0\"></iframe>",
"<iframe tabindex=\"0\"></iframe>",
"<iframe src=\"about:blank\" tabindex=\"0\" disabled></iframe>",
"<iframe tabindex=\"0\" disabled></iframe>",
"<iframe src=\"about:blank\" tabindex=\"1\"></iframe>",
"<iframe tabindex=\"1\"></iframe>",
"<iframe src=\"about:blank\" contenteditable=\"true\"></iframe>",
"<iframe contenteditable=\"true\"></iframe>",
"<img tabindex=\"-1\">",
"<img tabindex=\"0\">",

View File

@ -120,6 +120,7 @@
"<body>test1</body></html>";
gExpected = [{type: "pagehide", persisted: true},
{type: "load", title: "test1"},
{type: "pageshow", title: "test1", persisted: false}];
gBrowser.loadURI(test1Doc);

View File

@ -240,7 +240,7 @@ function pageEventListener(event) {
try {
dump("TEST: eventListener received a " + event.type + " event for page " +
event.originalTarget.title + ", persisted=" + event.persisted + "\n");
}catch(e) {
} catch(e) {
// Ignore any exception.
}
@ -293,8 +293,8 @@ function pageEventListener(event) {
if (typeof(expected.persisted) != "undefined") {
is(event.persisted, expected.persisted,
"The persisted property of the " + event.type + "event on page " +
event.originalTarget.title + " had an unexpected value");
"The persisted property of the " + event.type + " event on page " +
event.originalTarget.location + " had an unexpected value");
}
// If we're out of expected events, let doPageNavigation() return.

View File

@ -4837,6 +4837,10 @@ nsCommonWindowSH::PreCreate(nsISupports *nativeObj, JSContext *cx,
nsGlobalWindow *win = nsGlobalWindow::FromSupports(nativeObj);
if (win->IsOuterWindow()) {
win->EnsureInnerWindow();
}
if (sgo) {
*parentObj = sgo->GetGlobalJSObject();
@ -5164,6 +5168,9 @@ nsCommonWindowSH::GetProperty(nsIXPConnectWrappedNative *wrapper, JSContext *cx,
// check and return.
nsGlobalWindow *frameWin = (nsGlobalWindow *)frame.get();
NS_ASSERTION(frameWin->IsOuterWindow(), "GetChildFrame gave us an inner?");
frameWin->EnsureInnerWindow();
nsCOMPtr<nsIXPConnectJSObjectHolder> holder;
rv = WrapNative(cx, frameWin->GetGlobalJSObject(), frame,

View File

@ -1304,13 +1304,6 @@ nsGlobalWindow::SetScriptContext(PRUint32 lang_id, nsIScriptContext *aScriptCont
aScriptContext->SetGCOnDestruction(PR_FALSE);
}
nsCOMPtr<nsIPrincipal> principal =
do_CreateInstance("@mozilla.org/nullprincipal;1", &rv);
aScriptContext->CreateOuterObject(this, principal);
aScriptContext->DidInitializeContext();
mJSObject = (JSObject *)aScriptContext->GetNativeGlobal();
}
mContext = aScriptContext;
@ -1620,6 +1613,10 @@ nsGlobalWindow::SetNewDocument(nsIDocument* aDocument,
if (IsFrozen()) {
// This outer is now getting its first inner, thaw the outer now
// that it's ready and is getting an inner window.
mContext->CreateOuterObject(this, aDocument->NodePrincipal());
mContext->DidInitializeContext();
mJSObject = (JSObject *)mContext->GetNativeGlobal();
Thaw();
}

View File

@ -1520,17 +1520,17 @@ jsvalToPtrExplicit(JSContext* cx, jsval val, uintptr_t* result)
return false;
}
template<class IntegerType>
template<class IntegerType, class CharType, size_t N, class AP>
void
IntegerToString(IntegerType i, jsuint radix, AutoString& result)
IntegerToString(IntegerType i, jsuint radix, Vector<CharType, N, AP>& result)
{
JS_STATIC_ASSERT(numeric_limits<IntegerType>::is_exact);
// The buffer must be big enough for all the bits of IntegerType to fit,
// in base-2, including '-'.
jschar buffer[sizeof(IntegerType) * 8 + 1];
jschar* end = buffer + sizeof(buffer) / sizeof(jschar);
jschar* cp = end;
CharType buffer[sizeof(IntegerType) * 8 + 1];
CharType* end = buffer + sizeof(buffer) / sizeof(CharType);
CharType* cp = end;
// Build the string in reverse. We use multiplication and subtraction
// instead of modulus because that's much faster.
@ -4636,6 +4636,46 @@ PrepareCIF(JSContext* cx,
}
}
void
FunctionType::BuildSymbolName(JSContext* cx,
JSString* name,
JSObject* typeObj,
AutoCString& result)
{
FunctionInfo* fninfo = GetFunctionInfo(cx, typeObj);
switch (GetABICode(cx, fninfo->mABI)) {
case ABI_DEFAULT:
// For cdecl functions, no mangling is necessary.
AppendString(result, name);
break;
case ABI_STDCALL: {
// On WIN32, stdcall functions look like:
// _foo@40
// where 'foo' is the function name, and '40' is the aligned size of the
// arguments.
AppendString(result, "_");
AppendString(result, name);
AppendString(result, "@");
// Compute the suffix by aligning each argument to sizeof(ffi_arg).
size_t size = 0;
for (size_t i = 0; i < fninfo->mArgTypes.length(); ++i) {
JSObject* argType = fninfo->mArgTypes[i];
size += Align(CType::GetSize(cx, argType), sizeof(ffi_arg));
}
IntegerToString(size, 10, result);
break;
}
case INVALID_ABI:
JS_NOT_REACHED("invalid abi");
break;
}
}
static FunctionInfo*
NewFunctionInfo(JSContext* cx,
jsval abiType,

View File

@ -111,6 +111,8 @@ class Array : public Vector<T, N, SystemAllocPolicy>
// String and AutoString classes, based on Vector.
typedef Vector<jschar, 0, SystemAllocPolicy> String;
typedef Vector<jschar, 64, SystemAllocPolicy> AutoString;
typedef Vector<char, 0, SystemAllocPolicy> CString;
typedef Vector<char, 64, SystemAllocPolicy> AutoCString;
// Convenience functions to append, insert, and compare Strings.
template <class T, size_t N, class AP, size_t ArrayLength>
@ -142,6 +144,20 @@ AppendString(Vector<jschar, N, AP> &v, JSString* str)
v.append(str->chars(), str->length());
}
template <size_t N, class AP>
void
AppendString(Vector<char, N, AP> &v, JSString* str)
{
JS_ASSERT(str);
size_t vlen = v.length();
size_t alen = str->length();
if (!v.resize(vlen + alen))
return;
for (size_t i = 0; i < alen; ++i)
v[i + vlen] = char(str->chars()[i]);
}
template <class T, size_t N, class AP, size_t ArrayLength>
void
PrependString(Vector<T, N, AP> &v, const char (&array)[ArrayLength])
@ -462,6 +478,8 @@ namespace FunctionType {
FunctionInfo* GetFunctionInfo(JSContext* cx, JSObject* obj);
JSObject* GetLibrary(JSContext* cx, JSObject* obj);
void BuildSymbolName(JSContext* cx, JSString* name, JSObject* typeObj,
AutoCString& result);
}
namespace CClosure {

View File

@ -268,24 +268,21 @@ Library::Declare(JSContext* cx, uintN argc, jsval* vp)
return JS_FALSE;
}
const char* name = JS_GetStringBytesZ(cx, JSVAL_TO_STRING(argv[0]));
if (!name)
return JS_FALSE;
JSObject* fnObj = NULL;
JSObject* typeObj;
js::AutoObjectRooter root(cx);
bool isFunction = argc > 2;
if (isFunction) {
// Case 1).
// Create a FunctionType representing the function.
typeObj = FunctionType::CreateInternal(cx,
argv[1], argv[2], &argv[3], argc - 3);
if (!typeObj)
fnObj = FunctionType::CreateInternal(cx,
argv[1], argv[2], &argv[3], argc - 3);
if (!fnObj)
return JS_FALSE;
root.setObject(typeObj);
root.setObject(fnObj);
// Make a function pointer type.
typeObj = PointerType::CreateInternal(cx, typeObj);
typeObj = PointerType::CreateInternal(cx, fnObj);
if (!typeObj)
return JS_FALSE;
root.setObject(typeObj);
@ -301,16 +298,22 @@ Library::Declare(JSContext* cx, uintN argc, jsval* vp)
typeObj = JSVAL_TO_OBJECT(argv[1]);
if (CType::GetTypeCode(cx, typeObj) == TYPE_pointer) {
JSObject* baseType = PointerType::GetBaseType(cx, typeObj);
isFunction = baseType && CType::GetTypeCode(cx, baseType) == TYPE_function;
fnObj = PointerType::GetBaseType(cx, typeObj);
isFunction = fnObj && CType::GetTypeCode(cx, fnObj) == TYPE_function;
}
}
void* data;
PRFuncPtr fnptr;
JSString* nameStr = JSVAL_TO_STRING(argv[0]);
AutoCString symbol;
if (isFunction) {
// Build the symbol, with mangling if necessary.
FunctionType::BuildSymbolName(cx, nameStr, fnObj, symbol);
AppendString(symbol, "\0");
// Look up the function symbol.
fnptr = PR_FindFunctionSymbol(library, name);
fnptr = PR_FindFunctionSymbol(library, symbol.begin());
if (!fnptr) {
JS_ReportError(cx, "couldn't find function symbol in library");
return JS_FALSE;
@ -319,7 +322,10 @@ Library::Declare(JSContext* cx, uintN argc, jsval* vp)
} else {
// 'typeObj' is another data type. Look up the data symbol.
data = PR_FindSymbol(library, name);
AppendString(symbol, nameStr);
AppendString(symbol, "\0");
data = PR_FindSymbol(library, symbol.begin());
if (!data) {
JS_ReportError(cx, "couldn't find symbol in library");
return JS_FALSE;

View File

@ -1,4 +1,4 @@
Patch libffi to fix bug 550602, bug 528129, bug 538216, bug 556902, bug 538002, and bug 581909.
Patch libffi to fix bug 550602 and bug 538216.
diff --git a/js/src/ctypes/libffi/Makefile.in b/js/src/ctypes/libffi/Makefile.in
--- a/js/src/ctypes/libffi/Makefile.in
@ -107,645 +107,4 @@ diff --git a/js/src/ctypes/libffi/configure b/js/src/ctypes/libffi/configure
archive_cmds_need_lc=no
hardcode_direct=no
@@ -12179,17 +12179,17 @@ case "$host" in
;;
hppa*-*-hpux*)
TARGET=PA_HPUX; TARGETDIR=pa
;;
i?86-*-freebsd* | i?86-*-openbsd*)
TARGET=X86_FREEBSD; TARGETDIR=x86
;;
- i?86-win32* | i?86-*-cygwin* | i?86-*-mingw*)
+ i?86-win32* | i?86-*-cygwin* | i?86-*-mingw* | i?86-*-os2*)
TARGET=X86_WIN32; TARGETDIR=x86
# All mingw/cygwin/win32 builds require this for sharedlib
AM_LTLDFLAGS="-no-undefined"
;;
i?86-*-darwin*)
TARGET=X86_DARWIN; TARGETDIR=x86
;;
i?86-*-solaris2.1[0-9]*)
diff --git a/js/src/ctypes/libffi/msvcc.sh b/js/src/ctypes/libffi/msvcc.sh
--- a/js/src/ctypes/libffi/msvcc.sh
+++ b/js/src/ctypes/libffi/msvcc.sh
@@ -37,20 +37,21 @@
#
# ***** END LICENSE BLOCK *****
#
# GCC-compatible wrapper for cl.exe and ml.exe. Arguments are given in GCC
# format and translated into something sensible for cl or ml.
#
-args="-nologo -W3"
+args="-nologo"
md=-MD
cl="cl"
ml="ml"
+safeseh="-safeseh"
output=
while [ $# -gt 0 ]
do
case $1
in
-fexceptions)
# Don't enable exceptions for now.
@@ -58,16 +59,17 @@ do
shift 1
;;
-m32)
shift 1
;;
-m64)
cl="cl" # "$MSVC/x86_amd64/cl"
ml="ml64" # "$MSVC/x86_amd64/ml64"
+ safeseh=
shift 1
;;
-O*)
args="$args $1"
shift 1
;;
-g)
# Can't specify -RTC1 or -Zi in opt. -Gy is ok. Use -OPT:REF?
@@ -103,17 +105,18 @@ do
includes="$includes $1"
shift 1
;;
-W|-Wextra)
# TODO map extra warnings
shift 1
;;
-Wall)
- args="$args -Wall"
+ # -Wall on MSVC is overzealous. Use -W3 instead.
+ args="$args -W3"
shift 1
;;
-Werror)
args="$args -WX"
shift 1
;;
-W*)
# TODO map specific warnings
@@ -158,17 +161,17 @@ done
if [ -n "$assembly" ]; then
if [ -z "$outdir" ]; then
outdir="."
fi
ppsrc="$outdir/$(basename $src|sed 's/.S$/.asm/g')"
echo "$cl -nologo -EP $includes $defines $src > $ppsrc"
"$cl" -nologo -EP $includes $defines $src > $ppsrc || exit $?
output="$(echo $output | sed 's%/F[dpa][^ ]*%%g')"
- args="-nologo -safeseh $single $output $ppsrc"
+ args="-nologo $safeseh $single $output $ppsrc"
echo "$ml $args"
eval "\"$ml\" $args"
result=$?
# required to fix ml64 broken output?
#mv *.obj $outdir
else
diff --git a/js/src/ctypes/libffi/src/powerpc/ffi_darwin.c b/js/src/ctypes/libffi/src/powerpc/ffi_darwin.c
--- a/js/src/ctypes/libffi/src/powerpc/ffi_darwin.c
+++ b/js/src/ctypes/libffi/src/powerpc/ffi_darwin.c
@@ -339,17 +339,17 @@ aix_adjust_aggregate_sizes (ffi_type *s)
/* Do not add additional tail padding. */
}
/* Perform machine dependent cif processing. */
ffi_status
ffi_prep_cif_machdep (ffi_cif *cif)
{
/* All this is for the DARWIN ABI. */
- int i;
+ unsigned i;
ffi_type **ptr;
unsigned bytes;
int fparg_count = 0, intarg_count = 0;
unsigned flags = 0;
unsigned size_al = 0;
/* All the machine-independent calculation of cif->bytes will be wrong.
All the calculation of structure sizes will also be wrong.
@@ -537,21 +537,21 @@ ffi_call (ffi_cif *cif, void (*fn)(void)
}
else
ecif.rvalue = rvalue;
switch (cif->abi)
{
case FFI_AIX:
ffi_call_AIX(&ecif, -(long)cif->bytes, cif->flags, ecif.rvalue, fn,
- ffi_prep_args);
+ FFI_FN(ffi_prep_args));
break;
case FFI_DARWIN:
ffi_call_DARWIN(&ecif, -(long)cif->bytes, cif->flags, ecif.rvalue, fn,
- ffi_prep_args);
+ FFI_FN(ffi_prep_args));
break;
default:
FFI_ASSERT(0);
break;
}
}
static void flush_icache(char *);
@@ -794,32 +794,32 @@ ffi_closure_helper_DARWIN (ffi_closure *
break;
case FFI_TYPE_STRUCT:
#ifdef POWERPC64
size_al = arg_types[i]->size;
if (arg_types[i]->elements[0]->type == FFI_TYPE_DOUBLE)
size_al = ALIGN (arg_types[i]->size, 8);
if (size_al < 3 && cif->abi == FFI_DARWIN)
- avalue[i] = (void *) pgr + 8 - size_al;
+ avalue[i] = (char *) pgr + 8 - size_al;
else
- avalue[i] = (void *) pgr;
+ avalue[i] = pgr;
pgr += (size_al + 7) / 8;
#else
/* Structures that match the basic modes (QI 1 byte, HI 2 bytes,
SI 4 bytes) are aligned as if they were those modes. */
size_al = arg_types[i]->size;
/* If the first member of the struct is a double, then align
the struct to double-word. */
if (arg_types[i]->elements[0]->type == FFI_TYPE_DOUBLE)
size_al = ALIGN(arg_types[i]->size, 8);
if (size_al < 3 && cif->abi == FFI_DARWIN)
- avalue[i] = (void*) pgr + 4 - size_al;
+ avalue[i] = (char*) pgr + 4 - size_al;
else
- avalue[i] = (void*) pgr;
+ avalue[i] = pgr;
pgr += (size_al + 3) / 4;
#endif
break;
case FFI_TYPE_SINT64:
case FFI_TYPE_UINT64:
#ifdef POWERPC64
case FFI_TYPE_POINTER:
diff --git a/js/src/ctypes/libffi/src/x86/ffi.c b/js/src/ctypes/libffi/src/x86/ffi.c
--- a/js/src/ctypes/libffi/src/x86/ffi.c
+++ b/js/src/ctypes/libffi/src/x86/ffi.c
@@ -204,17 +204,17 @@ ffi_status ffi_prep_cif_machdep(ffi_cif
else if (cif->rtype->size == 8)
{
cif->flags = FFI_TYPE_SINT64; /* same as int64 type */
}
else
#endif
{
cif->flags = FFI_TYPE_STRUCT;
- // allocate space for return value pointer
+ /* allocate space for return value pointer */
cif->bytes += ALIGN(sizeof(void*), FFI_SIZEOF_ARG);
}
break;
default:
#ifdef X86_WIN64
cif->flags = FFI_TYPE_SINT64;
break;
@@ -229,17 +229,17 @@ ffi_status ffi_prep_cif_machdep(ffi_cif
for (ptr = cif->arg_types, i = cif->nargs; i > 0; i--, ptr++)
{
if (((*ptr)->alignment - 1) & cif->bytes)
cif->bytes = ALIGN(cif->bytes, (*ptr)->alignment);
cif->bytes += ALIGN((*ptr)->size, FFI_SIZEOF_ARG);
}
#ifdef X86_WIN64
- // ensure space for storing four registers
+ /* ensure space for storing four registers */
cif->bytes += 4 * sizeof(ffi_arg);
#endif
#ifdef X86_DARWIN
cif->bytes = (cif->bytes + 15) & ~0xF;
#endif
return FFI_OK;
@@ -287,18 +287,18 @@ void ffi_call(ffi_cif *cif, void (*fn)(v
ecif.rvalue = rvalue;
switch (cif->abi)
{
#ifdef X86_WIN64
case FFI_WIN64:
{
- // Make copies of all struct arguments
- // NOTE: not sure if responsibility should be here or in caller
+ /* Make copies of all struct arguments
+ NOTE: not sure if responsibility should be here or in caller */
unsigned int i;
for (i=0; i < cif->nargs;i++) {
size_t size = cif->arg_types[i]->size;
if ((cif->arg_types[i]->type == FFI_TYPE_STRUCT
&& (size != 1 && size != 2 && size != 4 && size != 8))
#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE
|| cif->arg_types[i]->type == FFI_TYPE_LONGDOUBLE
#endif
@@ -580,20 +580,20 @@ ffi_prep_raw_closure_loc (ffi_raw_closur
void *codeloc)
{
int i;
if (cif->abi != FFI_SYSV) {
return FFI_BAD_ABI;
}
- // we currently don't support certain kinds of arguments for raw
- // closures. This should be implemented by a separate assembly language
- // routine, since it would require argument processing, something we
- // don't do now for performance.
+ /* we currently don't support certain kinds of arguments for raw
+ closures. This should be implemented by a separate assembly language
+ routine, since it would require argument processing, something we
+ don't do now for performance. */
for (i = cif->nargs-1; i >= 0; i--)
{
FFI_ASSERT (cif->arg_types[i]->type != FFI_TYPE_STRUCT);
FFI_ASSERT (cif->arg_types[i]->type != FFI_TYPE_LONGDOUBLE);
}
diff --git a/js/src/ctypes/libffi/src/x86/ffitarget.h b/js/src/ctypes/libffi/src/x86/ffitarget.h
--- a/js/src/ctypes/libffi/src/x86/ffitarget.h
+++ b/js/src/ctypes/libffi/src/x86/ffitarget.h
@@ -33,17 +33,17 @@
#if defined (X86_64) && defined (__i386__)
#undef X86_64
#define X86
#endif
#ifdef X86_WIN64
#define FFI_SIZEOF_ARG 8
-#define USE_BUILTIN_FFS 0 // not yet implemented in mingw-64
+#define USE_BUILTIN_FFS 0 /* not yet implemented in mingw-64 */
#endif
/* ---- Generic type definitions ----------------------------------------- */
#ifndef LIBFFI_ASM
#ifdef X86_WIN64
#ifdef _MSC_VER
typedef unsigned __int64 ffi_arg;
diff --git a/js/src/ctypes/libffi/src/closures.c b/js/src/ctypes/libffi/src/closures.c
--- a/js/src/ctypes/libffi/src/closures.c
+++ b/js/src/ctypes/libffi/src/closures.c
@@ -39,17 +39,17 @@
option is defined will attempt to map such pages once, but if it
fails, it falls back to creating a temporary file in a writable and
executable filesystem and mapping pages from it into separate
locations in the virtual memory space, one location writable and
another executable. */
# define FFI_MMAP_EXEC_WRIT 1
# define HAVE_MNTENT 1
# endif
-# if defined(X86_WIN32) || defined(X86_WIN64)
+# if defined(X86_WIN32) || defined(X86_WIN64) || defined(__OS2__)
/* Windows systems may have Data Execution Protection (DEP) enabled,
which requires the use of VirtualMalloc/VirtualFree to alloc/free
executable memory. */
# define FFI_MMAP_EXEC_WRIT 1
# endif
#endif
#if FFI_MMAP_EXEC_WRIT && !defined FFI_MMAP_EXEC_SELINUX
@@ -188,31 +188,31 @@ static size_t dlmalloc_footprint(void) M
static size_t dlmalloc_max_footprint(void) MAYBE_UNUSED;
static void** dlindependent_calloc(size_t, size_t, void**) MAYBE_UNUSED;
static void** dlindependent_comalloc(size_t, size_t*, void**) MAYBE_UNUSED;
static void *dlpvalloc(size_t) MAYBE_UNUSED;
static int dlmalloc_trim(size_t) MAYBE_UNUSED;
static size_t dlmalloc_usable_size(void*) MAYBE_UNUSED;
static void dlmalloc_stats(void) MAYBE_UNUSED;
-#if !(defined(X86_WIN32) || defined(X86_WIN64)) || defined (__CYGWIN__)
+#if !(defined(X86_WIN32) || defined(X86_WIN64) || defined(__OS2__)) || defined (__CYGWIN__)
/* Use these for mmap and munmap within dlmalloc.c. */
static void *dlmmap(void *, size_t, int, int, int, off_t);
static int dlmunmap(void *, size_t);
-#endif /* !(defined(X86_WIN32) || defined(X86_WIN64)) || defined (__CYGWIN__) */
+#endif /* !(defined(X86_WIN32) || defined(X86_WIN64) || defined(__OS2__)) || defined (__CYGWIN__) */
#define mmap dlmmap
#define munmap dlmunmap
#include "dlmalloc.c"
#undef mmap
#undef munmap
-#if !(defined(X86_WIN32) || defined(X86_WIN64)) || defined (__CYGWIN__)
+#if !(defined(X86_WIN32) || defined(X86_WIN64) || defined(__OS2__)) || defined (__CYGWIN__)
/* A mutex used to synchronize access to *exec* variables in this file. */
static pthread_mutex_t open_temp_exec_file_mutex = PTHREAD_MUTEX_INITIALIZER;
/* A file descriptor of a temporary file from which we'll map
executable pages. */
static int execfd = -1;
@@ -517,17 +517,17 @@ segment_holding_code (mstate m, char* ad
&& addr < add_segment_exec_offset (sp->base, sp) + sp->size)
return sp;
if ((sp = sp->next) == 0)
return 0;
}
}
#endif
-#endif /* !(defined(X86_WIN32) || defined(X86_WIN64)) || defined (__CYGWIN__) */
+#endif /* !(defined(X86_WIN32) || defined(X86_WIN64) || defined(__OS2__)) || defined (__CYGWIN__) */
/* Allocate a chunk of memory with the given size. Returns a pointer
to the writable address, and sets *CODE to the executable
corresponding virtual address. */
void *
ffi_closure_alloc (size_t size, void **code)
{
void *ptr;
diff --git a/js/src/ctypes/libffi/src/dlmalloc.c b/js/src/ctypes/libffi/src/dlmalloc.c
--- a/js/src/ctypes/libffi/src/dlmalloc.c
+++ b/js/src/ctypes/libffi/src/dlmalloc.c
@@ -454,16 +454,24 @@ DEFAULT_MMAP_THRESHOLD default: 25
#define LACKS_STRING_H
#define LACKS_STRINGS_H
#define LACKS_SYS_TYPES_H
#define LACKS_ERRNO_H
#define MALLOC_FAILURE_ACTION
#define MMAP_CLEARS 0 /* WINCE and some others apparently don't clear */
#endif /* WIN32 */
+#ifdef __OS2__
+#define INCL_DOS
+#include <os2.h>
+#define HAVE_MMAP 1
+#define HAVE_MORECORE 0
+#define LACKS_SYS_MMAN_H
+#endif /* __OS2__ */
+
#if defined(DARWIN) || defined(_DARWIN)
/* Mac OSX docs advise not to use sbrk; it seems better to use mmap */
#ifndef HAVE_MORECORE
#define HAVE_MORECORE 0
#define HAVE_MMAP 1
#endif /* HAVE_MORECORE */
#endif /* DARWIN */
@@ -1283,17 +1291,17 @@ extern void* sbrk(ptrdiff_t);
#define CALL_MMAP(s) MFAIL
#define CALL_MUNMAP(a, s) (-1)
#define DIRECT_MMAP(s) MFAIL
#else /* HAVE_MMAP */
#define IS_MMAPPED_BIT (SIZE_T_ONE)
#define USE_MMAP_BIT (SIZE_T_ONE)
-#ifndef WIN32
+#if !defined(WIN32) && !defined (__OS2__)
#define CALL_MUNMAP(a, s) munmap((a), (s))
#define MMAP_PROT (PROT_READ|PROT_WRITE)
#if !defined(MAP_ANONYMOUS) && defined(MAP_ANON)
#define MAP_ANONYMOUS MAP_ANON
#endif /* MAP_ANON */
#ifdef MAP_ANONYMOUS
#define MMAP_FLAGS (MAP_PRIVATE|MAP_ANONYMOUS)
#define CALL_MMAP(s) mmap(0, (s), MMAP_PROT, MMAP_FLAGS, -1, 0)
@@ -1306,16 +1314,52 @@ extern void* sbrk(ptrdiff_t);
static int dev_zero_fd = -1; /* Cached file descriptor for /dev/zero. */
#define CALL_MMAP(s) ((dev_zero_fd < 0) ? \
(dev_zero_fd = open("/dev/zero", O_RDWR), \
mmap(0, (s), MMAP_PROT, MMAP_FLAGS, dev_zero_fd, 0)) : \
mmap(0, (s), MMAP_PROT, MMAP_FLAGS, dev_zero_fd, 0))
#endif /* MAP_ANONYMOUS */
#define DIRECT_MMAP(s) CALL_MMAP(s)
+
+#elif defined(__OS2__)
+
+/* OS/2 MMAP via DosAllocMem */
+static void* os2mmap(size_t size) {
+ void* ptr;
+ if (DosAllocMem(&ptr, size, OBJ_ANY|PAG_COMMIT|PAG_READ|PAG_WRITE) &&
+ DosAllocMem(&ptr, size, PAG_COMMIT|PAG_READ|PAG_WRITE))
+ return MFAIL;
+ return ptr;
+}
+
+#define os2direct_mmap(n) os2mmap(n)
+
+/* This function supports releasing coalesed segments */
+static int os2munmap(void* ptr, size_t size) {
+ while (size) {
+ ULONG ulSize = size;
+ ULONG ulFlags = 0;
+ if (DosQueryMem(ptr, &ulSize, &ulFlags) != 0)
+ return -1;
+ if ((ulFlags & PAG_BASE) == 0 ||(ulFlags & PAG_COMMIT) == 0 ||
+ ulSize > size)
+ return -1;
+ if (DosFreeMem(ptr) != 0)
+ return -1;
+ ptr = ( void * ) ( ( char * ) ptr + ulSize );
+ size -= ulSize;
+ }
+ return 0;
+}
+
+#define CALL_MMAP(s) os2mmap(s)
+#define CALL_MUNMAP(a, s) os2munmap((a), (s))
+#define DIRECT_MMAP(s) os2direct_mmap(s)
+
#else /* WIN32 */
/* Win32 MMAP via VirtualAlloc */
static void* win32mmap(size_t size) {
void* ptr = VirtualAlloc(0, size, MEM_RESERVE|MEM_COMMIT, PAGE_EXECUTE_READWRITE);
return (ptr != 0)? ptr: MFAIL;
}
@@ -1382,30 +1426,40 @@ static int win32munmap(void* ptr, size_t
protect against direct calls to MORECORE by other threads not
using this lock, so there is still code to cope the best we can on
interference.
* magic_init_mutex ensures that mparams.magic and other
unique mparams values are initialized only once.
*/
-#ifndef WIN32
+#if !defined(WIN32) && !defined(__OS2__)
/* By default use posix locks */
#include <pthread.h>
#define MLOCK_T pthread_mutex_t
#define INITIAL_LOCK(l) pthread_mutex_init(l, NULL)
#define ACQUIRE_LOCK(l) pthread_mutex_lock(l)
#define RELEASE_LOCK(l) pthread_mutex_unlock(l)
#if HAVE_MORECORE
static MLOCK_T morecore_mutex = PTHREAD_MUTEX_INITIALIZER;
#endif /* HAVE_MORECORE */
static MLOCK_T magic_init_mutex = PTHREAD_MUTEX_INITIALIZER;
+#elif defined(__OS2__)
+#define MLOCK_T HMTX
+#define INITIAL_LOCK(l) DosCreateMutexSem(0, l, 0, FALSE)
+#define ACQUIRE_LOCK(l) DosRequestMutexSem(*l, SEM_INDEFINITE_WAIT)
+#define RELEASE_LOCK(l) DosReleaseMutexSem(*l)
+#if HAVE_MORECORE
+static MLOCK_T morecore_mutex;
+#endif /* HAVE_MORECORE */
+static MLOCK_T magic_init_mutex;
+
#else /* WIN32 */
/*
Because lock-protected regions have bounded times, and there
are no recursive lock calls, we can use simple spinlocks.
*/
#define MLOCK_T long
static int win32_acquire_lock (MLOCK_T *sl) {
@@ -2487,20 +2541,25 @@ static int init_mparams(void) {
if (mparams.magic == 0) {
mparams.magic = s;
/* Set up lock for main malloc area */
INITIAL_LOCK(&gm->mutex);
gm->mflags = mparams.default_mflags;
}
RELEASE_MAGIC_INIT_LOCK();
-#ifndef WIN32
+#if !defined(WIN32) && !defined(__OS2__)
mparams.page_size = malloc_getpagesize;
mparams.granularity = ((DEFAULT_GRANULARITY != 0)?
DEFAULT_GRANULARITY : mparams.page_size);
+#elif defined (__OS2__)
+ /* if low-memory is used, os2munmap() would break
+ if it were anything other than 64k */
+ mparams.page_size = 4096u;
+ mparams.granularity = 65536u;
#else /* WIN32 */
{
SYSTEM_INFO system_info;
GetSystemInfo(&system_info);
mparams.page_size = system_info.dwPageSize;
mparams.granularity = system_info.dwAllocationGranularity;
}
#endif /* WIN32 */
diff --git a/js/src/ctypes/libffi/src/x86/win32.S b/js/src/ctypes/libffi/src/x86/win32.S
--- a/js/src/ctypes/libffi/src/x86/win32.S
+++ b/js/src/ctypes/libffi/src/x86/win32.S
@@ -390,17 +390,19 @@ END
#else
.text
# This assumes we are using gas.
.balign 16
.globl _ffi_call_win32
+#ifndef __OS2__
.def _ffi_call_win32; .scl 2; .type 32; .endef
+#endif
_ffi_call_win32:
.LFB1:
pushl %ebp
.LCFI0:
movl %esp,%ebp
.LCFI1:
# Make room for all of the new args.
movl 16(%ebp),%ecx
@@ -542,17 +544,19 @@ 1:
popl %ebp
ret
.ffi_call_win32_end:
.LFE1:
# This assumes we are using gas.
.balign 16
.globl _ffi_closure_SYSV
+#ifndef __OS2__
.def _ffi_closure_SYSV; .scl 2; .type 32; .endef
+#endif
_ffi_closure_SYSV:
.LFB3:
pushl %ebp
.LCFI4:
movl %esp, %ebp
.LCFI5:
subl $40, %esp
leal -24(%ebp), %edx
@@ -663,17 +667,19 @@ 1:
#define RAW_CLOSURE_CIF_OFFSET ((FFI_TRAMPOLINE_SIZE + 3) & ~3)
#define RAW_CLOSURE_FUN_OFFSET (RAW_CLOSURE_CIF_OFFSET + 4)
#define RAW_CLOSURE_USER_DATA_OFFSET (RAW_CLOSURE_FUN_OFFSET + 4)
#define CIF_FLAGS_OFFSET 20
# This assumes we are using gas.
.balign 16
.globl _ffi_closure_raw_SYSV
+#ifndef __OS2__
.def _ffi_closure_raw_SYSV; .scl 2; .type 32; .endef
+#endif
_ffi_closure_raw_SYSV:
.LFB4:
pushl %ebp
.LCFI6:
movl %esp, %ebp
.LCFI7:
pushl %esi
.LCFI8:
@@ -779,17 +785,19 @@ 1:
.ffi_closure_raw_SYSV_end:
.LFE4:
#endif /* !FFI_NO_RAW_API */
# This assumes we are using gas.
.balign 16
.globl _ffi_closure_STDCALL
+#ifndef __OS2__
.def _ffi_closure_STDCALL; .scl 2; .type 32; .endef
+#endif
_ffi_closure_STDCALL:
.LFB5:
pushl %ebp
.LCFI9:
movl %esp, %ebp
.LCFI10:
subl $40, %esp
leal -24(%ebp), %edx
@@ -885,17 +893,19 @@ 1:
.Lscls_noretval:
.Lscls_epilogue:
movl %ebp, %esp
popl %ebp
ret
.ffi_closure_STDCALL_end:
.LFE5:
+#ifndef __OS2__
.section .eh_frame,"w"
+#endif
.Lframe1:
.LSCIE1:
.long .LECIE1-.LASCIE1 /* Length of Common Information Entry */
.LASCIE1:
.long 0x0 /* CIE Identifier Tag */
.byte 0x1 /* CIE Version */
#ifdef __PIC__
.ascii "zR\0" /* CIE Augmentation */

View File

@ -1,3 +1,122 @@
2010-08-05 Dan Witte <dwitte@mozilla.com>
* Makefile.am: Pass FFI_DEBUG define to msvcc.sh for linking to the
debug CRT when --enable-debug is given.
* configure.ac: Define it.
* msvcc.sh: Translate -g and -DFFI_DEBUG appropriately.
2010-08-04 Dan Witte <dwitte@mozilla.com>
* src/x86/ffitarget.h: Add X86_ANY define for all x86/x86_64
platforms.
* src/x86/ffi.c: Remove redundant ifdef checks.
* src/prep_cif.c: Push stack space computation into src/x86/ffi.c
for X86_ANY so return value space doesn't get added twice.
2010-08-03 Neil Rashbrooke <neil@parkwaycc.co.uk>
* msvcc.sh: Don't pass -safeseh to ml64 because behavior is buggy.
2010-07-22 Dan Witte <dwitte@mozilla.com>
* src/*/ffitarget.h: Make FFI_LAST_ABI one past the last valid ABI.
* src/prep_cif.c: Fix ABI assertion.
* src/cris/ffi.c: Ditto.
2010-07-10 Evan Phoenix <evan@fallingsnow.net>
* src/closures.c (selinux_enabled_check): Fix strncmp usage bug.
2010-07-07 Dan Horák <dan@danny.cz>
* include/ffi.h.in: Protect #define with #ifndef.
* src/powerpc/ffitarget.h: Ditto.
* src/s390/ffitarget.h: Ditto.
* src/sparc/ffitarget.h: Ditto.
2010-05-11 Dan Witte <dwitte@mozilla.com>
* doc/libffi.tex: Document previous change.
2010-05-11 Makoto Kato <m_kato@ga2.so-net.ne.jp>
* src/x86/ffi.c (ffi_call): Don't copy structs passed by value.
2010-05-05 Michael Kohler <michaelkohler@live.com>
* src/dlmalloc.c (dlfree): Fix spelling.
* src/ia64/ffi.c (ffi_prep_cif_machdep): Ditto.
* configure.ac: Ditto.
* configure: Rebuilt.
2010-04-13 Dan Witte <dwitte@mozilla.com>
* msvcc.sh: Build with -W3 instead of -Wall.
* src/powerpc/ffi_darwin.c: Remove build warnings.
* src/x86/ffi.c: Ditto.
* src/x86/ffitarget.h: Ditto.
2010-03-30 Dan Witte <dwitte@mozilla.com>
* msvcc.sh: Disable build warnings.
* README (tested): Clarify windows build procedure.
2010-03-14 Matthias Klose <doko@ubuntu.com>
* src/x86/ffi64.c: Fix typo in comment.
* src/x86/ffi.c: Use /* ... */ comment style.
2010-07-07 Neil Roberts <neil@linux.intel.com>
* src/x86/sysv.S (ffi_call_SYSV): Align the stack pointer to
16-bytes.
2010-07-02 Jakub Jelinek <jakub@redhat.com>
* Makefile.am (AM_MAKEFLAGS): Pass also mandir to submakes.
* Makefile.in: Regenerated.
2010-05-19 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE>
* configure.ac (libffi_cv_as_x86_pcrel): Check for illegal in as
output, too.
(libffi_cv_as_ascii_pseudo_op): Check for .ascii.
(libffi_cv_as_string_pseudo_op): Check for .string.
* configure: Regenerate.
* fficonfig.h.in: Regenerate.
* src/x86/sysv.S (.eh_frame): Use .ascii, .string or error.
2010-04-07 Jakub Jelinek <jakub@redhat.com>
* regex.c (byte_re_match_2_internal): Avoid set but not used
warning.
2010-04-02 Ralf Wildenhues <Ralf.Wildenhues@gmx.de>
* Makefile.in: Regenerate.
* aclocal.m4: Regenerate.
* include/Makefile.in: Regenerate.
* man/Makefile.in: Regenerate.
* testsuite/Makefile.in: Regenerate.
2010-03-15 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE>
* configure.ac (libffi_cv_as_x86_64_unwind_section_type): New test.
* configure: Regenerate.
* fficonfig.h.in: Regenerate.
* libffi/src/x86/unix64.S (.eh_frame)
[HAVE_AS_X86_64_UNWIND_SECTION_TYPE]: Use @unwind section type.
2010-02-24 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE>
* doc/libffi.texi (The Closure API): Fix typo.
* doc/libffi.info: Remove.
2010-02-15 Matthias Klose <doko@ubuntu.com>
* src/arm/sysv.S (__ARM_ARCH__): Define for processor
__ARM_ARCH_7EM__.
2010-01-07 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE>
PR libffi/40701

View File

@ -69,6 +69,7 @@ AM_MAKEFLAGS = \
"exec_prefix=$(exec_prefix)" \
"infodir=$(infodir)" \
"libdir=$(libdir)" \
"mandir=$(mandir)" \
"prefix=$(prefix)" \
"AR=$(AR)" \
"AS=$(AS)" \
@ -151,6 +152,9 @@ endif
if FRV
nodist_libffi_la_SOURCES += src/frv/eabi.S src/frv/ffi.c
endif
if MOXIE
nodist_libffi_la_SOURCES += src/moxie/eabi.S src/moxie/ffi.c
endif
if S390
nodist_libffi_la_SOURCES += src/s390/sysv.S src/s390/ffi.c
endif
@ -174,6 +178,14 @@ libffi_convenience_la_SOURCES = $(libffi_la_SOURCES)
nodist_libffi_convenience_la_SOURCES = $(nodist_libffi_la_SOURCES)
AM_CFLAGS = -Wall -g -fexceptions
if FFI_DEBUG
# Build debug. Define FFI_DEBUG on the commandline so that, when building with
# MSVC, it can link against the debug CRT.
AM_CFLAGS += -DFFI_DEBUG
else
# Build opt.
AM_CFLAGS += -O2
endif
libffi_la_LDFLAGS = -version-info `grep -v '^\#' $(srcdir)/libtool-version` $(LTLDFLAGS) $(AM_LTLDFLAGS)

View File

@ -1,4 +1,4 @@
# Makefile.in generated by automake 1.11 from Makefile.am.
# Makefile.in generated by automake 1.11.1 from Makefile.am.
# @configure_input@
# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
@ -55,12 +55,18 @@ target_triplet = @target@
@AVR32_TRUE@am__append_17 = src/avr32/sysv.S src/avr32/ffi.c
@LIBFFI_CRIS_TRUE@am__append_18 = src/cris/sysv.S src/cris/ffi.c
@FRV_TRUE@am__append_19 = src/frv/eabi.S src/frv/ffi.c
@S390_TRUE@am__append_20 = src/s390/sysv.S src/s390/ffi.c
@X86_64_TRUE@am__append_21 = src/x86/ffi64.c src/x86/unix64.S src/x86/ffi.c src/x86/sysv.S
@SH_TRUE@am__append_22 = src/sh/sysv.S src/sh/ffi.c
@SH64_TRUE@am__append_23 = src/sh64/sysv.S src/sh64/ffi.c
@PA_LINUX_TRUE@am__append_24 = src/pa/linux.S src/pa/ffi.c
@PA_HPUX_TRUE@am__append_25 = src/pa/hpux32.S src/pa/ffi.c
@MOXIE_TRUE@am__append_20 = src/moxie/eabi.S src/moxie/ffi.c
@S390_TRUE@am__append_21 = src/s390/sysv.S src/s390/ffi.c
@X86_64_TRUE@am__append_22 = src/x86/ffi64.c src/x86/unix64.S src/x86/ffi.c src/x86/sysv.S
@SH_TRUE@am__append_23 = src/sh/sysv.S src/sh/ffi.c
@SH64_TRUE@am__append_24 = src/sh64/sysv.S src/sh64/ffi.c
@PA_LINUX_TRUE@am__append_25 = src/pa/linux.S src/pa/ffi.c
@PA_HPUX_TRUE@am__append_26 = src/pa/hpux32.S src/pa/ffi.c
# Build debug. Define FFI_DEBUG on the commandline so that, when building with
# MSVC, it can link against the debug CRT.
@FFI_DEBUG_TRUE@am__append_27 = -DFFI_DEBUG
# Build opt.
@FFI_DEBUG_FALSE@am__append_28 = -O2
subdir = .
DIST_COMMON = README $(am__configure_deps) $(srcdir)/Makefile.am \
$(srcdir)/Makefile.in $(srcdir)/doc/stamp-vti \
@ -138,13 +144,14 @@ am_libffi_la_OBJECTS = src/debug.lo src/prep_cif.lo src/types.lo \
@AVR32_TRUE@am__objects_17 = src/avr32/sysv.lo src/avr32/ffi.lo
@LIBFFI_CRIS_TRUE@am__objects_18 = src/cris/sysv.lo src/cris/ffi.lo
@FRV_TRUE@am__objects_19 = src/frv/eabi.lo src/frv/ffi.lo
@S390_TRUE@am__objects_20 = src/s390/sysv.lo src/s390/ffi.lo
@X86_64_TRUE@am__objects_21 = src/x86/ffi64.lo src/x86/unix64.lo \
@MOXIE_TRUE@am__objects_20 = src/moxie/eabi.lo src/moxie/ffi.lo
@S390_TRUE@am__objects_21 = src/s390/sysv.lo src/s390/ffi.lo
@X86_64_TRUE@am__objects_22 = src/x86/ffi64.lo src/x86/unix64.lo \
@X86_64_TRUE@ src/x86/ffi.lo src/x86/sysv.lo
@SH_TRUE@am__objects_22 = src/sh/sysv.lo src/sh/ffi.lo
@SH64_TRUE@am__objects_23 = src/sh64/sysv.lo src/sh64/ffi.lo
@PA_LINUX_TRUE@am__objects_24 = src/pa/linux.lo src/pa/ffi.lo
@PA_HPUX_TRUE@am__objects_25 = src/pa/hpux32.lo src/pa/ffi.lo
@SH_TRUE@am__objects_23 = src/sh/sysv.lo src/sh/ffi.lo
@SH64_TRUE@am__objects_24 = src/sh64/sysv.lo src/sh64/ffi.lo
@PA_LINUX_TRUE@am__objects_25 = src/pa/linux.lo src/pa/ffi.lo
@PA_HPUX_TRUE@am__objects_26 = src/pa/hpux32.lo src/pa/ffi.lo
nodist_libffi_la_OBJECTS = $(am__objects_1) $(am__objects_2) \
$(am__objects_3) $(am__objects_4) $(am__objects_5) \
$(am__objects_6) $(am__objects_7) $(am__objects_8) \
@ -153,17 +160,17 @@ nodist_libffi_la_OBJECTS = $(am__objects_1) $(am__objects_2) \
$(am__objects_15) $(am__objects_16) $(am__objects_17) \
$(am__objects_18) $(am__objects_19) $(am__objects_20) \
$(am__objects_21) $(am__objects_22) $(am__objects_23) \
$(am__objects_24) $(am__objects_25)
$(am__objects_24) $(am__objects_25) $(am__objects_26)
libffi_la_OBJECTS = $(am_libffi_la_OBJECTS) \
$(nodist_libffi_la_OBJECTS)
libffi_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \
$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
$(libffi_la_LDFLAGS) $(LDFLAGS) -o $@
libffi_convenience_la_LIBADD =
am__objects_26 = src/debug.lo src/prep_cif.lo src/types.lo \
am__objects_27 = src/debug.lo src/prep_cif.lo src/types.lo \
src/raw_api.lo src/java_raw_api.lo src/closures.lo
am_libffi_convenience_la_OBJECTS = $(am__objects_26)
am__objects_27 = $(am__objects_1) $(am__objects_2) $(am__objects_3) \
am_libffi_convenience_la_OBJECTS = $(am__objects_27)
am__objects_28 = $(am__objects_1) $(am__objects_2) $(am__objects_3) \
$(am__objects_4) $(am__objects_5) $(am__objects_6) \
$(am__objects_7) $(am__objects_8) $(am__objects_9) \
$(am__objects_10) $(am__objects_11) $(am__objects_12) \
@ -171,8 +178,8 @@ am__objects_27 = $(am__objects_1) $(am__objects_2) $(am__objects_3) \
$(am__objects_16) $(am__objects_17) $(am__objects_18) \
$(am__objects_19) $(am__objects_20) $(am__objects_21) \
$(am__objects_22) $(am__objects_23) $(am__objects_24) \
$(am__objects_25)
nodist_libffi_convenience_la_OBJECTS = $(am__objects_27)
$(am__objects_25) $(am__objects_26)
nodist_libffi_convenience_la_OBJECTS = $(am__objects_28)
libffi_convenience_la_OBJECTS = $(am_libffi_convenience_la_OBJECTS) \
$(nodist_libffi_convenience_la_OBJECTS)
DEFAULT_INCLUDES = -I.@am__isrc@
@ -319,6 +326,7 @@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
PACKAGE_NAME = @PACKAGE_NAME@
PACKAGE_STRING = @PACKAGE_STRING@
PACKAGE_TARNAME = @PACKAGE_TARNAME@
PACKAGE_URL = @PACKAGE_URL@
PACKAGE_VERSION = @PACKAGE_VERSION@
PATH_SEPARATOR = @PATH_SEPARATOR@
RANLIB = @RANLIB@
@ -448,6 +456,7 @@ AM_MAKEFLAGS = \
"exec_prefix=$(exec_prefix)" \
"infodir=$(infodir)" \
"libdir=$(libdir)" \
"mandir=$(mandir)" \
"prefix=$(prefix)" \
"AR=$(AR)" \
"AS=$(AS)" \
@ -475,10 +484,10 @@ nodist_libffi_la_SOURCES = $(am__append_1) $(am__append_2) \
$(am__append_15) $(am__append_16) $(am__append_17) \
$(am__append_18) $(am__append_19) $(am__append_20) \
$(am__append_21) $(am__append_22) $(am__append_23) \
$(am__append_24) $(am__append_25)
$(am__append_24) $(am__append_25) $(am__append_26)
libffi_convenience_la_SOURCES = $(libffi_la_SOURCES)
nodist_libffi_convenience_la_SOURCES = $(nodist_libffi_la_SOURCES)
AM_CFLAGS = -Wall -g -fexceptions
AM_CFLAGS = -Wall -g -fexceptions $(am__append_27) $(am__append_28)
libffi_la_LDFLAGS = -version-info `grep -v '^\#' $(srcdir)/libtool-version` $(LTLDFLAGS) $(AM_LTLDFLAGS)
AM_CPPFLAGS = -I. -I$(top_srcdir)/include -Iinclude -I$(top_srcdir)/src
AM_CCASFLAGS = $(AM_CPPFLAGS)
@ -744,6 +753,16 @@ src/frv/eabi.lo: src/frv/$(am__dirstamp) \
src/frv/$(DEPDIR)/$(am__dirstamp)
src/frv/ffi.lo: src/frv/$(am__dirstamp) \
src/frv/$(DEPDIR)/$(am__dirstamp)
src/moxie/$(am__dirstamp):
@$(MKDIR_P) src/moxie
@: > src/moxie/$(am__dirstamp)
src/moxie/$(DEPDIR)/$(am__dirstamp):
@$(MKDIR_P) src/moxie/$(DEPDIR)
@: > src/moxie/$(DEPDIR)/$(am__dirstamp)
src/moxie/eabi.lo: src/moxie/$(am__dirstamp) \
src/moxie/$(DEPDIR)/$(am__dirstamp)
src/moxie/ffi.lo: src/moxie/$(am__dirstamp) \
src/moxie/$(DEPDIR)/$(am__dirstamp)
src/s390/$(am__dirstamp):
@$(MKDIR_P) src/s390
@: > src/s390/$(am__dirstamp)
@ -837,6 +856,10 @@ mostlyclean-compile:
-rm -f src/mips/n32.lo
-rm -f src/mips/o32.$(OBJEXT)
-rm -f src/mips/o32.lo
-rm -f src/moxie/eabi.$(OBJEXT)
-rm -f src/moxie/eabi.lo
-rm -f src/moxie/ffi.$(OBJEXT)
-rm -f src/moxie/ffi.lo
-rm -f src/pa/ffi.$(OBJEXT)
-rm -f src/pa/ffi.lo
-rm -f src/pa/hpux32.$(OBJEXT)
@ -934,6 +957,8 @@ distclean-compile:
@AMDEP_TRUE@@am__include@ @am__quote@src/mips/$(DEPDIR)/ffi.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@src/mips/$(DEPDIR)/n32.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@src/mips/$(DEPDIR)/o32.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@src/moxie/$(DEPDIR)/eabi.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@src/moxie/$(DEPDIR)/ffi.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@src/pa/$(DEPDIR)/ffi.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@src/pa/$(DEPDIR)/hpux32.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@src/pa/$(DEPDIR)/linux.Plo@am__quote@
@ -1029,6 +1054,7 @@ clean-libtool:
-rm -rf src/m32r/.libs src/m32r/_libs
-rm -rf src/m68k/.libs src/m68k/_libs
-rm -rf src/mips/.libs src/mips/_libs
-rm -rf src/moxie/.libs src/moxie/_libs
-rm -rf src/pa/.libs src/pa/_libs
-rm -rf src/powerpc/.libs src/powerpc/_libs
-rm -rf src/s390/.libs src/s390/_libs
@ -1232,7 +1258,7 @@ uninstall-pkgconfigDATA:
# (which will cause the Makefiles to be regenerated when you run `make');
# (2) otherwise, pass the desired values on the `make' command line.
$(RECURSIVE_TARGETS):
@failcom='exit 1'; \
@fail= failcom='exit 1'; \
for f in x $$MAKEFLAGS; do \
case $$f in \
*=* | --[!k]*);; \
@ -1257,7 +1283,7 @@ $(RECURSIVE_TARGETS):
fi; test -z "$$fail"
$(RECURSIVE_CLEAN_TARGETS):
@failcom='exit 1'; \
@fail= failcom='exit 1'; \
for f in x $$MAKEFLAGS; do \
case $$f in \
*=* | --[!k]*);; \
@ -1424,7 +1450,8 @@ distdir: $(DISTFILES)
top_distdir="$(top_distdir)" distdir="$(distdir)" \
dist-info
-test -n "$(am__skip_mode_fix)" \
|| find "$(distdir)" -type d ! -perm -777 -exec chmod a+rwx {} \; -o \
|| find "$(distdir)" -type d ! -perm -755 \
-exec chmod u+rwx,go+rx {} \; -o \
! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \
! -type d ! -perm -400 -exec chmod a+r {} \; -o \
! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \
@ -1468,17 +1495,17 @@ dist dist-all: distdir
distcheck: dist
case '$(DIST_ARCHIVES)' in \
*.tar.gz*) \
GZIP=$(GZIP_ENV) gunzip -c $(distdir).tar.gz | $(am__untar) ;;\
GZIP=$(GZIP_ENV) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\
*.tar.bz2*) \
bunzip2 -c $(distdir).tar.bz2 | $(am__untar) ;;\
bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\
*.tar.lzma*) \
unlzma -c $(distdir).tar.lzma | $(am__untar) ;;\
lzma -dc $(distdir).tar.lzma | $(am__untar) ;;\
*.tar.xz*) \
xz -dc $(distdir).tar.xz | $(am__untar) ;;\
*.tar.Z*) \
uncompress -c $(distdir).tar.Z | $(am__untar) ;;\
*.shar.gz*) \
GZIP=$(GZIP_ENV) gunzip -c $(distdir).shar.gz | unshar ;;\
GZIP=$(GZIP_ENV) gzip -dc $(distdir).shar.gz | unshar ;;\
*.zip*) \
unzip $(distdir).zip ;;\
esac
@ -1587,6 +1614,8 @@ distclean-generic:
-rm -f src/m68k/$(am__dirstamp)
-rm -f src/mips/$(DEPDIR)/$(am__dirstamp)
-rm -f src/mips/$(am__dirstamp)
-rm -f src/moxie/$(DEPDIR)/$(am__dirstamp)
-rm -f src/moxie/$(am__dirstamp)
-rm -f src/pa/$(DEPDIR)/$(am__dirstamp)
-rm -f src/pa/$(am__dirstamp)
-rm -f src/powerpc/$(DEPDIR)/$(am__dirstamp)
@ -1612,7 +1641,7 @@ clean-am: clean-aminfo clean-generic clean-libLTLIBRARIES \
distclean: distclean-recursive
-rm -f $(am__CONFIG_DISTCLEAN_FILES)
-rm -rf src/$(DEPDIR) src/alpha/$(DEPDIR) src/arm/$(DEPDIR) src/avr32/$(DEPDIR) src/cris/$(DEPDIR) src/frv/$(DEPDIR) src/ia64/$(DEPDIR) src/m32r/$(DEPDIR) src/m68k/$(DEPDIR) src/mips/$(DEPDIR) src/pa/$(DEPDIR) src/powerpc/$(DEPDIR) src/s390/$(DEPDIR) src/sh/$(DEPDIR) src/sh64/$(DEPDIR) src/sparc/$(DEPDIR) src/x86/$(DEPDIR)
-rm -rf src/$(DEPDIR) src/alpha/$(DEPDIR) src/arm/$(DEPDIR) src/avr32/$(DEPDIR) src/cris/$(DEPDIR) src/frv/$(DEPDIR) src/ia64/$(DEPDIR) src/m32r/$(DEPDIR) src/m68k/$(DEPDIR) src/mips/$(DEPDIR) src/moxie/$(DEPDIR) src/pa/$(DEPDIR) src/powerpc/$(DEPDIR) src/s390/$(DEPDIR) src/sh/$(DEPDIR) src/sh64/$(DEPDIR) src/sparc/$(DEPDIR) src/x86/$(DEPDIR)
-rm -f Makefile
distclean-am: clean-am distclean-compile distclean-generic \
distclean-hdr distclean-libtool distclean-tags
@ -1732,7 +1761,7 @@ installcheck-am:
maintainer-clean: maintainer-clean-recursive
-rm -f $(am__CONFIG_DISTCLEAN_FILES)
-rm -rf $(top_srcdir)/autom4te.cache
-rm -rf src/$(DEPDIR) src/alpha/$(DEPDIR) src/arm/$(DEPDIR) src/avr32/$(DEPDIR) src/cris/$(DEPDIR) src/frv/$(DEPDIR) src/ia64/$(DEPDIR) src/m32r/$(DEPDIR) src/m68k/$(DEPDIR) src/mips/$(DEPDIR) src/pa/$(DEPDIR) src/powerpc/$(DEPDIR) src/s390/$(DEPDIR) src/sh/$(DEPDIR) src/sh64/$(DEPDIR) src/sparc/$(DEPDIR) src/x86/$(DEPDIR)
-rm -rf src/$(DEPDIR) src/alpha/$(DEPDIR) src/arm/$(DEPDIR) src/avr32/$(DEPDIR) src/cris/$(DEPDIR) src/frv/$(DEPDIR) src/ia64/$(DEPDIR) src/m32r/$(DEPDIR) src/m68k/$(DEPDIR) src/mips/$(DEPDIR) src/moxie/$(DEPDIR) src/pa/$(DEPDIR) src/powerpc/$(DEPDIR) src/s390/$(DEPDIR) src/sh/$(DEPDIR) src/sh64/$(DEPDIR) src/sparc/$(DEPDIR) src/x86/$(DEPDIR)
-rm -f Makefile
maintainer-clean-am: distclean-am maintainer-clean-aminfo \
maintainer-clean-generic maintainer-clean-vti

View File

@ -75,6 +75,7 @@ tested:
| X86 | Linux |
| X86 | Mac OSX |
| X86 | OpenBSD |
| X86 | OS/2 |
| X86 | Solaris |
| X86 | Windows/Cygwin |
| X86 | Windows/MingW |
@ -113,9 +114,13 @@ It's also possible to build libffi on Windows platforms with
Microsoft's Visual C++ compiler. In this case, use the msvcc.sh
wrapper script during configuration like so:
path/to/configure --enable-shared --enable-static \
CC=path/to/msvcc.sh LD=link \
CPP=\"cl -nologo -EP\"
path/to/configure CC=path/to/msvcc.sh LD=link CPP=\"cl -nologo -EP\"
For 64-bit Windows builds, use CC="path/to/msvcc.sh -m64".
You may also need to specify --build appropriately. When building with MSVC
under a MingW environment, you may need to remove the line in configure
that sets 'fix_srcfile_path' to a 'cygpath' command. ('cygpath' is not
present in MingW, and is not required when using MingW-style paths.)
Configure has many other options. Use "configure --help" to see them all.

View File

@ -1,4 +1,4 @@
# generated automatically by aclocal 1.11 -*- Autoconf -*-
# generated automatically by aclocal 1.11.1 -*- Autoconf -*-
# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
# 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc.
@ -13,8 +13,8 @@
m4_ifndef([AC_AUTOCONF_VERSION],
[m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.63],,
[m4_warning([this file was generated for autoconf 2.63.
m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.65],,
[m4_warning([this file was generated for autoconf 2.65.
You have another version of autoconf. It may work, but is not guaranteed to.
If you have problems, you may need to regenerate the build system entirely.
To do so, use the procedure documented by the package, typically `autoreconf'.])])
@ -7862,15 +7862,15 @@ m4_define([lt_dict_filter],
# Generated from ltversion.in.
# serial 3012 ltversion.m4
# serial 3017 ltversion.m4
# This file is part of GNU Libtool
m4_define([LT_PACKAGE_VERSION], [2.2.6])
m4_define([LT_PACKAGE_REVISION], [1.3012])
m4_define([LT_PACKAGE_VERSION], [2.2.6b])
m4_define([LT_PACKAGE_REVISION], [1.3017])
AC_DEFUN([LTVERSION_VERSION],
[macro_version='2.2.6'
macro_revision='1.3012'
[macro_version='2.2.6b'
macro_revision='1.3017'
_LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?])
_LT_DECL(, macro_revision, 0)
])
@ -7983,7 +7983,7 @@ AC_DEFUN([AM_AUTOMAKE_VERSION],
[am__api_version='1.11'
dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to
dnl require some minimum version. Point them to the right macro.
m4_if([$1], [1.11], [],
m4_if([$1], [1.11.1], [],
[AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl
])
@ -7999,7 +7999,7 @@ m4_define([_AM_AUTOCONF_VERSION], [])
# Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced.
# This function is AC_REQUIREd by AM_INIT_AUTOMAKE.
AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION],
[AM_AUTOMAKE_VERSION([1.11])dnl
[AM_AUTOMAKE_VERSION([1.11.1])dnl
m4_ifndef([AC_AUTOCONF_VERSION],
[m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
_AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))])

File diff suppressed because it is too large Load Diff

View File

@ -16,10 +16,14 @@ AM_INIT_AUTOMAKE
# We must force CC to /not/ be precious variables; otherwise
# the wrong, non-multilib-adjusted value will be used in multilibs.
# As a side effect, we have to subst CFLAGS ourselves.
# Also save and restore CFLAGS, since AC_PROG_CC will come up with
# defaults of its own if none are provided.
m4_rename([_AC_ARG_VAR_PRECIOUS],[real_PRECIOUS])
m4_define([_AC_ARG_VAR_PRECIOUS],[])
save_CFLAGS=$CFLAGS
AC_PROG_CC
CFLAGS=$save_CFLAGS
m4_undefine([_AC_ARG_VAR_PRECIOUS])
m4_rename([real_PRECIOUS],[_AC_ARG_VAR_PRECIOUS])
@ -43,7 +47,7 @@ TARGETDIR="unknown"
case "$host" in
alpha*-*-*)
TARGET=ALPHA; TARGETDIR=alpha;
# Support 128-bit long double, changable via command-line switch.
# Support 128-bit long double, changeable via command-line switch.
HAVE_LONG_DOUBLE='defined(__LONG_DOUBLE_128__)'
;;
@ -120,6 +124,10 @@ case "$host" in
TARGET=MIPS; TARGETDIR=mips
;;
moxie-*-*)
TARGET=MOXIE; TARGETDIR=moxie
;;
powerpc*-*-linux* | powerpc-*-sysv*)
TARGET=POWERPC; TARGETDIR=powerpc
;;
@ -185,6 +193,7 @@ AM_CONDITIONAL(ALPHA, test x$TARGET = xALPHA)
AM_CONDITIONAL(IA64, test x$TARGET = xIA64)
AM_CONDITIONAL(M32R, test x$TARGET = xM32R)
AM_CONDITIONAL(M68K, test x$TARGET = xM68K)
AM_CONDITIONAL(MOXIE, test x$TARGET = xMOXIE)
AM_CONDITIONAL(POWERPC, test x$TARGET = xPOWERPC)
AM_CONDITIONAL(POWERPC_AIX, test x$TARGET = xPOWERPC_AIX)
AM_CONDITIONAL(POWERPC_DARWIN, test x$TARGET = xPOWERPC_DARWIN)
@ -270,7 +279,7 @@ if test x$TARGET = xX86 || test x$TARGET = xX86_WIN32 || test x$TARGET = xX86_64
libffi_cv_as_x86_pcrel, [
libffi_cv_as_x86_pcrel=yes
echo '.text; foo: nop; .data; .long foo-.; .text' > conftest.s
if $CC $CFLAGS -c conftest.s 2>&1 | grep -i warning > /dev/null; then
if $CC $CFLAGS -c conftest.s 2>&1 | $EGREP -i 'illegal|warning' > /dev/null; then
libffi_cv_as_x86_pcrel=no
fi
])
@ -278,6 +287,32 @@ if test x$TARGET = xX86 || test x$TARGET = xX86_WIN32 || test x$TARGET = xX86_64
AC_DEFINE(HAVE_AS_X86_PCREL, 1,
[Define if your assembler supports PC relative relocs.])
fi
AC_CACHE_CHECK([assembler .ascii pseudo-op support],
libffi_cv_as_ascii_pseudo_op, [
libffi_cv_as_ascii_pseudo_op=unknown
# Check if we have .ascii
AC_TRY_COMPILE([asm (".ascii \"string\"");],,
[libffi_cv_as_ascii_pseudo_op=yes],
[libffi_cv_as_ascii_pseudo_op=no])
])
if test "x$libffi_cv_as_ascii_pseudo_op" = xyes; then
AC_DEFINE(HAVE_AS_ASCII_PSEUDO_OP, 1,
[Define if your assembler supports .ascii.])
fi
AC_CACHE_CHECK([assembler .string pseudo-op support],
libffi_cv_as_string_pseudo_op, [
libffi_cv_as_string_pseudo_op=unknown
# Check if we have .string
AC_TRY_COMPILE([asm (".string \"string\"");],,
[libffi_cv_as_string_pseudo_op=yes],
[libffi_cv_as_string_pseudo_op=no])
])
if test "x$libffi_cv_as_string_pseudo_op" = xyes; then
AC_DEFINE(HAVE_AS_STRING_PSEUDO_OP, 1,
[Define if your assembler supports .string.])
fi
fi
case "$target" in
@ -288,6 +323,21 @@ case "$target" in
;;
esac
if test x$TARGET = xX86_64; then
AC_CACHE_CHECK([assembler supports unwind section type],
libffi_cv_as_x86_64_unwind_section_type, [
libffi_cv_as_x86_64_unwind_section_type=yes
echo '.section .eh_frame,"a",@unwind' > conftest.s
if $CC $CFLAGS -c conftest.s 2>&1 | grep -i warning > /dev/null; then
libffi_cv_as_x86_64_unwind_section_type=no
fi
])
if test "x$libffi_cv_as_x86_64_unwind_section_type" = xyes; then
AC_DEFINE(HAVE_AS_X86_64_UNWIND_SECTION_TYPE, 1,
[Define if your assembler supports unwind section type.])
fi
fi
AC_CACHE_CHECK([whether .eh_frame section should be read-only],
libffi_cv_ro_eh_frame, [
libffi_cv_ro_eh_frame=no
@ -354,6 +404,7 @@ AC_ARG_ENABLE(debug,
if test "$enable_debug" = "yes"; then
AC_DEFINE(FFI_DEBUG, 1, [Define this if you want extra debugging.])
fi)
AM_CONDITIONAL(FFI_DEBUG, test "$enable_debug" = "yes")
AC_ARG_ENABLE(structs,
[ --disable-structs omit code for struct support],

View File

@ -4,7 +4,7 @@ from ../libffi/doc/libffi.texi.
This manual is for Libffi, a portable foreign-function interface
library.
Copyright (C) 2008 Red Hat, Inc.
Copyright (C) 2008, 2010 Red Hat, Inc.
Permission is granted to copy, distribute and/or modify this
document under the terms of the GNU General Public License as
@ -27,7 +27,7 @@ libffi
This manual is for Libffi, a portable foreign-function interface
library.
Copyright (C) 2008 Red Hat, Inc.
Copyright (C) 2008, 2010 Red Hat, Inc.
Permission is granted to copy, distribute and/or modify this
document under the terms of the GNU General Public License as
@ -89,6 +89,7 @@ File: libffi.info, Node: Using libffi, Next: Missing Features, Prev: Introduc
* Types:: libffi type descriptions.
* Multiple ABIs:: Different passing styles on one platform.
* The Closure API:: Writing a generic function.
* Closure Example:: A closure example.

File: libffi.info, Node: The Basics, Next: Simple Example, Up: Using libffi
@ -146,7 +147,9 @@ To prepare a call interface object, use the function `ffi_prep_cif'.
AVALUES is a vector of `void *' pointers that point to the memory
locations holding the argument values for a call. If CIF declares
that the function has no arguments (i.e., NARGS was 0), then
AVALUES is ignored.
AVALUES is ignored. Note that argument values may be modified by
the callee (for instance, structs passed by value); the burden of
copying pass-by-value arguments is placed on the caller.

File: libffi.info, Node: Simple Example, Next: Types, Prev: The Basics, Up: Using libffi
@ -368,7 +371,7 @@ instance, the x86 platform has both `stdcall' and `fastcall' functions.
necessarily platform-specific.

File: libffi.info, Node: The Closure API, Prev: Multiple ABIs, Up: Using libffi
File: libffi.info, Node: The Closure API, Next: Closure Example, Prev: Multiple ABIs, Up: Using libffi
2.5 The Closure API
===================
@ -443,6 +446,62 @@ closure function:
is deprecated, as it cannot handle the need for separate writable and
executable addresses.

File: libffi.info, Node: Closure Example, Prev: The Closure API, Up: Using libffi
2.6 Closure Example
===================
A trivial example that creates a new `puts' by binding `fputs' with
`stdin'.
#include <stdio.h>
#include <ffi.h>
/* Acts like puts with the file given at time of enclosure. */
void puts_binding(ffi_cif *cif, unsigned int *ret, void* args[],
FILE *stream)
{
*ret = fputs(*(char **)args[0], stream);
}
int main()
{
ffi_cif cif;
ffi_type *args[1];
ffi_closure *closure;
int (*bound_puts)(char *);
int rc;
/* Allocate closure and bound_puts */
closure = ffi_closure_alloc(sizeof(ffi_closure), &bound_puts);
if (closure)
{
/* Initialize the argument info vectors */
args[0] = &ffi_type_pointer;
/* Initialize the cif */
if (ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1,
&ffi_type_uint, args) == FFI_OK)
{
/* Initialize the closure, setting stream to stdout */
if (ffi_prep_closure_loc(closure, &cif, puts_binding,
stdout, bound_puts) == FFI_OK)
{
rc = bound_puts("Hello World!");
/* rc now holds the result of the call to fputs */
}
}
}
/* Deallocate both closure, and bound_puts */
ffi_closure_free(closure);
return 0;
}

File: libffi.info, Node: Missing Features, Next: Index, Prev: Using libffi, Up: Top
@ -480,7 +539,7 @@ Index
* closures: The Closure API. (line 13)
* FFI: Introduction. (line 31)
* ffi_call: The Basics. (line 41)
* ffi_closure_alloca: The Closure API. (line 19)
* ffi_closure_alloc: The Closure API. (line 19)
* ffi_closure_free: The Closure API. (line 26)
* FFI_CLOSURES: The Closure API. (line 13)
* ffi_prep_cif: The Basics. (line 16)
@ -516,18 +575,19 @@ Index

Tag Table:
Node: Top700
Node: Introduction1436
Node: Using libffi3072
Node: The Basics3507
Node: Simple Example6114
Node: Types7141
Node: Primitive Types7424
Node: Structures9244
Node: Type Example10104
Node: Multiple ABIs11327
Node: The Closure API11698
Node: Missing Features14618
Node: Index15111
Node: Top706
Node: Introduction1448
Node: Using libffi3084
Node: The Basics3570
Node: Simple Example6356
Node: Types7383
Node: Primitive Types7666
Node: Structures9486
Node: Type Example10346
Node: Multiple ABIs11569
Node: The Closure API11940
Node: Closure Example14884
Node: Missing Features16443
Node: Index16936

End Tag Table

View File

@ -171,7 +171,9 @@ discarded.
@var{avalues} is a vector of @code{void *} pointers that point to the
memory locations holding the argument values for a call. If @var{cif}
declares that the function has no arguments (i.e., @var{nargs} was 0),
then @var{avalues} is ignored.
then @var{avalues} is ignored. Note that argument values may be
modified by the callee (for instance, structs passed by value); the
burden of copying pass-by-value arguments is placed on the caller.
@end defun
@ -438,7 +440,7 @@ require special allocation on platforms that have a non-executable
heap. Memory management for closures is handled by a pair of
functions:
@findex ffi_closure_alloca
@findex ffi_closure_alloc
@defun void *ffi_closure_alloc (size_t @var{size}, void **@var{code})
Allocate a chunk of memory holding @var{size} bytes. This returns a
pointer to the writable address, and sets *@var{code} to the

View File

@ -33,6 +33,9 @@
*/
#undef HAVE_ALLOCA_H
/* Define if your assembler supports .ascii. */
#undef HAVE_AS_ASCII_PSEUDO_OP
/* Define if your assembler supports .cfi_* directives. */
#undef HAVE_AS_CFI_PSEUDO_OP
@ -43,6 +46,12 @@
*/
#undef HAVE_AS_SPARC_UA_PCREL
/* Define if your assembler supports .string. */
#undef HAVE_AS_STRING_PSEUDO_OP
/* Define if your assembler supports unwind section type. */
#undef HAVE_AS_X86_64_UNWIND_SECTION_TYPE
/* Define if your assembler supports PC relative relocs. */
#undef HAVE_AS_X86_PCREL

View File

@ -1,4 +1,4 @@
# Makefile.in generated by automake 1.11 from Makefile.am.
# Makefile.in generated by automake 1.11.1 from Makefile.am.
# @configure_input@
# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
@ -133,6 +133,7 @@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
PACKAGE_NAME = @PACKAGE_NAME@
PACKAGE_STRING = @PACKAGE_STRING@
PACKAGE_TARNAME = @PACKAGE_TARNAME@
PACKAGE_URL = @PACKAGE_URL@
PACKAGE_VERSION = @PACKAGE_VERSION@
PATH_SEPARATOR = @PATH_SEPARATOR@
RANLIB = @RANLIB@

View File

@ -57,7 +57,9 @@ extern "C" {
#endif
/* Specify which architecture libffi is configured for. */
#ifndef @TARGET@
#define @TARGET@
#endif
/* ---- System configuration information --------------------------------- */

View File

@ -1,6 +1,6 @@
# Generated from ltmain.m4sh.
# ltmain.sh (GNU libtool) 2.2.6
# ltmain.sh (GNU libtool) 2.2.6b
# Written by Gordon Matzigkeit <gord@gnu.ai.mit.edu>, 1996
# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006, 2007 2008 Free Software Foundation, Inc.
@ -65,7 +65,7 @@
# compiler: $LTCC
# compiler flags: $LTCFLAGS
# linker: $LD (gnu? $with_gnu_ld)
# $progname: (GNU libtool) 2.2.6
# $progname: (GNU libtool) 2.2.6b
# automake: $automake_version
# autoconf: $autoconf_version
#
@ -73,9 +73,9 @@
PROGRAM=ltmain.sh
PACKAGE=libtool
VERSION=2.2.6
VERSION=2.2.6b
TIMESTAMP=""
package_revision=1.3012
package_revision=1.3017
# Be Bourne compatible
if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then

View File

@ -9,15 +9,15 @@
# Generated from ltversion.in.
# serial 3012 ltversion.m4
# serial 3017 ltversion.m4
# This file is part of GNU Libtool
m4_define([LT_PACKAGE_VERSION], [2.2.6])
m4_define([LT_PACKAGE_REVISION], [1.3012])
m4_define([LT_PACKAGE_VERSION], [2.2.6b])
m4_define([LT_PACKAGE_REVISION], [1.3017])
AC_DEFUN([LTVERSION_VERSION],
[macro_version='2.2.6'
macro_revision='1.3012'
[macro_version='2.2.6b'
macro_revision='1.3017'
_LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?])
_LT_DECL(, macro_revision, 0)
])

View File

@ -1,4 +1,4 @@
# Makefile.in generated by automake 1.11 from Makefile.am.
# Makefile.in generated by automake 1.11.1 from Makefile.am.
# @configure_input@
# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
@ -131,6 +131,7 @@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
PACKAGE_NAME = @PACKAGE_NAME@
PACKAGE_STRING = @PACKAGE_STRING@
PACKAGE_TARNAME = @PACKAGE_TARNAME@
PACKAGE_URL = @PACKAGE_URL@
PACKAGE_VERSION = @PACKAGE_VERSION@
PATH_SEPARATOR = @PATH_SEPARATOR@
RANLIB = @RANLIB@

View File

@ -42,7 +42,7 @@
# format and translated into something sensible for cl or ml.
#
args="-nologo"
args="-nologo -W3"
md=-MD
cl="cl"
ml="ml"
@ -67,13 +67,25 @@ do
safeseh=
shift 1
;;
-O0)
args="$args -Od"
shift 1
;;
-O*)
args="$args $1"
# If we're optimizing, make sure we explicitly turn on some optimizations
# that are implicitly disabled by debug symbols (-Zi).
args="$args $1 -OPT:REF -OPT:ICF -INCREMENTAL:NO"
shift 1
;;
-g)
# Can't specify -RTC1 or -Zi in opt. -Gy is ok. Use -OPT:REF?
args="$args -D_DEBUG -RTC1 -Zi"
# Enable debug symbol generation.
args="$args -Zi -DEBUG"
shift 1
;;
-DFFI_DEBUG)
# Link against debug CRT and enable runtime error checks.
args="$args -RTC1"
defines="$defines $1"
md=-MDd
shift 1
;;
@ -110,8 +122,8 @@ do
shift 1
;;
-Wall)
# -Wall on MSVC is overzealous. Use -W3 instead.
args="$args -W3"
# -Wall on MSVC is overzealous, and we already build with -W3. Nothing
# to do here.
shift 1
;;
-Werror)

View File

@ -34,8 +34,8 @@ typedef signed long ffi_sarg;
typedef enum ffi_abi {
FFI_FIRST_ABI = 0,
FFI_SYSV,
FFI_DEFAULT_ABI = FFI_SYSV,
FFI_LAST_ABI = FFI_DEFAULT_ABI + 1
FFI_LAST_ABI,
FFI_DEFAULT_ABI = FFI_SYSV
} ffi_abi;
#endif

View File

@ -74,7 +74,8 @@
#endif
#if defined(__ARM_ARCH_7__) || defined(__ARM_ARCH_7A__) \
|| defined(__ARM_ARCH_7R__) || defined(__ARM_ARCH_7M__)
|| defined(__ARM_ARCH_7R__) || defined(__ARM_ARCH_7M__) \
|| defined(__ARM_ARCH_7EM__)
# undef __ARM_ARCH__
# define __ARM_ARCH__ 7
#endif

View File

@ -34,8 +34,8 @@ typedef signed long ffi_sarg;
typedef enum ffi_abi {
FFI_FIRST_ABI = 0,
FFI_SYSV,
FFI_DEFAULT_ABI = FFI_SYSV,
FFI_LAST_ABI = FFI_DEFAULT_ABI + 1
FFI_LAST_ABI,
FFI_DEFAULT_ABI = FFI_SYSV
} ffi_abi;
#endif

View File

@ -146,7 +146,7 @@ selinux_enabled_check (void)
p = strchr (p + 1, ' ');
if (p == NULL)
break;
if (strncmp (p + 1, "selinuxfs ", 10) != 0)
if (strncmp (p + 1, "selinuxfs ", 10) == 0)
{
free (buf);
fclose (f);

View File

@ -163,7 +163,7 @@ ffi_prep_cif (ffi_cif * cif,
ffi_type **ptr;
FFI_ASSERT (cif != NULL);
FFI_ASSERT ((abi > FFI_FIRST_ABI) && (abi <= FFI_DEFAULT_ABI));
FFI_ASSERT (abi > FFI_FIRST_ABI && abi < FFI_LAST_ABI);
cif->abi = abi;
cif->arg_types = atypes;

View File

@ -34,8 +34,8 @@ typedef signed long ffi_sarg;
typedef enum ffi_abi {
FFI_FIRST_ABI = 0,
FFI_SYSV,
FFI_DEFAULT_ABI = FFI_SYSV,
FFI_LAST_ABI = FFI_DEFAULT_ABI + 1
FFI_LAST_ABI,
FFI_DEFAULT_ABI = FFI_SYSV
} ffi_abi;
#endif

View File

@ -4251,7 +4251,7 @@ void* dlmalloc(size_t bytes) {
void dlfree(void* mem) {
/*
Consolidate freed chunks with preceeding or succeeding bordering
Consolidate freed chunks with preceding or succeeding bordering
free chunks, if they exist, and then place in a bin. Intermixed
with special cases for top, dv, mmapped chunks, and usage errors.
*/

View File

@ -35,13 +35,9 @@ typedef signed long ffi_sarg;
typedef enum ffi_abi {
FFI_FIRST_ABI = 0,
#ifdef FRV
FFI_EABI,
FFI_DEFAULT_ABI = FFI_EABI,
#endif
FFI_LAST_ABI = FFI_DEFAULT_ABI + 1
FFI_LAST_ABI,
FFI_DEFAULT_ABI = FFI_EABI
} ffi_abi;
#endif

View File

@ -225,7 +225,7 @@ ffi_prep_cif_machdep(ffi_cif *cif)
int flags;
/* Adjust cif->bytes to include space for the bits of the ia64_args frame
that preceeds the integer register portion. The estimate that the
that precedes the integer register portion. The estimate that the
generic bits did for the argument space required is good enough for the
integer component. */
cif->bytes += offsetof(struct ia64_args, gp_regs[0]);

View File

@ -34,8 +34,8 @@ typedef signed long long ffi_sarg;
typedef enum ffi_abi {
FFI_FIRST_ABI = 0,
FFI_UNIX, /* Linux and all Unix variants use the same conventions */
FFI_DEFAULT_ABI = FFI_UNIX,
FFI_LAST_ABI = FFI_DEFAULT_ABI + 1
FFI_LAST_ABI,
FFI_DEFAULT_ABI = FFI_UNIX
} ffi_abi;
#endif

View File

@ -36,8 +36,8 @@ typedef enum ffi_abi
{
FFI_FIRST_ABI = 0,
FFI_SYSV,
FFI_DEFAULT_ABI = FFI_SYSV,
FFI_LAST_ABI = FFI_DEFAULT_ABI + 1
FFI_LAST_ABI,
FFI_DEFAULT_ABI = FFI_SYSV
} ffi_abi;
#endif

View File

@ -34,8 +34,8 @@ typedef signed long ffi_sarg;
typedef enum ffi_abi {
FFI_FIRST_ABI = 0,
FFI_SYSV,
FFI_DEFAULT_ABI = FFI_SYSV,
FFI_LAST_ABI = FFI_DEFAULT_ABI + 1
FFI_LAST_ABI,
FFI_DEFAULT_ABI = FFI_SYSV
} ffi_abi;
#endif

View File

@ -186,30 +186,29 @@ typedef enum ffi_abi {
FFI_O32_SOFT_FLOAT,
FFI_N32_SOFT_FLOAT,
FFI_N64_SOFT_FLOAT,
FFI_LAST_ABI,
#ifdef FFI_MIPS_O32
#ifdef __mips_soft_float
FFI_DEFAULT_ABI = FFI_O32_SOFT_FLOAT,
FFI_DEFAULT_ABI = FFI_O32_SOFT_FLOAT
#else
FFI_DEFAULT_ABI = FFI_O32,
FFI_DEFAULT_ABI = FFI_O32
#endif
#else
# if _MIPS_SIM==_ABI64
# ifdef __mips_soft_float
FFI_DEFAULT_ABI = FFI_N64_SOFT_FLOAT,
FFI_DEFAULT_ABI = FFI_N64_SOFT_FLOAT
# else
FFI_DEFAULT_ABI = FFI_N64,
FFI_DEFAULT_ABI = FFI_N64
# endif
# else
# ifdef __mips_soft_float
FFI_DEFAULT_ABI = FFI_N32_SOFT_FLOAT,
FFI_DEFAULT_ABI = FFI_N32_SOFT_FLOAT
# else
FFI_DEFAULT_ABI = FFI_N32,
FFI_DEFAULT_ABI = FFI_N32
# endif
# endif
#endif
FFI_LAST_ABI = FFI_DEFAULT_ABI + 1
} ffi_abi;
#define FFI_EXTRA_CIF_FIELDS unsigned rstruct_flag

View File

@ -35,13 +35,9 @@ typedef signed long ffi_sarg;
typedef enum ffi_abi {
FFI_FIRST_ABI = 0,
#ifdef MOXIE
FFI_EABI,
FFI_DEFAULT_ABI = FFI_EABI,
#endif
FFI_LAST_ABI = FFI_DEFAULT_ABI + 1
FFI_LAST_ABI,
FFI_DEFAULT_ABI = FFI_EABI
} ffi_abi;
#endif

View File

@ -38,21 +38,22 @@ typedef enum ffi_abi {
#ifdef PA_LINUX
FFI_PA32,
FFI_DEFAULT_ABI = FFI_PA32,
FFI_LAST_ABI,
FFI_DEFAULT_ABI = FFI_PA32
#endif
#ifdef PA_HPUX
FFI_PA32,
FFI_DEFAULT_ABI = FFI_PA32,
FFI_LAST_ABI,
FFI_DEFAULT_ABI = FFI_PA32
#endif
#ifdef PA64_HPUX
#error "PA64_HPUX FFI is not yet implemented"
FFI_PA64,
FFI_DEFAULT_ABI = FFI_PA64,
FFI_LAST_ABI,
FFI_DEFAULT_ABI = FFI_PA64
#endif
FFI_LAST_ABI = FFI_DEFAULT_ABI + 1
} ffi_abi;
#endif

View File

@ -31,12 +31,18 @@
/* ---- System specific configurations ----------------------------------- */
#if defined (POWERPC) && defined (__powerpc64__) /* linux64 */
#ifndef POWERPC64
#define POWERPC64
#endif
#elif defined (POWERPC_DARWIN) && defined (__ppc64__) /* Darwin */
#ifndef POWERPC64
#define POWERPC64
#endif
#elif defined (POWERPC_AIX) && defined (__64BIT__) /* AIX64 */
#ifndef POWERPC64
#define POWERPC64
#endif
#endif
#ifndef LIBFFI_ASM
typedef unsigned long ffi_arg;

View File

@ -93,7 +93,7 @@ ffi_status ffi_prep_cif(ffi_cif *cif, ffi_abi abi, unsigned int nargs,
ffi_type **ptr;
FFI_ASSERT(cif != NULL);
FFI_ASSERT((abi > FFI_FIRST_ABI) && (abi <= FFI_DEFAULT_ABI));
FFI_ASSERT(abi > FFI_FIRST_ABI && abi < FFI_LAST_ABI);
cif->abi = abi;
cif->arg_types = atypes;
@ -110,7 +110,7 @@ ffi_status ffi_prep_cif(ffi_cif *cif, ffi_abi abi, unsigned int nargs,
FFI_ASSERT_VALID_TYPE(cif->rtype);
/* x86, x86-64 and s390 stack space allocation is handled in prep_machdep. */
#if !defined M68K && !defined __i386__ && !defined __x86_64__ && !defined S390 && !defined PA
#if !defined M68K && !defined X86_ANY && !defined S390 && !defined PA
/* Make space for the return structure pointer */
if (cif->rtype->type == FFI_TYPE_STRUCT
#ifdef SPARC
@ -131,7 +131,7 @@ ffi_status ffi_prep_cif(ffi_cif *cif, ffi_abi abi, unsigned int nargs,
check after the initialization. */
FFI_ASSERT_VALID_TYPE(*ptr);
#if !defined __i386__ && !defined __x86_64__ && !defined S390 && !defined PA
#if !defined X86_ANY && !defined S390 && !defined PA
#ifdef SPARC
if (((*ptr)->type == FFI_TYPE_STRUCT
&& ((*ptr)->size > 16 || cif->abi != FFI_V9))

View File

@ -28,8 +28,10 @@
#define LIBFFI_TARGET_H
#if defined (__s390x__)
#ifndef S390X
#define S390X
#endif
#endif
/* ---- System specific configurations ----------------------------------- */
@ -40,8 +42,8 @@ typedef signed long ffi_sarg;
typedef enum ffi_abi {
FFI_FIRST_ABI = 0,
FFI_SYSV,
FFI_DEFAULT_ABI = FFI_SYSV,
FFI_LAST_ABI = FFI_DEFAULT_ABI + 1
FFI_LAST_ABI,
FFI_DEFAULT_ABI = FFI_SYSV
} ffi_abi;
#endif

View File

@ -36,8 +36,8 @@ typedef signed long ffi_sarg;
typedef enum ffi_abi {
FFI_FIRST_ABI = 0,
FFI_SYSV,
FFI_DEFAULT_ABI = FFI_SYSV,
FFI_LAST_ABI = FFI_DEFAULT_ABI + 1
FFI_LAST_ABI,
FFI_DEFAULT_ABI = FFI_SYSV
} ffi_abi;
#endif

View File

@ -36,8 +36,8 @@ typedef signed long ffi_sarg;
typedef enum ffi_abi {
FFI_FIRST_ABI = 0,
FFI_SYSV,
FFI_DEFAULT_ABI = FFI_SYSV,
FFI_LAST_ABI = FFI_DEFAULT_ABI + 1
FFI_LAST_ABI,
FFI_DEFAULT_ABI = FFI_SYSV
} ffi_abi;
#define FFI_EXTRA_CIF_FIELDS long long flags2

View File

@ -30,8 +30,10 @@
/* ---- System specific configurations ----------------------------------- */
#if defined(__arch64__) || defined(__sparcv9)
#ifndef SPARC64
#define SPARC64
#endif
#endif
#ifndef LIBFFI_ASM
typedef unsigned long ffi_arg;
@ -42,12 +44,12 @@ typedef enum ffi_abi {
FFI_V8,
FFI_V8PLUS,
FFI_V9,
FFI_LAST_ABI,
#ifdef SPARC64
FFI_DEFAULT_ABI = FFI_V9,
FFI_DEFAULT_ABI = FFI_V9
#else
FFI_DEFAULT_ABI = FFI_V8,
FFI_DEFAULT_ABI = FFI_V8
#endif
FFI_LAST_ABI = FFI_DEFAULT_ABI + 1
} ffi_abi;
#endif

View File

@ -155,12 +155,10 @@ ffi_status ffi_prep_cif_machdep(ffi_cif *cif)
switch (cif->rtype->type)
{
case FFI_TYPE_VOID:
#if defined(X86) || defined (X86_WIN32) || defined(X86_FREEBSD) || defined(X86_DARWIN) || defined(X86_WIN64)
case FFI_TYPE_UINT8:
case FFI_TYPE_UINT16:
case FFI_TYPE_SINT8:
case FFI_TYPE_SINT16:
#endif
#ifdef X86_WIN64
case FFI_TYPE_UINT32:
case FFI_TYPE_SINT32:
@ -291,27 +289,8 @@ void ffi_call(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue)
{
#ifdef X86_WIN64
case FFI_WIN64:
{
/* Make copies of all struct arguments
NOTE: not sure if responsibility should be here or in caller */
unsigned int i;
for (i=0; i < cif->nargs;i++) {
size_t size = cif->arg_types[i]->size;
if ((cif->arg_types[i]->type == FFI_TYPE_STRUCT
&& (size != 1 && size != 2 && size != 4 && size != 8))
#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE
|| cif->arg_types[i]->type == FFI_TYPE_LONGDOUBLE
#endif
)
{
void *local = alloca(size);
memcpy(local, avalue[i], size);
avalue[i] = local;
}
}
ffi_call_win64(ffi_prep_args, &ecif, cif->bytes,
cif->flags, ecif.rvalue, fn);
}
ffi_call_win64(ffi_prep_args, &ecif, cif->bytes,
cif->flags, ecif.rvalue, fn);
break;
#elif defined(X86_WIN32)
case FFI_SYSV:
@ -586,9 +565,9 @@ ffi_prep_raw_closure_loc (ffi_raw_closure* closure,
}
/* we currently don't support certain kinds of arguments for raw
closures. This should be implemented by a separate assembly language
routine, since it would require argument processing, something we
don't do now for performance. */
closures. This should be implemented by a separate assembly
language routine, since it would require argument processing,
something we don't do now for performance. */
for (i = cif->nargs-1; i >= 0; i--)
{

View File

@ -50,9 +50,10 @@ extern void ffi_call_unix64 (void *args, unsigned long bytes, unsigned flags,
gcc/config/i386/i386.c. Do *not* change one without the other. */
/* Register class used for passing given 64bit part of the argument.
These represent classes as documented by the PS ABI, with the exception
of SSESF, SSEDF classes, that are basically SSE class, just gcc will
use SF or DFmode move instead of DImode to avoid reformating penalties.
These represent classes as documented by the PS ABI, with the
exception of SSESF, SSEDF classes, that are basically SSE class,
just gcc will use SF or DFmode move instead of DImode to avoid
reformatting penalties.
Similary we play games with INTEGERSI_CLASS to use cheaper SImode moves
whenever possible (upper half does contain padding). */

View File

@ -31,6 +31,9 @@
/* ---- System specific configurations ----------------------------------- */
/* For code common to all platforms on x86 and x86_64. */
#define X86_ANY
#if defined (X86_64) && defined (__i386__)
#undef X86_64
#define X86
@ -64,28 +67,26 @@ typedef enum ffi_abi {
#ifdef X86_WIN32
FFI_SYSV,
FFI_STDCALL,
FFI_LAST_ABI,
/* TODO: Add fastcall support for the sake of completeness */
FFI_DEFAULT_ABI = FFI_SYSV,
#endif
FFI_DEFAULT_ABI = FFI_SYSV
#ifdef X86_WIN64
#elif defined(X86_WIN64)
FFI_WIN64,
FFI_DEFAULT_ABI = FFI_WIN64,
#else
FFI_LAST_ABI,
FFI_DEFAULT_ABI = FFI_WIN64
#else
/* ---- Intel x86 and AMD x86-64 - */
#if !defined(X86_WIN32) && (defined(__i386__) || defined(__x86_64__) || defined(__i386) || defined(__amd64))
FFI_SYSV,
FFI_UNIX64, /* Unix variants all use the same ABI for x86-64 */
FFI_LAST_ABI,
#if defined(__i386__) || defined(__i386)
FFI_DEFAULT_ABI = FFI_SYSV,
FFI_DEFAULT_ABI = FFI_SYSV
#else
FFI_DEFAULT_ABI = FFI_UNIX64,
FFI_DEFAULT_ABI = FFI_UNIX64
#endif
#endif
#endif /* X86_WIN64 */
FFI_LAST_ABI = FFI_DEFAULT_ABI + 1
} ffi_abi;
#endif

View File

@ -1,5 +1,5 @@
/* -----------------------------------------------------------------------
sysv.S - Copyright (c) 1996, 1998, 2001-2003, 2005, 2008 Red Hat, Inc.
sysv.S - Copyright (c) 1996, 1998, 2001-2003, 2005, 2008, 2010 Red Hat, Inc.
X86 Foreign Function Interface
@ -48,6 +48,9 @@ ffi_call_SYSV:
movl 16(%ebp),%ecx
subl %ecx,%esp
/* Align the stack pointer to 16-bytes */
andl $0xfffffff0, %esp
movl %esp,%eax
/* Place all of the ffi_prep_args in position */
@ -331,10 +334,20 @@ ffi_closure_raw_SYSV:
.LSCIE1:
.long 0x0 /* CIE Identifier Tag */
.byte 0x1 /* CIE Version */
#ifdef HAVE_AS_ASCII_PSEUDO_OP
#ifdef __PIC__
.ascii "zR\0" /* CIE Augmentation */
#else
.ascii "\0" /* CIE Augmentation */
#endif
#elif defined HAVE_AS_STRING_PSEUDO_OP
#ifdef __PIC__
.string "zR" /* CIE Augmentation */
#else
.string "" /* CIE Augmentation */
#endif
#else
#error missing .ascii/.string
#endif
.byte 0x1 /* .uleb128 0x1; CIE Code Alignment Factor */
.byte 0x7c /* .sleb128 -4; CIE Data Alignment Factor */

View File

@ -324,7 +324,11 @@ ffi_closure_unix64:
.LUW9:
.size ffi_closure_unix64,.-ffi_closure_unix64
#ifdef HAVE_AS_X86_64_UNWIND_SECTION_TYPE
.section .eh_frame,"a",@unwind
#else
.section .eh_frame,"a",@progbits
#endif
.Lframe1:
.long .LECIE1-.LSCIE1 /* CIE Length */
.LSCIE1:

View File

@ -0,0 +1 @@
timestamp

View File

@ -1,4 +1,4 @@
# Makefile.in generated by automake 1.11 from Makefile.am.
# Makefile.in generated by automake 1.11.1 from Makefile.am.
# @configure_input@
# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
@ -108,6 +108,7 @@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
PACKAGE_NAME = @PACKAGE_NAME@
PACKAGE_STRING = @PACKAGE_STRING@
PACKAGE_TARNAME = @PACKAGE_TARNAME@
PACKAGE_URL = @PACKAGE_URL@
PACKAGE_VERSION = @PACKAGE_VERSION@
PATH_SEPARATOR = @PATH_SEPARATOR@
RANLIB = @RANLIB@

View File

@ -17,11 +17,9 @@ int main (void)
ffi_cif cif;
void *code;
ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
void* args[1];
ffi_type* arg_types[1];
arg_types[0] = NULL;
args[0] = NULL;
CHECK(ffi_prep_cif(&cif, 255, 0, &ffi_type_void,
arg_types) == FFI_BAD_ABI);

View File

@ -123,16 +123,6 @@
* (e.g., some HP systems), it may be necessary to #define NAN_WORD0
* appropriately -- to the most significant word of a quiet NaN.
* (On HP Series 700/800 machines, -DNAN_WORD0=0x7ff40000 works.)
* When INFNAN_CHECK is #defined and No_Hex_NaN is not #defined,
* strtod also accepts (case insensitively) strings of the form
* NaN(x), where x is a string of hexadecimal digits and spaces;
* if there is only one string of hexadecimal digits, it is taken
* for the 52 fraction bits of the resulting NaN; if there are two
* or more strings of hex digits, the first is for the high 20 bits,
* the second and subsequent for the low 32 bits, with intervening
* white space ignored; but if this results in none of the 52
* fraction bits being on (an IEEE Infinity symbol), then NAN_WORD0
* and NAN_WORD1 are used instead.
* #define MULTIPLE_THREADS if the system offers preemptively scheduled
* multiple threads. In this case, you must provide (or suitably
* #define) two locks, acquired by ACQUIRE_DTOA_LOCK(n) and freed
@ -1531,76 +1521,6 @@ match
return 1;
}
#ifndef No_Hex_NaN
static void
hexnan
#ifdef KR_headers
(rvp, sp) U *rvp; CONST char **sp;
#else
(U *rvp, CONST char **sp)
#endif
{
ULong c, x[2];
CONST char *s;
int havedig, udx0, xshift;
x[0] = x[1] = 0;
havedig = xshift = 0;
udx0 = 1;
s = *sp;
/* allow optional initial 0x or 0X */
while((c = *(CONST unsigned char*)(s+1)) && c <= ' ')
++s;
if (s[1] == '0' && (s[2] == 'x' || s[2] == 'X'))
s += 2;
while((c = *(CONST unsigned char*)++s)) {
if (c >= '0' && c <= '9')
c -= '0';
else if (c >= 'a' && c <= 'f')
c += 10 - 'a';
else if (c >= 'A' && c <= 'F')
c += 10 - 'A';
else if (c <= ' ') {
if (udx0 && havedig) {
udx0 = 0;
xshift = 1;
}
continue;
}
#ifdef GDTOA_NON_PEDANTIC_NANCHECK
else if (/*(*/ c == ')' && havedig) {
*sp = s + 1;
break;
}
else
return; /* invalid form: don't change *sp */
#else
else {
do {
if (/*(*/ c == ')') {
*sp = s + 1;
break;
}
} while((c = *++s));
break;
}
#endif
havedig = 1;
if (xshift) {
xshift = 0;
x[0] = x[1];
x[1] = 0;
}
if (udx0)
x[0] = (x[0] << 4) | (x[1] >> 28);
x[1] = (x[1] << 4) | c;
}
if ((x[0] &= 0xfffff) || x[1]) {
word0(*rvp) = Exp_mask | x[0];
word1(*rvp) = x[1];
}
}
#endif /*No_Hex_NaN*/
#endif /* INFNAN_CHECK */
static double
@ -1782,10 +1702,6 @@ _strtod
if (match(&s, "an")) {
word0(rv) = NAN_WORD0;
word1(rv) = NAN_WORD1;
#ifndef No_Hex_NaN
if (*s == '(') /*)*/
hexnan(&rv, &s);
#endif
goto ret;
}
}

View File

@ -568,7 +568,8 @@ JSRuntime::init(uint32 maxbytes)
#endif
if (!(defaultCompartment = new JSCompartment(this)) ||
!defaultCompartment->init()) {
!defaultCompartment->init() ||
!compartments.append(defaultCompartment)) {
return false;
}
@ -657,8 +658,10 @@ JSRuntime::~JSRuntime()
JS_DESTROY_LOCK(debuggerLock);
#endif
propertyTree.finish();
if (defaultCompartment)
delete defaultCompartment;
/* Delete all remaining Compartments. Ideally only the defaultCompartment should be left. */
for (JSCompartment **c = compartments.begin(); c != compartments.end(); ++c)
delete *c;
compartments.clear();
}
JS_PUBLIC_API(JSRuntime *)

View File

@ -624,12 +624,7 @@ JS_DECLARE_CALLINFO(js_String_tn)
JS_DECLARE_CALLINFO(js_CompareStrings)
JS_DECLARE_CALLINFO(js_ConcatStrings)
JS_DECLARE_CALLINFO(js_EqualStrings)
JS_DECLARE_CALLINFO(js_String_getelem)
JS_DECLARE_CALLINFO(js_String_p_charCodeAt)
JS_DECLARE_CALLINFO(js_String_p_charCodeAt0)
JS_DECLARE_CALLINFO(js_String_p_charCodeAt0_int)
JS_DECLARE_CALLINFO(js_String_p_charCodeAt_double_int)
JS_DECLARE_CALLINFO(js_String_p_charCodeAt_int_int)
JS_DECLARE_CALLINFO(js_Flatten)
/* Defined in jstypedarray.cpp. */
JS_DECLARE_CALLINFO(js_TypedArray_uint8_clamp_double)

View File

@ -2983,6 +2983,10 @@ SweepCompartments(JSContext *cx)
JSCompartment **read = rt->compartments.begin();
JSCompartment **end = rt->compartments.end();
JSCompartment **write = read;
/* Delete defaultCompartment only during runtime shutdown */
rt->defaultCompartment->marked = true;
while (read < end) {
JSCompartment *compartment = (*read++);
if (compartment->marked) {

View File

@ -2329,7 +2329,7 @@ class RegExpNativeCompiler {
Fragment* fragment;
LirWriter* lir;
#ifdef DEBUG
LirWriter* validate_writer;
ValidateWriter* validate_writer;
#endif
#ifdef NJ_VERBOSE
LirWriter* verbose_filter;
@ -3243,6 +3243,15 @@ class RegExpNativeCompiler {
lirbuf->state = state = addName(lirbuf, lir->insParam(0, 0), "state");
lirbuf->param1 = cpend = addName(lirbuf, lir->insParam(1, 0), "cpend");
#ifdef DEBUG
// Do this before any REGlobalData loads/stores occur. 'extras' can
// be stack-allocated.
{
void* extras[] = { /* dummy */NULL, /* dummy */NULL };
validate_writer->setCheckAccSetExtras(extras);
}
#endif
loopLabel = lir->ins0(LIR_label);
// If profiling, record where the loop label is, so that the
// assembler can insert a frag-entry-counter increment at that

View File

@ -176,6 +176,18 @@ JSString::flatten()
topNode->initFlatMutable(chars, pos, capacity);
}
#ifdef JS_TRACER
int32 JS_FASTCALL
js_Flatten(JSString* str)
{
str->flatten();
return 0;
}
JS_DEFINE_CALLINFO_1(extern, INT32, js_Flatten, STRING, 0, nanojit::ACCSET_STORE_ANY)
#endif /* !JS_TRACER */
static JS_ALWAYS_INLINE size_t
RopeAllocSize(const size_t length, size_t *capacity)
{
@ -977,17 +989,6 @@ str_substring(JSContext *cx, uintN argc, Value *vp)
return JS_TRUE;
}
#ifdef JS_TRACER
static JSString* FASTCALL
String_p_toString(JSContext* cx, JSObject* obj)
{
if (!InstanceOf(cx, obj, &js_StringClass, NULL))
return NULL;
Value v = obj->getPrimitiveThis();
return v.toString();
}
#endif
JSString* JS_FASTCALL
js_toLowerCase(JSContext *cx, JSString *str)
{
@ -1111,8 +1112,8 @@ str_localeCompare(JSContext *cx, uintN argc, Value *vp)
return JS_TRUE;
}
static JSBool
str_charAt(JSContext *cx, uintN argc, Value *vp)
JSBool
js_str_charAt(JSContext *cx, uintN argc, Value *vp)
{
JSString *str;
jsint i;
@ -1150,8 +1151,8 @@ out_of_range:
return JS_TRUE;
}
static JSBool
str_charCodeAt(JSContext *cx, uintN argc, Value *vp)
JSBool
js_str_charCodeAt(JSContext *cx, uintN argc, Value *vp)
{
JSString *str;
jsint i;
@ -1186,60 +1187,6 @@ out_of_range:
return JS_TRUE;
}
#ifdef JS_TRACER
jsdouble FASTCALL
js_String_p_charCodeAt(JSString* str, jsdouble d)
{
d = js_DoubleToInteger(d);
if (d < 0 || (int32)str->length() <= d)
return js_NaN;
return jsdouble(str->chars()[jsuint(d)]);
}
int32 FASTCALL
js_String_p_charCodeAt_int_int(JSString* str, jsint i)
{
if (i < 0 || (int32)str->length() <= i)
return 0;
return str->chars()[i];
}
JS_DEFINE_CALLINFO_2(extern, INT32, js_String_p_charCodeAt_int_int, STRING, INT32,
1, nanojit::ACCSET_NONE)
int32 FASTCALL
js_String_p_charCodeAt_double_int(JSString* str, double d)
{
d = js_DoubleToInteger(d);
if (d < 0 || (int32)str->length() <= d)
return 0;
return str->chars()[jsuint(d)];
}
JS_DEFINE_CALLINFO_2(extern, INT32, js_String_p_charCodeAt_double_int, STRING, DOUBLE,
1, nanojit::ACCSET_NONE)
jsdouble FASTCALL
js_String_p_charCodeAt0(JSString* str)
{
if ((int32)str->length() == 0)
return js_NaN;
return jsdouble(str->chars()[0]);
}
/*
* The FuncFilter replaces the generic double version of charCodeAt with the
* integer fast path if appropriate.
*/
int32 FASTCALL
js_String_p_charCodeAt0_int(JSString* str)
{
if ((int32)str->length() == 0)
return 0;
return str->chars()[0];
}
JS_DEFINE_CALLINFO_1(extern, INT32, js_String_p_charCodeAt0_int, STRING, 1, nanojit::ACCSET_NONE)
#endif
jsint
js_BoyerMooreHorspool(const jschar *text, jsuint textlen,
const jschar *pat, jsuint patlen)
@ -2852,19 +2799,8 @@ js_String_getelem(JSContext* cx, JSString* str, int32 i)
}
#endif
JS_DEFINE_TRCINFO_1(js_str_toString,
(2, (extern, STRING_RETRY, String_p_toString, CONTEXT, THIS,
1, nanojit::ACCSET_NONE)))
JS_DEFINE_TRCINFO_1(str_charAt,
(3, (extern, STRING_RETRY, js_String_getelem, CONTEXT, THIS_STRING, INT32,
1, nanojit::ACCSET_NONE)))
JS_DEFINE_TRCINFO_2(str_charCodeAt,
(1, (extern, DOUBLE, js_String_p_charCodeAt0, THIS_STRING,
1, nanojit::ACCSET_NONE)),
(2, (extern, DOUBLE, js_String_p_charCodeAt, THIS_STRING, DOUBLE,
1, nanojit::ACCSET_NONE)))
JS_DEFINE_TRCINFO_1(str_concat,
(3, (extern, STRING_RETRY, js_ConcatStrings, CONTEXT, THIS_STRING, STRING,
(3, (extern, STRING_RETRY, js_ConcatStrings, CONTEXT, THIS_STRING, STRING,
1, nanojit::ACCSET_NONE)))
#define GENERIC JSFUN_GENERIC_NATIVE
@ -2878,14 +2814,14 @@ static JSFunctionSpec string_methods[] = {
#endif
/* Java-like methods. */
JS_TN(js_toString_str, js_str_toString, 0,JSFUN_THISP_STRING, &js_str_toString_trcinfo),
JS_FN(js_toString_str, js_str_toString, 0,JSFUN_THISP_STRING),
JS_FN(js_valueOf_str, js_str_toString, 0,JSFUN_THISP_STRING),
JS_FN(js_toJSON_str, js_str_toString, 0,JSFUN_THISP_STRING),
JS_FN("substring", str_substring, 2,GENERIC_PRIMITIVE),
JS_FN("toLowerCase", str_toLowerCase, 0,GENERIC_PRIMITIVE),
JS_FN("toUpperCase", str_toUpperCase, 0,GENERIC_PRIMITIVE),
JS_TN("charAt", str_charAt, 1,GENERIC_PRIMITIVE, &str_charAt_trcinfo),
JS_TN("charCodeAt", str_charCodeAt, 1,GENERIC_PRIMITIVE, &str_charCodeAt_trcinfo),
JS_FN("charAt", js_str_charAt, 1,GENERIC_PRIMITIVE),
JS_FN("charCodeAt", js_str_charCodeAt, 1,GENERIC_PRIMITIVE),
JS_FN("indexOf", str_indexOf, 1,GENERIC_PRIMITIVE),
JS_FN("lastIndexOf", str_lastIndexOf, 1,GENERIC_PRIMITIVE),
JS_FN("trim", str_trim, 0,GENERIC_PRIMITIVE),

View File

@ -1125,6 +1125,12 @@ str_replace(JSContext *cx, uintN argc, js::Value *vp);
extern JSBool
js_str_toString(JSContext *cx, uintN argc, js::Value *vp);
extern JSBool
js_str_charAt(JSContext *cx, uintN argc, js::Value *vp);
extern JSBool
js_str_charCodeAt(JSContext *cx, uintN argc, js::Value *vp);
/*
* Convert one UCS-4 char and write it into a UTF-8 buffer, which must be at
* least 6 bytes long. Return the number of UTF-8 bytes of data written.

View File

@ -141,10 +141,10 @@ StackFilter::getTop(LIns* guard)
}
#ifdef DEBUG
void ValidateWriter::checkAccSet(LOpcode op, LIns* base, AccSet accSet)
void ValidateWriter::checkAccSet(LOpcode op, LIns* base, int32_t disp, AccSet accSet)
{
LIns* sp = checkAccSetIns1;
LIns* rp = checkAccSetIns2;
LIns* sp = (LIns*)checkAccSetExtras[0];
LIns* rp = (LIns*)checkAccSetExtras[1];
bool isRstack = base == rp;
bool isStack =
@ -2361,6 +2361,16 @@ TraceRecorder::TraceRecorder(JSContext* cx, VMSideExit* anchor, VMFragment* frag
fragment->loopLabel = entryLabel;
})
#ifdef DEBUG
// Need to set these up before any loads/stores occur.
// 'extras' is heap-allocated because its lifetime matches validate[12]'s.
void** extras = new (tempAlloc()) void*[2];
extras[0] = 0; // we'll set it shortly
extras[1] = 0; // we'll set it shortly
validate1->setCheckAccSetExtras(extras);
validate2->setCheckAccSetExtras(extras);
#endif
lirbuf->sp =
addName(lir->insLoad(LIR_ldp, lirbuf->state, offsetof(TracerState, sp), ACCSET_OTHER), "sp");
lirbuf->rp =
@ -2373,11 +2383,9 @@ TraceRecorder::TraceRecorder(JSContext* cx, VMSideExit* anchor, VMFragment* frag
addName(lir->insLoad(LIR_ldp, lirbuf->state, offsetof(TracerState, eor), ACCSET_OTHER), "eor");
#ifdef DEBUG
// Need to set these up before any stack/rstack loads/stores occur.
validate1->setCheckAccSetIns1(lirbuf->sp);
validate2->setCheckAccSetIns1(lirbuf->sp);
validate1->setCheckAccSetIns2(lirbuf->rp);
validate2->setCheckAccSetIns2(lirbuf->rp);
// Need to update these before any stack/rstack loads/stores occur.
extras[0] = lirbuf->sp;
extras[1] = lirbuf->rp;
#endif
/* If we came from exit, we might not have enough global types. */
@ -8573,20 +8581,6 @@ TraceRecorder::d2i(LIns* f, bool resultCanBeImpreciseIfFractional)
LIns* args[] = { fcallarg(f, 1), fcallarg(f, 0) };
return lir->insCall(&js_StringToInt32_ci, args);
}
if (ci == &js_String_p_charCodeAt0_ci) {
// Use a fast path builtin for a charCodeAt that converts to an int right away.
LIns* args[] = { fcallarg(f, 0) };
return lir->insCall(&js_String_p_charCodeAt0_int_ci, args);
}
if (ci == &js_String_p_charCodeAt_ci) {
LIns* idx = fcallarg(f, 1);
if (isPromote(idx)) {
LIns* args[] = { demote(lir, idx), fcallarg(f, 0) };
return lir->insCall(&js_String_p_charCodeAt_int_int_ci, args);
}
LIns* args[] = { idx, fcallarg(f, 0) };
return lir->insCall(&js_String_p_charCodeAt_double_int_ci, args);
}
}
return resultCanBeImpreciseIfFractional
? lir->ins1(LIR_d2i, f)
@ -8701,9 +8695,7 @@ TraceRecorder::ifop()
lir->insEqI_0(lir->ins2(LIR_eqd, v_ins, lir->insImmD(0))));
} else if (v.isString()) {
cond = v.toString()->length() != 0;
x = lir->ins2ImmI(LIR_rshup, lir->insLoad(LIR_ldp, v_ins,
offsetof(JSString, mLengthAndFlags), ACCSET_OTHER),
JSString::FLAGS_LENGTH_SHIFT);
x = getStringLength(v_ins);
} else {
JS_NOT_REACHED("ifop");
return ARECORD_STOP;
@ -9024,9 +9016,20 @@ TraceRecorder::equalityHelper(Value& l, Value& r, LIns* l_ins, LIns* r_ins,
JS_ASSERT(r.isBoolean());
cond = (l == r);
} else if (l.isString()) {
args[0] = r_ins, args[1] = l_ins;
l_ins = lir->insCall(&js_EqualStrings_ci, args);
r_ins = lir->insImmI(1);
JSString *l_str = l.toString();
JSString *r_str = r.toString();
if (!l_str->isRope() && !r_str->isRope() && l_str->length() == 1 && r_str->length() == 1) {
VMSideExit *exit = snapshot(BRANCH_EXIT);
LIns *c = INS_CONSTWORD(1);
guard(true, lir->ins2(LIR_eqp, getStringLength(l_ins), c), exit);
guard(true, lir->ins2(LIR_eqp, getStringLength(r_ins), c), exit);
l_ins = lir->insLoad(LIR_ldus2ui, getStringChars(l_ins), 0, ACCSET_OTHER, LOAD_CONST);
r_ins = lir->insLoad(LIR_ldus2ui, getStringChars(r_ins), 0, ACCSET_OTHER, LOAD_CONST);
} else {
args[0] = r_ins, args[1] = l_ins;
l_ins = lir->insCall(&js_EqualStrings_ci, args);
r_ins = lir->insImmI(1);
}
cond = !!js_EqualStrings(l.toString(), r.toString());
} else {
JS_ASSERT(l.isNumber() && r.isNumber());
@ -9457,7 +9460,12 @@ TraceRecorder::test_property_cache(JSObject* obj, LIns* obj_ins, JSObject*& obj2
JS_PROPERTY_CACHE(cx).test(cx, pc, aobj, obj2, entry, atom);
if (atom) {
// Miss: pre-fill the cache for the interpreter, as well as for our needs.
// FIXME: bug 458271.
jsid id = ATOM_TO_JSID(atom);
// The lookup below may change object shapes.
forgetGuardedShapes();
JSProperty* prop;
if (JOF_OPMODE(*pc) == JOF_NAME) {
JS_ASSERT(aobj == obj);
@ -10873,9 +10881,7 @@ TraceRecorder::record_JSOP_NOT()
return ARECORD_CONTINUE;
}
JS_ASSERT(v.isString());
set(&v, lir->insEqP_0(lir->ins2ImmI(LIR_rshup, lir->insLoad(LIR_ldp, get(&v),
offsetof(JSString, mLengthAndFlags), ACCSET_OTHER),
JSString::FLAGS_LENGTH_SHIFT)));
set(&v, lir->insEqP_0(getStringLength(get(&v))));
return ARECORD_CONTINUE;
}
@ -11359,13 +11365,33 @@ TraceRecorder::callNative(uintN argc, JSOp mode)
switch (argc) {
case 1:
if (vp[2].isNumber() &&
(native == js_math_ceil || native == js_math_floor || native == js_math_round)) {
LIns* a = get(&vp[2]);
if (isPromote(a)) {
set(&vp[0], a);
pendingSpecializedNative = IGNORE_NATIVE_CALL_COMPLETE_CALLBACK;
return RECORD_CONTINUE;
if (vp[2].isNumber()) {
if (native == js_math_ceil || native == js_math_floor || native == js_math_round) {
LIns* a = get(&vp[2]);
if (isPromote(a)) {
set(&vp[0], a);
pendingSpecializedNative = IGNORE_NATIVE_CALL_COMPLETE_CALLBACK;
return RECORD_CONTINUE;
}
}
if (vp[1].isString()) {
JSString *str = vp[1].toString();
if (native == (FastNative)js_str_charAt) {
LIns* str_ins = get(&vp[1]);
LIns* idx_ins = get(&vp[2]);
set(&vp[0], getCharAt(str, str_ins, idx_ins));
pendingSpecializedNative = IGNORE_NATIVE_CALL_COMPLETE_CALLBACK;
return RECORD_CONTINUE;
} else if (native == (FastNative)js_str_charCodeAt) {
jsdouble i = vp[2].toNumber();
if (i < 0 || i >= str->length())
RETURN_STOP("charCodeAt out of bounds");
LIns* str_ins = get(&vp[1]);
LIns* idx_ins = get(&vp[2]);
set(&vp[0], getCharCodeAt(str, str_ins, idx_ins));
pendingSpecializedNative = IGNORE_NATIVE_CALL_COMPLETE_CALLBACK;
return RECORD_CONTINUE;
}
}
}
break;
@ -12471,6 +12497,85 @@ TraceRecorder::getPropertyWithScriptGetter(JSObject *obj, LIns* obj_ins, JSScope
}
}
JS_REQUIRES_STACK LIns*
TraceRecorder::getStringLength(LIns* str_ins)
{
return addName(lir->ins2ImmI(LIR_rshup,
addName(lir->insLoad(LIR_ldp, str_ins,
offsetof(JSString, mLengthAndFlags),
ACCSET_OTHER, LOAD_CONST), "mLengthAndFlags"),
JSString::FLAGS_LENGTH_SHIFT), "length");
}
JS_REQUIRES_STACK LIns*
TraceRecorder::getStringChars(LIns* str_ins)
{
return addName(lir->insLoad(LIR_ldp, str_ins,
offsetof(JSString, mChars),
ACCSET_OTHER, LOAD_CONST), "chars");
}
JS_REQUIRES_STACK LIns*
TraceRecorder::getCharCodeAt(JSString *str, LIns* str_ins, LIns* idx_ins)
{
idx_ins = lir->insUI2P(makeNumberInt32(idx_ins));
LIns *length_ins = lir->insLoad(LIR_ldp, str_ins, offsetof(JSString, mLengthAndFlags),
ACCSET_OTHER, LOAD_CONST);
LIns *br = lir->insBranch(LIR_jt,
lir->insEqP_0(lir->ins2(LIR_andp,
length_ins,
INS_CONSTWORD(JSString::ROPE_BIT))),
NULL);
lir->insCall(&js_Flatten_ci, &str_ins);
br->setTarget(lir->ins0(LIR_label));
guard(true,
lir->ins2(LIR_ltup, idx_ins, lir->ins2ImmI(LIR_rshup, length_ins, JSString::FLAGS_LENGTH_SHIFT)),
snapshot(MISMATCH_EXIT));
LIns *chars_ins = getStringChars(str_ins);
return i2d(lir->insLoad(LIR_ldus2ui,
lir->ins2(LIR_addp, chars_ins, lir->ins2ImmI(LIR_lshp, idx_ins, 1)), 0,
ACCSET_OTHER, LOAD_CONST));
}
JS_STATIC_ASSERT(sizeof(JSString) == 16 || sizeof(JSString) == 32);
JS_REQUIRES_STACK LIns*
TraceRecorder::getCharAt(JSString *str, LIns* str_ins, LIns* idx_ins)
{
idx_ins = lir->insUI2P(makeNumberInt32(idx_ins));
LIns *length_ins = lir->insLoad(LIR_ldp, str_ins, offsetof(JSString, mLengthAndFlags),
ACCSET_OTHER, LOAD_CONST);
LIns *br = lir->insBranch(LIR_jt,
lir->insEqP_0(lir->ins2(LIR_andp,
length_ins,
INS_CONSTWORD(JSString::ROPE_BIT))),
NULL);
lir->insCall(&js_Flatten_ci, &str_ins);
br->setTarget(lir->ins0(LIR_label));
LIns *phi_ins = lir->insAlloc(sizeof(JSString *));
lir->insStore(LIR_stp, INS_CONSTSTR(cx->runtime->emptyString), phi_ins, 0, ACCSET_OTHER);
br = lir->insBranch(LIR_jf,
lir->ins2(LIR_ltup, idx_ins, lir->ins2ImmI(LIR_rshup, length_ins, JSString::FLAGS_LENGTH_SHIFT)),
NULL);
LIns *chars_ins = getStringChars(str_ins);
LIns *ch_ins = lir->insLoad(LIR_ldus2ui,
lir->ins2(LIR_addp, chars_ins, lir->ins2ImmI(LIR_lshp, idx_ins, 1)), 0,
ACCSET_OTHER, LOAD_CONST);
guard(true, lir->ins2ImmI(LIR_ltui, ch_ins, UNIT_STRING_LIMIT), snapshot(MISMATCH_EXIT));
LIns *unitstr_ins = lir->ins2(LIR_addp,
INS_CONSTPTR(JSString::unitStringTable),
lir->ins2ImmI(LIR_lshp,
lir->insUI2P(ch_ins),
(sizeof(JSString) == 16) ? 4 : 5));
lir->insStore(LIR_stp, unitstr_ins, phi_ins, 0, ACCSET_OTHER);
br->setTarget(lir->ins0(LIR_label));
return lir->insLoad(LIR_ldp, phi_ins, 0, ACCSET_OTHER);
}
// Typed array tracing depends on EXPANDED_LOADSTORE and F2I
#if NJ_EXPANDED_LOADSTORE_SUPPORTED && NJ_F2I_SUPPORTED
static bool OkToTraceTypedArrays = true;
@ -12496,11 +12601,7 @@ TraceRecorder::record_JSOP_GETELEM()
int i = asInt32(idx);
if (size_t(i) >= lval.toString()->length())
RETURN_STOP_A("Invalid string index in JSOP_GETELEM");
idx_ins = makeNumberInt32(idx_ins);
LIns* args[] = { idx_ins, obj_ins, cx_ins };
LIns* unitstr_ins = lir->insCall(&js_String_getelem_ci, args);
guard(false, lir->insEqP_0(unitstr_ins), MISMATCH_EXIT);
set(&lval, unitstr_ins);
set(&lval, getCharAt(lval.toString(), obj_ins, idx_ins));
return ARECORD_CONTINUE;
}
@ -12539,14 +12640,15 @@ TraceRecorder::record_JSOP_GETELEM()
if (int_idx < 0 || int_idx >= afp->argc)
RETURN_STOP_A("cannot trace arguments with out of range index");
guard(true,
VMSideExit *exit = snapshot(MISMATCH_EXIT);
guard(true,
addName(lir->ins2(LIR_gei, idx_ins, INS_CONST(0)),
"guard(upvar index >= 0)"),
MISMATCH_EXIT);
exit);
guard(true,
addName(lir->ins2(LIR_lti, idx_ins, INS_CONST(afp->argc)),
"guard(upvar index in range)"),
MISMATCH_EXIT);
exit);
JSValueType type = getCoercedType(*vp);
@ -15788,10 +15890,7 @@ TraceRecorder::record_JSOP_LENGTH()
if (l.isPrimitive()) {
if (!l.isString())
RETURN_STOP_A("non-string primitive JSOP_LENGTH unsupported");
set(&l, lir->ins1(LIR_i2d,
p2i(lir->ins2ImmI(LIR_rshup, lir->insLoad(LIR_ldp, get(&l),
offsetof(JSString, mLengthAndFlags), ACCSET_OTHER),
JSString::FLAGS_LENGTH_SHIFT))));
set(&l, lir->ins1(LIR_i2d, p2i(getStringLength(get(&l)))));
return ARECORD_CONTINUE;
}

View File

@ -1291,6 +1291,13 @@ class TraceRecorder
nanojit::LIns* obj_ins,
JSScopeProperty* sprop);
JS_REQUIRES_STACK nanojit::LIns* getStringLength(nanojit::LIns* str_ins);
JS_REQUIRES_STACK nanojit::LIns* getStringChars(nanojit::LIns* str_ins);
JS_REQUIRES_STACK nanojit::LIns* getCharCodeAt(JSString *str,
nanojit::LIns* str_ins, nanojit::LIns* idx_ins);
JS_REQUIRES_STACK nanojit::LIns* getCharAt(JSString *str,
nanojit::LIns* str_ins, nanojit::LIns* idx_ins);
JS_REQUIRES_STACK RecordingStatus nativeSet(JSObject* obj, nanojit::LIns* obj_ins,
JSScopeProperty* sprop,
const Value &v, nanojit::LIns* v_ins);

View File

@ -140,10 +140,11 @@ nanojit::LInsPrinter::accNames[] = {
#endif
#ifdef DEBUG
void ValidateWriter::checkAccSet(LOpcode op, LIns* base, AccSet accSet)
void ValidateWriter::checkAccSet(LOpcode op, LIns* base, int32_t disp, AccSet accSet)
{
(void)op;
(void)base;
(void)disp;
NanoAssert(accSet == ACCSET_OTHER);
}
#endif

View File

@ -1 +1 @@
186f3f376d662375ff9182cf0b470468335ef442
982cd218ddb049bdbbcdda4fa3a9d7e40e45e0be

View File

@ -2035,13 +2035,17 @@ namespace nanojit
}
void CseFilter::clearNL(NLKind nlkind) {
VMPI_memset(m_listNL[nlkind], 0, sizeof(LIns*)*m_capNL[nlkind]);
m_usedNL[nlkind] = 0;
if (m_usedNL[nlkind] > 0) {
VMPI_memset(m_listNL[nlkind], 0, sizeof(LIns*)*m_capNL[nlkind]);
m_usedNL[nlkind] = 0;
}
}
void CseFilter::clearL(CseAcc a) {
VMPI_memset(m_listL[a], 0, sizeof(LIns*)*m_capL[a]);
m_usedL[a] = 0;
if (m_usedL[a] > 0) {
VMPI_memset(m_listL[a], 0, sizeof(LIns*)*m_capL[a]);
m_usedL[a] = 0;
}
}
void CseFilter::clearAll() {
@ -2478,9 +2482,12 @@ namespace nanojit
// Clear all normal (excludes CONST and MULTIPLE) loads
// aliased by stores and calls since the last time we were in
// this function.
for (CseAcc a = 0; a < EMB_NUM_USED_ACCS; a++)
if (storesSinceLastLoad & (1 << a))
clearL(a);
AccSet a = storesSinceLastLoad & ((1 << EMB_NUM_USED_ACCS) - 1);
while (a) {
int acc = msbSet(a);
clearL((CseAcc)acc);
a &= ~(1 << acc);
}
// No need to clear CONST loads (those in the CSE_ACC_CONST table).
@ -2877,13 +2884,13 @@ namespace nanojit
ValidateWriter::ValidateWriter(LirWriter *out, LInsPrinter* printer, const char* where)
: LirWriter(out), printer(printer), whereInPipeline(where),
checkAccSetIns1(0), checkAccSetIns2(0)
checkAccSetExtras(0)
{}
LIns* ValidateWriter::insLoad(LOpcode op, LIns* base, int32_t d, AccSet accSet,
LoadQual loadQual)
{
checkAccSet(op, base, accSet);
checkAccSet(op, base, d, accSet);
switch (loadQual) {
case LOAD_CONST:
@ -2921,7 +2928,7 @@ namespace nanojit
LIns* ValidateWriter::insStore(LOpcode op, LIns* value, LIns* base, int32_t d, AccSet accSet)
{
checkAccSet(op, base, accSet);
checkAccSet(op, base, d, accSet);
int nArgs = 2;
LTy formals[2] = { LTy_V, LTy_P }; // LTy_V is overwritten shortly

View File

@ -262,6 +262,11 @@ namespace nanojit
static const AccSet ACCSET_LOAD_ANY = ACCSET_ALL; // synonym
static const AccSet ACCSET_STORE_ANY = ACCSET_ALL; // synonym
inline bool isSingletonAccSet(AccSet accSet) {
// This is a neat way of testing if a value has only one bit set.
return (accSet & (accSet - 1)) == 0;
}
// Full AccSets don't fit into load and store instructions. But
// load/store AccSets almost always contain a single access region. We
// take advantage of this to create a compressed AccSet, MiniAccSet, that
@ -284,23 +289,35 @@ namespace nanojit
struct MiniAccSet { MiniAccSetVal val; };
static const MiniAccSet MINI_ACCSET_MULTIPLE = { 99 };
#if defined(_WIN32) && (_MSC_VER >= 1300) && (defined(_M_IX86) || defined(_M_AMD64) || defined(_M_X64))
extern "C" unsigned char _BitScanReverse(unsigned long * Index, unsigned long Mask);
# pragma intrinsic(_BitScanReverse)
// Returns the index of the most significant bit that is set.
static int msbSet(uint32_t x) {
unsigned long idx;
_BitScanReverse(&idx, (unsigned long)(x | 1)); // the '| 1' ensures a 0 result when x==0
return idx;
}
#elif (__GNUC__ >= 4) || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)
static int msbSet(uint32_t x) {
return 31 - __builtin_clz(x | 1);
}
#else
static int msbSet(uint32_t x) { // slow fallback version
for (int i = 31; i >= 0; i--)
if ((1 << i) & x)
return i;
return 0;
}
#endif
static MiniAccSet compressAccSet(AccSet accSet) {
// As the number of regions increase, this may become a bottleneck.
// If it does we can first count the number of bits using Kernighan's
// technique
// (http://graphics.stanford.edu/~seander/bithacks.html#CountBitsSetKernighan)
// and if it's a single-region set, use a bit-scanning instruction to
// work out which single-region set it is. That would require
// factoring out the bit-scanning code currently in
// nRegisterAllocFromSet().
//
// Try all the single-region AccSets first.
for (int i = 0; i < NUM_ACCS; i++) {
if (accSet == (1U << i)) {
MiniAccSet ret = { uint8_t(i) };
return ret;
}
if (isSingletonAccSet(accSet)) {
MiniAccSet ret = { uint8_t(msbSet(accSet)) };
return ret;
}
// If we got here, it must be a multi-region AccSet.
return MINI_ACCSET_MULTIPLE;
}
@ -2234,15 +2251,14 @@ namespace nanojit
void checkLInsHasOpcode(LOpcode op, int argN, LIns* ins, LOpcode op2);
void checkLInsIsACondOrConst(LOpcode op, int argN, LIns* ins);
void checkLInsIsNull(LOpcode op, int argN, LIns* ins);
void checkAccSet(LOpcode op, LIns* base, AccSet accSet); // defined by the embedder
void checkAccSet(LOpcode op, LIns* base, int32_t disp, AccSet accSet); // defined by the embedder
// These can be set by the embedder and used in checkAccSet().
LIns *checkAccSetIns1, *checkAccSetIns2;
void** checkAccSetExtras;
public:
ValidateWriter(LirWriter* out, LInsPrinter* printer, const char* where);
void setCheckAccSetIns1(LIns* ins) { checkAccSetIns1 = ins; }
void setCheckAccSetIns2(LIns* ins) { checkAccSetIns2 = ins; }
void setCheckAccSetExtras(void** extras) { checkAccSetExtras = extras; }
LIns* insLoad(LOpcode op, LIns* base, int32_t d, AccSet accSet, LoadQual loadQual);
LIns* insStore(LOpcode op, LIns* value, LIns* base, int32_t d, AccSet accSet);

View File

@ -1065,6 +1065,14 @@ PutStr(JSContext *cx, uintN argc, jsval *vp)
return JS_TRUE;
}
static JSBool
Now(JSContext *cx, uintN argc, jsval *vp)
{
jsdouble now = PRMJ_Now() / double(PRMJ_USEC_PER_MSEC);
JS_SET_RVAL(cx, vp, DOUBLE_TO_JSVAL(now));
return true;
}
static JSBool
Print(JSContext *cx, uintN argc, jsval *vp)
{
@ -2210,6 +2218,18 @@ DumpHeap(JSContext *cx, uintN argc, jsval *vp)
return JS_FALSE;
}
JSBool
DumpObject(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
{
JSObject *arg0 = NULL;
if (!JS_ConvertArguments(cx, argc, argv, "o", &arg0))
return JS_FALSE;
js_DumpObject(arg0);
return JS_TRUE;
}
#endif /* DEBUG */
#ifdef TEST_CVTARGS
@ -3920,6 +3940,7 @@ static JSFunctionSpec shell_functions[] = {
JS_FN("readline", ReadLine, 0,0),
JS_FN("print", Print, 0,0),
JS_FN("putstr", PutStr, 0,0),
JS_FN("now", Now, 0,0),
JS_FS("help", Help, 0,0,0),
JS_FS("quit", Quit, 0,0,0),
JS_FN("assertEq", AssertEq, 2,0),
@ -3946,6 +3967,7 @@ static JSFunctionSpec shell_functions[] = {
JS_FS("disfile", DisassFile, 1,0,0),
JS_FS("dissrc", DisassWithSrc, 1,0,0),
JS_FN("dumpHeap", DumpHeap, 0,0),
JS_FS("dumpObject", DumpObject, 1,0,0),
JS_FS("notes", Notes, 1,0,0),
JS_FS("tracing", Tracing, 0,0,0),
JS_FS("stats", DumpStats, 1,0,0),
@ -4013,6 +4035,7 @@ static const char *const shell_help_messages[] = {
"readline() Read a single line from stdin",
"print([exp ...]) Evaluate and print expressions",
"putstr([exp]) Evaluate and print expression without newline",
"now() Return the current time with sub-ms precision",
"help([name ...]) Display usage and help messages",
"quit() Quit the shell",
"assertEq(actual, expected[, msg])\n"
@ -4049,6 +4072,7 @@ static const char *const shell_help_messages[] = {
"dissrc([fun]) Disassemble functions with source lines",
"dumpHeap([fileName[, start[, toFind[, maxDepth[, toIgnore]]]]])\n"
" Interface to JS_DumpHeap with output sent to file",
"dumpObject() Dump an internal representation of an object",
"notes([fun]) Show source notes for functions",
"tracing([true|false|filename]) Turn bytecode execution tracing on/off.\n"
" With filename, send to file.\n",

View File

@ -52,9 +52,14 @@ function test()
printBugNumber(BUGNUMBER);
printStatus (summary);
var doc;
if (typeof document == 'undefined')
{
document = {};
doc = {};
}
else
{
doc = document;
}
if (typeof alert == 'undefined')
@ -63,16 +68,16 @@ function test()
}
// Crash:
document.watch("title", function(a,b,c,d) {
doc.watch("title", function(a,b,c,d) {
return { toString : function() { alert(1); } };
});
document.title = "xxx";
doc.title = "xxx";
// No crash:
document.watch("title", function() {
doc.watch("title", function() {
return { toString : function() { alert(1); } };
});
document.title = "xxx";
doc.title = "xxx";
reportCompare(expect, actual, summary);

File diff suppressed because it is too large Load Diff

View File

@ -1,13 +1,12 @@
To run narcissus with jstests.py, change to the js/src/tests/ directory and run
the following command (which excludes tests that are particularly slow):
python jstests.py -d -j 4 $OBJDIR/njs -m narcissus.list -x slow-narcissus.txt
python jstests.py -d -j 4 $OBJDIR/njs -x slow-narcissus.txt
The js/src/tests/narcissus directory can be used for any tweaks that might be needed
to make Narcissus work properly. Currently, Narcissus is failing a number of
tests. narcissus-failures.txt can be used to ignore those tests. Note that
narcissus-failures.txt also includes all of the tests from slow-narcissus.txt.
Currently, Narcissus is failing a number of tests. narcissus-failures.txt can
be used to ignore those tests. Note that narcissus-failures.txt also includes
all of the tests from slow-narcissus.txt.
python jstests.py -d -j 4 $OBJDIR/njs -m narcissus.list -x narcissus-failures.txt
python jstests.py -d -j 4 $OBJDIR/njs -x narcissus-failures.txt

View File

@ -1 +0,0 @@
include ../jstests.list

View File

@ -1,4 +0,0 @@
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/**
* Hacks to work around Narcissus-specific problems
*/

View File

@ -0,0 +1,10 @@
// Any copyright is dedicated to the Public Domain.
// http://creativecommons.org/licenses/publicdomain/
// Contributor: Luke Wagner <lw@mozilla.com>
var x, f;
for (var i = 0; i < 100; i++) {
f = function() {};
f.foo;
x = f.length;
}

View File

@ -412,6 +412,8 @@ WrapObject(JSContext *cx, JSObject *parent, jsval *vp, XPCWrappedNative* wn)
return JS_TRUE;
}
CheckWindow(wn);
// The parent must be the inner global object for its scope.
parent = JS_GetGlobalForObject(cx, parent);
OBJ_TO_INNER_OBJECT(cx, parent);

View File

@ -1069,6 +1069,8 @@ JSObject *
XPCNativeWrapper::GetNewOrUsed(JSContext *cx, XPCWrappedNative *wrapper,
JSObject *scope, nsIPrincipal *aObjectPrincipal)
{
CheckWindow(wrapper);
if (aObjectPrincipal) {
nsIScriptSecurityManager *ssm = GetSecurityManager();

View File

@ -324,6 +324,12 @@ WrapObject(JSContext *cx, JSObject *scope, jsval v, jsval *vp)
return ThrowException(NS_ERROR_FAILURE, cx);
}
XPCWrappedNative *wn =
XPCWrappedNative::GetWrappedNativeOfJSObject(cx, objToWrap);
if (wn) {
CheckWindow(wn);
}
JSObject *wrapperObj =
JS_NewObjectWithGivenProto(cx, js::Jsvalify(&SJOWClass), nsnull, scope);

View File

@ -42,6 +42,7 @@
#include "XPCWrapper.h"
#include "XPCNativeWrapper.h"
#include "nsPIDOMWindow.h"
namespace XPCWrapper {
@ -189,6 +190,35 @@ static js::Class IteratorClass = {
}
};
void
CheckWindow(XPCWrappedNative *wn)
{
JSClass *clasp = wn->GetFlatJSObject()->getJSClass();
// Censor objects that can't be windows.
switch (clasp->name[0]) {
case 'C': // ChromeWindow?
if (clasp->name[1] != 'h') {
return;
}
break;
case 'M': // ModalContentWindow
break;
case 'W': // Window
break;
default:
return;
}
nsCOMPtr<nsPIDOMWindow> pwin(do_QueryWrappedNative(wn));
if (!pwin || pwin->IsInnerWindow()) {
return;
}
pwin->EnsureInnerWindow();
}
JSBool
RewrapObject(JSContext *cx, JSObject *scope, JSObject *obj, WrapperType hint,
jsval *vp)

View File

@ -444,6 +444,13 @@ WrapFunction(JSContext *cx, JSObject *wrapperObj, JSObject *funobj, jsval *v,
: XPCCrossOriginWrapper::WrapFunction(cx, wrapperObj, funobj, v);
}
/**
* Given a JSObject that might represent a Window object, ensures that the
* window object has an inner window.
*/
void
CheckWindow(XPCWrappedNative *wn);
/**
* Given a potentially-wrapped object, creates a wrapper for it.
*/

View File

@ -146,14 +146,6 @@ XPCCallContext::Init(XPCContext::LangType callerLanguage,
return;
}
// Get into the request as early as we can to avoid problems with scanning
// callcontexts on other threads from within the gc callbacks.
NS_ASSERTION(!callBeginRequest || mCallerLanguage == NATIVE_CALLER,
"Don't call JS_BeginRequest unless the caller is native.");
if(callBeginRequest)
JS_BeginRequest(mJSContext);
if(topJSContext != mJSContext)
{
if(NS_FAILED(stack->Push(mJSContext)))
@ -164,6 +156,14 @@ XPCCallContext::Init(XPCContext::LangType callerLanguage,
mContextPopRequired = JS_TRUE;
}
// Get into the request as early as we can to avoid problems with scanning
// callcontexts on other threads from within the gc callbacks.
NS_ASSERTION(!callBeginRequest || mCallerLanguage == NATIVE_CALLER,
"Don't call JS_BeginRequest unless the caller is native.");
if(callBeginRequest)
JS_BeginRequest(mJSContext);
mXPCContext = XPCContext::GetXPCContext(mJSContext);
mPrevCallerLanguage = mXPCContext->SetCallingLangType(mCallerLanguage);
@ -386,6 +386,10 @@ XPCCallContext::~XPCCallContext()
shouldReleaseXPC = mPrevCallContext == nsnull;
}
// NB: Needs to happen before the context stack pop.
if(mJSContext && mCallerLanguage == NATIVE_CALLER)
JS_EndRequest(mJSContext);
if(mContextPopRequired)
{
XPCJSContextStack* stack = mThreadData->GetJSContextStack();
@ -404,9 +408,6 @@ XPCCallContext::~XPCCallContext()
if(mJSContext)
{
if(mCallerLanguage == NATIVE_CALLER)
JS_EndRequest(mJSContext);
if(mDestroyJSContextInDestructor)
{
#ifdef DEBUG_xpc_hacker

View File

@ -113,7 +113,10 @@ Module::Call(nsIXPConnectWrappedNative* wrapper,
jsval* vp,
PRBool* _retval)
{
JSObject* global = JS_GetGlobalObject(cx);
JSObject* global = JS_GetGlobalForScopeChain(cx);
if (!global)
return NS_ERROR_NOT_AVAILABLE;
*_retval = InitAndSealCTypesClass(cx, global);
return NS_OK;
}

View File

@ -75,39 +75,39 @@ test_void_t_cdecl()
return;
}
#define DEFINE_TYPE(name, type, ffiType) \
#define FUNCTION_TESTS(name, type, ffiType, suffix) \
type ABI \
get_##name##_cdecl() \
get_##name##_##suffix() \
{ \
return ValueTraits<type>::literal(); \
} \
\
type ABI \
set_##name##_cdecl(type x) \
set_##name##_##suffix(type x) \
{ \
return x; \
} \
\
type ABI \
sum_##name##_cdecl(type x, type y) \
sum_##name##_##suffix(type x, type y) \
{ \
return ValueTraits<type>::sum(x, y); \
} \
\
type ABI \
sum_alignb_##name##_cdecl(char a, type x, char b, type y, char c) \
sum_alignb_##name##_##suffix(char a, type x, char b, type y, char c) \
{ \
return ValueTraits<type>::sum(x, y); \
} \
\
type ABI \
sum_alignf_##name##_cdecl(float a, type x, float b, type y, float c) \
sum_alignf_##name##_##suffix(float a, type x, float b, type y, float c) \
{ \
return ValueTraits<type>::sum(x, y); \
} \
\
type ABI \
sum_many_##name##_cdecl( \
sum_many_##name##_##suffix( \
type a, type b, type c, type d, type e, type f, type g, type h, type i, \
type j, type k, type l, type m, type n, type o, type p, type q, type r) \
{ \
@ -116,6 +116,7 @@ sum_many_##name##_cdecl( \
}
#define ABI /* cdecl */
#define DEFINE_TYPE(x, y, z) FUNCTION_TESTS(x, y, z, cdecl)
#include "typedefs.h"
#undef ABI
@ -129,6 +130,7 @@ test_void_t_stdcall()
}
#define ABI NS_STDCALL
#define DEFINE_TYPE(x, y, z) FUNCTION_TESTS(x, y, z, stdcall)
#include "typedefs.h"
#undef ABI

View File

@ -653,11 +653,18 @@ function run_UInt64_tests() {
function run_basic_abi_tests(library, t, name, toprimitive,
get_test, set_tests, sum_tests, sum_many_tests) {
// Test the function call ABI for calls involving the type.
run_single_abi_tests(library, ctypes.default_abi, t, name + "_cdecl",
function declare_fn_cdecl(fn_t, prefix) {
return library.declare(prefix + name + "_cdecl", fn_t);
}
run_single_abi_tests(declare_fn_cdecl, ctypes.default_abi, t,
toprimitive, get_test, set_tests, sum_tests, sum_many_tests);
#ifdef _WIN32
#ifndef _WIN64
run_single_abi_tests(library, ctypes.stdcall_abi, t, name + "_stdcall",
#ifdef WIN32
#ifndef HAVE_64BIT_OS
function declare_fn_stdcall(fn_t, prefix) {
return library.declare(prefix + name + "_stdcall", fn_t);
}
run_single_abi_tests(declare_fn_stdcall, ctypes.stdcall_abi, t,
toprimitive, get_test, set_tests, sum_tests, sum_many_tests);
#endif
#endif
@ -667,23 +674,28 @@ function run_basic_abi_tests(library, t, name, toprimitive,
check_struct_stats(library, t);
}
function run_single_abi_tests(library, abi, t, name, toprimitive,
function run_single_abi_tests(decl, abi, t, toprimitive,
get_test, set_tests, sum_tests, sum_many_tests) {
let getter = library.declare("get_" + name, abi, t);
let getter_t = ctypes.FunctionType(abi, t).ptr;
let getter = decl(getter_t, "get_");
do_check_eq(toprimitive(getter()), get_test);
let setter = library.declare("set_" + name, ctypes.default_abi, t, t);
let setter_t = ctypes.FunctionType(abi, t, [t]).ptr;
let setter = decl(setter_t, "set_");
for each (let i in set_tests)
do_check_eq(toprimitive(setter(i)), i);
let sum = library.declare("sum_" + name, ctypes.default_abi, t, t, t);
let sum_t = ctypes.FunctionType(abi, t, [t, t]).ptr;
let sum = decl(sum_t, "sum_");
for each (let a in sum_tests)
do_check_eq(toprimitive(sum(a[0], a[1])), a[2]);
let sum_alignb = library.declare("sum_alignb_" + name, ctypes.default_abi, t,
ctypes.char, t, ctypes.char, t, ctypes.char);
let sum_alignf = library.declare("sum_alignf_" + name, ctypes.default_abi, t,
ctypes.float, t, ctypes.float, t, ctypes.float);
let sum_alignb_t = ctypes.FunctionType(abi, t,
[ctypes.char, t, ctypes.char, t, ctypes.char]).ptr;
let sum_alignb = decl(sum_alignb_t, "sum_alignb_");
let sum_alignf_t = ctypes.FunctionType(abi, t,
[ctypes.float, t, ctypes.float, t, ctypes.float]).ptr;
let sum_alignf = decl(sum_alignf_t, "sum_alignf_");
for each (let a in sum_tests) {
do_check_eq(toprimitive(sum_alignb(0, a[0], 0, a[1], 0)), a[2]);
do_check_eq(toprimitive(sum_alignb(1, a[0], 1, a[1], 1)), a[2]);
@ -691,13 +703,14 @@ function run_single_abi_tests(library, abi, t, name, toprimitive,
do_check_eq(toprimitive(sum_alignf(1, a[0], 1, a[1], 1)), a[2]);
}
let sum_many = library.declare("sum_many_" + name, ctypes.default_abi, t,
t, t, t, t, t, t, t, t, t, t, t, t, t, t, t, t, t, t);
let sum_many_t = ctypes.FunctionType(abi, t,
[t, t, t, t, t, t, t, t, t, t, t, t, t, t, t, t, t, t]).ptr;
let sum_many = decl(sum_many_t, "sum_many_");
for each (let a in sum_many_tests)
do_check_eq(toprimitive(
sum_many(a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7],
a[8], a[9], a[10], a[11], a[12], a[13], a[14], a[15],
a[16], a[17])), a[18]);
do_check_eq(
toprimitive(sum_many(a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7],
a[8], a[9], a[10], a[11], a[12], a[13], a[14], a[15],
a[16], a[17])), a[18]);
}
function check_struct_stats(library, t) {
@ -1824,11 +1837,11 @@ function run_FunctionType_tests() {
ctypes.char.ptr.array().ptr).ptr.ptr.array(8).array();
do_check_eq(f3_t.name, "char*(*(**[][8])())[]");
#ifdef _WIN32
#ifndef _WIN64
#ifdef WIN32
#ifndef HAVE_64BIT_OS
f3_t = ctypes.FunctionType(ctypes.stdcall_abi,
ctypes.char.ptr.array().ptr).ptr.array(8).array();
do_check_eq(f3_t.ptr.name, "char*(__stdcall *(**[][8])())[]");
ctypes.char.ptr.array().ptr).ptr.ptr.array(8).array();
do_check_eq(f3_t.name, "char*(*(__stdcall **[][8])())[]");
#endif
#endif
@ -2016,8 +2029,8 @@ function run_void_tests(library) {
library.declare("test_void_t_cdecl", ctypes.default_abi, ctypes.void_t, ctypes.void_t);
}, Error);
#ifdef _WIN32
#ifndef _WIN64
#ifdef WIN32
#ifndef HAVE_64BIT_OS
test_void_t = library.declare("test_void_t_stdcall", ctypes.stdcall_abi, ctypes.void_t);
do_check_eq(test_void_t(), undefined);
#endif
@ -2170,8 +2183,8 @@ function run_function_tests(library)
function run_closure_tests(library)
{
run_single_closure_tests(library, ctypes.default_abi, "cdecl");
#ifdef _WIN32
#ifndef _WIN64
#ifdef WIN32
#ifndef HAVE_64BIT_OS
run_single_closure_tests(library, ctypes.stdcall_abi, "stdcall");
#endif
#endif
@ -2233,8 +2246,8 @@ function run_variadic_tests(library) {
ctypes.FunctionType(ctypes.default_abi, ctypes.bool, ["..."]);
}, Error);
#ifdef _WIN32
#ifndef _WIN64
#ifdef WIN32
#ifndef HAVE_64BIT_OS
do_check_throws(function() {
ctypes.FunctionType(ctypes.stdcall_abi, ctypes.bool,
[ctypes.bool, "..."]);