diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/CMakeLists.txt | 1 | ||||
| -rw-r--r-- | src/Makefile | 13 | ||||
| -rw-r--r-- | src/array.c | 18 | ||||
| -rw-r--r-- | src/class.c | 2 | ||||
| -rw-r--r-- | src/codegen.c | 17 | ||||
| -rw-r--r-- | src/error.c | 2 | ||||
| -rw-r--r-- | src/gc.c | 9 | ||||
| -rw-r--r-- | src/hash.c | 4 | ||||
| -rw-r--r-- | src/load.c | 3 | ||||
| -rw-r--r-- | src/numeric.c | 26 | ||||
| -rw-r--r-- | src/parse.y | 22 | ||||
| -rw-r--r-- | src/regint.h | 5 | ||||
| -rw-r--r-- | src/sprintf.c | 13 | ||||
| -rw-r--r-- | src/string.c | 10 | ||||
| -rw-r--r-- | src/transcode.c | 15 | ||||
| -rw-r--r-- | src/variable.c | 6 | ||||
| -rw-r--r-- | src/vm.c | 5 |
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); @@ -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; } @@ -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; } } |
