12#if defined(DUK_USE_PC2LINE)
35 curr_offset = (
duk_uint_fast32_t) (
sizeof(duk_uint32_t) + num_header_entries *
sizeof(duk_uint32_t) * 2);
44 hdr[0] = (duk_uint32_t) length;
47 while (curr_pc < length) {
56 hdr[hdr_index + 0] = (duk_uint32_t) curr_line;
57 hdr[hdr_index + 1] = (duk_uint32_t) curr_offset;
63 (
long) hdr[hdr_index + 0],
64 (
long) hdr[hdr_index + 1]));
68 be_ctx->
data = ((duk_uint8_t *) hdr) + curr_offset;
74 (curr_pc >= length) ) {
78 next_line = (duk_int32_t) instrs[curr_pc].line;
79 diff_line = next_line - curr_line;
83 (
long) curr_line, (
long) next_line, (
long) diff_line));
89 }
else if (diff_line >= 1 && diff_line <= 4) {
92 }
else if (diff_line >= -0x80 && diff_line <= 0x7f) {
94 DUK_ASSERT(diff_line + 0x80 >= 0 && diff_line + 0x80 <= 0xff);
100 duk_be_encode(be_ctx, (0x07 << 16) + ((next_line >> 16) & 0xffffU), 19);
104 curr_line = next_line;
120 DUK_DDD(
DUK_DDDPRINT(
"final pc2line data: pc_limit=%ld, length=%ld, %lf bits/opcode --> %!ixT",
121 (
long) length, (
long) new_size, (
double) new_size * 8.0 / (
double) length,
153 DUK_DD(
DUK_DDPRINT(
"pc2line lookup failed: buffer is smaller than minimal header"));
159 if (pc >= pc_limit) {
161 DUK_DD(
DUK_DDPRINT(
"pc2line lookup failed: pc out of bounds (pc=%ld, limit=%ld)",
162 (
long) pc, (
long) pc_limit));
166 curr_line = hdr[1 + hdr_index * 2];
167 start_offset = hdr[1 + hdr_index * 2 + 1];
169 DUK_DD(
DUK_DDPRINT(
"pc2line lookup failed: start_offset out of bounds (start_offset=%ld, buffer_size=%ld)",
179 bd_ctx->
data = ((duk_uint8_t *) hdr) + start_offset;
183 DUK_DDD(
DUK_DDDPRINT(
"pc2line lookup: pc=%ld -> hdr_index=%ld, pc_base=%ld, n=%ld, start_offset=%ld",
184 (
long) pc, (
long) hdr_index, (
long) pc_base, (
long) n, (
long) start_offset));
204 curr_line = curr_line + t - 0x80;
210 curr_line = curr_line + t + 1;
219 DUK_DDD(
DUK_DDDPRINT(
"pc2line lookup result: pc %ld -> line %ld", (
long) pc, (
long) curr_line));
239 if (pc2line !=
NULL) {
duk_int32_t duk_int_fast32_t
#define DUK_MEMZERO(p, n)
duk_uint32_t duk_uint_fast32_t
#define DUK_HBUFFER_DYNAMIC_GET_DATA_PTR(heap, x)
#define DUK_COMPILER_MAX_BYTECODE_LENGTH
DUK_INTERNAL_DECL duk_small_int_t duk_bd_decode_flag(duk_bitdecoder_ctx *ctx)
DUK_INTERNAL_DECL void duk_hbuffer_resize(duk_hthread *thr, duk_hbuffer_dynamic *buf, duk_size_t new_size)
#define DUK_PC2LINE_MAX_DIFF_LENGTH
DUK_INTERNAL_DECL duk_bool_t duk_get_prop_stridx(duk_context *ctx, duk_idx_t obj_index, duk_small_int_t stridx)
#define DUK_HBUFFER_FIXED_GET_SIZE(x)
DUK_INTERNAL_DECL void duk_be_encode(duk_bitencoder_ctx *ctx, duk_uint32_t data, duk_small_int_t bits)
DUK_INTERNAL_DECL duk_hbuffer * duk_get_hbuffer(duk_context *ctx, duk_idx_t index)
#define DUK_HBUFFER_FIXED_GET_DATA_PTR(heap, x)
#define DUK_STRIDX_INT_PC2LINE
DUK_EXTERNAL void duk_pop(duk_context *ctx)
DUK_INTERNAL_DECL void duk_be_finish(duk_bitencoder_ctx *ctx)
#define DUK_HBUFFER_HAS_EXTERNAL(x)
#define DUK_HBUFFER_HAS_DYNAMIC(x)
DUK_INTERNAL_DECL duk_int32_t duk_bd_decode(duk_bitdecoder_ctx *ctx, duk_small_int_t bits)
#define DUK_HBUFFER_GET_SIZE(x)
DUK_INTERNAL_DECL duk_tval * duk_get_tval(duk_context *ctx, duk_idx_t index)
#define duk_to_fixed_buffer(ctx, index, out_size)
#define duk_push_dynamic_buffer(ctx, size)
DUK_LOCAL duk_uint_fast32_t duk__hobject_pc2line_query_raw(duk_hthread *thr, duk_hbuffer_fixed *buf, duk_uint_fast32_t pc)
DUK_INTERNAL void duk_hobject_pc2line_pack(duk_hthread *thr, duk_compiler_instr *instrs, duk_uint_fast32_t length)
DUK_INTERNAL duk_uint_fast32_t duk_hobject_pc2line_query(duk_context *ctx, duk_idx_t idx_func, duk_uint_fast32_t pc)
static void error(LoadState *S, const char *why)
duk_small_int_t truncated