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