Dan Sugalski <[EMAIL PROTECTED]> wrote:
> I sync'd up with subversion this afternoon, and I'm finding that a
> *lot* of things that used to work for me are now breaking really
> badly. Specifically where there used to be sane fallbacks for pretty
> much all of the MMD functions now we've got nothing and I'm having to
> install a lot of crud I never used to have to.

You are not very verbose about what actually fails, but I presume that
you are speaking of ParrotObjects, which happened to call the mmd
fallback functions in absence of a C<mmdvtregister> overload.

> I assume that we didn't throw away all the default functions on
> purpose, since that'd be more than a little foolish.

Well, if this is sane or foolish is probably a matter of taste or usage.
I think that arbitrary objects shouldn't have floating point
mathematical semantics. If your class C<isa> float then you can just
sublass a C<Float>. If it C<isa> integer then subclass C<Integer>.

.pragma n_operators 1
.sub _main @MAIN
    $P0 = subclass "Float", "Foo"
    $P1 = new "Foo"     # [2]
    $P2 = new "Foo"
    $P1 = 2
    $P2 = 40
    $P0 = $P1 + $P2
    print $P0
    print "\n"
    typeof $S0, $P0
    print $S0
    print "\n"
.end

> ... Is this stuff
> being worked on, or shall I take some time to throw the default code
> back into the MMD subsystem?

All the fallback functions where just duplicating code from (mostly)
float.pmc or integer.pmc. All these functions are available in these
PMCs anyway, a lot of common code is in scalar.pmc.

The only thing that still needs work is to always return a PMC of a type
belonging to the type system of the HLL in use. Most of this is done [3],
only some explicit enum_class_* in classes/*.pmc needs replacing by the
equivalent of:

           dest = pmc_new(INTERP,
                Parrot_get_ctx_HLL_type(INTERP, enum_class_Float));

(this is from Complex.absolute - the abs() of a C<PyComplex> C<isa>
C<PyFloat> albeit the C<absolute> function is only implemented in Parrot
core and not in Python PMCs)

If the class needs some custom behavior, drop an appropriate function
into it's namespace and it works:

.namespace ["Foo"]
.sub __add
    .param pmc l
    .param pmc r
    print "in add\n"
    $P0 = new "Foo"
    $P0 = 77
    .return($P0)
.end

leo

[1]
$ cat mmd1.imc
.sub _main @MAIN
    $P0 = newclass "Foo"
    $I0 = find_type "Foo"

    $P0 = new $I0
    $P1 = new $I0
    $P2 = new $I0
    $P0 = $P1 + $P2
.end

$  ../parrot-0.1.2/parrot mmd1.imc
Can't find method '__get_number' for object 'Foo'

(The backtrace reveals that C<mmd_fallback_add_pmc> was called)

[2]
With a C<.HLL> declaration numeric types are working too.

[3]
src/hll.c

Reply via email to