Skip to content

Commit 2acfbdb

Browse files
committed
fix some ffi bugs
1 parent 894c514 commit 2acfbdb

3 files changed

Lines changed: 26 additions & 7 deletions

File tree

pixie/vm/libs/ffi.py

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -394,8 +394,9 @@ def ffi_set_value(self, ptr, val):
394394
vpnt = rffi.cast(rffi.VOIDPP, ptr)
395395
vpnt[0] = rffi.cast(rffi.VOIDP, val.raw_data())
396396
else:
397-
print val
398-
affirm(False, u"Cannot encode this type")
397+
frm_name = rt.name(rt.str(val.type()))
398+
to_name = rt.name(rt.str(self))
399+
affirm(False, u"Cannot encode " + frm_name + u" as " + to_name)
399400

400401

401402
def ffi_size(self):
@@ -445,7 +446,13 @@ def ffi_get_value(self, ptr):
445446

446447
def ffi_set_value(self, ptr, val):
447448
pnt = rffi.cast(rffi.VOIDPP, ptr)
448-
if isinstance(val, Buffer):
449+
if isinstance(val, String):
450+
pnt = rffi.cast(rffi.CCHARPP, ptr)
451+
utf8 = unicode_to_utf8(rt.name(val))
452+
raw = rffi.str2charp(utf8)
453+
pnt[0] = raw
454+
return CCharPToken(raw)
455+
elif isinstance(val, Buffer):
449456
pnt[0] = val.buffer()
450457
elif isinstance(val, VoidP):
451458
pnt[0] = val.raw_data()
@@ -454,8 +461,10 @@ def ffi_set_value(self, ptr, val):
454461
elif isinstance(val, CStruct):
455462
pnt[0] = rffi.cast(rffi.VOIDP, val.raw_data())
456463
else:
457-
print val
458-
affirm(False, u"Cannot encode this type")
464+
frm_name = rt.name(rt.str(val.type()))
465+
to_name = rt.name(rt.str(self))
466+
affirm(False, u"Cannot encode " + frm_name + u" as " + to_name)
467+
459468

460469
def ffi_size(self):
461470
return rffi.sizeof(rffi.VOIDP)

pixie/vm/object.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,16 @@ def runtime_error(msg):
151151
import pixie.vm.rt as rt
152152
raise WrappedException(RuntimeException(rt.wrap(msg)))
153153

154+
def safe_invoke(f, args):
155+
try:
156+
f.invoke(args)
157+
except Exception as ex:
158+
if isinstance(ex, WrappedException):
159+
print "UNSAFE EXCEPTION", ex._ex.__repr__()
160+
else:
161+
print "UNSAFE EXCEPTION", ex
162+
return None
163+
154164
class ErrorInfo(Object):
155165
_type = Type(u"pixie.stdlib.ErrorInfo")
156166
def type(self):

pixie/vm/threads.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from pixie.vm.object import Object, Type
1+
from pixie.vm.object import Object, Type, safe_invoke
22
from pixie.vm.primitives import true
33
import rpython.rlib.rthread as rthread
44
from pixie.vm.primitives import nil
@@ -42,7 +42,7 @@ def bootstrap():
4242
rthread.gc_thread_start()
4343
fn = bootstrapper.fn()
4444
bootstrapper.release()
45-
fn.invoke([])
45+
safe_invoke(fn, [])
4646
rthread.gc_thread_die()
4747

4848
bootstrapper = Bootstrapper()

0 commit comments

Comments
 (0)