# HG changeset patch # User Atul Varma # Date 1252387077 25200 # Node ID b7037cd0f375a4fe556306af183007fcb5d86dde # Parent 64fb84017d87f8031f18f2a6ad22d251bc7579c4 Added support for exposing object properties to JS. diff -r 64fb84017d87 -r b7037cd0f375 pydershell/pydershell.py --- a/pydershell/pydershell.py Mon Sep 07 17:20:24 2009 -0700 +++ b/pydershell/pydershell.py Mon Sep 07 22:17:57 2009 -0700 @@ -336,6 +336,32 @@ pyproto = type(value) if pyproto not in self.__type_protos: jsproto = self.cx.new_object() + if hasattr(pyproto, '__jsprops__'): + define_getter = self.cx.get_property(jsproto, + '__defineGetter__') + define_setter = self.cx.get_property(jsproto, + '__defineSetter__') + for name in pyproto.__jsprops__: + prop = getattr(pyproto, name) + if not type(prop) == property: + raise TypeError("Expected attribute '%s' to " + "be a property" % name) + getter = None + setter = None + if prop.fget: + getter = self.__wrap_pycallable(prop.fget, + pyproto) + if prop.fset: + setter = self.__wrap_pycallable(prop.fset, + pyproto) + if getter: + self.cx.call_function(jsproto, + define_getter, + (name, getter)) + if setter: + self.cx.call_function(jsproto, + define_setter, + (name, setter,)) for name in dir(pyproto): attr = getattr(pyproto, name) if (isinstance(attr, types.UnboundMethodType) and diff -r 64fb84017d87 -r b7037cd0f375 pydershell/test.js --- a/pydershell/test.js Mon Sep 07 17:20:24 2009 -0700 +++ b/pydershell/test.js Mon Sep 07 22:17:57 2009 -0700 @@ -17,3 +17,7 @@ var mybaz = baz(); print(mybaz.woozle(5)); ensureBaz(mybaz); +print(mybaz.moose); +print(mybaz.moose); +mybaz.moose = 0; +print(mybaz.moose); diff -r 64fb84017d87 -r b7037cd0f375 pydershell/test.py --- a/pydershell/test.py Mon Sep 07 17:20:24 2009 -0700 +++ b/pydershell/test.py Mon Sep 07 22:17:57 2009 -0700 @@ -11,6 +11,20 @@ sandbox = JsSandbox() class Baz(JsExposedObject): + __jsprops__ = ['moose'] + + def __init__(self): + self._moose = 0 + + def get_moose(self): + self._moose += 1 + return self._moose + + def set_moose(self, value): + self._moose = value + + moose = property(get_moose, set_moose) + @jsexposed def woozle(self, blap): return blap + 5