aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMike Pall <mike>2012-09-21 16:32:24 +0200
committerMike Pall <mike>2012-09-21 16:32:24 +0200
commit3dceaa9a7422497aab88dac7c58467c101c5f785 (patch)
tree696564bf8ba4ee3b6a7ffd47cdc8ef1e33d7cde9 /src
parent98f05808fac3b2c439034b9eca55e7e9492e3a9f (diff)
downloadluajit-3dceaa9a7422497aab88dac7c58467c101c5f785.tar.gz
luajit-3dceaa9a7422497aab88dac7c58467c101c5f785.tar.bz2
luajit-3dceaa9a7422497aab88dac7c58467c101c5f785.zip
Move load/dump functions to lj_load.c. Add load modes.
Diffstat (limited to 'src')
-rw-r--r--src/Makefile2
-rw-r--r--src/Makefile.dep31
-rw-r--r--src/lauxlib.h6
-rw-r--r--src/lib_aux.c77
-rw-r--r--src/lj_api.c44
-rw-r--r--src/lj_errmsg.h2
-rw-r--r--src/lj_lex.c2
-rw-r--r--src/lj_lex.h1
-rw-r--r--src/lj_load.c168
-rw-r--r--src/ljamalg.c1
-rw-r--r--src/lua.h2
11 files changed, 197 insertions, 139 deletions
diff --git a/src/Makefile b/src/Makefile
index bfb03e9a..8b7218e7 100644
--- a/src/Makefile
+++ b/src/Makefile
@@ -447,7 +447,7 @@ LJLIB_C= $(LJLIB_O:.o=.c)
447LJCORE_O= lj_gc.o lj_err.o lj_char.o lj_bc.o lj_obj.o \ 447LJCORE_O= lj_gc.o lj_err.o lj_char.o lj_bc.o lj_obj.o \
448 lj_str.o lj_tab.o lj_func.o lj_udata.o lj_meta.o lj_debug.o \ 448 lj_str.o lj_tab.o lj_func.o lj_udata.o lj_meta.o lj_debug.o \
449 lj_state.o lj_dispatch.o lj_vmevent.o lj_vmmath.o lj_strscan.o \ 449 lj_state.o lj_dispatch.o lj_vmevent.o lj_vmmath.o lj_strscan.o \
450 lj_api.o lj_lex.o lj_parse.o lj_bcread.o lj_bcwrite.o \ 450 lj_api.o lj_lex.o lj_parse.o lj_bcread.o lj_bcwrite.o lj_load.o \
451 lj_ir.o lj_opt_mem.o lj_opt_fold.o lj_opt_narrow.o \ 451 lj_ir.o lj_opt_mem.o lj_opt_fold.o lj_opt_narrow.o \
452 lj_opt_dce.o lj_opt_loop.o lj_opt_split.o lj_opt_sink.o \ 452 lj_opt_dce.o lj_opt_loop.o lj_opt_split.o lj_opt_sink.o \
453 lj_mcode.o lj_snap.o lj_record.o lj_crecord.o lj_ffrecord.o \ 453 lj_mcode.o lj_snap.o lj_record.o lj_crecord.o lj_ffrecord.o \
diff --git a/src/Makefile.dep b/src/Makefile.dep
index af5d33b1..99acc044 100644
--- a/src/Makefile.dep
+++ b/src/Makefile.dep
@@ -41,8 +41,7 @@ lj_alloc.o: lj_alloc.c lj_def.h lua.h luaconf.h lj_arch.h lj_alloc.h
41lj_api.o: lj_api.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h lj_gc.h \ 41lj_api.o: lj_api.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h lj_gc.h \
42 lj_err.h lj_errmsg.h lj_debug.h lj_str.h lj_tab.h lj_func.h lj_udata.h \ 42 lj_err.h lj_errmsg.h lj_debug.h lj_str.h lj_tab.h lj_func.h lj_udata.h \
43 lj_meta.h lj_state.h lj_bc.h lj_frame.h lj_trace.h lj_jit.h lj_ir.h \ 43 lj_meta.h lj_state.h lj_bc.h lj_frame.h lj_trace.h lj_jit.h lj_ir.h \
44 lj_dispatch.h lj_traceerr.h lj_vm.h lj_lex.h lj_bcdump.h lj_parse.h \ 44 lj_dispatch.h lj_traceerr.h lj_vm.h lj_strscan.h
45 lj_strscan.h
46lj_asm.o: lj_asm.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h lj_gc.h \ 45lj_asm.o: lj_asm.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h lj_gc.h \
47 lj_str.h lj_tab.h lj_frame.h lj_bc.h lj_ctype.h lj_ir.h lj_jit.h \ 46 lj_str.h lj_tab.h lj_frame.h lj_bc.h lj_ctype.h lj_ir.h lj_jit.h \
48 lj_ircall.h lj_iropt.h lj_mcode.h lj_trace.h lj_dispatch.h lj_traceerr.h \ 47 lj_ircall.h lj_iropt.h lj_mcode.h lj_trace.h lj_dispatch.h lj_traceerr.h \
@@ -125,6 +124,9 @@ lj_lex.o: lj_lex.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h lj_gc.h \
125lj_lib.o: lj_lib.c lauxlib.h lua.h luaconf.h lj_obj.h lj_def.h lj_arch.h \ 124lj_lib.o: lj_lib.c lauxlib.h lua.h luaconf.h lj_obj.h lj_def.h lj_arch.h \
126 lj_gc.h lj_err.h lj_errmsg.h lj_str.h lj_tab.h lj_func.h lj_bc.h \ 125 lj_gc.h lj_err.h lj_errmsg.h lj_str.h lj_tab.h lj_func.h lj_bc.h \
127 lj_dispatch.h lj_jit.h lj_ir.h lj_vm.h lj_strscan.h lj_lib.h 126 lj_dispatch.h lj_jit.h lj_ir.h lj_vm.h lj_strscan.h lj_lib.h
127lj_load.o: lj_load.c lua.h luaconf.h lauxlib.h lj_obj.h lj_def.h \
128 lj_arch.h lj_gc.h lj_err.h lj_errmsg.h lj_str.h lj_func.h lj_frame.h \
129 lj_bc.h lj_vm.h lj_lex.h lj_bcdump.h lj_parse.h
128lj_mcode.o: lj_mcode.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h \ 130lj_mcode.o: lj_mcode.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h \
129 lj_gc.h lj_jit.h lj_ir.h lj_mcode.h lj_trace.h lj_dispatch.h lj_bc.h \ 131 lj_gc.h lj_jit.h lj_ir.h lj_mcode.h lj_trace.h lj_dispatch.h lj_bc.h \
130 lj_traceerr.h lj_vm.h 132 lj_traceerr.h lj_vm.h
@@ -193,18 +195,19 @@ ljamalg.o: ljamalg.c lua.h luaconf.h lauxlib.h lj_gc.c lj_obj.h lj_def.h \
193 lj_obj.c lj_str.c lj_tab.c lj_func.c lj_udata.c lj_meta.c lj_strscan.h \ 195 lj_obj.c lj_str.c lj_tab.c lj_func.c lj_udata.c lj_meta.c lj_strscan.h \
194 lj_debug.c lj_state.c lj_lex.h lj_alloc.h lj_dispatch.c lj_ccallback.h \ 196 lj_debug.c lj_state.c lj_lex.h lj_alloc.h lj_dispatch.c lj_ccallback.h \
195 luajit.h lj_vmevent.c lj_vmevent.h lj_vmmath.c lj_strscan.c lj_api.c \ 197 luajit.h lj_vmevent.c lj_vmevent.h lj_vmmath.c lj_strscan.c lj_api.c \
196 lj_bcdump.h lj_parse.h lj_lex.c lualib.h lj_parse.c lj_bcread.c \ 198 lj_lex.c lualib.h lj_parse.h lj_parse.c lj_bcread.c lj_bcdump.h \
197 lj_bcwrite.c lj_ctype.c lj_cdata.c lj_cconv.h lj_cconv.c lj_ccall.c \ 199 lj_bcwrite.c lj_load.c lj_ctype.c lj_cdata.c lj_cconv.h lj_cconv.c \
198 lj_ccall.h lj_ccallback.c lj_target.h lj_target_*.h lj_mcode.h \ 200 lj_ccall.c lj_ccall.h lj_ccallback.c lj_target.h lj_target_*.h \
199 lj_carith.c lj_carith.h lj_clib.c lj_clib.h lj_cparse.c lj_cparse.h \ 201 lj_mcode.h lj_carith.c lj_carith.h lj_clib.c lj_clib.h lj_cparse.c \
200 lj_lib.c lj_lib.h lj_ir.c lj_ircall.h lj_iropt.h lj_opt_mem.c \ 202 lj_cparse.h lj_lib.c lj_lib.h lj_ir.c lj_ircall.h lj_iropt.h \
201 lj_opt_fold.c lj_folddef.h lj_opt_narrow.c lj_opt_dce.c lj_opt_loop.c \ 203 lj_opt_mem.c lj_opt_fold.c lj_folddef.h lj_opt_narrow.c lj_opt_dce.c \
202 lj_snap.h lj_opt_split.c lj_opt_sink.c lj_mcode.c lj_snap.c lj_record.c \ 204 lj_opt_loop.c lj_snap.h lj_opt_split.c lj_opt_sink.c lj_mcode.c \
203 lj_record.h lj_ffrecord.h lj_crecord.c lj_crecord.h lj_ffrecord.c \ 205 lj_snap.c lj_record.c lj_record.h lj_ffrecord.h lj_crecord.c \
204 lj_recdef.h lj_asm.c lj_asm.h lj_emit_*.h lj_asm_*.h lj_trace.c \ 206 lj_crecord.h lj_ffrecord.c lj_recdef.h lj_asm.c lj_asm.h lj_emit_*.h \
205 lj_gdbjit.h lj_gdbjit.c lj_alloc.c lib_aux.c lib_base.c lj_libdef.h \ 207 lj_asm_*.h lj_trace.c lj_gdbjit.h lj_gdbjit.c lj_alloc.c lib_aux.c \
206 lib_math.c lib_string.c lib_table.c lib_io.c lib_os.c lib_package.c \ 208 lib_base.c lj_libdef.h lib_math.c lib_string.c lib_table.c lib_io.c \
207 lib_debug.c lib_bit.c lib_jit.c lib_ffi.c lib_init.c 209 lib_os.c lib_package.c lib_debug.c lib_bit.c lib_jit.c lib_ffi.c \
210 lib_init.c
208luajit.o: luajit.c lua.h luaconf.h lauxlib.h lualib.h luajit.h lj_arch.h 211luajit.o: luajit.c lua.h luaconf.h lauxlib.h lualib.h luajit.h lj_arch.h
209host/buildvm.o: host/buildvm.c host/buildvm.h lj_def.h lua.h luaconf.h \ 212host/buildvm.o: host/buildvm.c host/buildvm.h lj_def.h lua.h luaconf.h \
210 lj_arch.h lj_obj.h lj_def.h lj_arch.h lj_gc.h lj_obj.h lj_bc.h lj_ir.h \ 213 lj_arch.h lj_obj.h lj_def.h lj_arch.h lj_gc.h lj_obj.h lj_bc.h lj_ir.h \
diff --git a/src/lauxlib.h b/src/lauxlib.h
index 505a9f52..80585f64 100644
--- a/src/lauxlib.h
+++ b/src/lauxlib.h
@@ -75,7 +75,11 @@ LUALIB_API const char *(luaL_gsub) (lua_State *L, const char *s, const char *p,
75LUALIB_API const char *(luaL_findtable) (lua_State *L, int idx, 75LUALIB_API const char *(luaL_findtable) (lua_State *L, int idx,
76 const char *fname, int szhint); 76 const char *fname, int szhint);
77 77
78 78/* From Lua 5.2. */
79LUALIB_API int (luaL_loadfilex) (lua_State *L, const char *filename,
80 const char *mode);
81LUALIB_API int (luaL_loadbufferx) (lua_State *L, const char *buff, size_t sz,
82 const char *name, const char *mode);
79 83
80 84
81/* 85/*
diff --git a/src/lib_aux.c b/src/lib_aux.c
index f25ab65a..8fbee71b 100644
--- a/src/lib_aux.c
+++ b/src/lib_aux.c
@@ -233,83 +233,6 @@ LUALIB_API void luaL_unref(lua_State *L, int t, int ref)
233 } 233 }
234} 234}
235 235
236/* -- Load Lua code ------------------------------------------------------- */
237
238typedef struct FileReaderCtx {
239 FILE *fp;
240 char buf[LUAL_BUFFERSIZE];
241} FileReaderCtx;
242
243static const char *reader_file(lua_State *L, void *ud, size_t *size)
244{
245 FileReaderCtx *ctx = (FileReaderCtx *)ud;
246 UNUSED(L);
247 if (feof(ctx->fp)) return NULL;
248 *size = fread(ctx->buf, 1, sizeof(ctx->buf), ctx->fp);
249 return *size > 0 ? ctx->buf : NULL;
250}
251
252LUALIB_API int luaL_loadfile(lua_State *L, const char *filename)
253{
254 FileReaderCtx ctx;
255 int status;
256 const char *chunkname;
257 if (filename) {
258 ctx.fp = fopen(filename, "rb");
259 if (ctx.fp == NULL) {
260 lua_pushfstring(L, "cannot open %s: %s", filename, strerror(errno));
261 return LUA_ERRFILE;
262 }
263 chunkname = lua_pushfstring(L, "@%s", filename);
264 } else {
265 ctx.fp = stdin;
266 chunkname = "=stdin";
267 }
268 status = lua_load(L, reader_file, &ctx, chunkname);
269 if (ferror(ctx.fp)) {
270 L->top -= filename ? 2 : 1;
271 lua_pushfstring(L, "cannot read %s: %s", chunkname+1, strerror(errno));
272 if (filename)
273 fclose(ctx.fp);
274 return LUA_ERRFILE;
275 }
276 if (filename) {
277 L->top--;
278 copyTV(L, L->top-1, L->top);
279 fclose(ctx.fp);
280 }
281 return status;
282}
283
284typedef struct StringReaderCtx {
285 const char *str;
286 size_t size;
287} StringReaderCtx;
288
289static const char *reader_string(lua_State *L, void *ud, size_t *size)
290{
291 StringReaderCtx *ctx = (StringReaderCtx *)ud;
292 UNUSED(L);
293 if (ctx->size == 0) return NULL;
294 *size = ctx->size;
295 ctx->size = 0;
296 return ctx->str;
297}
298
299LUALIB_API int luaL_loadbuffer(lua_State *L, const char *buf, size_t size,
300 const char *name)
301{
302 StringReaderCtx ctx;
303 ctx.str = buf;
304 ctx.size = size;
305 return lua_load(L, reader_string, &ctx, name);
306}
307
308LUALIB_API int luaL_loadstring(lua_State *L, const char *s)
309{
310 return luaL_loadbuffer(L, s, strlen(s), s);
311}
312
313/* -- Default allocator and panic function -------------------------------- */ 236/* -- Default allocator and panic function -------------------------------- */
314 237
315static int panic(lua_State *L) 238static int panic(lua_State *L)
diff --git a/src/lj_api.c b/src/lj_api.c
index a9ea38d8..5a0bd07a 100644
--- a/src/lj_api.c
+++ b/src/lj_api.c
@@ -23,9 +23,6 @@
23#include "lj_frame.h" 23#include "lj_frame.h"
24#include "lj_trace.h" 24#include "lj_trace.h"
25#include "lj_vm.h" 25#include "lj_vm.h"
26#include "lj_lex.h"
27#include "lj_bcdump.h"
28#include "lj_parse.h"
29#include "lj_strscan.h" 26#include "lj_strscan.h"
30 27
31/* -- Common helper functions --------------------------------------------- */ 28/* -- Common helper functions --------------------------------------------- */
@@ -1138,47 +1135,6 @@ LUA_API int lua_resume(lua_State *L, int nargs)
1138 return LUA_ERRRUN; 1135 return LUA_ERRRUN;
1139} 1136}
1140 1137
1141/* -- Load and dump Lua code ---------------------------------------------- */
1142
1143static TValue *cpparser(lua_State *L, lua_CFunction dummy, void *ud)
1144{
1145 LexState *ls = (LexState *)ud;
1146 GCproto *pt;
1147 GCfunc *fn;
1148 UNUSED(dummy);
1149 cframe_errfunc(L->cframe) = -1; /* Inherit error function. */
1150 pt = lj_lex_setup(L, ls) ? lj_bcread(ls) : lj_parse(ls);
1151 fn = lj_func_newL_empty(L, pt, tabref(L->env));
1152 /* Don't combine above/below into one statement. */
1153 setfuncV(L, L->top++, fn);
1154 return NULL;
1155}
1156
1157LUA_API int lua_load(lua_State *L, lua_Reader reader, void *data,
1158 const char *chunkname)
1159{
1160 LexState ls;
1161 int status;
1162 ls.rfunc = reader;
1163 ls.rdata = data;
1164 ls.chunkarg = chunkname ? chunkname : "?";
1165 lj_str_initbuf(&ls.sb);
1166 status = lj_vm_cpcall(L, NULL, &ls, cpparser);
1167 lj_lex_cleanup(L, &ls);
1168 lj_gc_check(L);
1169 return status;
1170}
1171
1172LUA_API int lua_dump(lua_State *L, lua_Writer writer, void *data)
1173{
1174 cTValue *o = L->top-1;
1175 api_checknelems(L, 1);
1176 if (tvisfunc(o) && isluafunc(funcV(o)))
1177 return lj_bcwrite(L, funcproto(funcV(o)), writer, data, 0);
1178 else
1179 return 1;
1180}
1181
1182/* -- GC and memory management -------------------------------------------- */ 1138/* -- GC and memory management -------------------------------------------- */
1183 1139
1184LUA_API int lua_gc(lua_State *L, int what, int data) 1140LUA_API int lua_gc(lua_State *L, int what, int data)
diff --git a/src/lj_errmsg.h b/src/lj_errmsg.h
index 28c5ca08..da40e848 100644
--- a/src/lj_errmsg.h
+++ b/src/lj_errmsg.h
@@ -111,6 +111,7 @@ ERRDEF(NOJIT, "JIT compiler permanently disabled by build option")
111ERRDEF(JITOPT, "unknown or malformed optimization flag " LUA_QS) 111ERRDEF(JITOPT, "unknown or malformed optimization flag " LUA_QS)
112 112
113/* Lexer/parser errors. */ 113/* Lexer/parser errors. */
114ERRDEF(XMODE, "attempt to load chunk with wrong mode")
114ERRDEF(XNEAR, "%s near " LUA_QS) 115ERRDEF(XNEAR, "%s near " LUA_QS)
115ERRDEF(XELEM, "lexical element too long") 116ERRDEF(XELEM, "lexical element too long")
116ERRDEF(XLINES, "chunk has too many lines") 117ERRDEF(XLINES, "chunk has too many lines")
@@ -144,7 +145,6 @@ ERRDEF(XGSCOPE, "<goto %s> jumps into the scope of local " LUA_QS)
144/* Bytecode reader errors. */ 145/* Bytecode reader errors. */
145ERRDEF(BCFMT, "cannot load incompatible bytecode") 146ERRDEF(BCFMT, "cannot load incompatible bytecode")
146ERRDEF(BCBAD, "cannot load malformed bytecode") 147ERRDEF(BCBAD, "cannot load malformed bytecode")
147ERRDEF(BCHEAD, "attempt to load bytecode with extra header")
148 148
149#if LJ_HASFFI 149#if LJ_HASFFI
150/* FFI errors. */ 150/* FFI errors. */
diff --git a/src/lj_lex.c b/src/lj_lex.c
index e464f420..b54d2a23 100644
--- a/src/lj_lex.c
+++ b/src/lj_lex.c
@@ -406,7 +406,7 @@ int lj_lex_setup(lua_State *L, LexState *ls)
406 ** Lua code by looking at the first char. Since this is a potential 406 ** Lua code by looking at the first char. Since this is a potential
407 ** security violation no attempt is made to echo the chunkname either. 407 ** security violation no attempt is made to echo the chunkname either.
408 */ 408 */
409 setstrV(L, L->top++, lj_err_str(L, LJ_ERR_BCHEAD)); 409 setstrV(L, L->top++, lj_err_str(L, LJ_ERR_BCBAD));
410 lj_err_throw(L, LUA_ERRSYNTAX); 410 lj_err_throw(L, LUA_ERRSYNTAX);
411 } 411 }
412 return 1; 412 return 1;
diff --git a/src/lj_lex.h b/src/lj_lex.h
index 16f35aa5..7a4fd74b 100644
--- a/src/lj_lex.h
+++ b/src/lj_lex.h
@@ -64,6 +64,7 @@ typedef struct LexState {
64 BCLine lastline; /* Line of last token. */ 64 BCLine lastline; /* Line of last token. */
65 GCstr *chunkname; /* Current chunk name (interned string). */ 65 GCstr *chunkname; /* Current chunk name (interned string). */
66 const char *chunkarg; /* Chunk name argument. */ 66 const char *chunkarg; /* Chunk name argument. */
67 const char *mode; /* Allow loading bytecode (b) and/or source text (t). */
67 VarInfo *vstack; /* Stack for names and extents of local variables. */ 68 VarInfo *vstack; /* Stack for names and extents of local variables. */
68 MSize sizevstack; /* Size of variable stack. */ 69 MSize sizevstack; /* Size of variable stack. */
69 MSize vtop; /* Top of variable stack. */ 70 MSize vtop; /* Top of variable stack. */
diff --git a/src/lj_load.c b/src/lj_load.c
new file mode 100644
index 00000000..e30421e6
--- /dev/null
+++ b/src/lj_load.c
@@ -0,0 +1,168 @@
1/*
2** Load and dump code.
3** Copyright (C) 2005-2012 Mike Pall. See Copyright Notice in luajit.h
4*/
5
6#include <errno.h>
7#include <stdio.h>
8
9#define lj_load_c
10#define LUA_CORE
11
12#include "lua.h"
13#include "lauxlib.h"
14
15#include "lj_obj.h"
16#include "lj_gc.h"
17#include "lj_err.h"
18#include "lj_str.h"
19#include "lj_func.h"
20#include "lj_frame.h"
21#include "lj_vm.h"
22#include "lj_lex.h"
23#include "lj_bcdump.h"
24#include "lj_parse.h"
25
26/* -- Load Lua source code and bytecode ----------------------------------- */
27
28static TValue *cpparser(lua_State *L, lua_CFunction dummy, void *ud)
29{
30 LexState *ls = (LexState *)ud;
31 GCproto *pt;
32 GCfunc *fn;
33 int bc;
34 UNUSED(dummy);
35 cframe_errfunc(L->cframe) = -1; /* Inherit error function. */
36 bc = lj_lex_setup(L, ls);
37 if (ls->mode && !strchr(ls->mode, bc ? 'b' : 't')) {
38 setstrV(L, L->top++, lj_err_str(L, LJ_ERR_XMODE));
39 lj_err_throw(L, LUA_ERRSYNTAX);
40 }
41 pt = bc ? lj_bcread(ls) : lj_parse(ls);
42 fn = lj_func_newL_empty(L, pt, tabref(L->env));
43 /* Don't combine above/below into one statement. */
44 setfuncV(L, L->top++, fn);
45 return NULL;
46}
47
48LUA_API int lua_loadx(lua_State *L, lua_Reader reader, void *data,
49 const char *chunkname, const char *mode)
50{
51 LexState ls;
52 int status;
53 ls.rfunc = reader;
54 ls.rdata = data;
55 ls.chunkarg = chunkname ? chunkname : "?";
56 ls.mode = mode;
57 lj_str_initbuf(&ls.sb);
58 status = lj_vm_cpcall(L, NULL, &ls, cpparser);
59 lj_lex_cleanup(L, &ls);
60 lj_gc_check(L);
61 return status;
62}
63
64LUA_API int lua_load(lua_State *L, lua_Reader reader, void *data,
65 const char *chunkname)
66{
67 return lua_loadx(L, reader, data, chunkname, NULL);
68}
69
70typedef struct FileReaderCtx {
71 FILE *fp;
72 char buf[LUAL_BUFFERSIZE];
73} FileReaderCtx;
74
75static const char *reader_file(lua_State *L, void *ud, size_t *size)
76{
77 FileReaderCtx *ctx = (FileReaderCtx *)ud;
78 UNUSED(L);
79 if (feof(ctx->fp)) return NULL;
80 *size = fread(ctx->buf, 1, sizeof(ctx->buf), ctx->fp);
81 return *size > 0 ? ctx->buf : NULL;
82}
83
84LUALIB_API int luaL_loadfilex(lua_State *L, const char *filename,
85 const char *mode)
86{
87 FileReaderCtx ctx;
88 int status;
89 const char *chunkname;
90 if (filename) {
91 ctx.fp = fopen(filename, "rb");
92 if (ctx.fp == NULL) {
93 lua_pushfstring(L, "cannot open %s: %s", filename, strerror(errno));
94 return LUA_ERRFILE;
95 }
96 chunkname = lua_pushfstring(L, "@%s", filename);
97 } else {
98 ctx.fp = stdin;
99 chunkname = "=stdin";
100 }
101 status = lua_loadx(L, reader_file, &ctx, chunkname, mode);
102 if (ferror(ctx.fp)) {
103 L->top -= filename ? 2 : 1;
104 lua_pushfstring(L, "cannot read %s: %s", chunkname+1, strerror(errno));
105 if (filename)
106 fclose(ctx.fp);
107 return LUA_ERRFILE;
108 }
109 if (filename) {
110 L->top--;
111 copyTV(L, L->top-1, L->top);
112 fclose(ctx.fp);
113 }
114 return status;
115}
116
117LUALIB_API int luaL_loadfile(lua_State *L, const char *filename)
118{
119 return luaL_loadfilex(L, filename, NULL);
120}
121
122typedef struct StringReaderCtx {
123 const char *str;
124 size_t size;
125} StringReaderCtx;
126
127static const char *reader_string(lua_State *L, void *ud, size_t *size)
128{
129 StringReaderCtx *ctx = (StringReaderCtx *)ud;
130 UNUSED(L);
131 if (ctx->size == 0) return NULL;
132 *size = ctx->size;
133 ctx->size = 0;
134 return ctx->str;
135}
136
137LUALIB_API int luaL_loadbufferx(lua_State *L, const char *buf, size_t size,
138 const char *name, const char *mode)
139{
140 StringReaderCtx ctx;
141 ctx.str = buf;
142 ctx.size = size;
143 return lua_loadx(L, reader_string, &ctx, name, mode);
144}
145
146LUALIB_API int luaL_loadbuffer(lua_State *L, const char *buf, size_t size,
147 const char *name)
148{
149 return luaL_loadbufferx(L, buf, size, name, NULL);
150}
151
152LUALIB_API int luaL_loadstring(lua_State *L, const char *s)
153{
154 return luaL_loadbuffer(L, s, strlen(s), s);
155}
156
157/* -- Dump bytecode ------------------------------------------------------- */
158
159LUA_API int lua_dump(lua_State *L, lua_Writer writer, void *data)
160{
161 cTValue *o = L->top-1;
162 api_check(L, L->top > L->base);
163 if (tvisfunc(o) && isluafunc(funcV(o)))
164 return lj_bcwrite(L, funcproto(funcV(o)), writer, data, 0);
165 else
166 return 1;
167}
168
diff --git a/src/ljamalg.c b/src/ljamalg.c
index a64c9429..7aae6260 100644
--- a/src/ljamalg.c
+++ b/src/ljamalg.c
@@ -49,6 +49,7 @@
49#include "lj_parse.c" 49#include "lj_parse.c"
50#include "lj_bcread.c" 50#include "lj_bcread.c"
51#include "lj_bcwrite.c" 51#include "lj_bcwrite.c"
52#include "lj_load.c"
52#include "lj_ctype.c" 53#include "lj_ctype.c"
53#include "lj_cdata.c" 54#include "lj_cdata.c"
54#include "lj_cconv.c" 55#include "lj_cconv.c"
diff --git a/src/lua.h b/src/lua.h
index 9e9357a8..c83fd3bb 100644
--- a/src/lua.h
+++ b/src/lua.h
@@ -344,6 +344,8 @@ LUA_API int lua_gethookcount (lua_State *L);
344/* From Lua 5.2. */ 344/* From Lua 5.2. */
345LUA_API void *lua_upvalueid (lua_State *L, int idx, int n); 345LUA_API void *lua_upvalueid (lua_State *L, int idx, int n);
346LUA_API void lua_upvaluejoin (lua_State *L, int idx1, int n1, int idx2, int n2); 346LUA_API void lua_upvaluejoin (lua_State *L, int idx1, int n1, int idx2, int n2);
347LUA_API int lua_loadx (lua_State *L, lua_Reader reader, void *dt,
348 const char *chunkname, const char *mode);
347 349
348 350
349struct lua_Debug { 351struct lua_Debug {