summaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorPaolo Bosetti <[email protected]>2012-05-29 14:32:05 -0700
committerPaolo Bosetti <[email protected]>2012-05-29 14:32:05 -0700
commitd73517877847dab5b345c7fa98091647737bbfe0 (patch)
tree6090a2df49b8093606181e5416e6aa6a5040b0ec /src
parent391f8dcef02cdafeb4e0acc693945acb166a8d09 (diff)
parent1e5d15dbcb977f6d197c24eca4a973ee1c5bf521 (diff)
downloadmruby-d73517877847dab5b345c7fa98091647737bbfe0.tar.gz
mruby-d73517877847dab5b345c7fa98091647737bbfe0.zip
Merge branch 'master' of git://github.com/mruby/mruby into XCode
Diffstat (limited to 'src')
-rw-r--r--src/CMakeLists.txt1
-rw-r--r--src/Makefile13
-rw-r--r--src/array.c18
-rw-r--r--src/class.c2
-rw-r--r--src/codegen.c17
-rw-r--r--src/error.c2
-rw-r--r--src/gc.c9
-rw-r--r--src/hash.c4
-rw-r--r--src/load.c3
-rw-r--r--src/numeric.c26
-rw-r--r--src/parse.y22
-rw-r--r--src/regint.h5
-rw-r--r--src/sprintf.c13
-rw-r--r--src/string.c10
-rw-r--r--src/transcode.c15
-rw-r--r--src/variable.c6
-rw-r--r--src/vm.c5
17 files changed, 88 insertions, 83 deletions
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 390129eb9..4a6aeee2c 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -7,6 +7,5 @@ file(GLOB MRUBY_SRC_C "*.c")
list(APPEND MRUBY_SRC_C "${CMAKE_CURRENT_BINARY_DIR}/parse.c")
add_library(mruby_object OBJECT ${MRUBY_SRC_C} ${BISON_mruby_OUTPUTS})
-add_library(mruby_static STATIC EXCLUDE_FROM_ALL $<TARGET_OBJECTS:mruby_object>)
# vim: ts=2 sts=2 sw=2 et
diff --git a/src/Makefile b/src/Makefile
index 385e447e3..61012ea68 100644
--- a/src/Makefile
+++ b/src/Makefile
@@ -19,12 +19,6 @@ OBJS := $(OBJ1) $(OBJ2) $(OBJ3)
# libraries, includes
INCLUDES = -I$(BASEDIR) -I$(BASEDIR)/../include
-# compiler, linker (gcc)
-CC = gcc
-LL = gcc
-AR = ar
-YACC = bison
-
DEBUG_MODE = 1
ifeq ($(DEBUG_MODE),1)
CFLAGS = -g -O3
@@ -33,6 +27,7 @@ CFLAGS = -O3
endif
ALL_CFLAGS = -Wall -Werror-implicit-function-declaration $(CFLAGS)
+
##############################
# generic build targets, rules
@@ -64,6 +59,6 @@ $(LDEF) : $(KWD)
.PHONY : clean #cleandep
clean :
@echo "make: removing targets, objects and depend files of `pwd`"
- -rm -f $(TARGET) $(OBJS) $(OBJY) $(YC)
- -rm -f $(OBJS:.o=.d) $(OBJY:.o=.d)
- -rm -f $(patsubst %.c,%.o,$(EXCEPT1)) $(patsubst %.c,%.d,$(EXCEPT1))
+ -$(RM_F) $(TARGET) $(OBJS) $(OBJY) $(YC)
+ -$(RM_F) $(OBJS:.o=.d) $(OBJY:.o=.d)
+ -$(RM_F) $(patsubst %.c,%.o,$(EXCEPT1)) $(patsubst %.c,%.d,$(EXCEPT1))
diff --git a/src/array.c b/src/array.c
index 37f1474df..7b486430f 100644
--- a/src/array.c
+++ b/src/array.c
@@ -917,22 +917,10 @@ mrb_ary_join(mrb_state *mrb, mrb_value ary, mrb_value sep)
static mrb_value
mrb_ary_join_m(mrb_state *mrb, mrb_value ary)
{
- mrb_value *argv;
- int argc;
-
- mrb_get_args(mrb, "*", &argv, &argc);
- switch(argc) {
- case 0:
- return mrb_ary_join(mrb, ary, mrb_nil_value());
-
- case 1:
- return mrb_ary_join(mrb, ary, argv[0]);
-
- default:
- mrb_raise(mrb, E_ARGUMENT_ERROR, "wrong number of arguments");
- }
+ mrb_value sep = mrb_nil_value();
- return mrb_nil_value(); /* dummy */
+ mrb_get_args(mrb, "|o", &sep);
+ return mrb_ary_join(mrb, ary, sep);
}
static mrb_value
diff --git a/src/class.c b/src/class.c
index c6dfdd568..b1ed7c0dc 100644
--- a/src/class.c
+++ b/src/class.c
@@ -578,7 +578,7 @@ mrb_get_args(mrb_state *mrb, const char *format, ...)
break;
}
}
- if (!*format && argc > i) {
+ if (!c && argc > i) {
mrb_raise(mrb, E_ARGUMENT_ERROR, "wrong number of arguments");
}
va_end(ap);
diff --git a/src/codegen.c b/src/codegen.c
index 087dd3165..11e9eb236 100644
--- a/src/codegen.c
+++ b/src/codegen.c
@@ -64,6 +64,7 @@ typedef struct scope {
int nlocals;
int nregs;
+ int ai;
int idx;
} codegen_scope;
@@ -1234,25 +1235,25 @@ codegen(codegen_scope *s, node *tree, int val)
int idx = new_msym(s, sym);
if (name[0] == '+' && strlen(name) == 1) {
- genop(s, MKOP_ABC(OP_ADD, cursp(), idx, 2));
+ genop(s, MKOP_ABC(OP_ADD, cursp(), idx, 1));
}
else if (name[0] == '-' && strlen(name) == 1) {
- genop(s, MKOP_ABC(OP_SUB, cursp(), idx, 2));
+ genop(s, MKOP_ABC(OP_SUB, cursp(), idx, 1));
}
else if (name[0] == '<' && strlen(name) == 1) {
- genop(s, MKOP_ABC(OP_LT, cursp(), idx, 2));
+ genop(s, MKOP_ABC(OP_LT, cursp(), idx, 1));
}
else if (name[0] == '<' && strlen(name) == 2 && name[1] == '=') {
- genop(s, MKOP_ABC(OP_LE, cursp(), idx, 2));
+ genop(s, MKOP_ABC(OP_LE, cursp(), idx, 1));
}
else if (name[0] == '>' && strlen(name) == 1) {
- genop(s, MKOP_ABC(OP_GT, cursp(), idx, 2));
+ genop(s, MKOP_ABC(OP_GT, cursp(), idx, 1));
}
else if (name[0] == '>' && strlen(name) == 2 && name[1] == '=') {
- genop(s, MKOP_ABC(OP_GE, cursp(), idx, 2));
+ genop(s, MKOP_ABC(OP_GE, cursp(), idx, 1));
}
else {
- genop(s, MKOP_ABC(OP_SEND, cursp(), idx, 2));
+ genop(s, MKOP_ABC(OP_SEND, cursp(), idx, 1));
}
}
gen_assignment(s, tree->car, cursp(), val);
@@ -1849,6 +1850,7 @@ scope_new(mrb_state *mrb, codegen_scope *prev, node *lv)
p->lv = lv;
p->sp += node_len(lv)+2;
p->nlocals = p->sp;
+ p->ai = mrb->arena_idx;
p->idx = mrb->irep_len++;
@@ -1882,6 +1884,7 @@ scope_finish(codegen_scope *s, int idx)
irep->nlocals = s->nlocals;
irep->nregs = s->nregs;
+ s->mrb->arena_idx = s->ai;
mrb_pool_close(s->mpool);
}
diff --git a/src/error.c b/src/error.c
index 5b32e3a00..feaa04af7 100644
--- a/src/error.c
+++ b/src/error.c
@@ -443,7 +443,7 @@ mrb_init_exception(mrb_state *mrb)
#ifdef INCLUDE_ENCODING
mrb_define_class(mrb, "EncodingError", mrb->eStandardError_class);
#endif
- mrb_define_class(mrb, "ZeroDivisionError", mrb->eStandardError_class); /* 15.2.30 */
+ // mrb_define_class(mrb, "ZeroDivisionError", mrb->eStandardError_class); /* 15.2.30 */
mrb_define_class(mrb, "FloatDomainError", eRangeError);
mrb_define_class(mrb, "KeyError", eIndexError);
diff --git a/src/gc.c b/src/gc.c
index 1d7a8627f..0ba6e3e76 100644
--- a/src/gc.c
+++ b/src/gc.c
@@ -261,12 +261,13 @@ mrb_obj_alloc(mrb_state *mrb, enum mrb_vtype ttype, struct RClass *cls)
}
mrb->live++;
- mrb->arena[mrb->arena_idx++] = p;
- memset(p, 0, sizeof(RVALUE));
- if (mrb->arena_idx >= MRB_ARENA_SIZE) {
+ if (mrb->arena_idx > MRB_ARENA_SIZE) {
/* arena overflow error */
- mrb_raise(mrb, E_TYPE_ERROR, "arena overflow error");
+ mrb->arena_idx = MRB_ARENA_SIZE - 2; /* force room in arena */
+ mrb_raise(mrb, mrb->eRuntimeError_class, "arena overflow error");
}
+ mrb->arena[mrb->arena_idx++] = p;
+ memset(p, 0, sizeof(RVALUE));
p->tt = ttype;
p->c = cls;
paint_partial_white(mrb, p);
diff --git a/src/hash.c b/src/hash.c
index 94be511c8..19d0507e3 100644
--- a/src/hash.c
+++ b/src/hash.c
@@ -1007,14 +1007,12 @@ mrb_hash_keys(mrb_state *mrb, mrb_value hash)
{
khash_t(ht) *h = RHASH_TBL(hash);
khiter_t k;
- mrb_value ary = mrb_ary_new(mrb);
+ mrb_value ary = mrb_ary_new_capa(mrb, kh_size(h));
if (!h) return ary;
for (k = kh_begin(h); k != kh_end(h); k++) {
if (kh_exist(h, k)) {
mrb_value v = kh_key(h,k);
- if ( !mrb_special_const_p(v) )
- v = mrb_obj_dup(mrb, v);
mrb_ary_push(mrb, ary, v);
}
}
diff --git a/src/load.c b/src/load.c
index af0e519bd..e73f09b3a 100644
--- a/src/load.c
+++ b/src/load.c
@@ -337,6 +337,7 @@ read_rite_irep_record(mrb_state *mrb, unsigned char *src, mrb_irep *irep, uint32
mrb_int fix_num;
mrb_float f;
mrb_value str;
+ int ai = mrb_gc_arena_save(mrb);
recordStart = src;
buf = mrb_malloc(mrb, bufsize);
@@ -489,6 +490,7 @@ read_rite_irep_record(mrb_state *mrb, unsigned char *src, mrb_irep *irep, uint32
*len = src - recordStart;
error_exit:
+ mrb_gc_arena_restore(mrb, ai);
if (buf)
mrb_free(mrb, buf);
@@ -537,7 +539,6 @@ mrb_read_irep(mrb_state *mrb, const char *bin)
}
mrb->irep_len += nirep;
-
error_exit:
if (ret != MRB_DUMP_OK) {
for (n=0,i=sirep; n<nirep; n++,i++) {
diff --git a/src/numeric.c b/src/numeric.c
index 09d55a5de..f26dda424 100644
--- a/src/numeric.c
+++ b/src/numeric.c
@@ -37,12 +37,6 @@
#define fmod(x,y) fmodf(x,y)
#endif
-void
-mrb_num_zerodiv(mrb_state *mrb)
-{
- mrb_raise(mrb, E_ZERODIVISION_ERROR, "divided by 0");
-}
-
static mrb_float
mrb_to_flo(mrb_state *mrb, mrb_value val)
{
@@ -252,7 +246,6 @@ flodivmod(mrb_state *mrb, mrb_float x, mrb_float y, mrb_float *divp, mrb_float *
{
mrb_float div, mod;
- if (y == 0.0) mrb_num_zerodiv(mrb);
mod = fmod(x, y);
if (isinf(x) && !isinf(y) && !isnan(y))
div = x;
@@ -744,7 +737,6 @@ fixdivmod(mrb_state *mrb, mrb_int x, mrb_int y, mrb_int *divp, mrb_int *modp)
{
mrb_int div, mod;
- if (y == 0) mrb_num_zerodiv(mrb);
if (y < 0) {
if (x < 0)
div = -x / -y;
@@ -1043,24 +1035,6 @@ fix_to_f(mrb_state *mrb, mrb_value num)
}
/*
- * Document-class: ZeroDivisionError
- *
- * Raised when attempting to divide an integer by 0.
- *
- * 42 / 0
- *
- * <em>raises the exception:</em>
- *
- * ZeroDivisionError: divided by 0
- *
- * Note that only division by an exact 0 will raise that exception:
- *
- * 42 / 0.0 #=> Float::INFINITY
- * 42 / -0.0 #=> -Float::INFINITY
- * 0 / 0.0 #=> NaN
- */
-
-/*
* Document-class: FloatDomainError
*
* Raised when attempting to convert special float values
diff --git a/src/parse.y b/src/parse.y
index 316e7309c..55c82c12d 100644
--- a/src/parse.y
+++ b/src/parse.y
@@ -41,8 +41,13 @@ static void backref_error(parser_state *p, node *n);
#define identchar(c) (isalnum(c) || (c) == '_' || !isascii(c))
+#ifndef TRUE
#define TRUE 1
+#endif
+
+#ifndef FALSE
#define FALSE 0
+#endif
typedef unsigned int stack_type;
@@ -1003,7 +1008,7 @@ top_stmts : none
}
| error top_stmt
{
- $$ = $2;
+ $$ = new_begin(p, 0);
}
;
@@ -2925,10 +2930,10 @@ yyerror(parser_state *p, const char *s)
if (! p->capture_errors) {
if (p->filename) {
- fprintf(stderr, "%s:%d:%d: %s\n", p->filename, p->lineno, p->column+1, s);
+ fprintf(stderr, "%s:%d:%d: %s\n", p->filename, p->lineno, p->column, s);
}
else {
- fprintf(stderr, "line %d:%d: %s\n", p->lineno, p->column+1, s);
+ fprintf(stderr, "line %d:%d: %s\n", p->lineno, p->column, s);
}
}
else if (p->nerr < sizeof(p->error_buffer) / sizeof(p->error_buffer[0])) {
@@ -2937,7 +2942,7 @@ yyerror(parser_state *p, const char *s)
memcpy(c, s, n + 1);
p->error_buffer[p->nerr].message = c;
p->error_buffer[p->nerr].lineno = p->lineno;
- p->error_buffer[p->nerr].column = p->column+1;
+ p->error_buffer[p->nerr].column = p->column;
}
p->nerr++;
}
@@ -2959,10 +2964,10 @@ yywarn(parser_state *p, const char *s)
if (! p->capture_errors) {
if (p->filename) {
- fprintf(stderr, "%s:%d:%d: %s\n", p->filename, p->lineno, p->column+1, s);
+ fprintf(stderr, "%s:%d:%d: %s\n", p->filename, p->lineno, p->column, s);
}
else {
- fprintf(stderr, "line %d:%d: %s\n", p->lineno, p->column+1, s);
+ fprintf(stderr, "line %d:%d: %s\n", p->lineno, p->column, s);
}
}
else if (p->nerr < sizeof(p->warn_buffer) / sizeof(p->warn_buffer[0])) {
@@ -3035,8 +3040,8 @@ nextc(parser_state *p)
if (c == '\n') {
// must understand heredoc
}
- p->column++;
}
+ p->column++;
return c;
}
@@ -3564,8 +3569,8 @@ parser_yylex(parser_state *p)
if (p->column == 1) {
if (peeks(p, "begin\n")) {
skips(p, "\n=end\n");
+ goto retry;
}
- goto retry;
}
switch (p->lstate) {
case EXPR_FNAME: case EXPR_DOT:
@@ -4694,6 +4699,7 @@ mrb_parser_new(mrb_state *mrb)
p->capture_errors = 0;
p->lineno = 1;
+ p->column = 0;
#if defined(PARSER_TEST) || defined(PARSER_DEBUG)
yydebug = 1;
#endif
diff --git a/src/regint.h b/src/regint.h
index 23e3a8c05..aa4871594 100644
--- a/src/regint.h
+++ b/src/regint.h
@@ -222,8 +222,13 @@
#include "regenc.h"
+#ifndef MIN
#define MIN(a,b) (((a)>(b))?(b):(a))
+#endif
+
+#ifndef MAX
#define MAX(a,b) (((a)<(b))?(b):(a))
+#endif
#define IS_NULL(p) (((void*)(p)) == (void*)0)
#define IS_NOT_NULL(p) (((void*)(p)) != (void*)0)
diff --git a/src/sprintf.c b/src/sprintf.c
index 6a86a0d04..479efa6c4 100644
--- a/src/sprintf.c
+++ b/src/sprintf.c
@@ -54,7 +54,7 @@ remove_sign_bits(char *str, int base)
static char
sign_bits(int base, const char *p)
{
- char c = '.';
+ char c;
switch (base) {
case 16:
@@ -65,6 +65,8 @@ sign_bits(int base, const char *p)
c = '7'; break;
case 2:
c = '1'; break;
+ default:
+ c = '.'; break;
}
return c;
}
@@ -74,7 +76,7 @@ mrb_fix2binstr(mrb_state *mrb, mrb_value x, int base)
{
char buf[64], *b = buf + sizeof buf;
unsigned long val = mrb_fixnum(x);
- char d = 0;
+ char d;
if (base != 2) {
mrb_raise(mrb, E_ARGUMENT_ERROR, "invalid radix %d", base);
@@ -97,6 +99,7 @@ mrb_fix2binstr(mrb_state *mrb, mrb_value x, int base)
case 16: d = 'f'; break;
case 8: d = '7'; break;
case 2: d = '1'; break;
+ default: d = 0; break;
}
if (d && *b != d) {
@@ -793,6 +796,8 @@ format_s:
case 'B':
if (flags&(FPLUS|FSPACE)) sign = 1;
break;
+ default:
+ break;
}
if (flags & FSHARP) {
switch (*p) {
@@ -801,6 +806,7 @@ format_s:
case 'X': prefix = "0X"; break;
case 'b': prefix = "0b"; break;
case 'B': prefix = "0B"; break;
+ default: break;
}
}
@@ -884,13 +890,14 @@ bin_retry:
snprintf(fbuf, sizeof(fbuf), "%%l%c", c);
snprintf(++s, sizeof(nbuf) - 1, fbuf, v);
if (v < 0) {
- char d = 0;
+ char d;
s = remove_sign_bits(s, base);
switch (base) {
case 16: d = 'f'; break;
case 8: d = '7'; break;
case 2: d = '1'; break;
+ default: d = 0; break;
}
if (d && *s != d) {
diff --git a/src/string.c b/src/string.c
index 28513c15c..695b0d01c 100644
--- a/src/string.c
+++ b/src/string.c
@@ -4400,9 +4400,17 @@ mrb_str_conv_enc_opts(mrb_state *mrb, mrb_value str, mrb_encoding *from, mrb_enc
mrb_enc_associate(mrb, newstr, to);
return newstr;
- default:
+ case econv_invalid_byte_sequence:
+ case econv_undefined_conversion:
+ case econv_source_buffer_empty:
+ case econv_after_output:
+ case econv_incomplete_input:
/* some error, return original */
return str;
+
+ default:
+ mrb_bug("Internal Error: Invalid return value mrb_econv_convert.");
+ return str;
}
}
diff --git a/src/transcode.c b/src/transcode.c
index 32a45932e..d9f0ce896 100644
--- a/src/transcode.c
+++ b/src/transcode.c
@@ -543,6 +543,7 @@ transcode_restartable0(mrb_state *mrb,
case 32: goto resume_label32;
case 33: goto resume_label33;
case 34: goto resume_label34;
+ default: break;
}
while (1) {
@@ -1197,6 +1198,10 @@ trans_sweep(mrb_state *mrb, mrb_econv_t *ec,
case econv_finished:
ec->num_finished = i+1;
break;
+
+ default:
+ mrb_bug("Internal Error: invalid return value from mrb_transcoding_convert().");
+ break;
}
}
}
@@ -1507,8 +1512,12 @@ mrb_econv_convert(mrb_state *mrb, mrb_econv_t *ec,
/* todo: add more alternative behaviors */
switch (ec->flags & ECONV_INVALID_MASK) {
case ECONV_INVALID_REPLACE:
- if (output_replacement_character(mrb, ec) == 0)
+ if (output_replacement_character(mrb, ec) == 0)
goto resume;
+
+ default:
+ mrb_bug("Internal error: Unhandled ECONV_INVALID_xxx.");
+ break;
}
}
@@ -1526,6 +1535,10 @@ mrb_econv_convert(mrb_state *mrb, mrb_econv_t *ec,
if (output_hex_charref(mrb, ec) == 0)
goto resume;
break;
+
+ default:
+ mrb_bug("Internal error: Unhandled ECONV_UNDEF_xxx.");
+ break;
}
}
diff --git a/src/variable.c b/src/variable.c
index 1f1a400cd..82ab7bef3 100644
--- a/src/variable.c
+++ b/src/variable.c
@@ -186,12 +186,16 @@ mrb_vm_cv_set(mrb_state *mrb, mrb_sym sym, mrb_value v)
if (k != kh_end(h)) {
k = kh_put(iv, h, sym);
kh_value(h, k) = v;
+ return;
}
}
c = c->super;
}
c = mrb->ci->target_class;
- h = c->iv = kh_init(iv, mrb);
+ h = c->iv;
+ if (!h) {
+ c->iv = h = kh_init(iv, mrb);
+ }
k = kh_put(iv, h, sym);
kh_value(h, k) = v;
}
diff --git a/src/vm.c b/src/vm.c
index b2a7b33d1..be55a0124 100644
--- a/src/vm.c
+++ b/src/vm.c
@@ -980,7 +980,10 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self)
cipop(mrb);
ci = mrb->ci;
if (ci == mrb->cibase) {
- if (ci->ridx == 0) goto L_STOP;
+ if (ci->ridx == 0) {
+ mrb->stack = mrb->stbase;
+ goto L_STOP;
+ }
break;
}
}