Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
branch: pcc_reorder
Fetching contributors…

Cannot retrieve contributors at this time

290 lines (188 sloc) 5.084 kb
/*
Copyright (C) 2004-2011, Parrot Foundation.
=head1 NAME
src/pmc/undef.pmc - Generic undefined value
=head1 DESCRIPTION
This is Parrot's generic undef type. This PMC has no defined value.
It returns a numeric value of 0, a boolean of false, and an empty string.
When assigned a number, integer, or string it morphs to a Number,
Integer, or String PMC respectively, and when assigned a generic PMC
it morphs into a PMC of the passed-in type and does a same-type assignment
from there.
=head2 Methods
=over 4
=cut
*/
#include "pmc/pmc_object.h"
#define UNDEF_STRING_CLASS enum_class_String
/* HEADERIZER HFILE: none */
/* HEADERIZER BEGIN: static */
/* HEADERIZER END: static */
pmclass Undef no_ro {
/*
=item C<void set_pmc(PMC *other)>
Sets the current PMC to C<*other> by first changing the current PMC to the
appropriate type.
=cut
*/
VTABLE void set_pmc(PMC *other) {
if (!PObj_is_object_TEST(other)) {
Parrot_pmc_reuse(INTERP, SELF, other->vtable->base_type, 0);
VTABLE_set_pmc(INTERP, SELF, other);
}
else {
PMC * const clone = VTABLE_clone(INTERP, other);
void * const attrs = PMC_data(clone);
PMC * const meta = PMC_metadata(clone);
/* now swap memory without leaking it */
PMC_data(clone) = PMC_data(SELF);
PMC_data(SELF) = attrs;
SELF->vtable = clone->vtable;
/* Restore metadata. */
if (!PMC_IS_NULL(meta)) {
PMC * const iter = VTABLE_get_iter(INTERP, meta);
while (VTABLE_get_bool(INTERP, iter)) {
STRING * const key = VTABLE_shift_string(INTERP, iter);
PMC * const value = VTABLE_get_pmc_keyed_str(INTERP, meta, key);
Parrot_pmc_setprop(INTERP, SELF, key, value);
}
}
PMC_data(clone) = NULL;
PObj_is_object_SET(SELF);
}
}
/*
=item C<void assign_pmc(PMC *other)>
Assigns the PMC to the value of C<*other> by first changing the PMC to the
appropriate type.
=cut
*/
VTABLE void assign_pmc(PMC *other) {
/* don't want to call set_pmc if we're assigning an Undef to an Undef */
if (other->vtable->base_type != enum_class_Undef)
VTABLE_set_pmc(INTERP, SELF, other);
}
/*
=item C<INTVAL get_integer()>
Returns 0.
=cut
*/
VTABLE INTVAL get_integer() {
UNUSED(SELF);
UNUSED(INTERP);
return 0;
}
/*
=item C<INTVAL defined()>
Returns 0.
=cut
*/
VTABLE INTVAL defined() {
UNUSED(SELF);
UNUSED(INTERP);
return 0;
}
/*
=item C<void set_integer_native(INTVAL value)>
Morphs the current PMC to an C<Integer> and sets the value from C<value>.
=cut
*/
VTABLE void set_integer_native(INTVAL value) {
Parrot_pmc_reuse(INTERP, SELF, enum_class_Integer, 0);
VTABLE_set_integer_native(INTERP, SELF, value);
}
/*
=item C<FLOATVAL get_number()>
Returns 0.0.
=cut
*/
VTABLE FLOATVAL get_number() {
UNUSED(SELF);
UNUSED(INTERP);
return 0.0;
}
/*
=item C<void set_number_native(FLOATVAL value)>
Morphs the current PMC to a C<Float> and sets the value from C<value>.
=cut
*/
VTABLE void set_number_native(FLOATVAL value) {
Parrot_pmc_reuse(INTERP, SELF, enum_class_Float, 0);
VTABLE_set_number_native(INTERP, SELF, value);
}
/*
=item C<STRING *get_string()>
Returns an empty string.
=cut
*/
VTABLE STRING *get_string() {
UNUSED(SELF);
Parrot_warn(INTERP, PARROT_WARNINGS_UNDEF_FLAG,
"Stringifying an Undef PMC");
return CONST_STRING(INTERP, "");
}
/*
=item C<void set_string_native(STRING *value)>
Morphs the current PMC to a C<String> and sets the value from C<value>.
=cut
*/
VTABLE void set_string_native(STRING *value) {
Parrot_pmc_reuse(INTERP, SELF, enum_class_String, 0);
VTABLE_set_string_native(INTERP, SELF, value);
}
/*
=item C<INTVAL get_bool()>
Returns 0.
=cut
*/
VTABLE INTVAL get_bool() {
UNUSED(SELF);
UNUSED(INTERP);
return 0;
}
/*
=item C<void share()>
Unknown. (TODO)
=cut
*/
VTABLE void share() {
UNUSED(SELF);
UNUSED(INTERP);
/* see src/pmc/integer.pmc */
}
/*
=item C<PMC *clone()>
Clones the current Undef PMC.
=cut
*/
VTABLE PMC *clone() {
return Parrot_pmc_new(INTERP, SELF->vtable->base_type);
}
/*
=item C<INTVAL is_equal(PMC *value)>
Returns 1 if the C<*value> is an Undef PMC, 0 otherwise.
=cut
*/
MULTI INTVAL is_equal(Undef value) {
UNUSED(SELF);
UNUSED(INTERP);
UNUSED(value);
return 1;
}
MULTI INTVAL is_equal(DEFAULT value) {
UNUSED(SELF);
UNUSED(INTERP);
UNUSED(value);
return 0;
}
}
/*
=back
=cut
*/
/*
* Local variables:
* c-file-style: "parrot"
* End:
* vim: expandtab shiftwidth=4 cinoptions='\:2=2' :
*/
Jump to Line
Something went wrong with that request. Please try again.