PyXPCOM_OLD: HEAD.patch.ksh

File HEAD.patch.ksh, 21.7 KB (added by anonymous, 10 years ago)
Line 
1Index: src/PyIVariant.cpp
2===================================================================
3RCS file: /cvsroot/mozilla/extensions/python/xpcom/src/PyIVariant.cpp,v
4retrieving revision 1.4
5diff -u -r1.4 PyIVariant.cpp
6--- src/PyIVariant.cpp  18 Apr 2004 22:13:54 -0000      1.4
7+++ src/PyIVariant.cpp  4 Feb 2005 05:42:38 -0000
8@@ -64,10 +64,10 @@
9        return PyString_FromStringAndSize(&c, 1);
10 }
11 static PyObject *MyUChar( PRUnichar c) {
12-       return PyUnicodeUCS2_FromUnicode(&c, 1);
13+       return PyUnicode_FromPRUnichar(&c, 1);
14 }
15 static PyObject *MyUnicode( PRUnichar *p) {
16-       return PyUnicodeUCS2_FromUnicode(p, nsCRT::strlen(p));
17+       return PyUnicode_FromPRUnichar(p, nsCRT::strlen(p));
18 }
19 static PyObject *MyISupports( nsISupports *p) {
20        return Py_nsISupports::PyObjectFromInterface(p, NS_GET_IID(nsISupports), PR_FALSE);
21@@ -129,7 +129,7 @@
22 GET_ALLOCATED(char *, GetAsString, PyString_FromString, nsMemory::Free);
23 GET_ALLOCATED(PRUnichar *, GetAsWString, MyUnicode, nsMemory::Free);
24 GET_ALLOCATED_SIZE(char *, GetAsStringWithSize, PyString_FromStringAndSize, nsMemory::Free);
25-GET_ALLOCATED_SIZE(PRUnichar *, GetAsWStringWithSize, PyUnicodeUCS2_FromUnicode, nsMemory::Free);
26+GET_ALLOCATED_SIZE(PRUnichar *, GetAsWStringWithSize, PyUnicode_FromPRUnichar, nsMemory::Free);
27 
28 static PyObject *GetAsInterface(PyObject *self, PyObject *args) {
29        nsIVariant *pI = GetI(self);
30Index: src/PyXPCOM.h
31===================================================================
32RCS file: /cvsroot/mozilla/extensions/python/xpcom/src/PyXPCOM.h,v
33retrieving revision 1.11
34diff -u -r1.11 PyXPCOM.h
35--- src/PyXPCOM.h       18 Apr 2004 22:13:54 -0000      1.11
36+++ src/PyXPCOM.h       4 Feb 2005 05:42:38 -0000
37@@ -117,6 +117,10 @@
38 #define PYXPCOM_LOG_DEBUG()
39 #endif // DEBUG
40 
41+// Create a Unicode Object from the PRUnichar buffer src of the given size
42+#define PyUnicode_FromPRUnichar(src, size) \
43+       PyUnicode_DecodeUTF16((char*)(src),sizeof(PRUnichar)*(size),NULL,NULL)
44+
45 /*************************************************************************
46 **************************************************************************
47 
48Index: src/PyXPCOM_std.h
49===================================================================
50RCS file: /cvsroot/mozilla/extensions/python/xpcom/src/PyXPCOM_std.h,v
51retrieving revision 1.7
52diff -u -r1.7 PyXPCOM_std.h
53--- src/PyXPCOM_std.h   18 Apr 2004 22:13:54 -0000      1.7
54+++ src/PyXPCOM_std.h   4 Feb 2005 05:42:38 -0000
55@@ -49,6 +49,14 @@
56 //
57 // (c) 2000, ActiveState corp.
58 
59+#include <Python.h>
60+
61+#ifdef HAVE_LONG_LONG
62+       // Mozilla also defines this - we undefine it to
63+       // prevent a compiler warning.
64+#      undef HAVE_LONG_LONG
65+#endif // HAVE_LONG_LONG
66+
67 #include "nsIAllocator.h"
68 #include "nsIWeakReference.h"
69 #include "nsIInterfaceInfoManager.h"
70@@ -68,11 +76,4 @@
71 // we can use it to trigger "exports"
72 #define BUILD_PYXPCOM
73 
74-#ifdef HAVE_LONG_LONG
75-       // Mozilla also defines this - we undefine it to
76-       // prevent a compiler warning.
77-#      undef HAVE_LONG_LONG
78-#endif // HAVE_LONG_LONG
79-
80-#include "Python.h"
81 #include "PyXPCOM.h"
82Index: src/Pyxpt_info.cpp
83===================================================================
84RCS file: /cvsroot/mozilla/extensions/python/xpcom/src/Pyxpt_info.cpp,v
85retrieving revision 1.6
86diff -u -r1.6 Pyxpt_info.cpp
87--- src/Pyxpt_info.cpp  18 Apr 2004 22:13:54 -0000      1.6
88+++ src/Pyxpt_info.cpp  4 Feb 2005 05:42:38 -0000
89@@ -152,7 +152,7 @@
90                        v = PyString_FromStringAndSize(&c->value.ch, 1);
91                        break;
92                case TD_WCHAR:
93-                       v = PyUnicode_FromUnicode((PRUnichar *)&c->value.wch, 1);
94+                       v = PyUnicode_FromPRUnichar((PRUnichar *)&c->value.wch, 1);
95                        break;
96        //    TD_VOID              = 13, 
97                case TD_PNSIID:
98@@ -163,7 +163,7 @@
99                        v = PyString_FromString(c->value.str);
100                        break;
101                case TD_PWSTRING:
102-                       v = PyUnicode_FromUnicode((PRUnichar *)c->value.wstr, nsCRT::strlen((PRUnichar *)c->value.wstr));
103+                       v = PyUnicode_FromPRUnichar((PRUnichar *)c->value.wstr, nsCRT::strlen((PRUnichar *)c->value.wstr));
104                        break;
105        //    TD_INTERFACE_TYPE    = 18,
106        //    TD_INTERFACE_IS_TYPE = 19,
107Index: src/VariantUtils.cpp
108===================================================================
109RCS file: /cvsroot/mozilla/extensions/python/xpcom/src/VariantUtils.cpp,v
110retrieving revision 1.18
111diff -u -r1.18 VariantUtils.cpp
112--- src/VariantUtils.cpp        21 Jul 2004 11:42:46 -0000      1.18
113+++ src/VariantUtils.cpp        4 Feb 2005 05:42:39 -0000
114@@ -21,6 +21,9 @@
115  * Contributor(s):
116  *   Mark Hammond <[email protected]> (original author)
117  *
118+ *   Unicode corrections by Shane Hathaway (http://hathawaymix.org),
119+ *     inspired by Mikhail Sobolev
120+ *
121  * Alternatively, the contents of this file may be used under the terms of
122  * either the GNU General Public License Version 2 or later (the "GPL"), or
123  * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
124@@ -69,6 +72,38 @@
125        return PR_FALSE;
126 }
127 
128+// Create a zero-terminated PRUnichar buffer from a Python unicode.
129+// On success, returns 0.  On failure, returns -1 and sets an exception.
130+// dest_out must not be null.  size_out may be null.
131+static int
132+PyUnicode_AsPRUnichar(PyObject *obj, PRUnichar **dest_out, PRUint32 *size_out)
133+{
134+       PRUint32 size;
135+       PyObject *s;
136+       PRUnichar *dest;
137+
138+       s = PyUnicode_AsUTF16String(obj);
139+       if (!s)
140+               return -1;
141+       size = (PyString_GET_SIZE(s) - 2) / sizeof(PRUnichar);
142+       dest = (PRUnichar *)nsMemory::Alloc(sizeof(PRUnichar) * (size + 1));
143+       if (!dest) {
144+               PyErr_NoMemory();
145+               Py_DECREF(s);
146+               return -1;
147+       }
148+       // Drop the UTF-16 byte order mark at the beginning of
149+       // the string.  (See the docs on PyUnicode_AsUTF16String.)
150+       // Some Mozilla libraries don't like the mark.
151+       memcpy(dest, PyString_AS_STRING(s) + 2, sizeof(PRUnichar) * size);
152+       Py_DECREF(s);
153+       dest[size] = 0;
154+       *dest_out = dest;
155+       if (size_out)
156+               *size_out = size;
157+       return 0;
158+}
159+
160 PyObject *PyObject_FromNSString( const nsACString &s, PRBool bAssumeUTF8 = PR_FALSE )
161 {
162        PyObject *ret;
163@@ -78,10 +113,16 @@
164        } else {
165                if (bAssumeUTF8) {
166                        char *temp = ToNewCString(s);
167+                       if (!temp) {
168+                               PyErr_NoMemory();
169+                               return NULL;
170+                       }
171                        ret = PyUnicode_DecodeUTF8(temp, s.Length(), NULL);
172                        nsMemory::Free(temp);
173                } else {
174                        ret = PyString_FromStringAndSize(NULL, s.Length());
175+                       if (!ret)
176+                               return NULL;
177                        // Need "CopyAsciiTo"!?
178                        nsACString::const_iterator fromBegin, fromEnd;
179                        char* dest = PyString_AS_STRING(ret);
180@@ -98,8 +139,13 @@
181                ret = Py_None;
182                Py_INCREF(Py_None);
183        } else {
184-               ret = PyUnicodeUCS2_FromUnicode( NULL, s.Length() );
185-               CopyUnicodeTo(s, 0, PyUnicodeUCS2_AsUnicode(ret), s.Length());
186+               PRUnichar *tmp = ToNewUnicode(s);
187+               if (!tmp) {
188+                       PyErr_NoMemory();
189+                       return NULL;
190+               }
191+               ret = PyUnicode_FromPRUnichar(tmp, s.Length());
192+               nsMemory::Free(tmp);
193        }
194        return ret;
195 }
196@@ -303,9 +349,10 @@
197                                        PyErr_SetString(PyExc_TypeError, "This parameter must be a string or Unicode object");
198                                        BREAK_FALSE;
199                                }
200-                               if ((val_use = PyUnicodeUCS2_FromObject(val))==NULL)
201+                               if ((val_use = PyUnicode_FromObject(val)) == NULL)
202                                        BREAK_FALSE;
203-                               NS_ABORT_IF_FALSE(PyUnicode_Check(val_use), "PyUnicodeUCS2_FromObject didnt return a Unicode object!");
204+                               NS_ABORT_IF_FALSE(PyUnicode_Check(val_use), "PyUnicode_FromObject didnt return a Unicode object!");
205+                               // Lossy!
206                                FILL_SIMPLE_POINTER( PRUnichar, *PyUnicode_AS_UNICODE(val_use) );
207                                break;
208 
209@@ -369,18 +416,11 @@
210                                        PyErr_SetString(PyExc_TypeError, "This parameter must be a string or Unicode object");
211                                        BREAK_FALSE;
212                                }
213-                               if ((val_use = PyUnicodeUCS2_FromObject(val))==NULL)
214+                               if ((val_use = PyUnicode_FromObject(val))==NULL)
215                                        BREAK_FALSE;
216-                               NS_ABORT_IF_FALSE(PyUnicode_Check(val_use), "PyUnicodeUCS2_FromObject didnt return a Unicode object!");
217-                               const PRUnichar *sz = PyUnicode_AS_UNICODE(val_use);
218-                               int nch = PyUnicode_GET_SIZE(val_use);
219-
220-                               *pp = (PRUnichar *)nsMemory::Alloc(sizeof(PRUnichar) * (nch+1));
221-                               if (*pp==NULL) {
222-                                       PyErr_NoMemory();
223+                               NS_ABORT_IF_FALSE(PyUnicode_Check(val_use), "PyUnicode_FromObject didnt return a Unicode object!");
224+                               if (PyUnicode_AsPRUnichar(val_use, pp, NULL) < 0)
225                                        BREAK_FALSE;
226-                               }
227-                               memcpy(*pp, sz, sizeof(PRUnichar) * (nch + 1));
228                                break;
229                                }
230                          case nsXPTType::T_INTERFACE_IS: // hmm - ignoring the IID can't be good :(
231@@ -476,8 +516,9 @@
232                                if (*pp==NULL) {
233                                        Py_INCREF(Py_None);
234                                        val = Py_None;
235-                               } else
236-                                       val = PyUnicodeUCS2_FromUnicode( *pp, nsCRT::strlen(*pp) );
237+                               } else {
238+                                       val = PyUnicode_FromPRUnichar( *pp, nsCRT::strlen(*pp) );
239+                               }
240                                break;
241                                }
242                          case nsXPTType::T_INTERFACE_IS:
243@@ -532,8 +573,12 @@
244                return nsIDataType::VTYPE_STRING_SIZE_IS;
245        if (PyUnicode_Check(ob))
246                return nsIDataType::VTYPE_WSTRING_SIZE_IS;
247-       if (PyTuple_Check(ob) || PyList_Check(ob))
248-               return PySequence_Length(ob) ? nsIDataType::VTYPE_ARRAY : nsIDataType::VTYPE_EMPTY_ARRAY;
249+       if (PyTuple_Check(ob) || PyList_Check(ob)) {
250+               if (PySequence_Length(ob))
251+                       return nsIDataType::VTYPE_ARRAY;
252+               else
253+                       return nsIDataType::VTYPE_EMPTY_ARRAY;
254+       }
255        // Now do expensive or abstract checks.
256        if (Py_nsISupports::InterfaceFromPyObject(ob, NS_GET_IID(nsISupports), &ps, PR_TRUE)) {
257                if (pdata) {
258@@ -550,8 +595,12 @@
259                return nsIDataType::VTYPE_ID;
260        } else
261                PyErr_Clear();
262-       if (PySequence_Check(ob))
263-               return PySequence_Length(ob) ? nsIDataType::VTYPE_ARRAY : nsIDataType::VTYPE_EMPTY_ARRAY;
264+       if (PySequence_Check(ob)) {
265+               if (PySequence_Length(ob))
266+                       return nsIDataType::VTYPE_ARRAY;
267+               else
268+                       return nsIDataType::VTYPE_EMPTY_ARRAY;
269+       }
270        return (PRUint16)-1;
271 }
272 
273@@ -584,7 +633,19 @@
274                        nr = v->SetAsStringWithSize(PyString_Size(ob), PyString_AsString(ob));
275                        break;
276                case nsIDataType::VTYPE_WSTRING_SIZE_IS:
277-                       nr = v->SetAsWStringWithSize(PyUnicodeUCS2_GetSize(ob), PyUnicodeUCS2_AsUnicode(ob));
278+                       if (PyUnicode_GetSize(ob) == 0) {
279+                               nr = v->SetAsWStringWithSize(0, (PRUnichar*)NULL);
280+                       }
281+                       else {
282+                               PRUint32 nch;
283+                               PRUnichar *p;
284+                               if (PyUnicode_AsPRUnichar(ob, &p, &nch) < 0) {
285+                                       nr = NS_ERROR_UNEXPECTED;
286+                                       break;
287+                               }
288+                               nr = v->SetAsWStringWithSize(nch, p);
289+                               nsMemory::Free(p);
290+                       }
291                        break;
292                case nsIDataType::VTYPE_INTERFACE_IS:
293                {
294@@ -1143,14 +1204,15 @@
295                                PyErr_SetString(PyExc_TypeError, "This parameter must be a string or Unicode object");
296                                BREAK_FALSE;
297                        }
298-                       if ((val_use = PyUnicodeUCS2_FromObject(val))==NULL)
299+                       if ((val_use = PyUnicode_FromObject(val))==NULL)
300                                BREAK_FALSE;
301                        // Sanity check should PyObject_Str() ever loosen its semantics wrt Unicode!
302-                       NS_ABORT_IF_FALSE(PyUnicode_Check(val_use), "PyUnicodeUCS2_FromObject didnt return a unicode object!");
303-                       if (PyUnicode_GET_SIZE(val_use) != 1) {
304+                       NS_ABORT_IF_FALSE(PyUnicode_Check(val_use), "PyUnicode_FromObject didnt return a unicode object!");
305+                       if (PyUnicode_GetSize(val_use) != 1) {
306                                PyErr_SetString(PyExc_ValueError, "Must specify a one character string for a character");
307                                BREAK_FALSE;
308                        }
309+                       // Lossy!
310                        ns_v.val.wc = *PyUnicode_AS_UNICODE(val_use);
311                        break;
312                        }
313@@ -1172,12 +1234,21 @@
314                                        PyErr_SetString(PyExc_TypeError, "This parameter must be a string or Unicode object");
315                                        BREAK_FALSE;
316                                }
317-                               if ((val_use = PyUnicodeUCS2_FromObject(val))==NULL)
318+                               if ((val_use = PyUnicode_FromObject(val))==NULL)
319                                        BREAK_FALSE;
320                                // Sanity check should PyObject_Str() ever loosen its semantics wrt Unicode!
321-                               NS_ABORT_IF_FALSE(PyUnicode_Check(val_use), "PyUnicodeUCS2_FromObject didnt return a unicode object!");
322-                               ns_v.val.p = new nsString(PyUnicode_AS_UNICODE(val_use),
323-                                                         PyUnicode_GET_SIZE(val_use));
324+                               NS_ABORT_IF_FALSE(PyUnicode_Check(val_use), "PyUnicode_FromObject didnt return a unicode object!");
325+                               if (PyUnicode_GET_SIZE(val_use) == 0) {
326+                                       ns_v.val.p = new nsString();
327+                               }
328+                               else {
329+                                       PRUint32 nch;
330+                                       PRUnichar *tempo;
331+                                       if (PyUnicode_AsPRUnichar(val_use, &tempo, &nch) < 0)
332+                                               BREAK_FALSE;
333+                                       ns_v.val.p = new nsString(tempo, nch);
334+                                       nsMemory::Free(tempo);
335+                               }
336                        }
337                        if (!ns_v.val.p) {
338                                PyErr_NoMemory();
339@@ -1254,22 +1325,19 @@
340                                ns_v.val.p = nsnull;
341                                break;
342                        }
343-                       // If an "in" char *, and we have a PyString, then pass the
344-                       // pointer (hoping everyone else plays by the rules too.
345-                       if (!XPT_PD_IS_OUT(td.param_flags) && PyUnicode_Check(val)) {
346-                               ns_v.val.p = PyUnicode_AS_UNICODE(val);
347-                               break;
348-                       }
349                        if (!PyString_Check(val) && !PyUnicode_Check(val)) {
350                                PyErr_SetString(PyExc_TypeError, "This parameter must be a string or Unicode object");
351                                BREAK_FALSE;
352                        }
353-                       if ((val_use = PyUnicodeUCS2_FromObject(val))==NULL)
354+                       if ((val_use = PyUnicode_FromObject(val))==NULL)
355                                BREAK_FALSE;
356-                       NS_ABORT_IF_FALSE(PyUnicode_Check(val_use), "PyUnicodeUCS2_FromObject didnt return a Unicode object!");
357-                       cb_this_buffer_pointer = (PyUnicode_GET_SIZE(val_use)+1) * sizeof(Py_UNICODE);
358-                       MAKE_VALUE_BUFFER(cb_this_buffer_pointer);
359-                       memcpy(this_buffer_pointer, PyUnicode_AS_UNICODE(val_use), cb_this_buffer_pointer);
360+                       NS_ABORT_IF_FALSE(PyUnicode_Check(val_use), "PyUnicode_FromObject didnt return a Unicode object!");
361+                       PRUnichar *sv;
362+                       PRUint32 nch;
363+                       if (PyUnicode_AsPRUnichar(val_use, &sv, &nch) < 0)
364+                               BREAK_FALSE;
365+                       cb_this_buffer_pointer = (nch + 1) * sizeof(PRUnichar);
366+                       this_buffer_pointer = sv;
367                        ns_v.val.p = this_buffer_pointer;
368                        break;
369                        }
370@@ -1346,16 +1414,18 @@
371                                PyErr_SetString(PyExc_TypeError, "This parameter must be a string or Unicode object");
372                                BREAK_FALSE;
373                        }
374-                       if ((val_use = PyUnicodeUCS2_FromObject(val))==NULL)
375+                       if ((val_use = PyUnicode_FromObject(val))==NULL)
376                                BREAK_FALSE;
377                        // Sanity check should PyObject_Str() ever loosen its semantics wrt Unicode!
378                        NS_ABORT_IF_FALSE(PyUnicode_Check(val_use), "PyObject_Unicode didnt return a unicode object!");
379-
380-                       cb_this_buffer_pointer = PyUnicode_GET_SIZE(val_use) * sizeof(PRUnichar);
381-                       MAKE_VALUE_BUFFER(cb_this_buffer_pointer);
382-                       memcpy(this_buffer_pointer, PyUnicode_AS_UNICODE(val_use), cb_this_buffer_pointer);
383+                       PRUnichar *sv;
384+                       PRUint32 nch;
385+                       if (PyUnicode_AsPRUnichar(val_use, &sv, &nch) < 0)
386+                               BREAK_FALSE;
387+                       cb_this_buffer_pointer = (nch + 1) * sizeof(PRUnichar);
388+                       this_buffer_pointer = sv;
389                        ns_v.val.p = this_buffer_pointer;
390-                       rc = SetSizeIs(value_index, PR_TRUE, PyUnicode_GET_SIZE(val_use) );
391+                       rc = SetSizeIs(value_index, PR_TRUE, nch);
392                        break;
393                        }
394                case nsXPTType::T_ARRAY: {
395@@ -1556,7 +1626,7 @@
396                break;
397 
398          case nsXPTType::T_WCHAR:
399-               ret = PyUnicodeUCS2_FromUnicode( ((PRUnichar *)ns_v.ptr), 1 );
400+               ret = PyUnicode_FromPRUnichar( ((PRUnichar *)ns_v.ptr), 1 );
401                break;
402 //       case nsXPTType::T_VOID:
403          case nsXPTType::T_IID:
404@@ -1588,8 +1658,9 @@
405                if (us == NULL) {
406                        ret = Py_None;
407                        Py_INCREF(Py_None);
408-               } else
409-                       ret = PyUnicodeUCS2_FromUnicode( us, nsCRT::strlen(us));
410+               } else {
411+                       ret = PyUnicode_FromPRUnichar( us, nsCRT::strlen(us));
412+               }
413                break;
414                }
415          case nsXPTType::T_INTERFACE: {
416@@ -1655,7 +1726,7 @@
417                        Py_INCREF(Py_None);
418                } else {
419                        PRUint32 string_size = GetSizeIs(index, PR_TRUE);
420-                       ret = PyUnicodeUCS2_FromUnicode( *((PRUnichar **)ns_v.ptr), string_size );
421+                       ret = PyUnicode_FromPRUnichar( *((PRUnichar **)ns_v.ptr), string_size );
422                }
423                break;
424        default:
425@@ -1905,7 +1976,7 @@
426                }
427          case nsXPTType::T_WCHAR: {
428                PRUnichar temp = (PRUnichar)DEREF_IN_OR_OUT(ns_v.val.wc, PRUnichar);
429-               ret = PyUnicodeUCS2_FromUnicode(&temp, 1);
430+               ret = PyUnicode_FromPRUnichar(&temp, 1);
431                break;
432                }
433 //       case nsXPTType::T_VOID:
434@@ -1942,8 +2013,9 @@
435                if (us==NULL) {
436                        ret = Py_None;
437                        Py_INCREF(Py_None);
438-               } else
439-                       ret = PyUnicodeUCS2_FromUnicode( us, nsCRT::strlen(us));
440+               } else {
441+                       ret = PyUnicode_FromPRUnichar( us, nsCRT::strlen(us));
442+               }
443                break;
444                }
445          case nsXPTType::T_INTERFACE_IS: // our Python code does it :-)
446@@ -2000,8 +2072,9 @@
447                if (t==NULL) {
448                        ret = Py_None;
449                        Py_INCREF(Py_None);
450-               } else
451-                       ret = PyUnicodeUCS2_FromUnicode(t, string_size);
452+               } else {
453+                       ret = PyUnicode_FromPRUnichar(t, string_size);
454+               }
455                break;
456                }
457        default:
458@@ -2160,9 +2233,10 @@
459                        PyErr_SetString(PyExc_TypeError, "This parameter must be a string or Unicode object");
460                        BREAK_FALSE;
461                }
462-               if ((val_use = PyUnicodeUCS2_FromObject(val))==NULL)
463+               if ((val_use = PyUnicode_FromObject(val))==NULL)
464                        BREAK_FALSE;
465-               NS_ABORT_IF_FALSE(PyUnicode_Check(val_use), "PyUnicodeUCS2_FromObject didnt return a Unicode object!");
466+               NS_ABORT_IF_FALSE(PyUnicode_Check(val_use), "PyUnicode_FromObject didnt return a Unicode object!");
467+               // Lossy!
468                FILL_SIMPLE_POINTER( PRUnichar, *PyUnicode_AS_UNICODE(val_use) );
469                break;
470 
471@@ -2195,10 +2269,21 @@
472                                PyErr_SetString(PyExc_TypeError, "This parameter must be a string or Unicode object");
473                                BREAK_FALSE;
474                        }
475-                       val_use = PyUnicodeUCS2_FromObject(val);
476-                       NS_ABORT_IF_FALSE(PyUnicode_Check(val_use), "PyUnicodeUCS2_FromObject didnt return a Unicode object!");
477-                       const PRUnichar *sz = PyUnicode_AS_UNICODE(val_use);
478-                       ws->Assign(sz, PyUnicode_GET_SIZE(val_use));
479+                       val_use = PyUnicode_FromObject(val);
480+                       if (!val_use)
481+                               BREAK_FALSE;
482+                       NS_ABORT_IF_FALSE(PyUnicode_Check(val_use), "PyUnicode_FromObject didn't return a Unicode object!");
483+                       if (PyUnicode_GET_SIZE(val_use) == 0) {
484+                               ws->Assign((PRUnichar*)NULL, 0);
485+                       }
486+                       else {
487+                               PRUint32 nch;
488+                               PRUnichar *sz;
489+                               if (PyUnicode_AsPRUnichar(val_use, &sz, &nch) < 0)
490+                                       BREAK_FALSE;
491+                               ws->Assign(sz, nch);
492+                               nsMemory::Free(sz);
493+                       }
494                }
495                break;
496                }
497@@ -2282,17 +2367,10 @@
498                        PyErr_SetString(PyExc_TypeError, "This parameter must be a string or Unicode object");
499                        BREAK_FALSE;
500                }
501-               val_use = PyUnicodeUCS2_FromObject(val);
502-               NS_ABORT_IF_FALSE(PyUnicode_Check(val_use), "PyUnicodeUCS2_FromObject didnt return a Unicode object!");
503-               const PRUnichar *sz = PyUnicode_AS_UNICODE(val_use);
504-               int nch = PyUnicode_GET_SIZE(val_use);
505-
506-               *pp = (PRUnichar *)nsMemory::Alloc(sizeof(PRUnichar) * (nch+1));
507-               if (*pp==NULL) {
508-                       PyErr_NoMemory();
509+               val_use = PyUnicode_FromObject(val);
510+               NS_ABORT_IF_FALSE(PyUnicode_Check(val_use), "PyUnicode_FromObject didnt return a Unicode object!");
511+               if (PyUnicode_AsPRUnichar(val_use, pp, NULL) < 0)
512                        BREAK_FALSE;
513-               }
514-               memcpy(*pp, sz, sizeof(PRUnichar) * (nch + 1));
515                break;
516                }
517          case nsXPTType::T_INTERFACE:  {
518@@ -2399,7 +2477,7 @@
519                }
520 
521          case nsXPTType::T_PWSTRING_SIZE_IS: {
522-               const PRUnichar *sz = nsnull;
523+               PRUnichar *sz = nsnull;
524                PRUint32 nch = 0;
525                PRUint32 nbytes = 0;
526 
527@@ -2408,10 +2486,10 @@
528                                PyErr_SetString(PyExc_TypeError, "This parameter must be a string or Unicode object");
529                                BREAK_FALSE;
530                        }
531-                       val_use = PyUnicodeUCS2_FromObject(val);
532-                       NS_ABORT_IF_FALSE(PyUnicode_Check(val_use), "PyUnicodeUCS2_FromObject didnt return a Unicode object!");
533-                       sz = PyUnicode_AS_UNICODE(val_use);
534-                       nch = PyUnicode_GET_SIZE(val_use);
535+                       val_use = PyUnicode_FromObject(val);
536+                       NS_ABORT_IF_FALSE(PyUnicode_Check(val_use), "PyUnicode_FromObject didnt return a Unicode object!");
537+                       if (PyUnicode_AsPRUnichar(val_use, &sz, &nch) < 0)
538+                               BREAK_FALSE;
539                        nbytes = sizeof(PRUnichar) * nch;
540                }
541                PRBool bBackFill = PR_FALSE;
542@@ -2436,22 +2514,16 @@
543                        PRUnichar **pp = (PRUnichar **)ns_v.val.p;
544                        if (*pp && pi->IsIn())
545                                nsMemory::Free(*pp);
546-                       *pp = nsnull;
547-
548-                       if (val == Py_None)
549-                               break; // Remains NULL.
550-                       *pp = (PRUnichar *)nsMemory::Alloc(nbytes);
551-                       if (*pp==NULL) {
552-                               PyErr_NoMemory();
553-                               BREAK_FALSE;
554-                       }
555-                       memcpy(*pp, sz, nbytes);
556+                       *pp = sz;
557+                       sz = nsnull;
558                        if (bCanSetSizeIs)
559                                rc = SetSizeIs(index, PR_TRUE, nch);
560                        else {
561                                NS_ABORT_IF_FALSE(GetSizeIs(index, PR_TRUE) == nch, "Can't set sizeis, but string isnt correct size");
562                        }
563                }
564+               if (sz)
565+                       nsMemory::Free(sz);
566                break;
567                }
568          case nsXPTType::T_ARRAY: {
569Index: src/loader/pyloader.cpp
570===================================================================
571RCS file: /cvsroot/mozilla/extensions/python/xpcom/src/loader/pyloader.cpp,v
572retrieving revision 1.19
573diff -u -r1.19 pyloader.cpp
574--- src/loader/pyloader.cpp     18 Apr 2004 22:13:54 -0000      1.19
575+++ src/loader/pyloader.cpp     4 Feb 2005 05:42:39 -0000
576@@ -43,8 +43,13 @@
577 // the xpcom "components" directory.  Simply locates and loads the standard
578 // _xpcom support module and transfers control to that.
579 
580+#include <Python.h>
581+
582+#ifdef HAVE_LONG_LONG
583+#undef HAVE_LONG_LONG
584+#endif
585+
586 #include "nsIComponentLoader.h"
587-#include "nsIRegistry.h"
588 #include "nsISupports.h"
589 #include "nsIModule.h"
590 #include "nsDirectoryServiceDefs.h"
591@@ -57,15 +62,8 @@
592 
593 #include "nsReadableUtils.h"
594 #include "nsCRT.h"
595-#include <nsFileStream.h> // For console logging.
596 #include "nspr.h" // PR_fprintf
597 
598-#ifdef HAVE_LONG_LONG
599-#undef HAVE_LONG_LONG
600-#endif
601-
602-#include "Python.h"
603-
604 #if (PY_VERSION_HEX >= 0x02030000)
605 #define PYXPCOM_USE_PYGILSTATE
606 #endif
607@@ -100,14 +98,14 @@
608 void AddStandardPaths()
609 {
610        // Put {bin}\Python on the path if it exists.
611+       nsresult rv;
612        nsCOMPtr<nsIFile> aFile;
613-       nsCOMPtr<nsILocalFile> aLocalFile;
614-       NS_GetSpecialDirectory(NS_XPCOM_CURRENT_PROCESS_DIR, getter_AddRefs(aFile));
615-       if (!aFile) {
616+       rv = NS_GetSpecialDirectory(NS_XPCOM_CURRENT_PROCESS_DIR, getter_AddRefs(aFile));
617+       if (NS_FAILED(rv)) {
618                LogError("The Python XPCOM loader could not locate the 'bin' directory\n");
619                return;
620        }
621-       aFile->Append(NS_LITERAL_STRING("python"));
622+       aFile->AppendNative(NS_LITERAL_CSTRING("python"));
623        nsAutoString pathBuf;
624        aFile->GetPath(pathBuf);
625        PyObject *obPath = PySys_GetObject("path");
626Index: test/test_misc.py
627===================================================================
628RCS file: /cvsroot/mozilla/extensions/python/xpcom/test/test_misc.py,v
629retrieving revision 1.8
630diff -u -r1.8 test_misc.py
631--- test/test_misc.py   25 Aug 2004 23:02:43 -0000      1.8
632+++ test/test_misc.py   4 Feb 2005 05:42:39 -0000
633@@ -191,7 +191,7 @@
634             ob = xpcom.components.classes[progid].createInstance()
635         else:
636             ob = progid
637-        self.failUnless(repr(ob).find(progid) >= 0, repr(ob))
638+        self.failUnless(repr(ob).find(str(progid)) >= 0, repr(ob))
639         for interface_name in interfaces.split():
640             self.failUnless(repr(ob).find(interface_name) >= 0, repr(ob))
641