diff options
| -rw-r--r-- | INSTALL | 4 | ||||
| -rw-r--r-- | include/mrbconf.h | 11 | ||||
| -rw-r--r-- | include/mruby/string.h | 2 | ||||
| -rw-r--r-- | src/gc.c | 5 | ||||
| -rw-r--r-- | src/kernel.c | 27 | ||||
| -rw-r--r-- | src/numeric.c | 36 | ||||
| -rw-r--r-- | src/print.c | 4 | ||||
| -rw-r--r-- | src/string.c | 41 | ||||
| -rw-r--r-- | src/variable.c | 8 | ||||
| -rw-r--r-- | tools/mruby/mruby.c | 127 |
10 files changed, 122 insertions, 143 deletions
@@ -1,3 +1,7 @@ +* Prerequisites + + 1. Make sure you have bison (http://www.gnu.org/software/bison/) installed in your system. + * Compilation and Installation 1. Run make in the top directory. diff --git a/include/mrbconf.h b/include/mrbconf.h index f87e2ef43..478b79019 100644 --- a/include/mrbconf.h +++ b/include/mrbconf.h @@ -8,12 +8,19 @@ #define MRUBYCONF_H #include <stdint.h> +#define MRB_USE_FLOAT + +#ifdef MRB_USE_FLOAT +typedef float mrb_float; +#define readfloat(p) strtof((p),NULL) +#else typedef double mrb_float; +#define readfloat(p) strtod((p),NULL) +#endif + typedef int32_t mrb_int; typedef intptr_t mrb_sym; - #define readint(p,base) strtol((p),NULL,(base)) -#define readfloat(p) strtod((p),NULL) #undef INCLUDE_ENCODING /* not use encoding classes (ascii only) */ #define INCLUDE_ENCODING /* use UTF-8 encoding classes */ diff --git a/include/mruby/string.h b/include/mruby/string.h index ea9ca71ec..d35a5fe53 100644 --- a/include/mruby/string.h +++ b/include/mruby/string.h @@ -29,7 +29,7 @@ struct RString { long len; union { size_t capa; - mrb_value shared; + struct RString *shared; } aux; char *buf; }; @@ -352,8 +352,9 @@ gc_mark_children(mrb_state *mrb, struct RBasic *obj) { struct RString *s = (struct RString*)obj; - if (s->flags & MRB_STR_SHARED) { - mrb_gc_mark_value(mrb, s->aux.shared) + while (s->flags & MRB_STR_SHARED) { + s = s->aux.shared; + if (!s) break; } } break; diff --git a/src/kernel.c b/src/kernel.c index 6b6aab661..eeaa0fe27 100644 --- a/src/kernel.c +++ b/src/kernel.c @@ -688,17 +688,13 @@ mrb_obj_ivar_defined(mrb_state *mrb, mrb_value self) mrb_get_args(mrb, "o", &arg); mrb_sym mid = mrb_to_id(mrb, arg); - //if (!mrb_is_instance_id(id)) { - // mrb_name_error(id, "`%s' is not allowed as an instance variable name", mrb_sym2name(mrb, id)); - //} - //return mrb_ivar_defined(self, id); - k = kh_get(iv, h, mid); - if (k != kh_end(h)) { - return mrb_true_value(); - } - else { - return mrb_false_value(); + if (h) { + k = kh_get(iv, h, mid); + if (k != kh_end(h)) { + return mrb_true_value(); + } } + return mrb_false_value(); } /* 15.3.1.3.21 */ @@ -797,16 +793,15 @@ mrb_obj_instance_variables(mrb_state *mrb, mrb_value self) const char* p; ary = mrb_ary_new(mrb); - //if (mrb_is_instance_id(key)) { - // mrb_ary_push(mrb, ary, mrb_sym2name(mrb, key)); - //} - for (i=0;i<kh_end(h);i++) { - if (kh_exist(h, i)) { + if (h) { + for (i=0;i<kh_end(h);i++) { + if (kh_exist(h, i)) { p = mrb_sym2name(mrb, kh_key(h,i)); if (*p == '@') { if (mrb_type(kh_value(h, i)) != MRB_TT_UNDEF) mrb_ary_push(mrb, ary, mrb_str_new_cstr(mrb, p)); } + } } } return ary; @@ -924,6 +919,7 @@ method_entry_loop(mrb_state *mrb, struct RClass* klass, mrb_value ary) int i; khash_t(mt) *h = klass->mt; + if (!h) return; for (i=0;i<kh_end(h);i++) { if (kh_exist(h, i)) { mrb_ary_push(mrb, ary, mrb_symbol_value(kh_key(h,i))); @@ -1246,6 +1242,7 @@ mrb_obj_remove_instance_variable(mrb_state *mrb, mrb_value self) case MRB_TT_MODULE: if (!mrb_obj_ptr(self)->iv) break; h = mrb_obj_ptr(self)->iv; + if (!h) break; k = kh_get(iv, h, sym); if (k != kh_end(h)) { val = kh_value(h, k); diff --git a/src/numeric.c b/src/numeric.c index a29692bab..23da9089c 100644 --- a/src/numeric.c +++ b/src/numeric.c @@ -101,29 +101,14 @@ const unsigned char mrb_nan[] = "\x00\x00\xc0\x7f"; const unsigned char mrb_nan[] = "\x7f\xc0\x00\x00"; #endif -extern double round(double); - -#ifndef HAVE_ROUND -double -round(double x) -{ - double f; - - if (x > 0.0) { - f = floor(x); - x = f + (x - f >= 0.5); - } - else if (x < 0.0) { - f = ceil(x); - x = f - (f - x >= 0.5); - } - return x; -} +#ifdef MRB_USE_FLOAT +#define round(f) roundf(f) +#define floor(f) floorf(f) +#define ceil(f) ceilf(f) +#define floor(f) floorf(f) +#define fmod(x,y) fmodf(x,y) #endif - - - void mrb_cmperr(mrb_state *mrb, mrb_value x, mrb_value y); void @@ -459,16 +444,7 @@ 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); -#ifdef HAVE_FMOD mod = fmod(x, y); -#else - { - mrb_float z; - - modf(x/y, &z); - mod = x - z * y; - } -#endif if (isinf(x) && !isinf(y) && !isnan(y)) div = x; else diff --git a/src/print.c b/src/print.c index 5de0fc721..e13e1ef5c 100644 --- a/src/print.c +++ b/src/print.c @@ -42,14 +42,14 @@ static mrb_value p_m(mrb_state *mrb, mrb_value self) { int argc, i; - mrb_value *argv; + mrb_value *argv = NULL; mrb_get_args(mrb, "*", &argv, &argc); for (i=0; i<argc; i++) { mrb_p(mrb, argv[i]); } - return argv[0]; + return argv ? argv[0] : mrb_nil_value(); } mrb_value diff --git a/src/string.c b/src/string.c index 9867d014a..e92d76b18 100644 --- a/src/string.c +++ b/src/string.c @@ -488,13 +488,13 @@ str_new4(mrb_state *mrb, enum mrb_vtype ttype, mrb_value str) RSTRING(str2)->buf = RSTRING_PTR(str); if (MRB_STR_SHARED_P(str)) { - mrb_value shared = RSTRING_SHARED(str); + struct RString *shared = RSTRING_SHARED(str); FL_SET(str2, MRB_STR_SHARED); RSTRING_SHARED(str2) = shared; } else { FL_SET(str, MRB_STR_SHARED); - RSTRING_SHARED(str) = str2; + RSTRING_SHARED(str) = mrb_str_ptr(str2); } mrb_enc_cr_str_exact_copy(mrb, str2, str); return str2; @@ -2174,7 +2174,7 @@ str_replace_shared(mrb_state *mrb, mrb_value str2, mrb_value str) str = mrb_str_new_frozen(mrb, str); RSTRING(str2)->len = RSTRING_LEN(str); RSTRING(str2)->buf = RSTRING_PTR(str); - RSTRING_SHARED(str2) = str; + RSTRING_SHARED(str2) = mrb_str_ptr(str); FL_SET(str2, MRB_STR_SHARED); mrb_enc_cr_str_exact_copy(mrb, str2, str); @@ -2209,9 +2209,9 @@ mrb_str_new_frozen(mrb_state *mrb, mrb_value orig) klass = mrb_obj_class(mrb, orig); - if (MRB_STR_SHARED_P(orig) && !mrb_nil_p(RSTRING_SHARED(orig))) { + if (MRB_STR_SHARED_P(orig) && RSTRING_SHARED(orig)) { long ofs; - ofs = RSTRING_LEN(str) - RSTRING_LEN(orig); + ofs = RSTRING_LEN(str) - RSTRING_SHARED(orig)->len; #ifdef INCLUDE_ENCODING if ((ofs > 0) || (klass != RBASIC(str)->c) || ENCODING_GET(mrb, str) != ENCODING_GET(mrb, orig)) { @@ -2765,9 +2765,9 @@ str_replace(mrb_state *mrb, mrb_value str, mrb_value str2) len = RSTRING_LEN(str2); if (MRB_STR_SHARED_P(str2)) { - mrb_value shared = RSTRING_SHARED(str2); + struct RString *shared = RSTRING_SHARED(str2); RSTRING_LEN(str) = len; - RSTRING_PTR(str) = RSTRING_PTR(str2); + RSTRING_PTR(str) = shared->buf; FL_SET(str, MRB_STR_SHARED); RSTRING_SHARED(str) = shared; } @@ -4729,35 +4729,8 @@ mrb_lastline_set(mrb_value val) mrb_value mrb_str_append(mrb_state *mrb, mrb_value str, mrb_value str2) { -#ifdef INCLUDE_ENCODING - mrb_encoding *enc; - int cr, cr2; -#endif //INCLUDE_ENCODING - - //StringValue(str2); mrb_string_value(mrb, &str2); - if (RSTRING_LEN(str2) > 0 /*&& STR_ASSOC_P(str)*/) { - long len = RSTRING_LEN(str)+RSTRING_LEN(str2); -#ifdef INCLUDE_ENCODING - enc = mrb_enc_check(mrb, str, str2); - cr = ENC_CODERANGE(str); - if ((cr2 = ENC_CODERANGE(str2)) > cr) cr = cr2; -#endif //INCLUDE_ENCODING - mrb_str_modify(mrb, str); - REALLOC_N(mrb, RSTRING(str)->buf, char, len+1); - memcpy(RSTRING(str)->buf + RSTRING(str)->len, - RSTRING_PTR(str2), RSTRING_LEN(str2)+1); - RSTRING(str)->len = len; - mrb_enc_associate(mrb, str, enc); - ENC_CODERANGE_SET(str, cr); - - return str; - } -#ifdef INCLUDE_ENCODING return mrb_str_buf_append(mrb, str, str2); -#else - return str; -#endif //INCLUDE_ENCODING } void diff --git a/src/variable.c b/src/variable.c index 171706f13..5aba846b1 100644 --- a/src/variable.c +++ b/src/variable.c @@ -344,9 +344,11 @@ mrb_f_global_variables(mrb_state *mrb, mrb_value self) struct kh_iv *h = mrb->globals; mrb_value ary = mrb_ary_new(mrb); - for (i=0;i< kh_end(h);i++) { - if (kh_exist(h, i)) { - mrb_ary_push(mrb, ary, mrb_symbol_value(kh_key(h,i))); + if (h) { + for (i=0;i < kh_end(h);i++) { + if (kh_exist(h, i)) { + mrb_ary_push(mrb, ary, mrb_symbol_value(kh_key(h,i))); + } } } buf[0] = '$'; diff --git a/tools/mruby/mruby.c b/tools/mruby/mruby.c index 0a2aa85e9..ef513312b 100644 --- a/tools/mruby/mruby.c +++ b/tools/mruby/mruby.c @@ -1,5 +1,7 @@ #include "mruby.h" #include "mruby/proc.h" +#include "mruby/array.h" +#include "mruby/string.h" #include "compile.h" #include "mruby/dump.h" #include <stdio.h> @@ -16,6 +18,8 @@ struct _args { int mrbfile : 1; int check_syntax : 1; int verbose : 1; + int argc; + char** argv; }; static void @@ -43,76 +47,84 @@ static int parse_args(mrb_state *mrb, int argc, char **argv, struct _args *args) { char **origargv = argv; - int cmdline = 0; memset(args, 0, sizeof(*args)); for (argc--,argv++; argc > 0; argc--,argv++) { - if (**argv == '-') { - if (strlen(*argv) <= 1) - return -1; - - switch ((*argv)[1]) { - case 'b': - args->mrbfile = 1; - break; - case 'c': - args->check_syntax = 1; - break; - case 'e': - cmdline = 1; - break; - case 'v': - ruby_show_version(mrb); - args->verbose = 1; - break; - case '-': - if (strcmp((*argv) + 2, "version") == 0) { - ruby_show_version(mrb); - } - else if (strcmp((*argv) + 2, "verbose") == 0) { - args->verbose = 1; - break; - } - else if (strcmp((*argv) + 2, "copyright") == 0) { - ruby_show_copyright(mrb); - } - else return -3; - return 0; - } - } - else if (cmdline) { - if (!args->cmdline) { - char *buf; + if (argv[0][0] != '-') break; + + if (strlen(*argv) <= 1) + return -1; - buf = mrb_malloc(mrb, strlen(argv[0])+1); - strcpy(buf, argv[0]); - args->cmdline = buf; + switch ((*argv)[1]) { + case 'b': + args->mrbfile = 1; + break; + case 'c': + args->check_syntax = 1; + break; + case 'e': + if (argc > 1) { + argc--; argv++; + if (!args->cmdline) { + char *buf; + + buf = mrb_malloc(mrb, strlen(argv[0])+1); + strcpy(buf, argv[0]); + args->cmdline = buf; + } + else { + args->cmdline = mrb_realloc(mrb, args->cmdline, strlen(args->cmdline)+strlen(argv[0])+2); + strcat(args->cmdline, "\n"); + strcat(args->cmdline, argv[0]); + } } else { - args->cmdline = mrb_realloc(mrb, args->cmdline, strlen(args->cmdline)+strlen(argv[0])+2); - strcat(args->cmdline, "\n"); - strcat(args->cmdline, argv[0]); + printf("%s: No code specified for -e\n", *origargv); + return 0; } - } - else if (args->rfp == NULL) { - if ((args->rfp = fopen(*argv, args->mrbfile ? "rb" : "r")) == NULL) { - printf("%s: Cannot open program file. (%s)\n", *origargv, *argv); - return 0; + break; + case 'v': + ruby_show_version(mrb); + args->verbose = 1; + break; + case '-': + if (strcmp((*argv) + 2, "version") == 0) { + ruby_show_version(mrb); + } + else if (strcmp((*argv) + 2, "verbose") == 0) { + args->verbose = 1; + break; } + else if (strcmp((*argv) + 2, "copyright") == 0) { + ruby_show_copyright(mrb); + } + else return -3; + return 0; } } + + if (args->rfp == NULL && args->cmdline == NULL && (args->rfp = fopen(*argv, args->mrbfile ? "rb" : "r")) == NULL) { + printf("%s: Cannot open program file. (%s)\n", *origargv, *argv); + return 0; + } + args->argv = mrb_realloc(mrb, args->argv, sizeof(char*) * (argc + 1)); + memcpy(args->argv, argv, (argc+1) * sizeof(char*)); + args->argc = argc; + return 0; } static void -cleanup(struct _args *args) +cleanup(mrb_state *mrb, struct _args *args) { if (args->rfp) fclose(args->rfp); if (args->cmdline) - free(args->cmdline); + mrb_free(mrb, args->cmdline); + if (args->argv) + mrb_free(mrb, args->argv); } int @@ -120,12 +132,13 @@ main(int argc, char **argv) { mrb_state *mrb = mrb_open(); int n = -1; + int i; struct _args args; struct mrb_parser_state *p; n = parse_args(mrb, argc, argv, &args); if (n < 0 || (args.cmdline == NULL && args.rfp == NULL)) { - cleanup(&args); + cleanup(mrb, &args); usage(argv[0]); return n; } @@ -141,7 +154,7 @@ main(int argc, char **argv) p = mrb_parse_file(mrb, args.rfp); } if (!p || !p->tree || p->nerr) { - cleanup(&args); + cleanup(mrb, &args); return -1; } @@ -153,18 +166,24 @@ main(int argc, char **argv) } if (n >= 0) { + mrb_value ARGV = mrb_ary_new(mrb); + for (i = 0; i < args.argc; i++) { + mrb_ary_push(mrb, ARGV, mrb_str_new(mrb, args.argv[i], strlen(args.argv[i]))); + } + mrb_define_global_const(mrb, "ARGV", ARGV); + if (args.verbose) codedump_all(mrb, n); if (!args.check_syntax) { mrb_run(mrb, mrb_proc_new(mrb, mrb->irep[n]), mrb_top_self(mrb)); if (mrb->exc) { - mrb_p(mrb, mrb_obj_value(mrb->exc)); + mrb_p(mrb, mrb_obj_value(mrb->exc)); } } } - cleanup(&args); + cleanup(mrb, &args); return n > 0 ? 0 : 1; } |
