00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 
00022 
00023 
00024 
00025 # include "incls/_precompiled.incl"
00026 # include "incls/_vframe_prims.cpp.incl"
00027 
00028 TRACE_FUNC(TraceVframePrims, "vframe")
00029 
00030 int vframeOopPrimitives::number_of_calls;
00031 
00032 #define ASSERT_RECEIVER assert(receiver->is_vframe(), "receiver must be vframe")
00033 
00034 PRIM_DECL_1(vframeOopPrimitives::process, oop receiver) {
00035   PROLOGUE_1("process", receiver);
00036   ASSERT_RECEIVER;
00037   return vframeOop(receiver)->process();
00038 }
00039 
00040 PRIM_DECL_1(vframeOopPrimitives::index, oop receiver) {
00041   PROLOGUE_1("index", receiver);
00042   ASSERT_RECEIVER;
00043   return as_smiOop(vframeOop(receiver)->index());
00044 }
00045 
00046 PRIM_DECL_1(vframeOopPrimitives::time_stamp, oop receiver) {
00047   PROLOGUE_1("time_stamp", receiver);
00048   ASSERT_RECEIVER;
00049   return as_smiOop(vframeOop(receiver)->time_stamp());
00050 }
00051 
00052 
00053 PRIM_DECL_1(vframeOopPrimitives::is_smalltalk_activation, oop receiver) {
00054   PROLOGUE_1("is_smalltalk_activation", receiver);
00055   ASSERT_RECEIVER;
00056 
00057   ResourceMark rm;
00058 
00059   vframe* vf = vframeOop(receiver)->get_vframe();
00060 
00061   if (vf == NULL)
00062     return markSymbol(vmSymbols::activation_is_invalid());
00063     
00064   return vf->is_delta_frame() ? trueObj : falseObj;
00065 }
00066 
00067 PRIM_DECL_1(vframeOopPrimitives::byte_code_index, oop receiver) {
00068   PROLOGUE_1("byte_code_index", receiver);
00069   ASSERT_RECEIVER;
00070 
00071   ResourceMark rm;
00072 
00073   vframe* vf = vframeOop(receiver)->get_vframe();
00074 
00075   if (vf == NULL)
00076     return markSymbol(vmSymbols::activation_is_invalid());
00077     
00078   if (!vf->is_delta_frame())
00079     return markSymbol(vmSymbols::external_activation());
00080   
00081   return as_smiOop(((deltaVFrame*) vf)->bci());
00082 }
00083 
00084 PRIM_DECL_1(vframeOopPrimitives::expression_stack, oop receiver) {
00085   PROLOGUE_1("expression_stack", receiver);
00086   ASSERT_RECEIVER;
00087 
00088   ResourceMark rm;
00089 
00090   vframe* vf = vframeOop(receiver)->get_vframe();
00091 
00092   if (vf == NULL)
00093     return markSymbol(vmSymbols::activation_is_invalid());
00094     
00095   if (!vf->is_delta_frame())
00096     return markSymbol(vmSymbols::external_activation());
00097 
00098   BlockScavenge bs;
00099 
00100   GrowableArray<oop>* stack = ((deltaVFrame*) vf)->expression_stack();
00101 
00102   return oopFactory::new_objArray(stack);
00103 }
00104 
00105 PRIM_DECL_1(vframeOopPrimitives::method, oop receiver) {
00106   PROLOGUE_1("method", receiver);
00107   ASSERT_RECEIVER;
00108 
00109   ResourceMark rm;
00110 
00111   vframe* vf = vframeOop(receiver)->get_vframe();
00112 
00113   if (vf == NULL)
00114     return markSymbol(vmSymbols::activation_is_invalid());
00115     
00116   if (!vf->is_delta_frame())
00117     return markSymbol(vmSymbols::external_activation());
00118 
00119   return ((deltaVFrame*) vf)->method();
00120 }
00121 
00122 PRIM_DECL_1(vframeOopPrimitives::receiver, oop recv) {
00123   PROLOGUE_1("receiver", recv);
00124 
00125   assert(recv->is_vframe(), "receiver must be vframe")
00126 
00127   ResourceMark rm;
00128 
00129   vframe* vf = vframeOop(recv)->get_vframe();
00130 
00131   if (vf == NULL)
00132     return markSymbol(vmSymbols::activation_is_invalid());
00133     
00134   if (!vf->is_delta_frame())
00135     return markSymbol(vmSymbols::external_activation());
00136 
00137   return ((deltaVFrame*) vf)->receiver();
00138 }
00139 
00140 PRIM_DECL_1(vframeOopPrimitives::temporaries, oop receiver) {
00141   PROLOGUE_1("temporaries", receiver);
00142   ASSERT_RECEIVER;
00143 
00144   return receiver;
00145 }
00146 
00147 PRIM_DECL_1(vframeOopPrimitives::arguments, oop receiver) {
00148   PROLOGUE_1("arguments", receiver);
00149   ASSERT_RECEIVER;
00150 
00151   ResourceMark rm;
00152 
00153   vframe* vf = vframeOop(receiver)->get_vframe();
00154 
00155   if (vf == NULL)
00156     return markSymbol(vmSymbols::activation_is_invalid());
00157     
00158   if (!vf->is_delta_frame())
00159     return markSymbol(vmSymbols::external_activation());
00160 
00161   BlockScavenge bs;
00162 
00163   GrowableArray<oop>* stack = ((deltaVFrame*) vf)->arguments();
00164 
00165   return oopFactory::new_objArray(stack);
00166 }
00167 
00168 class vframeStream: public byteArrayPrettyPrintStream {
00169   void begin_highlight() { set_highlight(true); print_char(27); }
00170   void end_highlight()   { set_highlight(false); print_char(27); }
00171 };
00172 
00173 PRIM_DECL_1(vframeOopPrimitives::pretty_print, oop receiver) {
00174   PROLOGUE_1("receiver", receiver);
00175   ASSERT_RECEIVER;
00176 
00177   ResourceMark rm;
00178   BlockScavenge bs;
00179 
00180   vframe* vf = vframeOop(receiver)->get_vframe();
00181 
00182   if (vf == NULL)
00183     return markSymbol(vmSymbols::activation_is_invalid());
00184 
00185   if (!vf->is_delta_frame())
00186     return markSymbol(vmSymbols::external_activation());
00187 
00188   byteArrayPrettyPrintStream* stream = new vframeStream;
00189   prettyPrinter::print_body((deltaVFrame*) vf, stream);
00190 
00191   return stream->asByteArray();
00192 }