1#include "prism/internal/options.h"
5#include "prism/internal/allocator.h"
6#include "prism/internal/char.h"
7#include "prism/internal/stringy.h"
19 if (options == NULL) abort();
30 for (
size_t scope_index = 0; scope_index < options->scopes_count; scope_index++) {
32 xfree_sized(scope->locals, scope->locals_count *
sizeof(
pm_string_t));
45 pm_options_cleanup(options);
54 options->shebang_callback = shebang_callback;
55 options->shebang_callback_data = shebang_callback_data;
63 return &options->filepath;
70pm_options_filepath_set(
pm_options_t *options,
const char *filepath) {
71 pm_string_init(&options->filepath, (
const uint8_t *) filepath, strlen(filepath));
78pm_options_encoding_set(
pm_options_t *options,
const char *encoding) {
79 pm_string_init(&options->encoding, (
const uint8_t *) encoding, strlen(encoding));
86pm_options_encoding_locked_set(
pm_options_t *options,
bool encoding_locked) {
87 options->encoding_locked = encoding_locked;
102pm_options_frozen_string_literal_set(
pm_options_t *options,
bool frozen_string_literal) {
110pm_options_command_line_set(
pm_options_t *options, uint8_t command_line) {
111 options->command_line = command_line;
118is_number(
const char *
string,
size_t length) {
119 return pm_strspn_decimal_digit((
const uint8_t *)
string, (ptrdiff_t) length) == length;
128pm_options_version_set(
pm_options_t *options,
const char *version,
size_t length) {
129 if (version == NULL) {
130 options->version = PM_OPTIONS_VERSION_LATEST;
135 if (strncmp(version,
"3.3", 3) == 0) {
136 options->version = PM_OPTIONS_VERSION_CRUBY_3_3;
140 if (strncmp(version,
"3.4", 3) == 0) {
141 options->version = PM_OPTIONS_VERSION_CRUBY_3_4;
145 if (strncmp(version,
"3.5", 3) == 0 || strncmp(version,
"4.0", 3) == 0) {
146 options->version = PM_OPTIONS_VERSION_CRUBY_4_0;
150 if (strncmp(version,
"4.1", 3) == 0) {
151 options->version = PM_OPTIONS_VERSION_CRUBY_4_1;
158 if (length >= 4 && is_number(version + 4, length - 4)) {
159 if (strncmp(version,
"3.3.", 4) == 0) {
160 options->version = PM_OPTIONS_VERSION_CRUBY_3_3;
164 if (strncmp(version,
"3.4.", 4) == 0) {
165 options->version = PM_OPTIONS_VERSION_CRUBY_3_4;
169 if (strncmp(version,
"3.5.", 4) == 0 || strncmp(version,
"4.0.", 4) == 0) {
170 options->version = PM_OPTIONS_VERSION_CRUBY_4_0;
174 if (strncmp(version,
"4.1.", 4) == 0) {
175 options->version = PM_OPTIONS_VERSION_CRUBY_4_1;
181 if (strncmp(version,
"latest", 6) == 0) {
182 options->version = PM_OPTIONS_VERSION_LATEST;
196 options->version = PM_OPTIONS_VERSION_CRUBY_3_3;
205 options->version = PM_OPTIONS_VERSION_LATEST;
213 options->main_script = main_script;
220pm_options_partial_script_set(
pm_options_t *options,
bool partial_script) {
221 options->partial_script = partial_script;
229 return options->freeze;
237 options->freeze = freeze;
245 return options->attach_comments;
252pm_options_attach_comments_set(
pm_options_t *options,
bool attach_comments) {
253 options->attach_comments = attach_comments;
260 return options->raise_error;
266void pm_options_raise_error_set(
pm_options_t *options, uint8_t raise_error) {
267 options->raise_error = raise_error;
273#if defined(__GNUC__) && (__GNUC__ >= 10)
274#pragma GCC diagnostic push
275#pragma GCC diagnostic ignored "-Wanalyzer-malloc-leak"
283 options->scopes_count = scopes_count;
285 return options->scopes != NULL;
294 return &options->scopes[index];
303 return &options->scopes[index];
312 scope->locals_count = locals_count;
315 if (scope->locals == NULL) abort();
324 return &scope->locals[index];
333 return &scope->locals[index];
341 scope->forwarding = forwarding;
350pm_options_read_u32(
const char *data) {
351 if (((uintptr_t) data) %
sizeof(uint32_t) == 0) {
352 return *((uint32_t *) data);
355 memcpy(&value, data,
sizeof(uint32_t));
366pm_options_read_s32(
const char *data) {
367 if (((uintptr_t) data) %
sizeof(int32_t) == 0) {
368 return *((int32_t *) data);
371 memcpy(&value, data,
sizeof(int32_t));
384pm_options_read(
pm_options_t *options,
const char *data) {
386 if (data == NULL)
return;
388 uint32_t filepath_length = pm_options_read_u32(data);
391 if (filepath_length > 0) {
392 pm_string_init(&options->filepath, (
const uint8_t *) data, filepath_length);
393 data += filepath_length;
396 options->line = pm_options_read_s32(data);
399 uint32_t encoding_length = pm_options_read_u32(data);
402 if (encoding_length > 0) {
403 pm_string_init(&options->encoding, (
const uint8_t *) data, encoding_length);
404 data += encoding_length;
407 options->frozen_string_literal = (int8_t) *data++;
408 options->command_line = (uint8_t) *data++;
409 options->version = (pm_options_version_t) *data++;
410 options->encoding_locked = ((uint8_t) *data++) > 0;
411 options->main_script = ((uint8_t) *data++) > 0;
412 options->partial_script = ((uint8_t) *data++) > 0;
413 options->freeze = ((uint8_t) *data++) > 0;
414 options->attach_comments = ((uint8_t) *data++) > 0;
416 uint32_t scopes_count = pm_options_read_u32(data);
419 if (scopes_count > 0) {
420 if (!pm_options_scopes_init(options, scopes_count))
return;
422 for (
size_t scope_index = 0; scope_index < scopes_count; scope_index++) {
423 uint32_t locals_count = pm_options_read_u32(data);
427 pm_options_scope_init(scope, locals_count);
429 uint8_t forwarding = (uint8_t) *data++;
430 pm_options_scope_forwarding_set(&options->scopes[scope_index], forwarding);
432 for (
size_t local_index = 0; local_index < locals_count; local_index++) {
433 uint32_t local_length = pm_options_read_u32(data);
436 pm_string_init(&scope->locals[local_index], (
const uint8_t *) data, local_length);
437 data += local_length;
443#if defined(__GNUC__) && (__GNUC__ >= 10)
444#pragma GCC diagnostic pop
#define xcalloc
Old name of ruby_xcalloc.
#define PRISM_INLINE
Old Visual Studio versions do not support the inline keyword, so we need to define it to be __inline.
static const uint8_t PM_OPTIONS_SCOPE_FORWARDING_NONE
The default value for parameters.
#define PM_OPTIONS_FROZEN_STRING_LITERAL_DISABLED
String literals should not be frozen.
#define PM_OPTIONS_FROZEN_STRING_LITERAL_ENABLED
String literals should be made frozen.
void(* pm_options_shebang_callback_t)(pm_options_t *options, const uint8_t *source, size_t length, void *shebang_callback_data)
The callback called when additional switches are found in a shebang comment that need to be processed...
A view of a sequence of bytes.