Author: fperrad
Date: Thu Feb 21 00:05:03 2008
New Revision: 25928

Modified:
   trunk/languages/lua/lib/luafile.pir
   trunk/languages/lua/lib/luaio.pir
   trunk/languages/lua/pmc/luauserdata.pmc

Log:
[Lua]
aligned with Lua 5.1.3 (part 3)

Modified: trunk/languages/lua/lib/luafile.pir
==============================================================================
--- trunk/languages/lua/lib/luafile.pir (original)
+++ trunk/languages/lua/lib/luafile.pir Thu Feb 21 00:05:03 2008
@@ -19,7 +19,9 @@
 .namespace [ 'Lua::io::file' ]
 
 .sub 'createmeta'
-    .param pmc env
+    .local pmc _lua__GLOBAL
+    _lua__GLOBAL = get_hll_global '_G'
+
     .local pmc _file
     _file = lua_newmetatable('ParrotIO')
 
@@ -28,47 +30,47 @@
     _file[$P1] = _file
 
     .const .Sub _file_close = 'close'
-    _file_close.'setfenv'(env)
+    _file_close.'setfenv'(_lua__GLOBAL)
     set $P1, 'close'
     _file[$P1] = _file_close
 
     .const .Sub _file_flush = 'flush'
-    _file_flush.'setfenv'(env)
+    _file_flush.'setfenv'(_lua__GLOBAL)
     set $P1, 'flush'
     _file[$P1] = _file_flush
 
     .const .Sub _file_lines = 'lines'
-    _file_lines.'setfenv'(env)
+    _file_lines.'setfenv'(_lua__GLOBAL)
     set $P1, 'lines'
     _file[$P1] = _file_lines
 
     .const .Sub _file_read = 'read'
-    _file_read.'setfenv'(env)
+    _file_read.'setfenv'(_lua__GLOBAL)
     set $P1, 'read'
     _file[$P1] = _file_read
 
     .const .Sub _file_seek = 'seek'
-    _file_seek.'setfenv'(env)
+    _file_seek.'setfenv'(_lua__GLOBAL)
     set $P1, 'seek'
     _file[$P1] = _file_seek
 
     .const .Sub _file_setvbuf = 'setvbuf'
-    _file_setvbuf.'setfenv'(env)
+    _file_setvbuf.'setfenv'(_lua__GLOBAL)
     set $P1, 'setvbuf'
     _file[$P1] = _file_setvbuf
 
     .const .Sub _file_write = 'write'
-    _file_write.'setfenv'(env)
+    _file_write.'setfenv'(_lua__GLOBAL)
     set $P1, 'write'
     _file[$P1] = _file_write
 
     .const .Sub _file__gc = '__gc'
-    _file__gc.'setfenv'(env)
+    _file__gc.'setfenv'(_lua__GLOBAL)
     set $P1, '__gc'
     _file[$P1] = _file__gc
 
     .const .Sub _file__tostring = '__tostring'
-    _file__tostring.'setfenv'(env)
+    _file__tostring.'setfenv'(_lua__GLOBAL)
     set $P1, '__tostring'
     _file[$P1] = _file__tostring
 

Modified: trunk/languages/lua/lib/luaio.pir
==============================================================================
--- trunk/languages/lua/lib/luaio.pir   (original)
+++ trunk/languages/lua/lib/luaio.pir   Thu Feb 21 00:05:03 2008
@@ -39,16 +39,18 @@
 .sub 'luaopen_io'
 #    print "init Lua I/O\n"
 
-    .local pmc _lua__GLOBAL
-    _lua__GLOBAL = get_hll_global '_G'
-    new $P1, 'LuaString'
+    .local pmc _file
+    $P0 = get_hll_global ['Lua::io::file'], 'createmeta'
+    _file = $P0()
 
+    # create (private) environment (with fields IO_INPUT, IO_OUTPUT, __close)
     .local pmc _io_env
-    new _io_env, 'LuaTable'
+    .const .Sub _io_fclose = 'fclose'
+    _io_env = newfenv(_io_fclose)
 
-    .local pmc _file
-    $P0 = get_hll_global ['Lua::io::file'], 'createmeta'
-    _file = $P0(_io_env)
+    .local pmc _lua__GLOBAL
+    _lua__GLOBAL = get_hll_global '_G'
+    new $P1, 'LuaString'
 
     .local pmc _io
     new _io, 'LuaTable'
@@ -115,19 +117,22 @@
     .const .Sub _readline = 'readline'
     _readline.'setfenv'(_io_env)
 
-
-    # set default close function
-    .const .Sub _io_fclose = 'fclose'
-    _io_fclose.'setfenv'(_io_env)
-    set $P1, '__close'
-    _io_env[$P1] = _io_fclose
-
     # create (and set) default files
     createstdfiles(_file, _io, _io_env)
 
 .end
 
 
+.sub 'newfenv' :anon
+    .param pmc fct
+    .local pmc env
+    new env, 'LuaTable'
+    .const .LuaString key = '__close'
+    env[key] = fct
+    .return (env)
+.end
+
+
 .const int IO_INPUT = 1
 .const int IO_OUTPUT = 2
 
@@ -135,7 +140,10 @@
 .sub 'createstdfiles' :anon
     .param pmc mt
     .param pmc io
-    .param pmc env
+    .param pmc io_env
+    .local pmc env
+    .const .Sub _io_noclose = 'noclose'
+    env = newfenv(_io_noclose) # close function for default files
     new $P1, 'LuaString'
     new $P3, 'LuaNumber'
 
@@ -144,24 +152,27 @@
     new $P0, 'LuaUserdata'
     setattribute $P0, 'data', $P2
     $P0.'set_metatable'(mt)
+    $P0.'setfenv'(env)
     io[$P1] = $P0
     set $P3, IO_INPUT
-    env[$P3] = $P0
+    io_env[$P3] = $P0
 
     set $P1, 'stdout'
     $P2 = getstdout
     new $P0, 'LuaUserdata'
     setattribute $P0, 'data', $P2
     $P0.'set_metatable'(mt)
+    $P0.'setfenv'(env)
     io[$P1] = $P0
     set $P3, IO_OUTPUT
-    env[$P3] = $P0
+    io_env[$P3] = $P0
 
     set $P1, 'stderr'
     $P2 = getstderr
     new $P0, 'LuaUserdata'
     setattribute $P0, 'data', $P2
     $P0.'set_metatable'(mt)
+    $P0.'setfenv'(env)
     io[$P1] = $P0
 .end
 
@@ -233,14 +244,18 @@
 
 .sub 'newfile' :anon
     .local pmc file
+    new file, 'LuaUserdata'
+    $P0 = getinterp
+    $P1 = $P0['sub'; 1]
+    .local pmc env
+    env = $P1.'getfenv'()
+    file.'setfenv'(env)
     .local pmc _lua__REGISTRY
-    .local pmc mt
     _lua__REGISTRY = get_hll_global '_REGISTRY'
     .const .LuaString key = 'ParrotIO'
+    .local pmc mt
     mt = _lua__REGISTRY[key]
-    new file, 'LuaUserdata'
     file.'set_metatable'(mt)
-    # TODO : setfenv with the caller one
     .return (file)
 .end
 
@@ -366,20 +381,11 @@
 
 .sub 'aux_close'
     .param pmc file
-    .local pmc f
-    f = tofilep(file)
-    $P0 = getstdin
-    $I0 = issame $P0, f
-    if $I0 goto L1
-    $P0 = getstdout
-    $I0 = issame $P0, f
-    if $I0 goto L1
-    $P0 = getstderr
-    $I0 = issame $P0, f
-    if $I0 goto L1
-    .return fclose(file)
-  L1:
-    .return noclose(file)
+    .local pmc env
+    env = file.'getfenv'()
+    .const .LuaString key = '__close'
+    $P0 = env[key]
+    .return $P0(file)
 .end
 
 .sub 'aux_lines' :lex

Modified: trunk/languages/lua/pmc/luauserdata.pmc
==============================================================================
--- trunk/languages/lua/pmc/luauserdata.pmc     (original)
+++ trunk/languages/lua/pmc/luauserdata.pmc     Thu Feb 21 00:05:03 2008
@@ -1,5 +1,5 @@
 /*
-Copyright (C) 2005-2007, The Perl Foundation.
+Copyright (C) 2005-2008, The Perl Foundation.
 $Id$
 
 =head1 NAME
@@ -21,6 +21,13 @@
 
 #include "lua_private.h"
 
+typedef struct {
+    PMC * val;
+    PMC * env;
+} userdata_t;
+
+#define u_val(pmc) (PMC_data_typed((pmc), userdata_t *))->val
+#define u_env(pmc) (PMC_data_typed((pmc), userdata_t *))->env
 
 pmclass LuaUserdata
     extends LuaAny
@@ -40,7 +47,8 @@
 
 */
     void init() {
-        PMC_pmc_val(SELF) = NULL;
+        userdata_t *u = mem_allocate_zeroed_typed(userdata_t);
+        PMC_data(SELF) = u;
         PMC_metadata(SELF) = NULL;
         PObj_custom_mark_destroy_SETALL(SELF);
     }
@@ -55,8 +63,10 @@
 
 */
     void mark() {
-        if (PMC_pmc_val(SELF))
-            pobject_lives(INTERP, (PObj *)PMC_pmc_val(SELF));
+        if (u_val(SELF))
+            pobject_lives(INTERP, (PObj *)u_val(SELF));
+        if (u_env(SELF))
+            pobject_lives(INTERP, (PObj *)u_env(SELF));
         if (PMC_metadata(SELF))
             pobject_lives(INTERP, (PObj *)PMC_metadata(SELF));
     }
@@ -71,12 +81,14 @@
 
 */
     void destroy() {
+        userdata_t *u = PMC_data_typed(SELF, userdata_t *);
         PMC* meth = find_meth(INTERP, SELF, "__gc");
         if (meth != NULL) {
             (void)Parrot_runops_fromc_args(INTERP, meth, "vP", SELF);
         }
-        if (PMC_pmc_val(SELF)) {
-            PMC_pmc_val(SELF) = NULL;
+        if (u) {
+            mem_sys_free(u);
+            PMC_data(SELF) = NULL;
         }
     }
 
@@ -123,7 +135,8 @@
 
 */
     void set_pmc(PMC *value) {
-        PMC_struct_val(SELF) = PMC_struct_val(value);
+        u_val(SELF) = u_val(value);
+        u_env(SELF) = u_env(value);
         PMC_metadata(SELF) = PMC_metadata(value);
     }
 
@@ -135,7 +148,7 @@
 
 */
     PMC* get_attr_str(STRING* key) {
-        return PMC_pmc_val(SELF);
+        return u_val(SELF);
     }
 
 /*
@@ -146,7 +159,7 @@
 
 */
     void set_attr_str(STRING* key, PMC* value) {
-        PMC_pmc_val(SELF) = value;
+        u_val(SELF) = value;
     }
 
 /*
@@ -214,6 +227,21 @@
 
 =over 4
 
+=item C<PMC *getfenv()>
+
+=cut
+
+*/
+    METHOD PMC* getfenv() {
+        PMC *retval = u_env(SELF);
+        if (retval != NULL)
+            return retval;
+        else
+            return pmc_new(INTERP, dynpmc_LuaNil);
+    }
+
+/*
+
 =item C<PMC *get_metatable()>
 
 =cut
@@ -236,7 +264,8 @@
     METHOD PMC* rawequal(PMC* value) {
         PMC* retval = pmc_new(INTERP, dynpmc_LuaBoolean);
         if (PMC_type(SELF) == PMC_type(value)
-         && SELF == value)
+         && u_val(SELF) == u_val(value)
+         && u_env(SELF) == u_env(value))
             PMC_int_val(retval) = 1;
         else
             PMC_int_val(retval) = 0;
@@ -245,6 +274,17 @@
 
 /*
 
+=item C<void setfenv(PMC *env)>
+
+=cut
+
+*/
+    METHOD void setfenv(PMC *env) {
+        u_env(SELF) = env;
+    }
+
+/*
+
 =item C<void set_metatable(PMC *meta)>
 
 =cut

Reply via email to