]> gitweb.factorcode.org Git - factor.git/commitdiff
Fix GC root safety in word-xt primitive
authorSlava Pestov <slava@shill.local>
Sat, 26 Sep 2009 02:42:21 +0000 (21:42 -0500)
committerSlava Pestov <slava@shill.local>
Sat, 26 Sep 2009 02:42:21 +0000 (21:42 -0500)
core/words/words-tests.factor
vm/words.cpp

index c3dacbaf148921a1492b45101b8f97980e42f973..b9d6e80630af59151923deea6d7010afa573ddf3 100755 (executable)
@@ -125,3 +125,5 @@ DEFER: x
         keys [ "forgotten" word-prop ] filter
     ] map harvest
 ] unit-test
+
+[ "hi" word-xt ] must-fail
index ce25313ea25b0dac4cbbe9cc28f6883ebcfbb1c4..b6f7097f71401d29a3b4f0a52ff75dd72aad6a6d 100644 (file)
@@ -44,10 +44,19 @@ PRIMITIVE_FORWARD(word)
 /* word-xt ( word -- start end ) */
 inline void factor_vm::primitive_word_xt()
 {
-       word *w = untag_check<word>(dpop());
-       code_block *code = (profiling_p ? w->profiling : w->code);
-       dpush(allot_cell((cell)code->xt()));
-       dpush(allot_cell((cell)code + code->size));
+       gc_root<word> w(dpop(),this);
+       w.untag_check(this);
+
+       if(profiling_p)
+       {
+               dpush(allot_cell((cell)w->profiling->xt()));
+               dpush(allot_cell((cell)w->profiling + w->profiling->size));
+       }
+       else
+       {
+               dpush(allot_cell((cell)w->code->xt()));
+               dpush(allot_cell((cell)w->code + w->code->size));
+       }
 }
 
 PRIMITIVE_FORWARD(word_xt)