summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>1998-03-06 10:07:53 +0000
committermatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>1998-03-06 10:07:53 +0000
commit6a3fdf70f18a7b67808f23ddbd28e9631f7f905a (patch)
tree3007e2a4a9ffc83b1a6e73753c083c5ff800bf09
parentf70ffbee2120cbbb8c6b0a15dfc693a69ac0d7d4 (diff)
*** empty log message ***
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/v1_1r@108 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r--ChangeLog13
-rw-r--r--eval.c42
-rw-r--r--ext/Setup2
-rw-r--r--ext/curses/curses.c22
-rw-r--r--parse.y5
-rw-r--r--ruby.h33
-rw-r--r--struct.c2
7 files changed, 93 insertions, 26 deletions
diff --git a/ChangeLog b/ChangeLog
index 204cf914a3..18a1f3afdd 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,18 @@
+Fri Mar 6 17:23:07 1998 Yukihiro Matsumoto <matz@netlab.co.jp>
+
+ * object.c (obj_alloc): check for allocating instance for the
+ primitive classes (mostly perfect).
+
+ * ext/curses/curses.c (curses_finalize): restore original state at
+ interpreter temination.
+
+ * ext/curses/curses.c (curses_addstr): forgot to check argument
+ type (caused SEGV). now uses STR2CSTR() macro.
+
Thu Mar 5 13:47:39 1998 Yukihiro Matsumoto <matz@netlab.co.jp>
+ * eval.c (block_pass): accepts method object as block args.
+
* eval.c (f_missing): use any_to_s() for stringify.
Wed Mar 4 01:39:52 1998 Yukihiro Matsumoto <matz@netlab.co.jp>
diff --git a/eval.c b/eval.c
index 25402e68ce..73faf7fb91 100644
--- a/eval.c
+++ b/eval.c
@@ -44,6 +44,8 @@ static VALUE f_binding _((VALUE));
static void f_END _((void));
static VALUE f_iterator_p _((void));
static VALUE block_pass _((VALUE,NODE*));
+static VALUE cMethod;
+static VALUE method_proc _((VALUE));
#define SCOPE_PRIVATE FL_USER4
#define SCOPE_MODFUNC FL_USER5
@@ -4618,7 +4620,10 @@ block_pass(self, node)
volatile int orphan;
volatile int safe = safe_level;
- if (TYPE(block) != T_DATA
+ if (obj_is_kind_of(block, cMethod)) {
+ block = method_proc(block);
+ }
+ else if (TYPE(block) != T_DATA
|| RDATA(block)->dfree != blk_free
|| !obj_is_kind_of(block, cProc)) {
TypeError("wrong argument type %s (expected Proc)",
@@ -4680,8 +4685,6 @@ block_pass(self, node)
return result;
}
-static VALUE cMethod;
-
struct METHOD {
VALUE klass, oklass;
VALUE recv;
@@ -4774,6 +4777,38 @@ method_inspect(method)
return str;
}
+static VALUE
+mproc()
+{
+ VALUE proc;
+
+ /* emulate ruby's method call */
+ PUSH_ITER(ITER_CUR);
+ PUSH_FRAME();
+ proc = f_lambda();
+ POP_FRAME();
+ POP_ITER();
+
+ return proc;
+}
+
+static VALUE
+mcall(args, method)
+ VALUE args, method;
+{
+ if (TYPE(args) == T_ARRAY) {
+ return method_call(RARRAY(args)->len, RARRAY(args)->ptr, method);
+ }
+ return method_call(1, &args, method);
+}
+
+static VALUE
+method_proc(method)
+ VALUE method;
+{
+ return rb_iterate(mproc, 0, mcall, method);
+}
+
void
Init_Proc()
{
@@ -4793,6 +4828,7 @@ Init_Proc()
rb_define_method(cMethod, "call", method_call, -1);
rb_define_method(cMethod, "inspect", method_inspect, 0);
rb_define_method(cMethod, "to_s", method_inspect, 0);
+ rb_define_method(cMethod, "to_proc", method_proc, 0);
rb_define_method(mKernel, "method", obj_method, 1);
}
diff --git a/ext/Setup b/ext/Setup
index 9e3a2474c3..4258bd4873 100644
--- a/ext/Setup
+++ b/ext/Setup
@@ -1,7 +1,7 @@
#option nodynamic
#GD
-#curses
+curses
#dbm
#etc
#fcntl
diff --git a/ext/curses/curses.c b/ext/curses/curses.c
index 0230636c50..127f51a0cb 100644
--- a/ext/curses/curses.c
+++ b/ext/curses/curses.c
@@ -99,15 +99,27 @@ curses_stdscr()
static VALUE
curses_close_screen()
{
- endwin();
+#ifdef HAVE_ISENDWIN
+ if (!isendwin())
+#endif
+ endwin();
return Qnil;
}
+static void
+curses_finalize()
+{
+#ifdef HAVE_ISENDWIN
+ if (!isendwin())
+#endif
+ endwin();
+}
+
/* def closed? */
static VALUE
curses_closed()
{
-#ifdef HAVE_ENDWIN
+#ifdef HAVE_ISENDWIN
if (isendwin()) {
return TRUE;
}
@@ -313,7 +325,7 @@ curses_addstr(obj, str)
VALUE obj;
VALUE str;
{
- addstr(RSTRING(str)->ptr);
+ addstr(STR2CSTR(str));
return Qnil;
}
@@ -659,7 +671,7 @@ window_addstr(obj, str)
struct windata *winp;
GetWINDOW(obj, winp);
- waddstr(winp->window, RSTRING(str)->ptr);
+ waddstr(winp->window, STR2CSTR(str));
return Qnil;
}
@@ -787,4 +799,6 @@ Init_curses()
rb_define_method(cWindow, "getstr", window_getstr, 0);
rb_define_method(cWindow, "delch", window_delch, 0);
rb_define_method(cWindow, "deleteln", window_deleteln, 0);
+
+ rb_set_end_proc(curses_finalize, 0);
}
diff --git a/parse.y b/parse.y
index e3d9cbafdf..3c4a8fc3a3 100644
--- a/parse.y
+++ b/parse.y
@@ -2251,7 +2251,10 @@ retry:
}
/* fall through */
case '\n':
- if (lex_state == EXPR_BEG || lex_state == EXPR_FNAME) {
+ switch (lex_state) {
+ case EXPR_BEG:
+ case EXPR_FNAME:
+ case EXPR_DOT:
sourceline++;
goto retry;
}
diff --git a/ruby.h b/ruby.h
index f9bb2585f3..604a5be911 100644
--- a/ruby.h
+++ b/ruby.h
@@ -127,20 +127,22 @@ extern VALUE cObject;
VALUE rb_class_of _((VALUE));
#define CLASS_OF(v) rb_class_of((VALUE)(v))
-#define T_NIL 0x00
-#define T_OBJECT 0x01
-#define T_CLASS 0x02
-#define T_ICLASS 0x03
-#define T_MODULE 0x04
-#define T_FLOAT 0x05
-#define T_STRING 0x06
-#define T_REGEXP 0x07
-#define T_ARRAY 0x08
-#define T_FIXNUM 0x09
-#define T_HASH 0x0a
-#define T_STRUCT 0x0b
-#define T_BIGNUM 0x0c
-#define T_FILE 0x0d
+#define T_NONE 0x00
+
+#define T_NIL 0x01
+#define T_OBJECT 0x02
+#define T_CLASS 0x03
+#define T_ICLASS 0x04
+#define T_MODULE 0x05
+#define T_FLOAT 0x06
+#define T_STRING 0x07
+#define T_REGEXP 0x08
+#define T_ARRAY 0x09
+#define T_FIXNUM 0x0a
+#define T_HASH 0x0b
+#define T_STRUCT 0x0c
+#define T_BIGNUM 0x0d
+#define T_FILE 0x0e
#define T_TRUE 0x20
#define T_FALSE 0x21
@@ -295,7 +297,6 @@ struct RBignum {
#define RFILE(obj) (R_CAST(RFile)(obj))
#define FL_SINGLETON FL_USER0
-#define FL_PRIMITIVE FL_USER1
#define FL_MARK (1<<8)
#define FL_FINALIZE (1<<9)
@@ -318,6 +319,8 @@ struct RBignum {
#define FL_UNSET(x,f) if(FL_ABLE(x)){RBASIC(x)->flags &= ~(f);}
#define FL_REVERSE(x,f) if(FL_ABLE(x)){RBASIC(x)->flags ^= f;}
+#define FL_PRIMITIVE FL_USER1
+
#if defined(__GNUC__) && __GNUC__ >= 2 && !defined(RUBY_NO_INLINE)
extern __inline__ int
rb_type(VALUE obj)
diff --git a/struct.c b/struct.c
index 9fcee02ab9..1819c3c1dc 100644
--- a/struct.c
+++ b/struct.c
@@ -149,7 +149,6 @@ make_struct(name, member)
}
rb_define_method_id(nstr, id_attrset(id), struct_set, 1);
}
- FL_SET(nstr, FL_PRIMITIVE);
return nstr;
}
@@ -430,5 +429,4 @@ Init_Struct()
rb_define_method(cStruct, "[]=", struct_aset, 2);
rb_define_method(cStruct, "members", struct_members, 0);
- FL_SET(cStruct, FL_PRIMITIVE);
}