diff --git a/objects/src/instance.winxed b/objects/src/instance.winxed index 779c695..479c7b4 100644 --- a/objects/src/instance.winxed +++ b/objects/src/instance.winxed @@ -50,10 +50,7 @@ class instance { } function invoke[vtable](var p [slurpy], var n [slurpy,named]) { - var sub; - - if(self.__class__ != null) - sub = self.__class__.__call__; + var sub = self.__call__; // if sub is a parrot Sub, it'll get executed // if sub is an instance with __call__, this invoke will get called, @@ -63,7 +60,8 @@ class instance { function find_method[vtable](string name) { // likely broken - var method = self.__dict__[name]; + using Python.instance.get_pmc_keyed_str; + var method = self.*get_pmc_keyed_str(name); // closure to soak up the obj return function(var obj, var p[slurpy], var n[slurpy,named]) { @@ -83,10 +81,9 @@ class instance { if(exists dict['__class__']) { var cls = dict['__class__']; - for(var i in get_mro(cls)) { + for(var i in get_mro(cls)) if(exists i.__dict__['__getattribute__']) return i.__dict__['__getattribute__'](self, name); - } } return dict[name]; diff --git a/objects/src/object.winxed b/objects/src/object.winxed index 0fb80f2..447a3a9 100644 --- a/objects/src/object.winxed +++ b/objects/src/object.winxed @@ -21,11 +21,10 @@ function object(type) { t.__init__ = function(obj) {}; t.__call__ = function() { - var f = t.__new__; - var n = f(t); - //f = n.__init__; - //f(n); + say('creating object instance'); + var n = t.__new__(t); n.__init__(n); + return n; }; diff --git a/objects/src/type.winxed b/objects/src/type.winxed index ae45b3e..2f5c1a5 100644 --- a/objects/src/type.winxed +++ b/objects/src/type.winxed @@ -19,6 +19,7 @@ function type() { }; t.__call__ = function(obj) { + say('creating type instance'); return obj.__class__; }; diff --git a/objects/t/instance.t b/objects/t/instance.t index a6242da..ea70a3c 100644 --- a/objects/t/instance.t +++ b/objects/t/instance.t @@ -99,10 +99,8 @@ class instance { function call() { var i = new Python.instance; - var c = new Python.instance; - i.__class__ = c; - c.__call__ = function(self){return 42;}; + i.__call__ = function(obj){return 42;}; self.assert.equal(i(), 42); } diff --git a/objects/t/type.t b/objects/t/type.t index 1880eb4..04ea694 100644 --- a/objects/t/type.t +++ b/objects/t/type.t @@ -111,14 +111,11 @@ class type { :(var t, var o) = boot(); var i = o(); - say(i.__class__.__name__); - //self.assert.same(i.__class__, o); + self.assert.same(i.__class__, o); // it's t instead of o for some reason } function instance_get() { - self.status.todo('__getattribute__ broken for now.'); - :(var t, var o) = boot(); var func = o.__new__; @@ -155,20 +152,19 @@ class type { function instance_set_attr() { :(var t, var o) = boot(); - var func = o.__new__; - var i = func(o); + var i = o.__new__(o); i.foo = 'bar'; + self.assert.equal(i.foo, 'bar'); } function non_data_descriptor() { :(var t, var o) = boot(); - var f = o.__new__; - var i = f(o); - - i.__get__ = function(attr, obj) {return 42;}; + var i = o.__new__(o); + i.__get__ = function(obj, attr) {return 42;}; t.i = i; + self.assert.equal(t.i, 42); } }