mirror of https://github.com/boa-dev/boa.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
178 lines
6.2 KiB
178 lines
6.2 KiB
//! This module implements the `Const` structure, which represents the primitive values in JavaScript. |
|
//! |
|
//! More information: |
|
//! - [ECMAScript reference][spec] |
|
//! - [MDN documentation][mdn] |
|
//! |
|
//! [spec]: https://tc39.es/ecma262/#sec-primary-expression-literals |
|
//! [mdn]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Grammar_and_types#Literals |
|
|
|
use crate::{ |
|
builtins::bigint::BigInt, |
|
gc::{Finalize, Trace}, |
|
}; |
|
use std::fmt::{Display, Formatter, Result}; |
|
|
|
#[cfg(feature = "deser")] |
|
use serde::{Deserialize, Serialize}; |
|
|
|
/// Literals represent values in JavaScript. |
|
/// |
|
/// These are fixed values **not variables** that you literally provide in your script. |
|
/// |
|
/// More information: |
|
/// - [ECMAScript reference][spec] |
|
/// - [MDN documentation][mdn] |
|
/// |
|
/// [spec]: https://tc39.es/ecma262/#sec-primary-expression-literals |
|
/// [mdn]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Grammar_and_types#Literals |
|
#[cfg_attr(feature = "deser", derive(Serialize, Deserialize))] |
|
#[derive(Clone, Debug, Trace, Finalize, PartialEq)] |
|
pub enum Const { |
|
/// A string literal is zero or more characters enclosed in double (`"`) or single (`'`) quotation marks. |
|
/// |
|
/// A string must be delimited by quotation marks of the same type (that is, either both single quotation marks, or both double quotation marks). |
|
/// You can call any of the String object's methods on a string literal value. |
|
/// JavaScript automatically converts the string literal to a temporary String object, |
|
/// calls the method, then discards the temporary String object. |
|
/// |
|
/// More information: |
|
/// - [ECMAScript reference][spec] |
|
/// - [MDN documentation][mdn] |
|
/// |
|
/// [spec]: https://tc39.es/ecma262/#sec-terms-and-definitions-string-value |
|
/// [mdn]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Grammar_and_types#String_literals |
|
String(Box<str>), |
|
|
|
/// A floating-point number literal. |
|
/// |
|
/// The exponent part is an "`e`" or "`E`" followed by an integer, which can be signed (preceded by "`+`" or "`-`"). |
|
/// A floating-point literal must have at least one digit, and either a decimal point or "`e`" (or "`E`"). |
|
/// |
|
/// More information: |
|
/// - [ECMAScript reference][spec] |
|
/// - [MDN documentation][mdn] |
|
/// |
|
/// [spec]: https://tc39.es/ecma262/#sec-terms-and-definitions-number-value |
|
/// [mdn]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Grammar_and_types#Floating-point_literals |
|
Num(f64), |
|
|
|
/// Integer types can be expressed in decimal (base 10), hexadecimal (base 16), octal (base 8) and binary (base 2). |
|
/// |
|
/// More information: |
|
/// - [ECMAScript reference][spec] |
|
/// - [MDN documentation][mdn] |
|
/// |
|
/// [spec]: https://tc39.es/ecma262/#sec-terms-and-definitions-number-value |
|
/// [mdn]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Grammar_and_types#Numeric_literals |
|
Int(i32), |
|
|
|
/// BigInt provides a way to represent whole numbers larger than the largest number JavaScript |
|
/// can reliably represent with the `Number` primitive. |
|
/// |
|
/// More information: |
|
/// - [ECMAScript reference][spec] |
|
/// - [MDN documentation][mdn] |
|
/// |
|
/// [spec]: https://tc39.es/ecma262/#sec-terms-and-definitions-bigint-value |
|
/// [mdn]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Grammar_and_types#Numeric_literals |
|
BigInt(BigInt), |
|
|
|
/// The Boolean type has two literal values: `true` and `false`. |
|
/// |
|
/// The Boolean object is a wrapper around the primitive Boolean data type. |
|
/// |
|
/// More information: |
|
/// - [ECMAScript reference][spec] |
|
/// - [MDN documentation][mdn] |
|
/// |
|
/// [spec]: https://tc39.es/ecma262/#sec-terms-and-definitions-boolean-value |
|
/// [mdn]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Grammar_and_types#Boolean_literals |
|
Bool(bool), |
|
|
|
/// In JavaScript, `null` is marked as one of the primitive values, cause it's behaviour is seemingly primitive. |
|
/// |
|
/// In computer science, a null value represents a reference that points, |
|
/// generally intentionally, to a nonexistent or invalid object or address. |
|
/// The meaning of a null reference varies among language implementations. |
|
/// |
|
/// More information: |
|
/// - [ECMAScript reference][spec] |
|
/// - [MDN documentation][mdn] |
|
/// |
|
/// [spec]: https://tc39.es/ecma262/#sec-null-value |
|
/// [mdn]: https://developer.mozilla.org/en-US/docs/Glossary/null |
|
Null, |
|
|
|
/// The `undefined` is a primitive value automatically assigned to variables that have just been declared, or to formal arguments for which there are no actual arguments. |
|
/// |
|
/// More information: |
|
/// - [ECMAScript reference][spec] |
|
/// - [MDN documentation][mdn] |
|
/// |
|
/// [spec]: https://tc39.es/ecma262/#sec-undefined |
|
/// [mdn]: https://developer.mozilla.org/en-US/docs/Glossary/undefined |
|
Undefined, |
|
} |
|
|
|
impl From<&str> for Const { |
|
fn from(s: &str) -> Self { |
|
Self::String(s.to_owned().into_boxed_str()) |
|
} |
|
} |
|
|
|
impl From<&String> for Const { |
|
fn from(s: &String) -> Self { |
|
Self::String(s.clone().into_boxed_str()) |
|
} |
|
} |
|
|
|
impl From<Box<str>> for Const { |
|
fn from(s: Box<str>) -> Self { |
|
Self::String(s) |
|
} |
|
} |
|
|
|
impl From<String> for Const { |
|
fn from(s: String) -> Self { |
|
Self::String(s.into_boxed_str()) |
|
} |
|
} |
|
|
|
impl From<f64> for Const { |
|
fn from(num: f64) -> Self { |
|
Self::Num(num) |
|
} |
|
} |
|
|
|
impl From<i32> for Const { |
|
fn from(i: i32) -> Self { |
|
Self::Int(i) |
|
} |
|
} |
|
|
|
impl From<BigInt> for Const { |
|
fn from(i: BigInt) -> Self { |
|
Self::BigInt(i) |
|
} |
|
} |
|
|
|
impl From<bool> for Const { |
|
fn from(b: bool) -> Self { |
|
Self::Bool(b) |
|
} |
|
} |
|
|
|
impl Display for Const { |
|
fn fmt(&self, f: &mut Formatter<'_>) -> Result { |
|
match *self { |
|
Self::String(ref st) => write!(f, "\"{}\"", st), |
|
Self::Num(num) => write!(f, "{}", num), |
|
Self::Int(num) => write!(f, "{}", num), |
|
Self::BigInt(ref num) => write!(f, "{}", num), |
|
Self::Bool(v) => write!(f, "{}", v), |
|
Self::Null => write!(f, "null"), |
|
Self::Undefined => write!(f, "undefined"), |
|
} |
|
} |
|
}
|
|
|