summaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/codegen.c4
-rw-r--r--src/dump.c16
-rw-r--r--src/etc.c3
-rw-r--r--src/hash.c8
-rw-r--r--src/load.c24
-rw-r--r--src/mruby_core.rake19
-rw-r--r--src/string.c40
-rw-r--r--src/struct.c10
8 files changed, 71 insertions, 53 deletions
diff --git a/src/codegen.c b/src/codegen.c
index 86d61fecf..d3239259b 100644
--- a/src/codegen.c
+++ b/src/codegen.c
@@ -1083,6 +1083,7 @@ codegen(codegen_scope *s, node *tree, int val)
}
if (n3->cdr->cdr->car) {
codegen(s, n3->cdr->cdr->car, val);
+ if (val) pop();
}
tmp = new_label(s);
genop(s, MKOP_sBx(OP_JMP, exend));
@@ -1102,6 +1103,9 @@ codegen(codegen_scope *s, node *tree, int val)
if (tree->car) {
codegen(s, tree->car, val);
}
+ else if (val) {
+ push();
+ }
dispatch_linked(s, exend);
loop_pop(s, NOVAL);
}
diff --git a/src/dump.c b/src/dump.c
index e8d96c570..ba5a69a56 100644
--- a/src/dump.c
+++ b/src/dump.c
@@ -10,6 +10,7 @@
#include "mruby/string.h"
#include "mruby/irep.h"
+#include "mruby/numeric.h"
static const unsigned char def_rite_binary_header[] =
RITE_FILE_IDENFIFIER
@@ -50,6 +51,8 @@ enum {
DUMP_SECTION_NUM,
};
+#ifdef ENABLE_STDIO
+
uint16_t calc_crc_16_ccitt(unsigned char*,int);
static inline int uint8_dump(uint8_t,char*,int);
static inline int uint16_dump(uint16_t,char*,int);
@@ -187,8 +190,7 @@ str_dump_len(char *str, uint16_t len, int type)
if (*src >= ' ' && *src <= '~') {
dump_len++;
} else {
- // dump_len += sprintf(buf, "\\%03o", *src & 0377);
- dump_len += 4;
+ dump_len += 4; /* octet "\\nnn" */
}
break;
}
@@ -241,8 +243,8 @@ get_pool_block_size(mrb_state *mrb, mrb_irep *irep, int type)
switch (mrb_type(irep->pool[pool_no])) {
case MRB_TT_FIXNUM:
- len = mrb_int_to_str( buf, mrb_fixnum(irep->pool[pool_no]));
- size += (uint32_t)len;
+ str = mrb_fix2str(mrb, irep->pool[pool_no], 10);
+ size += (uint32_t)RSTRING_LEN(str);
break;
case MRB_TT_FLOAT:
len = mrb_float_to_str( buf, mrb_float(irep->pool[pool_no]));
@@ -358,7 +360,9 @@ write_pool_block(mrb_state *mrb, mrb_irep *irep, char *buf, int type)
switch (mrb_type(irep->pool[pool_no])) {
case MRB_TT_FIXNUM:
- len = mrb_int_to_str(char_buf, mrb_fixnum(irep->pool[pool_no]));
+ str = mrb_fix2str(mrb, irep->pool[pool_no], 10);
+ memcpy(char_buf, RSTRING_PTR(str), RSTRING_LEN(str));
+ len = RSTRING_LEN(str);
break;
case MRB_TT_FLOAT:
@@ -742,3 +746,5 @@ mrb_bdump_irep(mrb_state *mrb, int n, FILE *f,const char *initname)
return rc;
}
+
+#endif /* ENABLE_STDIO */
diff --git a/src/etc.c b/src/etc.c
index 1e2849d45..6a43ddd31 100644
--- a/src/etc.c
+++ b/src/etc.c
@@ -74,7 +74,6 @@ mrb_lastline_get(mrb_state *mrb)
mrb_value
mrb_exec_recursive(mrb_state *mrb, mrb_value (*func) (mrb_state *, mrb_value, mrb_value, int), mrb_value obj, void *arg)
{
- // return mrb_exec_recursive(mrb, io_puts_ary, line, &out);
return func(mrb, obj, *(mrb_value*)arg, 0);
}
@@ -118,7 +117,7 @@ mrb_to_id(mrb_state *mrb, mrb_value name)
mrb_value
mrb_block_proc(void)
{
- return mrb_nil_value();//proc_new(mrb_cProc, FALSE);
+ return mrb_nil_value();
}
static mrb_int
diff --git a/src/hash.c b/src/hash.c
index b7ac59ada..5fa3c1ef8 100644
--- a/src/hash.c
+++ b/src/hash.c
@@ -181,12 +181,6 @@ mrb_hash_dup(mrb_state *mrb, mrb_value hash)
return mrb_obj_value(ret);
}
-static void
-mrb_hash_modify_check(mrb_state *mrb, mrb_value hash)
-{
- //if (OBJ_FROZEN(hash)) mrb_error_frozen("hash");
-}
-
mrb_value
mrb_check_hash_type(mrb_state *mrb, mrb_value hash)
{
@@ -207,7 +201,6 @@ mrb_hash_tbl(mrb_state *mrb, mrb_value hash)
static void
mrb_hash_modify(mrb_state *mrb, mrb_value hash)
{
- //mrb_hash_modify_check(mrb, hash);
mrb_hash_tbl(mrb, hash);
}
@@ -755,7 +748,6 @@ mrb_hash_replace(mrb_state *mrb, mrb_value hash)
khiter_t k;
mrb_get_args(mrb, "o", &hash2);
- mrb_hash_modify_check(mrb, hash);
hash2 = to_hash(mrb, hash2);
if (mrb_obj_equal(mrb, hash, hash2)) return hash;
mrb_hash_clear(mrb, hash);
diff --git a/src/load.c b/src/load.c
index a61af509c..850fa6e8d 100644
--- a/src/load.c
+++ b/src/load.c
@@ -11,6 +11,7 @@
#include "mruby/proc.h"
#include "mruby/irep.h"
+#ifdef ENABLE_STDIO
typedef struct _RiteFILE
{
FILE* fp;
@@ -18,6 +19,7 @@ typedef struct _RiteFILE
int cnt;
int readlen;
} RiteFILE;
+#endif
const char hex2bin[256] = {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //00-0f
@@ -38,15 +40,18 @@ static uint16_t hex_to_uint16(unsigned char*);
static uint32_t hex_to_uint32(unsigned char*);
static char* hex_to_str(char*,char*,uint16_t*);
uint16_t calc_crc_16_ccitt(unsigned char*,int);
+#ifdef ENABLE_STDIO
static unsigned char rite_fgetcSub(RiteFILE*);
static unsigned char rite_fgetc(RiteFILE*,int);
static unsigned char* rite_fgets(RiteFILE*,unsigned char*,int,int);
static int load_rite_header(FILE*,rite_binary_header*,unsigned char*);
static int load_rite_irep_record(mrb_state*, RiteFILE*,unsigned char*,uint32_t*);
+#endif
static int read_rite_header(mrb_state*,unsigned char*,rite_binary_header*);
static int read_rite_irep_record(mrb_state*,unsigned char*,uint32_t*);
+#ifdef ENABLE_STDIO
static unsigned char
rite_fgetcSub(RiteFILE* rfp)
{
@@ -65,7 +70,9 @@ rite_fgetcSub(RiteFILE* rfp)
}
return rfp->buf[(rfp->cnt)++];
}
+#endif /* ENABLE_STDIO */
+#ifdef ENABLE_STDIO
static unsigned char
rite_fgetc(RiteFILE* rfp, int ignorecomment)
{
@@ -87,7 +94,9 @@ rite_fgetc(RiteFILE* rfp, int ignorecomment)
}
}
}
+#endif /* ENABLE_STDIO */
+#ifdef ENABLE_STDIO
static unsigned char*
rite_fgets(RiteFILE* rfp, unsigned char* dst, int len, int ignorecomment)
{
@@ -100,7 +109,9 @@ rite_fgets(RiteFILE* rfp, unsigned char* dst, int len, int ignorecomment)
}
return dst;
}
+#endif /* ENABLE_STDIO */
+#ifdef ENABLE_STDIO
static int
load_rite_header(FILE* fp, rite_binary_header* bin_header, unsigned char* hcrc)
{
@@ -128,7 +139,9 @@ load_rite_header(FILE* fp, rite_binary_header* bin_header, unsigned char* hcrc)
return MRB_DUMP_OK;
}
+#endif /* ENABLE_STDIO */
+#ifdef ENABLE_STDIO
static int
load_rite_irep_record(mrb_state *mrb, RiteFILE* rfp, unsigned char* dst, uint32_t* len)
{
@@ -152,8 +165,10 @@ load_rite_irep_record(mrb_state *mrb, RiteFILE* rfp, unsigned char* dst, uint32_
//IREP HEADER BLOCK
*dst = rite_fgetc(rfp, TRUE); //record identifier
- if (*dst != RITE_IREP_IDENFIFIER)
- return MRB_DUMP_INVALID_IREP;
+ if (*dst != RITE_IREP_IDENFIFIER) {
+ result = MRB_DUMP_INVALID_IREP;
+ goto error_exit;
+ }
dst += sizeof(unsigned char);
*dst = rite_fgetc(rfp, TRUE); //class or module
dst += sizeof(unsigned char);
@@ -247,7 +262,9 @@ error_exit:
return result;
}
+#endif /* ENABLE_STDIO */
+#ifdef ENABLE_STDIO
int
mrb_read_irep_file(mrb_state *mrb, FILE* fp)
{
@@ -306,6 +323,7 @@ error_exit:
return ret;
}
+#endif /* ENABLE_STDIO */
static int
read_rite_header(mrb_state *mrb, unsigned char *bin, rite_binary_header* bin_header)
@@ -668,6 +686,7 @@ irep_error(mrb_state *mrb, int n)
mrb->exc = (struct RObject*)mrb_object(mrb_exc_new(mrb, E_SCRIPT_ERROR, msg, sizeof(msg) - 1));
}
+#ifdef ENABLE_STDIO
mrb_value
mrb_load_irep_file(mrb_state *mrb, FILE* fp)
{
@@ -679,6 +698,7 @@ mrb_load_irep_file(mrb_state *mrb, FILE* fp)
}
return mrb_run(mrb, mrb_proc_new(mrb, mrb->irep[n]), mrb_top_self(mrb));
}
+#endif
mrb_value
mrb_load_irep(mrb_state *mrb, const char *bin)
diff --git a/src/mruby_core.rake b/src/mruby_core.rake
index 44d62c1e9..db335223d 100644
--- a/src/mruby_core.rake
+++ b/src/mruby_core.rake
@@ -1,8 +1,11 @@
MRuby.each_target do
- dir = File.dirname(__FILE__).relative_path_from(root)
-
- lex_def = "#{dir}/lex.def"
- objs = Dir.glob("src/*.{c}").map { |f| objfile(f.pathmap("#{build_dir}/%X")) } + [objfile("#{build_dir}/#{dir}/y.tab")]
+ current_dir = File.dirname(__FILE__).relative_path_from(Dir.pwd)
+ relative_from_root = File.dirname(__FILE__).relative_path_from(MRUBY_ROOT)
+ current_build_dir = "#{build_dir}/#{relative_from_root}"
+
+ lex_def = "#{current_dir}/lex.def"
+ objs = Dir.glob("#{current_dir}/*.c").map { |f| objfile(f.pathmap("#{current_build_dir}/%n")) }
+ objs += [objfile("#{current_build_dir}/y.tab")]
self.libmruby << objs
file libfile("#{build_dir}/lib/libmruby_core") => objs do |t|
@@ -10,16 +13,16 @@ MRuby.each_target do
end
# Parser
- file "#{build_dir}/#{dir}/y.tab.c" => ["#{dir}/parse.y"] do |t|
+ file "#{current_build_dir}/y.tab.c" => ["#{current_dir}/parse.y"] do |t|
yacc.run t.name, t.prerequisites.first
end
- file objfile("#{build_dir}/#{dir}/y.tab") => ["#{build_dir}/#{dir}/y.tab.c", lex_def] do |t|
- cc.run t.name, t.prerequisites.first, [], [dir]
+ file objfile("#{current_build_dir}/y.tab") => ["#{current_build_dir}/y.tab.c", lex_def] do |t|
+ cc.run t.name, t.prerequisites.first, [], [current_dir]
end
# Lexical analyzer
- file lex_def => "#{dir}/keywords" do |t|
+ file lex_def => "#{current_dir}/keywords" do |t|
gperf.run t.name, t.prerequisites.first
end
end
diff --git a/src/string.c b/src/string.c
index 6afb4f6ca..205c39876 100644
--- a/src/string.c
+++ b/src/string.c
@@ -14,6 +14,7 @@
#include "mruby/range.h"
#include "mruby/array.h"
#include "mruby/class.h"
+#include "mruby/numeric.h"
#include <stdio.h>
#include "re.h"
@@ -1319,7 +1320,6 @@ mrb_str_include(mrb_state *mrb, mrb_value self)
return mrb_true_value();
return mrb_false_value();
}
- //StringValue(arg);
mrb_string_value(mrb, &str2);
i = mrb_str_index(mrb, self, str2, 0);
@@ -1985,14 +1985,6 @@ mrb_str_split_m(mrb_state *mrb, mrb_value str)
}
-int
-mrb_block_given_p()
-{
- /*if (ruby_frame->iter == ITER_CUR && ruby_block)
- return 1;*//*Qtrue*/
- return FALSE;
-}
-
/* 15.2.10.5.37 */
/*
* call-seq:
@@ -2281,8 +2273,6 @@ mrb_cstr_to_dbl(mrb_state *mrb, const char * p, int badcheck)
{
char *end;
double d;
-// const char *ellipsis = "";
-// int w;
#if !defined(DBL_DIG)
#define DBL_DIG 16
#endif
@@ -2353,7 +2343,6 @@ mrb_str_to_dbl(mrb_state *mrb, mrb_value str, int badcheck)
char *s;
int len;
- //StringValue(str);
mrb_string_value(mrb, &str);
s = RSTRING_PTR(str);
len = RSTRING_LEN(str);
@@ -2552,9 +2541,16 @@ mrb_str_dump(mrb_state *mrb, mrb_value str)
*q++ = c;
}
else {
- *q++ = '\\';
- sprintf(q, "%03o", c&0xff);
- q += 3;
+ mrb_value octstr;
+ mrb_value chr;
+ const char *ptr;
+ int len;
+ chr = mrb_fixnum_value(c & 0xff);
+ octstr = mrb_fix2str(mrb, chr, 8);
+ ptr = mrb_str_body(octstr, &len);
+ memcpy(q, "\\000", 4);
+ memcpy(q + 4 - len, ptr, len);
+ q += 4;
}
}
*q++ = '"';
@@ -2637,9 +2633,17 @@ mrb_str_inspect(mrb_state *mrb, mrb_value str)
continue;
}
else {
- int n = sprintf(buf, "\\%03o", c & 0377);
- mrb_str_buf_cat(mrb, result, buf, n);
- continue;
+ mrb_value octstr;
+ mrb_value chr;
+ const char *ptr;
+ int len;
+ chr = mrb_fixnum_value(c & 0xff);
+ octstr = mrb_fix2str(mrb, chr, 8);
+ ptr = mrb_str_body(octstr, &len);
+ memcpy(buf, "\\000", 4);
+ memcpy(buf + 4 - len, ptr, len);
+ mrb_str_buf_cat(mrb, result, buf, 4);
+ continue;
}
}
mrb_str_buf_cat(mrb, result, "\"", 1);
diff --git a/src/struct.c b/src/struct.c
index 1efdca66f..5026a6ab4 100644
--- a/src/struct.c
+++ b/src/struct.c
@@ -172,12 +172,6 @@ static mrb_value (*const ref_func[])(mrb_state*, mrb_value) = {
mrb_struct_ref9,
};
-static void
-mrb_struct_modify(mrb_value s)
-{
- //if (OBJ_FROZEN(s)) mrb_error_frozen("Struct");
-}
-
mrb_sym
mrb_id_attrset(mrb_state *mrb, mrb_sym id)
{
@@ -212,7 +206,6 @@ mrb_struct_set(mrb_state *mrb, mrb_value obj, mrb_value val)
members = mrb_struct_members(mrb, obj);
ptr_members = RARRAY_PTR(members);
len = RARRAY_LEN(members);
- mrb_struct_modify(obj);
ptr = RSTRUCT_PTR(obj);
for (i=0; i<len; i++) {
slot = ptr_members[i];
@@ -429,7 +422,6 @@ mrb_struct_initialize_withArg(mrb_state *mrb, int argc, mrb_value *argv, mrb_val
int n;
struct RStruct *st;
- mrb_struct_modify(self);
n = num_members(mrb, klass);
if (n < argc) {
mrb_raise(mrb, E_ARGUMENT_ERROR, "struct size differs");
@@ -616,7 +608,6 @@ mrb_struct_aset_id(mrb_state *mrb, mrb_value s, mrb_sym id, mrb_value val)
members = mrb_struct_members(mrb, s);
len = RARRAY_LEN(members);
- mrb_struct_modify(s);
if (RSTRUCT_LEN(s) != len) {
mrb_raisef(mrb, E_TYPE_ERROR, "struct size differs (%ld required %ld given)",
len, RSTRUCT_LEN(s));
@@ -678,7 +669,6 @@ mrb_struct_aset(mrb_state *mrb, mrb_value s)
mrb_raisef(mrb, E_INDEX_ERROR, "offset %ld too large for struct(size:%ld)",
i, RSTRUCT_LEN(s));
}
- mrb_struct_modify(s);
return RSTRUCT_PTR(s)[i] = val;
}