static value_t call_data_get(builtin_arguments_t *args) { value_t self = get_builtin_subject(args); CHECK_FAMILY(ofCallData, self); value_t needle = get_builtin_argument(args, 0); value_t tags = get_call_data_tags(self); for (int64_t i = 0; i < get_call_tags_entry_count(tags); i++) { value_t tag = get_call_tags_tag_at(tags, i); if (value_identity_compare(needle, tag)) return get_call_data_value_at(self, i); } ESCAPE_BUILTIN(args, no_such_tag, needle); }
void print_invocation_on(value_t tags, frame_t *frame, string_buffer_t *buf) { int64_t arg_count = get_call_tags_entry_count(tags); string_buffer_printf(buf, "{"); for (int64_t i = 0; i < arg_count; i++) { value_t tag = get_call_tags_tag_at(tags, i); value_t arg = frame_get_pending_argument_at(frame, tags, i); if (i > 0) string_buffer_printf(buf, ", "); string_buffer_printf(buf, "%v: %v", tag, arg); } string_buffer_printf(buf, "}"); }
void call_tags_print_on(value_t self, print_on_context_t *context) { string_buffer_printf(context->buf, "{"); int64_t arg_count = get_call_tags_entry_count(self); for (int64_t i = 0; i < arg_count; i++) { if (i > 0) string_buffer_printf(context->buf, ", "); value_t tag = get_call_tags_tag_at(self, i); size_t offset = (size_t) get_call_tags_offset_at(self, i); value_print_inner_on(tag, context, -1); string_buffer_printf(context->buf, "@%i", offset); } string_buffer_printf(context->buf, "}"); }
static void log_lookup_error(value_t condition, value_t tags, frame_t *frame) { size_t arg_count = get_call_tags_entry_count(tags); string_buffer_t buf; string_buffer_init(&buf); string_buffer_printf(&buf, "%v: {", condition); for (size_t i = 0; i < arg_count; i++) { if (i > 0) string_buffer_printf(&buf, ", "); value_t tag = get_call_tags_tag_at(tags, i); value_t value = frame_get_pending_argument_at(frame, tags, i); string_buffer_printf(&buf, "%v: %v", tag, value); } string_buffer_printf(&buf, "}"); string_t str; string_buffer_flush(&buf, &str); ERROR("%s", str.chars); string_buffer_dispose(&buf); }