(self)
| 375 | ("address", pointer_type)]) |
| 376 | |
| 377 | def ReadUpToGC(self): |
| 378 | while self.log_pos < self.log.size(): |
| 379 | tag = self.log[self.log_pos:self.log_pos + 1] |
| 380 | self.log_pos += 1 |
| 381 | |
| 382 | if tag == LogReader._CODE_MOVING_GC_TAG: |
| 383 | return |
| 384 | |
| 385 | if tag == LogReader._CODE_CREATE_TAG: |
| 386 | event = self.code_create_struct.from_buffer(self.log, self.log_pos) |
| 387 | self.log_pos += ctypes.sizeof(event) |
| 388 | start_address = event.code_address |
| 389 | end_address = start_address + event.code_size |
| 390 | name = self.log[self.log_pos:self.log_pos + event.name_size].decode() |
| 391 | origin = JS_ORIGIN |
| 392 | self.log_pos += event.name_size |
| 393 | origin_offset = self.log_pos |
| 394 | self.log_pos += event.code_size |
| 395 | code = Code(name, start_address, end_address, origin, origin_offset) |
| 396 | conficting_code = self.code_map.Find(start_address) |
| 397 | if conficting_code: |
| 398 | if not (conficting_code.start_address == code.start_address and |
| 399 | conficting_code.end_address == code.end_address): |
| 400 | self.code_map.Remove(conficting_code) |
| 401 | else: |
| 402 | LogReader._HandleCodeConflict(conficting_code, code) |
| 403 | # TODO(vitalyr): this warning is too noisy because of our |
| 404 | # attempts to reconstruct code log from the snapshot. |
| 405 | # print >>sys.stderr, \ |
| 406 | # "Warning: Skipping duplicate code log entry %s" % code |
| 407 | continue |
| 408 | self.code_map.Add(code) |
| 409 | continue |
| 410 | |
| 411 | if tag == LogReader._CODE_MOVE_TAG: |
| 412 | event = self.code_move_struct.from_buffer(self.log, self.log_pos) |
| 413 | self.log_pos += ctypes.sizeof(event) |
| 414 | old_start_address = event.from_address |
| 415 | new_start_address = event.to_address |
| 416 | if old_start_address == new_start_address: |
| 417 | # Skip useless code move entries. |
| 418 | continue |
| 419 | code = self.code_map.Find(old_start_address) |
| 420 | if not code: |
| 421 | print("Warning: Not found %x" % old_start_address, file=sys.stderr) |
| 422 | continue |
| 423 | assert code.start_address == old_start_address, \ |
| 424 | "Inexact move address %x for %s" % (old_start_address, code) |
| 425 | self.code_map.Remove(code) |
| 426 | size = code.end_address - code.start_address |
| 427 | code.start_address = new_start_address |
| 428 | code.end_address = new_start_address + size |
| 429 | self.code_map.Add(code) |
| 430 | continue |
| 431 | |
| 432 | assert False, "Unknown tag %s" % tag |
| 433 | |
| 434 | def Dispose(self): |
no test coverage detected