Skip to content

Commit

Permalink
* parse.y (stmt): local variable declaration order was changed
Browse files Browse the repository at this point in the history
  since 1.6

* parse.y (arg): ditto.

* pack.c (pack_pack): add templates 'q' and 'Q'.

* pack.c (pack_unpack): ditto.

* bignum.c (rb_quad_pack): new utility function.

* bignum.c (rb_quad_unpack): ditto.

* parse.y (assignable): should emit CVASGN within the method
  body.

* dir.c (dir_s_glob): should not warn even if no match found.

* eval.c (rb_eval): clean up class variable behavior.

* eval.c (assign): ditto.

* eval.c (is_defined): ditto.

* variable.c (rb_mod_class_variables): need not to call rb_cvar_singleton().

* variable.c (rb_cvar_singleton): removed.


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@2063 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
  • Loading branch information
matz committed Feb 13, 2002
1 parent 1995213 commit ba8fc11
Show file tree
Hide file tree
Showing 12 changed files with 289 additions and 106 deletions.
36 changes: 36 additions & 0 deletions ChangeLog
Original file line number Diff line number Diff line change
@@ -1,3 +1,39 @@
Wed Feb 13 17:58:12 2002 Yukihiro Matsumoto <[email protected]>

* parse.y (stmt): local variable declaration order was changed
since 1.6

* parse.y (arg): ditto.

* pack.c (pack_pack): add templates 'q' and 'Q'.

* pack.c (pack_unpack): ditto.

* bignum.c (rb_quad_pack): new utility function.

* bignum.c (rb_quad_unpack): ditto.

Tue Feb 12 01:21:34 2002 Yukihiro Matsumoto <[email protected]>

* parse.y (assignable): should emit CVASGN within the method
body.

Mon Feb 11 06:13:53 2002 Matt Armstrong <[email protected]>

* dir.c (dir_s_glob): should not warn even if no match found.

Mon Feb 11 04:25:54 2002 Yukihiro Matsumoto <[email protected]>

* eval.c (rb_eval): clean up class variable behavior.

* eval.c (assign): ditto.

* eval.c (is_defined): ditto.

* variable.c (rb_mod_class_variables): need not to call rb_cvar_singleton().

* variable.c (rb_cvar_singleton): removed.

Sun Feb 10 16:52:53 2002 Nobuyoshi Nakada <[email protected]>

* ruby.c (load_file): avoid SEGV on '#' only input.
Expand Down
106 changes: 106 additions & 0 deletions bignum.c
Original file line number Diff line number Diff line change
Expand Up @@ -185,6 +185,112 @@ rb_int2inum(n)
return rb_int2big(n);
}

#ifdef HAVE_LONG_LONG

void
rb_quad_pack(buf, val)
char *buf;
VALUE val;
{
LONG_LONG q;

val = rb_to_int(val);
if (FIXNUM_P(val)) {
q = FIX2LONG(val);
}
else {
long len = RBIGNUM(val)->len;
BDIGIT *ds;

ds = BDIGITS(val);
q = 0;
while (len--) {
q = BIGUP(q);
q += ds[len];
}
}
memcpy(buf, (char*)&q, sizeof(LONG_LONG));
}

VALUE
rb_quad_unpack(buf, sign)
const char *buf;
int sign;
{
unsigned LONG_LONG q;
long neg = 0;
long i = 0;
BDIGIT *digits;
VALUE big;

memcpy(&q, buf, sizeof(LONG_LONG));
if (sign) {
if (FIXABLE((LONG_LONG)q)) return INT2FIX((LONG_LONG)q);
if ((LONG_LONG)q < 0) {
q = -(LONG_LONG)q;
neg = 1;
}
}
else {
if (POSFIXABLE(q)) return INT2FIX(q);
}

i = 0;
big = bignew(DIGSPERLONGLONG, 1);
digits = BDIGITS(big);
while (i < DIGSPERLONGLONG) {
digits[i++] = BIGLO(q);
q = BIGDN(q);
}

i = DIGSPERLONGLONG;
while (i-- && !digits[i]) ;
RBIGNUM(big)->len = i+1;

if (neg) {
RBIGNUM(big)->sign = 0;
}
return bignorm(big);
}

#else

#define QUAD_SIZE 8

void
rb_quad_pack(buf, val)
char *buf;
VALUE val;
{
long len;

memset(buf, 0, QUAD_SIZE);
val = rb_to_int(val);
if (FIXNUM_P(val)) {
val = rb_uint2big(FIX2LONG(val));
}
len = RBIGNUM(val)->len * sizeof(BDIGIT);
if (len > QUAD_SIZE) len = QUAD_SIZE;
memcpy(buf, (char*)BDIGITS(val), len);
}

VALUE
rb_quad_unpack(buf, sign)
const char *buf;
int sign;
{
VALUE big = bignew(QUAD_SIZE/sizeof(BDIGIT), 1);

memcpy((char*)BDIGITS(big), buf, QUAD_SIZE);
if (sign && (buf[7] & 0x80)) {
RBIGNUM(big)->sign = 0;
}

return bignorm(big);
}

#endif

VALUE
rb_cstr_to_inum(str, base, badcheck)
const char *str;
Expand Down
3 changes: 0 additions & 3 deletions dir.c
Original file line number Diff line number Diff line change
Expand Up @@ -939,9 +939,6 @@ dir_s_glob(dir, str)
if (buf != buffer)
free(buf);
if (ary) {
if (RARRAY(ary)->len == 0) {
rb_warning("no matches found: %s", RSTRING(str)->ptr);
}
return ary;
}
return Qnil;
Expand Down
75 changes: 33 additions & 42 deletions eval.c
Original file line number Diff line number Diff line change
Expand Up @@ -436,7 +436,7 @@ rb_method_boundp(klass, id, ex)
return Qfalse;
}

static ID init, eqq, each, aref, aset, match, to_ary, missing;
static ID init, alloc, eqq, each, aref, aset, match, to_ary, missing;
static ID added, singleton_added;
static ID __id__, __send__;

Expand Down Expand Up @@ -1899,24 +1899,19 @@ is_defined(self, node, buf)
break;

case NODE_CVAR:
if (!ruby_frame || !ruby_frame->last_class ||
!FL_TEST(ruby_frame->last_class, FL_SINGLETON)) {
if (NIL_P(ruby_cbase)) {
if (rb_cvar_defined(CLASS_OF(self), node->nd_vid)) {
return "class variable";
}
break;
if (NIL_P(ruby_cbase)) {
if (rb_cvar_defined(CLASS_OF(self), node->nd_vid)) {
return "class variable";
}
if (!FL_TEST(ruby_cbase, FL_SINGLETON)) {
if (rb_cvar_defined(ruby_cbase, node->nd_vid)) {
return "class variable";
}
break;
break;
}
if (!FL_TEST(ruby_cbase, FL_SINGLETON)) {
if (rb_cvar_defined(ruby_cbase, node->nd_vid)) {
return "class variable";
}
break;
}
/* fall through */
case NODE_CVAR2:
if (rb_cvar_defined(rb_cvar_singleton(self), node->nd_vid)) {
if (rb_cvar_defined(rb_iv_get(ruby_cbase, "__attached__"), node->nd_vid)) {
return "class variable";
}
break;
Expand Down Expand Up @@ -2866,17 +2861,15 @@ rb_eval(self, n)
rb_raise(rb_eTypeError, "no class/module to define class variable");
}
result = rb_eval(self, node->nd_value);
if (FL_TEST(ruby_cbase, FL_SINGLETON)) {
rb_cvar_declare(rb_cvar_singleton(rb_iv_get(ruby_cbase, "__attached__")),
node->nd_vid, result);
break;
if (ruby_verbose && FL_TEST(ruby_cbase, FL_SINGLETON)) {
rb_warn("declaring singleton class variable");
}
rb_cvar_declare(ruby_cbase, node->nd_vid, result);
break;

case NODE_CVASGN:
result = rb_eval(self, node->nd_value);
rb_cvar_set(rb_cvar_singleton(self), node->nd_vid, result);
rb_cvar_set(ruby_cbase, node->nd_vid, result);
break;

case NODE_LVAR:
Expand All @@ -2902,22 +2895,16 @@ rb_eval(self, n)
result = ev_const_get(RNODE(ruby_frame->cbase), node->nd_vid, self);
break;

case NODE_CVAR: /* normal method */
if (!ruby_frame || !ruby_frame->last_class ||
!FL_TEST(ruby_frame->last_class, FL_SINGLETON)) {
/* non singleton method */
if (NIL_P(ruby_cbase)) {
result = rb_cvar_get(CLASS_OF(self), node->nd_vid);
break;
}
if (!FL_TEST(ruby_cbase, FL_SINGLETON)) {
result = rb_cvar_get(ruby_cbase, node->nd_vid);
break;
}
case NODE_CVAR:
if (NIL_P(ruby_cbase)) {
result = rb_cvar_get(CLASS_OF(self), node->nd_vid);
break;
}
/* fall through */
case NODE_CVAR2: /* singleton method */
result = rb_cvar_get(rb_cvar_singleton(self), node->nd_vid);
if (!FL_TEST(ruby_cbase, FL_SINGLETON)) {
result = rb_cvar_get(ruby_cbase, node->nd_vid);
break;
}
result = rb_cvar_get(rb_iv_get(ruby_cbase, "__attached__"), node->nd_vid);
break;

case NODE_BLOCK_ARG:
Expand Down Expand Up @@ -3103,6 +3090,9 @@ rb_eval(self, n)
if (NIL_P(ruby_class)) {
rb_raise(rb_eTypeError, "no class/module to add method");
}
if (ruby_class == rb_cClass && node->nd_mid == alloc) {
rb_raise(rb_eNameError, "redefining Class#allocate will cause infinite loop");
}
if (ruby_class == rb_cObject && node->nd_mid == init) {
rb_warn("redefining Object#initialize may cause infinite loop");
}
Expand Down Expand Up @@ -3922,14 +3912,14 @@ assign(self, lhs, val, pcall)
break;

case NODE_CVDECL:
if (!FL_TEST(ruby_cbase, FL_SINGLETON)) {
rb_cvar_declare(ruby_cbase, lhs->nd_vid, val);
break;
if (ruby_verbose && FL_TEST(ruby_cbase, FL_SINGLETON)) {
rb_warn("declaring singleton class variable");
}
self = rb_iv_get(ruby_cbase, "__attached__");
/* fall through */
rb_cvar_declare(ruby_cbase, lhs->nd_vid, val);
break;

case NODE_CVASGN:
rb_cvar_set(rb_cvar_singleton(self), lhs->nd_vid, val);
rb_cvar_set(ruby_cbase, lhs->nd_vid, val);
break;

case NODE_MASGN:
Expand Down Expand Up @@ -6021,6 +6011,7 @@ void
Init_eval()
{
init = rb_intern("initialize");
alloc = rb_intern("allocate");
eqq = rb_intern("===");
each = rb_intern("each");

Expand Down
1 change: 0 additions & 1 deletion gc.c
Original file line number Diff line number Diff line change
Expand Up @@ -700,7 +700,6 @@ rb_gc_mark_children(ptr)
case NODE_DVAR:
case NODE_IVAR:
case NODE_CVAR:
case NODE_CVAR2:
case NODE_NTH_REF:
case NODE_BACK_REF:
case NODE_ALIAS:
Expand Down
3 changes: 2 additions & 1 deletion intern.h
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,8 @@ long rb_big2long _((VALUE));
#define rb_big2int(x) rb_big2long(x)
unsigned long rb_big2ulong _((VALUE));
#define rb_big2uint(x) rb_big2ulong(x)
void rb_quad_pack _((char*,VALUE));
VALUE rb_quad_unpack _((const char*,int));
VALUE rb_dbl2big _((double));
double rb_big2dbl _((VALUE));
VALUE rb_big_plus _((VALUE, VALUE));
Expand Down Expand Up @@ -424,7 +426,6 @@ void rb_cvar_declare _((VALUE, ID, VALUE));
VALUE rb_cvar_defined _((VALUE, ID));
void rb_cvar_set _((VALUE, ID, VALUE));
VALUE rb_cvar_get _((VALUE, ID));
VALUE rb_cvar_singleton _((VALUE));
void rb_cv_set _((VALUE, const char *, VALUE));
VALUE rb_cv_get _((VALUE, const char *));
void rb_define_class_variable _((VALUE, const char *, VALUE));
Expand Down
2 changes: 0 additions & 2 deletions node.h
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,6 @@ enum node_type {
NODE_IVAR,
NODE_CONST,
NODE_CVAR,
NODE_CVAR2,
NODE_NTH_REF,
NODE_BACK_REF,
NODE_MATCH,
Expand Down Expand Up @@ -285,7 +284,6 @@ typedef struct RNode {
#define NEW_IVAR(v) rb_node_newnode(NODE_IVAR,v,0,0)
#define NEW_CONST(v) rb_node_newnode(NODE_CONST,v,0,0)
#define NEW_CVAR(v) rb_node_newnode(NODE_CVAR,v,0,0)
#define NEW_CVAR2(v) rb_node_newnode(NODE_CVAR2,v,0,0)
#define NEW_NTH_REF(n) rb_node_newnode(NODE_NTH_REF,0,n,local_cnt('~'))
#define NEW_BACK_REF(n) rb_node_newnode(NODE_BACK_REF,0,n,local_cnt('~'))
#define NEW_MATCH(c) rb_node_newnode(NODE_MATCH,c,0,0)
Expand Down
Loading

0 comments on commit ba8fc11

Please sign in to comment.