summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--INSTALL4
-rw-r--r--include/mrbconf.h11
-rw-r--r--include/mruby/string.h2
-rw-r--r--src/gc.c5
-rw-r--r--src/kernel.c27
-rw-r--r--src/numeric.c36
-rw-r--r--src/print.c4
-rw-r--r--src/string.c41
-rw-r--r--src/variable.c8
-rw-r--r--tools/mruby/mruby.c127
10 files changed, 122 insertions, 143 deletions
diff --git a/INSTALL b/INSTALL
index e6c84b501..92851c86d 100644
--- a/INSTALL
+++ b/INSTALL
@@ -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;
};
diff --git a/src/gc.c b/src/gc.c
index 92378ee0a..e90c8a293 100644
--- a/src/gc.c
+++ b/src/gc.c
@@ -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;
}