ref: 5cdcc209367f3497006fe43a51e187f6ae7d2e86
parent: ca79fc1497f30fc4f3bb9bcdc58490b1a93fc476
author: Tor Andersson <tor@ccxvii.net>
date: Tue Jan 21 10:15:22 EST 2014
Simplistic REPL.
--- a/js.h
+++ b/js.h
@@ -10,7 +10,7 @@
/* Basic functions */
js_State *js_newstate(void);
void js_freestate(js_State *J);
-int js_dostring(js_State *J, const char *source);
+int js_dostring(js_State *J, const char *source, int report);
int js_dofile(js_State *J, const char *filename);
void js_gc(js_State *J, int report);
--- a/jscompile.c
+++ b/jscompile.c
@@ -39,7 +39,7 @@
++J->gccounter;
F->filename = js_intern(J, J->filename);
- F->line = name ? name->line : params ? params->line : body->line;
+ F->line = name ? name->line : params ? params->line : body ? body->line : 1;
cfunbody(J, F, name, params, body);
--- a/jsdump.c
+++ b/jsdump.c
@@ -685,22 +685,22 @@
case JS_TSTRING: printf("'%s'", v.u.string); break;
case JS_TOBJECT:
switch (v.u.object->type) {
- case JS_COBJECT: printf("object(%p)", v.u.object); break;
- case JS_CARRAY: printf("array(%p)", v.u.object); break;
+ case JS_COBJECT: printf("[Object %p]", v.u.object); break;
+ case JS_CARRAY: printf("[Array %p]", v.u.object); break;
case JS_CFUNCTION:
- printf("function(%p, %s, %s:%d)",
+ printf("[Function %p, %s, %s:%d]",
v.u.object,
v.u.object->u.f.function->name,
v.u.object->u.f.function->filename,
v.u.object->u.f.function->line);
break;
- case JS_CSCRIPT: printf("script(%s)", v.u.object->u.f.function->filename); break;
- case JS_CCFUNCTION: printf("cfunction(%p)", v.u.object->u.c.function); break;
- case JS_CBOOLEAN: printf("boolean(%d)", v.u.object->u.boolean); break;
- case JS_CNUMBER: printf("number(%g)", v.u.object->u.number); break;
- case JS_CSTRING: printf("string('%s')", v.u.object->u.string); break;
- case JS_CERROR: printf("error()"); break;
- default: printf("<unknown %p>", v.u.object); break;
+ case JS_CSCRIPT: printf("[Function %s]", v.u.object->u.f.function->filename); break;
+ case JS_CCFUNCTION: printf("[Function %p]", v.u.object->u.c.function); break;
+ case JS_CBOOLEAN: printf("[Boolean %d]", v.u.object->u.boolean); break;
+ case JS_CNUMBER: printf("[Number %g]", v.u.object->u.number); break;
+ case JS_CSTRING: printf("[String'%s']", v.u.object->u.string); break;
+ case JS_CERROR: printf("[Error %s]", v.u.object->u.string); break;
+ default: printf("[Object %p]", v.u.object); break;
}
break;
}
--- a/jsparse.c
+++ b/jsparse.c
@@ -950,7 +950,8 @@
next(J);
p = script(J);
- jsP_foldconst(p);
+ if (p)
+ jsP_foldconst(p);
/* patch up global and eval code to return value of last expression */
last = p;
--- a/jsstate.c
+++ b/jsstate.c
@@ -69,7 +69,7 @@
js_endtry(J);
}
-int js_dostring(js_State *J, const char *source)
+int js_dostring(js_State *J, const char *source, int report)
{
if (js_try(J)) {
fprintf(stderr, "libjs: %s\n", js_tostring(J, -1));
@@ -78,6 +78,8 @@
js_loadstring(J, "(string)", source);
js_pushglobal(J);
js_call(J, 0);
+ if (report)
+ printf("%s\n", js_tostring(J, -1));
js_pop(J, 1);
js_endtry(J);
return 0;
--- a/main.c
+++ b/main.c
@@ -1,15 +1,29 @@
+#include <stdio.h>
+
#include "js.h"
+#define PS1 "> "
+
int
main(int argc, char **argv)
{
+ char line[256];
js_State *J;
int i;
J = js_newstate();
- for (i = 1; i < argc; ++i) {
- js_dofile(J, argv[i]);
+ if (argc > 1) {
+ for (i = 1; i < argc; ++i) {
+ js_dofile(J, argv[i]);
+ js_gc(J, 1);
+ }
+ } else {
+ fputs(PS1, stdout);
+ while (fgets(line, sizeof line, stdin)) {
+ js_dostring(J, line, 1);
+ fputs(PS1, stdout);
+ }
js_gc(J, 1);
}