Author: fperrad
Date: Sun Jan 15 22:50:57 2006
New Revision: 11205

Modified:
   trunk/languages/lua/classes/luanil.pmc
Log:
Lua :

This patch changes LuaNil PMC, it used to be a singleton, this patch makes it a 
normal PMC.
some other methods are implemented for morphing into other Lua types 
(LuaString, LuaNumber, LuaBoolean).

Courtesy of Klaas-Jan Stol.

+ change Parrot_PMC_typenum by pmc_type

Modified: trunk/languages/lua/classes/luanil.pmc
==============================================================================
--- trunk/languages/lua/classes/luanil.pmc      (original)
+++ trunk/languages/lua/classes/luanil.pmc      Sun Jan 15 22:50:57 2006
@@ -8,8 +8,13 @@ classes/luanil.pmc - Lua Nil

 

 =head1 DESCRIPTION

 

-C<LuaNil> extends C<Python None> to provide a class with the behaviour of

-the Lua C<Nil> value.

+C<LuaNil> provides a class with the behaviour of the Lua C<Nil> value.

+Implementation is based on the Undef PMC. LuaNil is no longer a singleton;

+this would be a problem, as all uninitialized values in Lua are LuaNil.

+If some value is assigned, the LuaNil should morph into the correct type,

+and so a new PMC is constructed anyway. Therefore, we may as well create

+a new PMC right away. Also, creating a new PMC from a singleton class is

+troublesome (if not possible?).

 

 =head2 Overloaded Methods

 

@@ -22,20 +27,27 @@ the Lua C<Nil> value.

 #include "parrot/parrot.h"

 

 static STRING *string_representation;

-static PMC *Lua_Nil;

+static INTVAL dynclass_LuaNumber;

+static INTVAL dynclass_LuaString;

+static INTVAL dynclass_LuaBoolean;

 

-pmclass LuaNil

-    singleton

-    extends None

+pmclass LuaNil   

     dynpmc

     group lua_group

     hll Lua {

 

-/* Class initialization. Caches constant strings that will be used later.

+/* 

+* Class initialization. Caches constant strings that will be used later.

 */

     void class_init() {

         if (pass) {

             string_representation = const_string(INTERP, "nil");

+            dynclass_LuaNumber = pmc_type(INTERP,

+                    string_from_const_cstring(INTERP, "LuaNumber", 0));

+            dynclass_LuaString = pmc_type(INTERP,

+                    string_from_const_cstring(INTERP, "LuaString", 0));

+            dynclass_LuaBoolean = pmc_type(INTERP, 

+                    string_from_const_cstring(INTERP, "LuaBoolean", 0));

         }

     }

 

@@ -78,24 +90,11 @@ Return the string "nil".

         return string_representation;

     }

 

-/*

-

-=item C<void* get_pointer()>

-

-=item C<void set_pointer(void *ptr)>

-

-These two functions are part of the singleton creation interface. For more

-information see F<src/pmc.c>.

-

-=cut

-

-*/

-    void* get_pointer() {

-        return Lua_Nil;

-    }

 

-    void set_pointer(void* ptr) {

-        Lua_Nil = (PMC*)ptr;

+    PMC* clone () {

+        PMC* dest = pmc_new(INTERP, SELF->vtable->base_type);

+        memcpy(&PMC_union(dest), &PMC_union(SELF), sizeof(UnionVal));

+        return dest;

     }

 

 /*

@@ -109,23 +108,60 @@ Return always true.

 */

     PMC* logical_not (PMC* dest) {

         if (!dest)

-            dest = pmc_new(INTERP, pmc_type(INTERP,

-              string_from_const_cstring(INTERP, "LuaBoolean", 0)));

+            dest = pmc_new(INTERP, dynclass_LuaBoolean);

         VTABLE_set_integer_native(INTERP, dest, 1);

         return dest;

     }

 

-}

+/*

+

+=item C<INTVAL defined()>

+

+"nil" in Lua is always undefined.

+

+=cut

+

+*/

+    INTVAL defined() {

+        return 0;

+    }

 

 /*

 

-=back

+=item C<void set_number_native(FLOATVAL)>

+

+=item C<void set_string_native(STRING *)>

 

-=head1 AUTHORS

+=item C<void set_bool(INTVAL)>

 

-Original code by Klaas-Jan Stol.

+Methods to set a new value to this LuaNil PMC. First,

+this PMC is morph'ed into the correct Lua type.

+

+=item C<void morph(INTVAL)>

+

+Morph to another Lua type.

 

 =cut

 

 */

+    void set_number_native(FLOATVAL value) {

+        VTABLE_morph(INTERP, SELF, dynclass_LuaNumber);

+        VTABLE_set_number_native(INTERP, SELF, value);

+    }

+

+    void set_string_native(STRING *value) {

+        VTABLE_morph(INTERP, SELF, dynclass_LuaString);

+        VTABLE_set_string_native(INTERP, SELF, value);

+    }

+

+    void set_bool (INTVAL value) {

+        VTABLE_morph(INTERP, SELF, dynclass_LuaBoolean);

+        VTABLE_set_bool(INTERP, SELF, value);

+    }

+

+    void morph(INTVAL new_type) {

+        pmc_reuse(INTERP, SELF, new_type, 0);

+    }

+

+}

 

Reply via email to