-
-
Notifications
You must be signed in to change notification settings - Fork 413
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
18 changed files
with
592 additions
and
19 deletions.
There are no files selected for viewing
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,22 @@ | ||
[package] | ||
name = "boa_builtins" | ||
description = "Builtins of the Boa JavaScript engine." | ||
publish = true | ||
version.workspace = true | ||
edition.workspace = true | ||
authors.workspace = true | ||
license.workspace = true | ||
repository.workspace = true | ||
rust-version.workspace = true | ||
build = "build.rs" | ||
|
||
[dependencies] | ||
bitflags = "2.1.0" | ||
phf = "^0.11.1" | ||
phf_shared = "^0.11.1" | ||
|
||
[build-dependencies] | ||
boa_macros.workspace = true | ||
phf_codegen = "^0.11.1" | ||
phf_shared = "^0.11.1" | ||
bitflags = "2.1.0" |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
# TOOD |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,177 @@ | ||
use std::fs::File; | ||
use std::hash::{Hash, Hasher}; | ||
use std::io::{self, BufWriter, Write}; | ||
use std::path::Path; | ||
use std::{env, fmt}; | ||
|
||
use bitflags::bitflags; | ||
use phf_shared::{FmtConst, PhfBorrow, PhfHash}; | ||
|
||
use boa_macros::utf16; | ||
|
||
bitflags! { | ||
/// This struct constains the property flags as described in the ECMAScript specification. | ||
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] | ||
pub struct Attribute: u8 { | ||
/// The `Writable` attribute decides whether the value associated with the property can be changed or not, from its initial value. | ||
const WRITABLE = 0b0000_0001; | ||
|
||
/// If the property can be enumerated by a `for-in` loop. | ||
const ENUMERABLE = 0b0000_0010; | ||
|
||
/// If the property descriptor can be changed later. | ||
const CONFIGURABLE = 0b0000_0100; | ||
} | ||
} | ||
|
||
/// List of well known symbols. | ||
#[derive(Debug, Clone, Copy)] | ||
#[repr(u8)] | ||
#[allow(dead_code)] | ||
enum WellKnown { | ||
AsyncIterator, | ||
HasInstance, | ||
IsConcatSpreadable, | ||
Iterator, | ||
Match, | ||
MatchAll, | ||
Replace, | ||
Search, | ||
Species, | ||
Split, | ||
ToPrimitive, | ||
ToStringTag, | ||
Unscopables, | ||
} | ||
|
||
#[derive(Debug, Clone, PartialEq, Eq, Hash)] | ||
pub enum StaticPropertyKey<'a> { | ||
String(&'a [u16]), | ||
Symbol(u8), | ||
} | ||
|
||
impl PhfHash for StaticPropertyKey<'static> { | ||
#[inline] | ||
fn phf_hash<H: Hasher>(&self, state: &mut H) { | ||
self.hash(state) | ||
} | ||
} | ||
|
||
impl FmtConst for StaticPropertyKey<'static> { | ||
fn fmt_const(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { | ||
if matches!(self, StaticPropertyKey::String(_)) { | ||
f.write_str("StaticPropertyKey::String(")?; | ||
} else { | ||
f.write_str("StaticPropertyKey::Symbol(")?; | ||
} | ||
|
||
match self { | ||
StaticPropertyKey::String(s) => write!(f, "&{:?})", s), | ||
StaticPropertyKey::Symbol(s) => write!(f, "{})", s), | ||
} | ||
} | ||
} | ||
|
||
impl<'b, 'a: 'b> PhfBorrow<StaticPropertyKey<'b>> for StaticPropertyKey<'a> { | ||
fn borrow(&self) -> &StaticPropertyKey<'b> { | ||
self | ||
} | ||
} | ||
|
||
trait ToPropertyKey { | ||
fn to_property_key(self) -> StaticPropertyKey<'static>; | ||
} | ||
|
||
impl ToPropertyKey for &'static [u16] { | ||
fn to_property_key(self) -> StaticPropertyKey<'static> { | ||
StaticPropertyKey::String(self) | ||
} | ||
} | ||
|
||
impl ToPropertyKey for WellKnown { | ||
fn to_property_key(self) -> StaticPropertyKey<'static> { | ||
StaticPropertyKey::Symbol(self as u8) | ||
} | ||
} | ||
|
||
struct BuiltInBuilder<'a> { | ||
file: &'a mut BufWriter<File>, | ||
|
||
name: &'static str, | ||
map: phf_codegen::OrderedMap<StaticPropertyKey<'static>>, | ||
|
||
slot_index: usize, | ||
} | ||
|
||
impl<'a> BuiltInBuilder<'a> { | ||
fn new(file: &'a mut BufWriter<File>, name: &'static str) -> Self { | ||
Self { | ||
file, | ||
name, | ||
map: phf_codegen::OrderedMap::new(), | ||
slot_index: 0, | ||
} | ||
} | ||
|
||
fn method<K>(&mut self, key: K) -> &mut Self | ||
where | ||
K: ToPropertyKey, | ||
{ | ||
let key = key.to_property_key(); | ||
let attributes = Attribute::WRITABLE | Attribute::CONFIGURABLE; | ||
self.map.entry( | ||
key, | ||
&format!( | ||
"({}, Attribute::from_bits_retain({}))", | ||
self.slot_index, | ||
attributes.bits() | ||
), | ||
); | ||
self.slot_index += 1; | ||
self | ||
} | ||
|
||
fn property<K>(&mut self, key: K, attributes: Attribute) -> &mut Self | ||
where | ||
K: ToPropertyKey, | ||
{ | ||
let key = key.to_property_key(); | ||
self.map.entry( | ||
key, | ||
&format!( | ||
"({}, Attribute::from_bits_retain({}))", | ||
self.slot_index, | ||
attributes.bits() | ||
), | ||
); | ||
self.slot_index += 1; | ||
self | ||
} | ||
|
||
fn build(&mut self) -> io::Result<()> { | ||
writeln!( | ||
self.file, | ||
"pub static {}_STATIC_SHAPE: ::phf::OrderedMap::<StaticPropertyKey<'static>, (u32, Attribute)> = \n{};", | ||
self.name, | ||
self.map.build(), | ||
) | ||
} | ||
} | ||
|
||
fn main() -> io::Result<()> { | ||
let file = Path::new(&env::var("OUT_DIR").unwrap()).join("static_shapes_codegen.rs"); | ||
let file = &mut BufWriter::new(File::create(file)?); | ||
|
||
BuiltInBuilder::new(file, "EMPTY_OBJECT").build()?; | ||
|
||
BuiltInBuilder::new(file, "JSON_OBJECT") | ||
.method(utf16!("parse")) | ||
.method(utf16!("stringify")) | ||
.property( | ||
WellKnown::ToStringTag, | ||
Attribute::WRITABLE | Attribute::CONFIGURABLE, | ||
) | ||
.build()?; | ||
|
||
Ok(()) | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,47 @@ | ||
use std::hash::{Hash, Hasher}; | ||
|
||
use bitflags::bitflags; | ||
use phf::PhfHash; | ||
use phf_shared::PhfBorrow; | ||
|
||
bitflags! { | ||
/// This struct constains the property flags as described in the ECMAScript specification. | ||
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] | ||
pub struct Attribute: u8 { | ||
/// The `Writable` attribute decides whether the value associated with the property can be changed or not, from its initial value. | ||
const WRITABLE = 0b0000_0001; | ||
|
||
/// If the property can be enumerated by a `for-in` loop. | ||
const ENUMERABLE = 0b0000_0010; | ||
|
||
/// If the property descriptor can be changed later. | ||
const CONFIGURABLE = 0b0000_0100; | ||
} | ||
} | ||
|
||
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] | ||
pub enum StaticPropertyKey<'a> { | ||
String(&'a [u16]), | ||
Symbol(u8), | ||
} | ||
|
||
impl PhfHash for StaticPropertyKey<'static> { | ||
#[inline] | ||
fn phf_hash<H: Hasher>(&self, state: &mut H) { | ||
self.hash(state) | ||
} | ||
} | ||
|
||
impl<'b, 'a: 'b> PhfBorrow<StaticPropertyKey<'b>> for StaticPropertyKey<'a> { | ||
#[inline] | ||
fn borrow(&self) -> &StaticPropertyKey<'b> { | ||
self | ||
} | ||
} | ||
|
||
pub type Slot = (u32, Attribute); | ||
pub type StaticShape = phf::OrderedMap<StaticPropertyKey<'static>, Slot>; | ||
|
||
include!(concat!(env!("OUT_DIR"), "/static_shapes_codegen.rs")); | ||
|
||
// static NUMBER_BUITIN_OBJECT_STATIC_SHAPE_REF: &StaticShape = &NUMBER_BUITIN_OBJECT_STATIC_SHAPE; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.