[PyObjC-svn] r1979 - in trunk/pyobjc/pyobjc-core: . Modules/objc Modules/objc/test libffi-src/powerpc

[email protected]
Newsgroups gmane.comp.python.pyobjc.cvs
Message-ID <[email protected]>
Author: ronaldoussoren
Date: Sun Jan 13 12:25:35 2008
New Revision: 1979

Log:
* Fix a problem with compilation of libffi that I introduced in my previous checkin
* Explictly add '-fexceptions' to the compiler arguments (probably not needed)
* Fix some 64-bit issues (NSInteger vs. int issues)
* More serious: code sometimes looked at PyObjCObject fields without checking that
  the object really is a PyObjCObject, even when objects can PyObjCClass instances.
  This happens to work fine on all platforms but PPC64, but that's accidental.
* Enable '@try{' instead of 'NSDURING'

All of this is part of trying to get pyobjc-core going on a PPC64 system. Sadly
enough I now get a fatal error from the ObjC runtime because of an uncaught
exception, even though code is passing through an @try block that should catch
the exception.


Modified:
   trunk/pyobjc/pyobjc-core/Modules/objc/OC_PythonData.m
   trunk/pyobjc/pyobjc-core/Modules/objc/OC_PythonDictionary.m
   trunk/pyobjc/pyobjc-core/Modules/objc/OC_PythonObject.m
   trunk/pyobjc/pyobjc-core/Modules/objc/OC_PythonString.h
   trunk/pyobjc/pyobjc-core/Modules/objc/formal-protocol.m
   trunk/pyobjc/pyobjc-core/Modules/objc/libffi_support.m
   trunk/pyobjc/pyobjc-core/Modules/objc/method-imp.m
   trunk/pyobjc/pyobjc-core/Modules/objc/objc-object.m
   trunk/pyobjc/pyobjc-core/Modules/objc/objc_super.m
   trunk/pyobjc/pyobjc-core/Modules/objc/objc_util.m
   trunk/pyobjc/pyobjc-core/Modules/objc/opaque-pointer.m
   trunk/pyobjc/pyobjc-core/Modules/objc/pyobjc-api.h
   trunk/pyobjc/pyobjc-core/Modules/objc/selector.m
   trunk/pyobjc/pyobjc-core/Modules/objc/test/ctests.m
   trunk/pyobjc/pyobjc-core/Modules/objc/test/structargs.m
   trunk/pyobjc/pyobjc-core/Modules/objc/test/testbndl.m
   trunk/pyobjc/pyobjc-core/Modules/objc/toll-free-bridging.m
   trunk/pyobjc/pyobjc-core/libffi-src/powerpc/ppc-darwin.h
   trunk/pyobjc/pyobjc-core/libffi-src/powerpc/ppc-ffi_darwin.c
   trunk/pyobjc/pyobjc-core/setup.py

Modified: trunk/pyobjc/pyobjc-core/Modules/objc/OC_PythonData.m
==============================================================================
--- trunk/pyobjc/pyobjc-core/Modules/objc/OC_PythonData.m	(original)
+++ trunk/pyobjc/pyobjc-core/Modules/objc/OC_PythonData.m	Sun Jan 13 12:25:35 2008
@@ -63,7 +63,7 @@
 			PyErr_Clear();
 			rval = 0;
 		}
-		if ((unsigned)buffer_len > NSUIntegerMax) {
+		if ((NSUInteger)buffer_len > NSUIntegerMax) {
 			rval = NSUIntegerMax;
 		} else {
 			rval = buffer_len;

Modified: trunk/pyobjc/pyobjc-core/Modules/objc/OC_PythonDictionary.m
==============================================================================
--- trunk/pyobjc/pyobjc-core/Modules/objc/OC_PythonDictionary.m	(original)
+++ trunk/pyobjc/pyobjc-core/Modules/objc/OC_PythonDictionary.m	Sun Jan 13 12:25:35 2008
@@ -372,6 +372,7 @@
 	 * Forcefully disable coding for now, to avoid generating invalid
 	 * encoded streams.
 	 */        
+	//abort();
 	[NSException raise:NSInvalidArgumentException format:@"PyObjC: Encoding python objects of type %s is not supported", value->ob_type->tp_name, coder];
 }
 

Modified: trunk/pyobjc/pyobjc-core/Modules/objc/OC_PythonObject.m
==============================================================================
--- trunk/pyobjc/pyobjc-core/Modules/objc/OC_PythonObject.m	(original)
+++ trunk/pyobjc/pyobjc-core/Modules/objc/OC_PythonObject.m	Sun Jan 13 12:25:35 2008
@@ -986,7 +986,7 @@
         rval = PyObject_Hash([self pyObject]);
         if (rval == -1) {
             PyErr_Clear();
-            rval = (int)[self pyObject];
+            rval = (unsigned)[self pyObject];
         }
         PyObjC_GIL_RETURN((unsigned)rval);
     PyObjC_END_WITH_GIL

Modified: trunk/pyobjc/pyobjc-core/Modules/objc/OC_PythonString.h
==============================================================================
--- trunk/pyobjc/pyobjc-core/Modules/objc/OC_PythonString.h	(original)
+++ trunk/pyobjc/pyobjc-core/Modules/objc/OC_PythonString.h	Sun Jan 13 12:25:35 2008
@@ -62,8 +62,8 @@
  * Primitive NSString methods
  *
  */
--(unsigned)length;
--(unichar)characterAtIndex:(unsigned)index;
+-(NSUInteger)length;
+-(unichar)characterAtIndex:(NSUInteger)index;
 -(void)getCharacters:(unichar *)buffer range:(NSRange)aRange;
 
 @end

Modified: trunk/pyobjc/pyobjc-core/Modules/objc/formal-protocol.m
==============================================================================
--- trunk/pyobjc/pyobjc-core/Modules/objc/formal-protocol.m	(original)
+++ trunk/pyobjc/pyobjc-core/Modules/objc/formal-protocol.m	Sun Jan 13 12:25:35 2008
@@ -86,15 +86,18 @@
 	PyObject* args, PyObject* kwds)
 {
 static	char*	keywords[] = { "name", "supers", "selectors", NULL };
-	PyObjCFormalProtocol* result = NULL;
 	char* name;
 	PyObject* supers;
 	PyObject* selectors;
 	Py_ssize_t i, len;
+
+#ifndef __LP64__
+	PyObjCFormalProtocol* result = NULL;
 	Py_ssize_t numInstance = 0;
 	Py_ssize_t numClass = 0;
 	struct Protocol_struct* theProtocol = NULL;
 	struct objc_method_description* c;
+#endif
 
 	if (!PyArg_ParseTupleAndKeywords(args, kwds, "sOO:formal_protocol",
 			keywords, &name, &supers, &selectors)) { 

Modified: trunk/pyobjc/pyobjc-core/Modules/objc/libffi_support.m
==============================================================================
--- trunk/pyobjc/pyobjc-core/Modules/objc/libffi_support.m	(original)
+++ trunk/pyobjc/pyobjc-core/Modules/objc/libffi_support.m	Sun Jan 13 12:25:35 2008
@@ -57,7 +57,7 @@
 #    error "Need FFI_CLOSURES!"
 #endif
 
-#if 1 /* Usefull during debugging, only used in the debugger */
+#if 0 /* Usefull during debugging, only used in the debugger */
 static void describe_ffitype(ffi_type* type)
 {
 	switch (type->type) {
@@ -3577,8 +3577,12 @@
 		goto error_cleanup;
 	}
 
-	isUninitialized = ((PyObjCObject*)self)->flags  & PyObjCObject_kUNINITIALIZED;
-	((PyObjCObject*)self)->flags  &= ~PyObjCObject_kUNINITIALIZED;
+	if (PyObjCObject_Check(self)) {
+		isUninitialized = ((PyObjCObject*)self)->flags  & PyObjCObject_kUNINITIALIZED;
+		((PyObjCObject*)self)->flags  &= ~PyObjCObject_kUNINITIALIZED;
+	} else {
+		isUninitialized = NO;
+        }
 
 	if (methinfo->ob_size >= 3) {
 	}
@@ -3600,10 +3604,12 @@
 		}
 
 	PyObjC_HANDLER
+		NSLog(@"caught exception: %@", localException);
 		PyObjCErr_FromObjC(localException);
+
 	PyObjC_ENDHANDLER
 
-	if (isUninitialized) {
+	if (isUninitialized && PyObjCObject_Check(self)) {
 		((PyObjCObject*)self)->flags  |= PyObjCObject_kUNINITIALIZED;
 	}
 
@@ -3676,7 +3682,6 @@
 	const char* rettype;
 	ffi_status rv;
 	int i;
-	BOOL variadicAllArgs = NO;
 
 	rettype = methinfo->rettype.type;
 

Modified: trunk/pyobjc/pyobjc-core/Modules/objc/method-imp.m
==============================================================================
--- trunk/pyobjc/pyobjc-core/Modules/objc/method-imp.m	(original)
+++ trunk/pyobjc/pyobjc-core/Modules/objc/method-imp.m	Sun Jan 13 12:25:35 2008
@@ -138,7 +138,7 @@
 		pyres = pyself;
 	}
 
-	if (((PyObjCObject*)pyself)->flags & PyObjCObject_kUNINITIALIZED) {
+	if (PyObjCObject_Check(pyself) && (((PyObjCObject*)pyself)->flags & PyObjCObject_kUNINITIALIZED)) {
 		if (pyself != pyres && !PyErr_Occurred()) {
 			PyObjCObject_ClearObject(pyself);
 		}

Modified: trunk/pyobjc/pyobjc-core/Modules/objc/objc-object.m
==============================================================================
--- trunk/pyobjc/pyobjc-core/Modules/objc/objc-object.m	(original)
+++ trunk/pyobjc/pyobjc-core/Modules/objc/objc-object.m	Sun Jan 13 12:25:35 2008
@@ -717,7 +717,7 @@
      { 0, 0, 0, 0 },			/* as_buffer */
      0,					/* name */
      0,					/* slots */
-   }, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+   }, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
 };
 
 /*

Modified: trunk/pyobjc/pyobjc-core/Modules/objc/objc_super.m
==============================================================================
--- trunk/pyobjc/pyobjc-core/Modules/objc/objc_super.m	(original)
+++ trunk/pyobjc/pyobjc-core/Modules/objc/objc_super.m	Sun Jan 13 12:25:35 2008
@@ -148,4 +148,5 @@
 	PyType_GenericAlloc,			/* tp_alloc */
 	PyType_GenericNew,			/* tp_new */
 	PyObject_GC_Del,        		/* tp_free */
+	1,					/* tp_is_gc */
 };

Modified: trunk/pyobjc/pyobjc-core/Modules/objc/objc_util.m
==============================================================================
--- trunk/pyobjc/pyobjc-core/Modules/objc/objc_util.m	(original)
+++ trunk/pyobjc/pyobjc-core/Modules/objc/objc_util.m	Sun Jan 13 12:25:35 2008
@@ -39,6 +39,7 @@
 ObjCErr_PyExcForName(const char* value)
 {
 	/* XXX: This table should be changeable from python */
+	printf("finding exception for '%s'\n", value);
 	if (strcmp(value, "NSRangeException") == 0) {
 		return PyExc_IndexError;
 	}  else if (strcmp(value, "NSInvalidArgumentException") == 0) {

Modified: trunk/pyobjc/pyobjc-core/Modules/objc/opaque-pointer.m
==============================================================================
--- trunk/pyobjc/pyobjc-core/Modules/objc/opaque-pointer.m	(original)
+++ trunk/pyobjc/pyobjc-core/Modules/objc/opaque-pointer.m	Sun Jan 13 12:25:35 2008
@@ -282,10 +282,10 @@
 		PyObjC_free_closure(cl);
 	}
 	if (to_c) {
-		PyObjC_free_closure(to_c);
+		PyObjC_free_closure((ffi_closure*)to_c);
 	}
 	if (from_c) {
-		PyObjC_free_closure(from_c);
+		PyObjC_free_closure((ffi_closure*)from_c);
 	}
 	Py_XDECREF(v);
 	Py_XDECREF(w);

Modified: trunk/pyobjc/pyobjc-core/Modules/objc/pyobjc-api.h
==============================================================================
--- trunk/pyobjc/pyobjc-core/Modules/objc/pyobjc-api.h	(original)
+++ trunk/pyobjc/pyobjc-core/Modules/objc/pyobjc-api.h	Sun Jan 13 12:25:35 2008
@@ -42,7 +42,7 @@
 
 
 /* threading support */
-#if 1
+#if 0
 #define PyObjC_DURING \
 		Py_BEGIN_ALLOW_THREADS \
 		NS_DURING

Modified: trunk/pyobjc/pyobjc-core/Modules/objc/selector.m
==============================================================================
--- trunk/pyobjc/pyobjc-core/Modules/objc/selector.m	(original)
+++ trunk/pyobjc/pyobjc-core/Modules/objc/selector.m	Sun Jan 13 12:25:35 2008
@@ -532,7 +532,7 @@
 			pyres = pyself;
 		}
 
-		if (((PyObjCObject*)self->sel_self)->flags & PyObjCObject_kUNINITIALIZED) {
+		if (PyObjCObject_Check(self) && (((PyObjCObject*)self->sel_self)->flags & PyObjCObject_kUNINITIALIZED)) {
 			if (self->sel_self != pyres && !PyErr_Occurred()) {
 				PyObjCObject_ClearObject(pyself);
 			}

Modified: trunk/pyobjc/pyobjc-core/Modules/objc/test/ctests.m
==============================================================================
--- trunk/pyobjc/pyobjc-core/Modules/objc/test/ctests.m	(original)
+++ trunk/pyobjc/pyobjc-core/Modules/objc/test/ctests.m	Sun Jan 13 12:25:35 2008
@@ -49,8 +49,6 @@
 {
 }
 -(void)methodWithMyStruct: (struct Struct2)val1 andShort:(short)val2;
-
-
 @end
 
 @implementation PyObjCTest_NSInvoke 
@@ -61,17 +59,19 @@
 }
 @end
 
-#ifndef GNU_RUNTIME
-
-
 BEGIN_UNITTEST(CheckNSInvoke)
 	/* This is not a 'real' unittest, but is used to disable a number of
 	 * other tests (in objc.test.test_methods2) when NSInvocation isn't
 	 * working correctly (MacOS X at least upto 10.2.6).
 	 * [Panther previews also have this problem]
 	 *
-	 * GNUstep is even worse, this test causes a crash of the interpreter,
+	 * Leopard is even worse, this test causes a crash of the interpreter when
+         * running on PPC64.
 	 */
+#ifdef __ppc64__
+	ASSERT_EQUALS(0, 1, "%d");
+#endif
+
 	PyObjCTest_NSInvoke* obj = [[PyObjCTest_NSInvoke alloc] init];
 	NSInvocation* inv;
 	struct Struct2 v1 = { 1, 2, { 3, 4, 5, 6, 7 } };
@@ -96,15 +96,6 @@
 
 END_UNITTEST
 
-#else
-
-BEGIN_UNITTEST(CheckNSInvoke)
-	/* Force failure, see comment above */
-	ASSERT_EQUALS(0, 1, "%d");
-END_UNITTEST
-
-#endif
-
 
 BEGIN_UNITTEST(StructSize)
 

Modified: trunk/pyobjc/pyobjc-core/Modules/objc/test/structargs.m
==============================================================================
--- trunk/pyobjc/pyobjc-core/Modules/objc/test/structargs.m	(original)
+++ trunk/pyobjc/pyobjc-core/Modules/objc/test/structargs.m	Sun Jan 13 12:25:35 2008
@@ -9,7 +9,7 @@
 {
 }
 -(NSString*)compP:(NSPoint)aPoint aRect:(NSRect)aRect anOp:(int)op;
--(unsigned)stackPtr;
+-(size_t)stackPtr;
 -(NSRect)someRect;
 -(NSRect)someRectWithRect:(NSRect)rect;
 -(NSRect)someRectWithX:(int)x Y:(int)y H:(int)h W:(int)w;
@@ -46,11 +46,16 @@
 			NSStringFromRect(aRect),
 			op];
 }
--(unsigned)stackPtr
+
+static size_t ident(size_t v)
+{
+	return v;
+}
+-(size_t)stackPtr
 {
 	char c;
 
-	return ((unsigned)&c)+1;
+	return ident(((size_t)&c)+1);
 }
 @end
 

Modified: trunk/pyobjc/pyobjc-core/Modules/objc/test/testbndl.m
==============================================================================
--- trunk/pyobjc/pyobjc-core/Modules/objc/test/testbndl.m	(original)
+++ trunk/pyobjc/pyobjc-core/Modules/objc/test/testbndl.m	Sun Jan 13 12:25:35 2008
@@ -1663,7 +1663,7 @@
 + (NSData*)fetchData:(NSCoder*)coder
 {
 	void* data;
-	unsigned length;
+	NSUInteger length;
 
 	data = [coder decodeBytesWithReturnedLength:&length];
 	return [NSData dataWithBytes:data length:length];

Modified: trunk/pyobjc/pyobjc-core/Modules/objc/toll-free-bridging.m
==============================================================================
--- trunk/pyobjc/pyobjc-core/Modules/objc/toll-free-bridging.m	(original)
+++ trunk/pyobjc/pyobjc-core/Modules/objc/toll-free-bridging.m	Sun Jan 13 12:25:35 2008
@@ -45,7 +45,7 @@
  *
  */
 PyObject* 
-PyObjC_IDToCFType(id argument)
+PyObjC_IDToCFType(id argument __attribute__((__unused__)))
 {
 #ifndef __OBJC2__
 	CFTypeRef typeRef = (CFTypeRef)argument;

Modified: trunk/pyobjc/pyobjc-core/libffi-src/powerpc/ppc-darwin.h
==============================================================================
--- trunk/pyobjc/pyobjc-core/libffi-src/powerpc/ppc-darwin.h	(original)
+++ trunk/pyobjc/pyobjc-core/libffi-src/powerpc/ppc-darwin.h	Sun Jan 13 12:25:35 2008
@@ -74,6 +74,13 @@
 };
 
 void ffi_prep_args(extended_cif*   inEcif, unsigned *const stack);
+
+typedef union
+{
+        float   f;
+        double  d;
+} ffi_dblfl;
+
 int ffi_closure_helper_DARWIN( ffi_closure*    closure,
         void*                   rvalue, unsigned long*  pgr,
         ffi_dblfl*              pfr);

Modified: trunk/pyobjc/pyobjc-core/libffi-src/powerpc/ppc-ffi_darwin.c
==============================================================================
--- trunk/pyobjc/pyobjc-core/libffi-src/powerpc/ppc-ffi_darwin.c	(original)
+++ trunk/pyobjc/pyobjc-core/libffi-src/powerpc/ppc-ffi_darwin.c	Sun Jan 13 12:25:35 2008
@@ -790,12 +790,6 @@
 	} ldu;
 #endif
 
-typedef union
-{
-	float	f;
-	double	d;
-} ffi_dblfl;
-
 /*	The trampoline invokes ffi_closure_ASM, and on entry, r11 holds the
 	address of the closure. After storing the registers that could possibly
 	contain parameters to be passed into the stack frame and setting up space
@@ -1764,4 +1758,4 @@
 }
 
 #endif	/*	defined(__ppc64__)	*/
-#endif	/* __ppc__ || __ppc64__ */
\ No newline at end of file
+#endif	/* __ppc__ || __ppc64__ */

Modified: trunk/pyobjc/pyobjc-core/setup.py
==============================================================================
--- trunk/pyobjc/pyobjc-core/setup.py	(original)
+++ trunk/pyobjc/pyobjc-core/setup.py	Sun Jan 13 12:25:35 2008
@@ -93,6 +93,7 @@
     #"-Wstrict-overflow",
     "-g",
     #"-fobjc-gc",
+    "-fexceptions",
 
     ## Arghh, a stupid compiler flag can cause problems. Don't 
     ## enable -O0 if you value your sanity. With -O0 PyObjC will crash

-------------------------------------------------------------------------
Check out the new SourceForge.net Marketplace.
It's the best place to buy or sell services for
just about anything Open Source.
http://ad.doubleclick.net/clk;164216239;13503038;w?http://sf.net/marketplace
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.