305
306 assert(length == values->size(), "Mismatch between actual stack format and supplied data");
307
308 // handle locals
309 for (int i = 0; i < length; i++) {
310 // Find stack location
311 intptr_t *addr = locals_addr_at(i);
312
313 // Depending on oop/int put it in the right package
314 StackValue *sv = values->at(i);
315 assert(sv != NULL, "sanity check");
316 if (sv->type() == T_OBJECT) {
317 *(oop *) addr = (sv->get_obj())();
318 } else { // integer
319 *addr = sv->get_int();
320 }
321 }
322 }
323
324 StackValueCollection* interpretedVFrame::expressions() const {
325 int length = fr().interpreter_frame_expression_stack_size();
326 if (method()->is_native()) {
327 // If the method is native, there is no expression stack
328 length = 0;
329 }
330
331 int nof_locals = method()->max_locals();
332 StackValueCollection* result = new StackValueCollection(length);
333
334 InterpreterOopMap oop_mask;
335 // Get oopmap describing oops and int for current bci
336 if (TraceDeoptimization && Verbose) {
337 methodHandle m_h(method());
338 OopMapCache::compute_one_oop_map(m_h, bci(), &oop_mask);
339 } else {
340 method()->mask_for(bci(), &oop_mask);
341 }
342 // handle expressions
343 for(int i=0; i < length; i++) {
344 // Find stack location
345 intptr_t *addr = fr().interpreter_frame_expression_stack_at(i);
346
347 // Depending on oop/int put it in the right package
348 StackValue *sv;
349 if (oop_mask.is_oop(i + nof_locals)) {
350 // oop value
351 Handle h(*(oop *)addr);
352 sv = new StackValue(h);
353 } else {
354 // integer
355 sv = new StackValue(*addr);
356 }
357 assert(sv != NULL, "sanity check");
358 result->add(sv);
359 }
360 return result;
361 }
|
305
306 assert(length == values->size(), "Mismatch between actual stack format and supplied data");
307
308 // handle locals
309 for (int i = 0; i < length; i++) {
310 // Find stack location
311 intptr_t *addr = locals_addr_at(i);
312
313 // Depending on oop/int put it in the right package
314 StackValue *sv = values->at(i);
315 assert(sv != NULL, "sanity check");
316 if (sv->type() == T_OBJECT) {
317 *(oop *) addr = (sv->get_obj())();
318 } else { // integer
319 *addr = sv->get_int();
320 }
321 }
322 }
323
324 StackValueCollection* interpretedVFrame::expressions() const {
325
326 InterpreterOopMap oop_mask;
327
328 if (!method()->is_native()) {
329 // Get oopmap describing oops and int for current bci
330 if (TraceDeoptimization && Verbose) {
331 methodHandle m_h(method());
332 OopMapCache::compute_one_oop_map(m_h, bci(), &oop_mask);
333 } else {
334 method()->mask_for(bci(), &oop_mask);
335 }
336 }
337
338 int length = oop_mask.expression_stack_size();
339
340 assert(fr().interpreter_frame_expression_stack_size() >= length,
341 "error in expression stack!");
342
343 StackValueCollection* result = new StackValueCollection(length);
344
345 if (0 == length) {
346 return result;
347 }
348
349 int nof_locals = method()->max_locals();
350
351 // handle expressions
352 for(int i=0; i < length; i++) {
353 // Find stack location
354 intptr_t *addr = fr().interpreter_frame_expression_stack_at(i);
355
356 // Depending on oop/int put it in the right package
357 StackValue *sv;
358 if (oop_mask.is_oop(i + nof_locals)) {
359 // oop value
360 Handle h(*(oop *)addr);
361 sv = new StackValue(h);
362 } else {
363 // integer
364 sv = new StackValue(*addr);
365 }
366 assert(sv != NULL, "sanity check");
367 result->add(sv);
368 }
369 return result;
370 }
|