[macruby-changes] [5219] MacRuby/trunk/object.c

source_changes at macosforge.org source_changes at macosforge.org
Thu Feb 3 16:45:09 PST 2011


Revision: 5219
          http://trac.macosforge.org/projects/ruby/changeset/5219
Author:   pthomson at apple.com
Date:     2011-02-03 16:45:08 -0800 (Thu, 03 Feb 2011)
Log Message:
-----------
Allow Float objects to be trusted/untrusted and tainted/untainted. Fixes #1009.

Modified Paths:
--------------
    MacRuby/trunk/object.c

Modified: MacRuby/trunk/object.c
===================================================================
--- MacRuby/trunk/object.c	2011-02-02 14:01:33 UTC (rev 5218)
+++ MacRuby/trunk/object.c	2011-02-04 00:45:08 UTC (rev 5219)
@@ -765,6 +765,11 @@
     return Qnil;
 }
 
+// In order to mimic 1.9, we allow Floats to be tainted and untrusted, even
+// though they are technically immediates.
+static st_table *immediate_flags_tbl = 0;
+
+
 /*
  *  call-seq:
  *     obj.tainted?    => true or false
@@ -775,13 +780,19 @@
 static VALUE
 rb_obj_tainted_p(VALUE obj, SEL sel)
 {
-    if (SPECIAL_CONST_P(obj))
+    if (SPECIAL_CONST_P(obj)) {
+	if (immediate_flags_tbl && FIXFLOAT_P(obj)) {
+	    VALUE flags = 0;
+	    if (st_lookup(immediate_flags_tbl, obj, &flags) && (flags & FL_TAINT)) {
+		return Qtrue;
+	    }
+	}
 	return Qfalse;
+    }
     else if (NATIVE(obj)) {
 	switch (TYPE(obj)) {
 	    case T_SYMBOL:
 		return Qfalse;
-
 	    case T_ARRAY:
 		if (rb_klass_is_rary(*(VALUE *)obj)) {
 		    return RBASIC(obj)->flags & FL_TAINT ? Qtrue : Qfalse;
@@ -827,13 +838,26 @@
 {
     rb_secure(4);
     if (SPECIAL_CONST_P(obj)) {
+	if (!FIXFLOAT_P(obj)) {
+	    return obj;
+	}
+	else if (!immediate_flags_tbl) {
+	    immediate_flags_tbl = st_init_numtable();
+	    GC_RETAIN(immediate_flags_tbl);
+	    st_insert(immediate_flags_tbl, obj, (st_data_t)FL_TAINT);
+	}
+	else {
+	    VALUE flags = 0;
+	    st_lookup(immediate_flags_tbl, obj, &flags);
+	    flags |= FL_TAINT;
+	    st_insert(immediate_flags_tbl, obj, (st_data_t)flags);
+	}
 	return obj;
     }
     else if (NATIVE(obj)) {
 	switch (TYPE(obj)) {
 	    case T_SYMBOL:
-		break;
-
+		return obj;
 	    case T_ARRAY:
 		if (rb_klass_is_rary(*(VALUE *)obj)) {
 		    RBASIC(obj)->flags |= FL_TAINT;
@@ -883,11 +907,19 @@
 rb_obj_untaint_m(VALUE obj, SEL sel)
 {
     rb_secure(3);
-    if (!SPECIAL_CONST_P(obj) && NATIVE(obj)) {
+    if (SPECIAL_CONST_P(obj)) {
+	if (immediate_flags_tbl && FIXFLOAT_P(obj)) {
+	    VALUE flags = 0;
+	    st_lookup(immediate_flags_tbl, obj, &flags);
+	    flags &= ~FL_TAINT;
+	    st_insert(immediate_flags_tbl, obj, (st_data_t)flags);
+	}
+	return obj;
+    }
+    else if (NATIVE(obj)) {
 	switch (TYPE(obj)) {
 	    case T_SYMBOL:
-		break;
-
+		return obj;
 	    case T_ARRAY:
 		if (rb_klass_is_rary(*(VALUE *)obj)) {
 		    RBASIC(obj)->flags &= ~FL_TAINT;
@@ -928,11 +960,19 @@
 static VALUE
 rb_obj_untrusted_imp(VALUE obj, SEL sel)
 {
-    if (!SPECIAL_CONST_P(obj) && NATIVE(obj)) {
+    if (SPECIAL_CONST_P(obj)) {
+	if (immediate_flags_tbl && FIXFLOAT_P(obj)) {
+	    VALUE flags = 0;
+	    if (st_lookup(immediate_flags_tbl, obj, &flags) && (flags && FL_UNTRUSTED)) {
+		return Qtrue;
+	    }
+	}
+	return Qfalse;
+    }
+    else if (NATIVE(obj)) {
 	switch (TYPE(obj)) {
 	    case T_SYMBOL:
-		return Qfalse;
-
+		return Qfalse;	
 	    case T_ARRAY:
 		if (rb_klass_is_rary(*(VALUE *)obj)) {
 		    return RBASIC(obj)->flags & FL_UNTRUSTED ? Qtrue : Qfalse;
@@ -971,11 +1011,27 @@
 	if (OBJ_FROZEN(obj)) {
 	    rb_error_frozen("object");
 	}
-	if (!SPECIAL_CONST_P(obj) && NATIVE(obj)) {
+	else if (SPECIAL_CONST_P(obj)) {
+	    if(!FIXFLOAT_P(obj)) {
+		return obj;
+	    }
+	    else if(!immediate_flags_tbl) {
+		immediate_flags_tbl = st_init_numtable();
+		GC_RETAIN(immediate_flags_tbl);
+		st_insert(immediate_flags_tbl, obj, FL_UNTRUSTED);
+	    }
+	    else {
+		VALUE flags = 0;
+		st_lookup(immediate_flags_tbl, obj, &flags);
+		flags &= ~FL_UNTRUSTED;
+		st_insert(immediate_flags_tbl, obj, (st_data_t)flags);
+	    }
+	    return obj;
+	}
+	else if (NATIVE(obj)) {
 	    switch (TYPE(obj)) {
 		case T_SYMBOL:
-		    break;
-
+		    return obj;
 		case T_ARRAY:
 		    if (rb_klass_is_rary(*(VALUE *)obj)) {
 			RBASIC(obj)->flags &= ~FL_UNTRUSTED;
@@ -1017,11 +1073,27 @@
 	if (OBJ_FROZEN(obj)) {
 	    rb_error_frozen("object");
 	}
-	if (!SPECIAL_CONST_P(obj) && NATIVE(obj)) {
+	else if (SPECIAL_CONST_P(obj)) {
+	    if (!FIXFLOAT_P(obj)) {
+		return obj;
+	    }
+	    else if (!immediate_flags_tbl) {
+		immediate_flags_tbl = st_init_numtable();
+		GC_RETAIN(immediate_flags_tbl);
+		st_insert(immediate_flags_tbl, obj, (st_data_t)FL_UNTRUSTED);
+	    }
+	    else {
+		VALUE flags = 0;
+		st_lookup(immediate_flags_tbl, obj, &flags);
+		flags |= FL_UNTRUSTED;
+		st_insert(immediate_flags_tbl, obj, (st_data_t)flags);
+	    }
+	    return obj;
+	}
+	else if (NATIVE(obj)) {
 	    switch (TYPE(obj)) {
 		case T_SYMBOL:
-		    break;
-
+		    return Qfalse;
 		case T_ARRAY:
 		    if (rb_klass_is_rary(*(VALUE *)obj)) {
 			RBASIC(obj)->flags |= FL_UNTRUSTED;
@@ -1061,8 +1133,6 @@
     OBJ_INFECT(obj1, obj2);
 }
 
-static st_table *immediate_frozen_tbl = 0;
-
 /*
  *  call-seq:
  *     obj.freeze    => obj
@@ -1092,11 +1162,18 @@
 	}
 	else if (SPECIAL_CONST_P(obj)) {
 immediate:
-	    if (!immediate_frozen_tbl) {
-		immediate_frozen_tbl = st_init_numtable();
-		GC_RETAIN(immediate_frozen_tbl);
+	    if (!immediate_flags_tbl) {
+		immediate_flags_tbl = st_init_numtable();
+	 	GC_RETAIN(immediate_flags_tbl);
+		st_insert(immediate_flags_tbl, obj, (st_data_t)FL_FREEZE);
+	    } 
+	    else {
+		VALUE flags = 0;
+		st_lookup(immediate_flags_tbl, obj, &flags);
+		flags |= FL_FREEZE;
+		st_insert(immediate_flags_tbl, obj, (st_data_t)flags);
 	    }
-	    st_insert(immediate_frozen_tbl, obj, (st_data_t)Qtrue);
+	    return obj;
 	}
 	else if ((type = TYPE(obj)) == T_CLASS || type == T_MODULE) {
 	    RCLASS_SET_VERSION_FLAG(obj, RCLASS_IS_FROZEN);
@@ -1156,12 +1233,12 @@
 {
     if (SPECIAL_CONST_P(obj)) {
 immediate:
-	if (!immediate_frozen_tbl) {
-	    return Qfalse;
+	if (immediate_flags_tbl) {
+	    VALUE flags = 0;
+	    if (st_lookup(immediate_flags_tbl, obj, &flags) && (flags & FL_FREEZE)) {
+	    	return Qtrue;
+	    }
 	}
-	if (st_lookup(immediate_frozen_tbl, obj, 0)) {
-	    return Qtrue;
-	}
 	return Qfalse;
     }
     switch (TYPE(obj)) {
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/macruby-changes/attachments/20110203/401f1ac3/attachment.html>


More information about the macruby-changes mailing list