[strongtalk] r179 committed - Merge nil subclass fix into SVN

1 view
Skip to first unread message

codesite...@google.com

unread,
Oct 17, 2009, 11:34:11 AM10/17/09
to strongta...@googlegroups.com
Revision: 179
Author: StephenLRees
Date: Sat Oct 17 08:33:31 2009
Log: Merge nil subclass fix into SVN
http://code.google.com/p/strongtalk/source/detail?r=179

Modified:
/branches/gcc-linux/test/prims/behaviorPrimsSuperclassTests.cpp
/branches/gcc-linux/vm/prims/behavior_prims.cpp

=======================================
--- /branches/gcc-linux/test/prims/behaviorPrimsSuperclassTests.cpp Sat Oct
17 07:54:56 2009
+++ /branches/gcc-linux/test/prims/behaviorPrimsSuperclassTests.cpp Sat Oct
17 08:33:31 2009
@@ -208,6 +208,18 @@
ASSERT_TRUE_M(superclassOf(subclass()->klass()) ==
objectClass()->klass(),
"Metasuperclass should be unchanged");
}
+
+TESTF(BehaviorPrimitivesSuperclassTests,
setSuperclassShouldChangeNilSuperclassToNotNil) {
+ ASSERT_TRUE_M(superclassOf(subclass()) == objectClass(), "Original
superclassHandle");
+
+ oop result = behaviorPrimitives::setSuperclass(nilObj, subclass());
+
+ ASSERT_TRUE_M(superclassOf(subclass()) == nilObj, "Superclass should
have changed");
+
+ result = behaviorPrimitives::setSuperclass(objectClass(), subclass());
+
+ ASSERT_TRUE_M(superclassOf(subclass()) == objectClass(), "Superclass
should have changed back");
+}

TESTF(BehaviorPrimitivesSuperclassTests,
setSuperclassShouldChangeTopSuperclassToClass) {
oop result = behaviorPrimitives::setSuperclass(classClass(),
topClass()->klass());
=======================================
--- /branches/gcc-linux/vm/prims/behavior_prims.cpp Sat Oct 17 07:54:56 2009
+++ /branches/gcc-linux/vm/prims/behavior_prims.cpp Sat Oct 17 08:33:31 2009
@@ -74,17 +74,24 @@
return markSymbol(vmSymbols::first_argument_has_wrong_type());

Klass* receiverClass = klassOop(receiver)->klass_part();
- Klass* oldSuperclass = receiverClass->superKlass()->klass_part();
klassOop newSuperclass;
- if (newSuper == nilObj) {
- newSuperclass = klassOop(nilObj);
- if (oldSuperclass->number_of_instance_variables() > 0)
+ if (receiverClass->superKlass() == newSuper) return receiver; // no
change
+ if (receiverClass->superKlass() == nilObj) {
+ newSuperclass = klassOop(newSuper);
+ if (newSuperclass->klass_part()->number_of_instance_variables() > 0)
return markSymbol(vmSymbols::argument_is_invalid());
} else {
- newSuperclass = klassOop(newSuper);
-
- if (!oldSuperclass->has_same_inst_vars_as(newSuperclass))
- return markSymbol(vmSymbols::invalid_klass());
+ Klass* oldSuperclass = receiverClass->superKlass()->klass_part();
+ if (newSuper == nilObj) {
+ newSuperclass = klassOop(nilObj);
+ if (oldSuperclass->number_of_instance_variables() > 0)
+ return markSymbol(vmSymbols::argument_is_invalid());
+ } else {
+ newSuperclass = klassOop(newSuper);
+
+ if (!oldSuperclass->has_same_inst_vars_as(newSuperclass))
+ return markSymbol(vmSymbols::invalid_klass());
+ }
}
receiverClass->set_superKlass(newSuperclass);

Reply all
Reply to author
Forward
0 new messages