summaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/codegen.c2
-rw-r--r--src/compile.h91
-rw-r--r--src/gc.h8
-rw-r--r--src/init.c3
-rw-r--r--src/parse.y98
-rw-r--r--src/print.c13
-rw-r--r--src/version.c81
-rw-r--r--src/version.h38
8 files changed, 64 insertions, 270 deletions
diff --git a/src/codegen.c b/src/codegen.c
index 0abd9e67e..e039e72dc 100644
--- a/src/codegen.c
+++ b/src/codegen.c
@@ -9,7 +9,7 @@
#include "mruby.h"
#include "mruby/irep.h"
-#include "compile.h"
+#include "mruby/compile.h"
#include "mruby/proc.h"
#include "opcode.h"
#include "mruby/string.h"
diff --git a/src/compile.h b/src/compile.h
deleted file mode 100644
index ba1dfd2ee..000000000
--- a/src/compile.h
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
-** compile.h - mruby parser
-**
-** See Copyright Notice in mruby.h
-*/
-
-#include "mruby.h"
-#include <stdio.h>
-#include <setjmp.h>
-
-typedef struct mrb_ast_node {
- struct mrb_ast_node *car, *cdr;
-} mrb_ast_node;
-
-#include "node.h"
-#include "pool.h"
-#include <stdio.h>
-
-enum mrb_lex_state_enum {
- EXPR_BEG, /* ignore newline, +/- is a sign. */
- EXPR_END, /* newline significant, +/- is an operator. */
- EXPR_ENDARG, /* ditto, and unbound braces. */
- EXPR_ENDFN, /* ditto, and unbound braces. */
- EXPR_ARG, /* newline significant, +/- is an operator. */
- EXPR_CMDARG, /* newline significant, +/- is an operator. */
- EXPR_MID, /* newline significant, +/- is an operator. */
- EXPR_FNAME, /* ignore newline, no reserved words. */
- EXPR_DOT, /* right after `.' or `::', no reserved words. */
- EXPR_CLASS, /* immediate after `class', no here document. */
- EXPR_VALUE, /* alike EXPR_BEG but label is disallowed. */
- EXPR_MAX_STATE
-};
-
-struct mrb_parser_message {
- int lineno;
- int column;
- char* message;
-};
-
-struct mrb_parser_state {
- mrb_state *mrb;
- struct mrb_pool *pool;
- mrb_ast_node *cells;
- const char *s, *send;
- FILE *f;
- int lineno;
- int column;
- const char *filename;
-
- enum mrb_lex_state_enum lstate;
- int sterm;
-
- unsigned int cond_stack;
- unsigned int cmdarg_stack;
- int paren_nest;
- int lpar_beg;
-
- mrb_ast_node *pb;
- char buf[1024];
- int bidx;
-
- mrb_ast_node *heredoc;
-
- int in_def, in_single, cmd_start;
- mrb_ast_node *locals;
-
- void *ylval;
-
- int nerr;
- int nwarn;
- mrb_ast_node *tree, *begin_tree;
-
- int capture_errors;
- struct mrb_parser_message error_buffer[10];
- struct mrb_parser_message warn_buffer[10];
-
- jmp_buf jmp;
-};
-
-struct mrb_parser_state* mrb_parse_file(mrb_state*,FILE*,const char*,int);
-struct mrb_parser_state* mrb_parse_string(mrb_state*,const char*);
-struct mrb_parser_state* mrb_parse_nstring(mrb_state*,const char*,size_t);
-struct mrb_parser_state* mrb_parse_nstring_ext(mrb_state*,const char*,size_t);
-int mrb_generate_code(mrb_state*, mrb_ast_node*);
-
-int mrb_compile_file(mrb_state*,FILE*,const char*,int);
-int mrb_compile_string(mrb_state*,char*);
-int mrb_compile_nstring(mrb_state*,char*,size_t);
-
-const char *mrb_parser_filename(struct mrb_parser_state *p, const char *s);
-int mrb_parser_lineno(struct mrb_parser_state *p, int n);
diff --git a/src/gc.h b/src/gc.h
index 61f8ce96a..0a4bc1c51 100644
--- a/src/gc.h
+++ b/src/gc.h
@@ -7,6 +7,10 @@
#ifndef MRUBY_GC_H
#define MRUBY_GC_H
+#if defined(__cplusplus)
+extern "C" {
+#endif
+
typedef struct {
union {
struct free_obj {
@@ -41,4 +45,8 @@ void mrb_gc_mark_ht(mrb_state*, struct RHash*);
size_t mrb_gc_mark_ht_size(mrb_state*, struct RHash*);
void mrb_gc_free_ht(mrb_state*, struct RHash*);
+#if defined(__cplusplus)
+} /* extern "C" { */
+#endif
+
#endif /* MRUBY_GC_H */
diff --git a/src/init.c b/src/init.c
index 0d4b9721d..ea5591278 100644
--- a/src/init.c
+++ b/src/init.c
@@ -28,8 +28,6 @@ void mrb_init_file(mrb_state *);
void mrb_init_thread(mrb_state *);
void mrb_init_struct(mrb_state *);
void mrb_init_gc(mrb_state *);
-void Init_var_tables(mrb_state *mrb);
-void Init_version(mrb_state *mrb);
void mrb_init_print(mrb_state *mrb);
void mrb_init_mrblib(mrb_state *mrb);
void mrb_init_math(mrb_state *mrb);
@@ -48,7 +46,6 @@ mrb_init_core(mrb_state *mrb)
mrb_init_symbols(mrb);
mrb_init_proc(mrb);
mrb_init_string(mrb);
- Init_version(mrb); /* after init_string */
mrb_init_array(mrb);
mrb_init_hash(mrb);
mrb_init_numeric(mrb);
diff --git a/src/parse.y b/src/parse.y
index fb3526034..41363b49e 100644
--- a/src/parse.y
+++ b/src/parse.y
@@ -14,7 +14,7 @@
#include "mruby.h"
#include "st.h"
-#include "compile.h"
+#include "mruby/compile.h"
#include <stdio.h>
#include <errno.h>
#include <ctype.h>
@@ -967,12 +967,11 @@ var_reference(parser_state *p, node *lhs)
%%
program : {
p->lstate = EXPR_BEG;
- local_nest(p);
+ if (!p->locals) p->locals = cons(0,0);
}
top_compstmt
{
p->tree = new_scope(p, $2);
- local_unnest(p);
}
;
@@ -2955,9 +2954,9 @@ yywarn(parser_state *p, const char *s)
n = strlen(s);
c = parser_palloc(p, n + 1);
memcpy(c, s, n + 1);
- p->error_buffer[p->nwarn].message = c;
- p->error_buffer[p->nwarn].lineno = p->lineno;
- p->error_buffer[p->nwarn].column = p->column;
+ p->warn_buffer[p->nwarn].message = c;
+ p->warn_buffer[p->nwarn].lineno = p->lineno;
+ p->warn_buffer[p->nwarn].column = p->column;
}
p->nwarn++;
}
@@ -4618,8 +4617,8 @@ yylex(void *lval, parser_state *p)
return t;
}
-static void
-start_parser(parser_state *p)
+void
+mrb_parser_parse(parser_state *p)
{
node *tree;
@@ -4631,6 +4630,9 @@ start_parser(parser_state *p)
}
yyparse(p);
tree = p->tree;
+ if ((int)tree->car == NODE_SCOPE) {
+ p->locals = cons(tree->cdr->car, 0);
+ }
if (!tree) {
if (p->begin_tree) {
tree = p->begin_tree;
@@ -4645,8 +4647,8 @@ start_parser(parser_state *p)
}
}
-static parser_state*
-parser_new(mrb_state *mrb)
+parser_state*
+mrb_parser_new(mrb_state *mrb)
{
mrb_pool *pool;
parser_state *p;
@@ -4661,6 +4663,9 @@ parser_new(mrb_state *mrb)
p->pool = pool;
p->in_def = p->in_single = 0;
+ p->s = p->send = NULL;
+ p->f = NULL;
+
p->cmd_start = TRUE;
p->in_def = p->in_single = FALSE;
@@ -4674,50 +4679,51 @@ parser_new(mrb_state *mrb)
return p;
}
-parser_state*
-mrb_parse_file(mrb_state *mrb, FILE *f, const char *fn, int line)
+const char*
+mrb_parser_filename(parser_state *p, const char *s)
{
- parser_state *p;
-
- p = parser_new(mrb);
- if (!p) return 0;
- p->s = p->send = NULL;
- p->f = f;
- if (line) p->lineno = line;
- if (fn) mrb_parser_filename(p, fn);
+ if (s) {
+ p->filename = strdup(s);
+ }
+ return p->filename;
+}
- start_parser(p);
- return p;
+int
+mrb_parser_lineno(struct mrb_parser_state *p, int n)
+{
+ if (n <= 0) {
+ return p->lineno;
+ }
+ p->column = 0;
+ p->lineno = n;
+ return n;
}
parser_state*
-mrb_parse_nstring(mrb_state *mrb, const char *s, size_t len)
+mrb_parse_file(mrb_state *mrb, FILE *f)
{
parser_state *p;
-
- p = parser_new(mrb);
+
+ p = mrb_parser_new(mrb);
if (!p) return 0;
- p->s = s;
- p->send = s + len;
- p->f = NULL;
+ p->s = p->send = NULL;
+ p->f = f;
- start_parser(p);
+ mrb_parser_parse(p);
return p;
}
parser_state*
-mrb_parse_nstring_ext(mrb_state *mrb, const char *s, size_t len)
+mrb_parse_nstring(mrb_state *mrb, const char *s, size_t len)
{
parser_state *p;
- p = parser_new(mrb);
+ p = mrb_parser_new(mrb);
if (!p) return 0;
p->s = s;
p->send = s + len;
- p->f = NULL;
- p->capture_errors = 1;
- start_parser(p);
+ mrb_parser_parse(p);
return p;
}
@@ -4732,12 +4738,12 @@ mrb_parse_string(mrb_state *mrb, const char *s)
void parser_dump(mrb_state *mrb, node *tree, int offset);
int
-mrb_compile_file(mrb_state * mrb, FILE *f,const char *fn, int line)
+mrb_compile_file(mrb_state * mrb, FILE *f)
{
parser_state *p;
int n;
- p = mrb_parse_file(mrb, f, fn, line);
+ p = mrb_parse_file(mrb, f);
if (!p) return -1;
if (!p->tree) return -1;
if (p->nerr) return -1;
@@ -4750,26 +4756,6 @@ mrb_compile_file(mrb_state * mrb, FILE *f,const char *fn, int line)
return n;
}
-const char*
-mrb_parser_filename(parser_state *p, const char *s)
-{
- if (s) {
- p->filename = strdup(s);
- }
- return p->filename;
-}
-
-int
-mrb_parser_lineno(struct mrb_parser_state *p, int n)
-{
- if (n <= 0) {
- return p->lineno;
- }
- p->column = 0;
- p->lineno = n;
- return n;
-}
-
int
mrb_compile_nstring(mrb_state *mrb, char *s, size_t len)
{
diff --git a/src/print.c b/src/print.c
index 35fde4896..f9034470b 100644
--- a/src/print.c
+++ b/src/print.c
@@ -73,3 +73,16 @@ mrb_init_print(mrb_state *mrb)
mrb_define_method(mrb, krn, "__printstr__", mrb_printstr, ARGS_REQ(1));
mrb_define_method(mrb, krn, "p", p_m, ARGS_ANY()); /* 15.3.1.3.34 */
}
+
+
+void
+mrb_show_version(mrb_state *mrb)
+{
+ printf("mruby - Embeddable Ruby Copyright (c) 2010-2012 mruby developers\n");
+}
+
+void
+mrb_show_copyright(mrb_state *mrb)
+{
+ printf("mruby - Copyright (c) 2010-2012 mruby developers\n");
+}
diff --git a/src/version.c b/src/version.c
deleted file mode 100644
index 142c2239f..000000000
--- a/src/version.c
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
-** version.c - version information
-**
-** See Copyright Notice in mruby.h
-*/
-
-#include "mruby.h"
-#include "version.h"
-#include <stdio.h>
-#include "mruby/string.h"
-#include "mruby/variable.h"
-
-#define PRINT(type) puts(ruby_##type)
-//#define MKSTR(type) mrb_obj_freeze(mrb_str_new(ruby_##type, sizeof(ruby_##type)-1))
-#define MKSTR(type) mrb_str_new(mrb, ruby_##type, sizeof(ruby_##type)-1)
-
-const char ruby_version[] = RUBY_VERSION;
-const char ruby_release_date[] = RUBY_RELEASE_DATE;
-const char ruby_platform[] = RUBY_PLATFORM;
-const int ruby_patchlevel = RUBY_PATCHLEVEL;
-const char ruby_engine[] = RUBY_ENGINE;
-
-void
-Init_version(mrb_state *mrb)
-{
- char description[128];
- char copyright[128];
- mrb_value v = MKSTR(version);
- mrb_value d = MKSTR(release_date);
- mrb_value p = MKSTR(platform);
- mrb_value e = MKSTR(engine);
- mrb_value tmp;
-
- mrb_define_global_const(mrb, "RUBY_VERSION", v);
- mrb_define_global_const(mrb, "RUBY_RELEASE_DATE", d);
- mrb_define_global_const(mrb, "RUBY_PLATFORM", p);
- mrb_define_global_const(mrb, "RUBY_PATCHLEVEL", mrb_fixnum_value(RUBY_PATCHLEVEL));
- mrb_define_global_const(mrb, "RUBY_ENGINE", e);
-
- snprintf(description, sizeof(description), "ruby %s (%s %s %d) [%s]",
- RUBY_VERSION, RUBY_RELEASE_DATE, RUBY_RELEASE_STR,
- RUBY_RELEASE_NUM, RUBY_PLATFORM);
- //tmp = mrb_obj_freeze(mrb_str_new2(description));
- tmp = mrb_str_new2(mrb, description);
- mrb_define_global_const(mrb, "RUBY_DESCRIPTION", tmp);
-
- snprintf(copyright, sizeof(copyright), "ruby - Copyright (C) %d-%d %s",
- RUBY_BIRTH_YEAR, RUBY_RELEASE_YEAR, RUBY_AUTHOR);
- //tmp = mrb_obj_freeze(mrb_str_new2(copyright));
- tmp = mrb_str_new2(mrb, copyright);
- mrb_define_global_const(mrb, "RUBY_COPYRIGHT", tmp);
-
- /* obsolete constants */
- mrb_define_global_const(mrb, "VERSION", v);
- mrb_define_global_const(mrb, "RELEASE_DATE", d);
- mrb_define_global_const(mrb, "PLATFORM", p);
-}
-
-void
-ruby_show_version(mrb_state *mrb)
-{
- mrb_value v = mrb_const_get(mrb, mrb_obj_value(mrb->object_class), mrb_intern(mrb, "RUBY_DESCRIPTION"));
-
- if (mrb_type(v) != MRB_TT_STRING)
- return;
-
- puts(RSTRING_PTR(v));
- fflush(stdout);
-}
-
-void
-ruby_show_copyright(mrb_state *mrb)
-{
- mrb_value v = mrb_const_get(mrb, mrb_obj_value(mrb->object_class), mrb_intern(mrb, "RUBY_COPYRIGHT"));
-
- if (mrb_type(v) != MRB_TT_STRING)
- return;
-
- puts(RSTRING_PTR(v));
- exit(0);
-}
diff --git a/src/version.h b/src/version.h
deleted file mode 100644
index fed532886..000000000
--- a/src/version.h
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
-** version.h - version information
-**
-** See Copyright Notice in mruby.h
-*/
-
-#define RUBY_VERSION "1.8.7"
-#define RUBY_RELEASE_DATE "2010-08-16"
-#define RUBY_VERSION_CODE 187
-#define RUBY_RELEASE_CODE 20100816
-#define RUBY_PATCHLEVEL 302
-
-#define RUBY_VERSION_MAJOR 1
-#define RUBY_VERSION_MINOR 8
-#define RUBY_VERSION_TEENY 7
-#define RUBY_RELEASE_YEAR 2010
-#define RUBY_RELEASE_MONTH 8
-#define RUBY_RELEASE_DAY 16
-
-#ifdef RUBY_EXTERN
-RUBY_EXTERN const char ruby_version[];
-RUBY_EXTERN const char ruby_release_date[];
-RUBY_EXTERN const char ruby_platform[];
-RUBY_EXTERN const int ruby_patchlevel;
-RUBY_EXTERN const char *ruby_description;
-RUBY_EXTERN const char *ruby_copyright;
-#endif
-
-#define RUBY_AUTHOR "Yukihiro Matsumoto"
-#define RUBY_BIRTH_YEAR 1993
-#define RUBY_BIRTH_MONTH 2
-#define RUBY_BIRTH_DAY 24
-
-#define RUBY_RELEASE_STR "patchlevel"
-#define RUBY_RELEASE_NUM RUBY_PATCHLEVEL
-
-#define RUBY_PLATFORM "i386-mingw32"
-#define RUBY_ENGINE "ruby"