mirror of https://github.com/boa-dev/boa.git
Browse Source
Added boa examples as per issue #446 Overtaken https://github.com/boa-dev/boa/pull/634 Somehow screwed that branch up by rebasing it and losing access pings @elasmojs This Pull Request fixes/closes #446 . Co-authored-by: Jason Williams <jase.williams@gmail.com> Co-authored-by: Iban Eguia (Razican) <razican@protonmail.ch> Co-authored-by: jasonwilliams <jase.williams@gmail.com> Co-authored-by: jedel1043 <jedel0124@gmail.com>pull/1910/head
Jason Williams
3 years ago
15 changed files with 175 additions and 7 deletions
@ -0,0 +1,14 @@ |
|||||||
|
[package] |
||||||
|
name = "boa_examples" |
||||||
|
version = "0.11.0" |
||||||
|
authors = ["boa-dev"] |
||||||
|
repository = "https://github.com/boa-dev/boa" |
||||||
|
license = "Unlicense/MIT" |
||||||
|
edition = "2021" |
||||||
|
|
||||||
|
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html |
||||||
|
|
||||||
|
[dependencies] |
||||||
|
boa_engine = { path = "../boa_engine", features = ["console"] } |
||||||
|
boa_gc = { path = "../boa_gc" } |
||||||
|
gc = { version = "0.4.1" } |
@ -0,0 +1,14 @@ |
|||||||
|
module.exports = { |
||||||
|
add: function (a, b) { |
||||||
|
return a + b; |
||||||
|
}, |
||||||
|
subtract: function (a, b) { |
||||||
|
return a - b; |
||||||
|
}, |
||||||
|
multiply: function (a, b) { |
||||||
|
return a * b; |
||||||
|
}, |
||||||
|
divide: function (a, b) { |
||||||
|
return a / b; |
||||||
|
}, |
||||||
|
}; |
@ -0,0 +1,8 @@ |
|||||||
|
//load module
|
||||||
|
let calc = require("./scripts/calc.js"); |
||||||
|
|
||||||
|
console.log("Using calc module"); |
||||||
|
console.log("Add: " + calc.add(3, 3)); |
||||||
|
console.log("Subtract: " + calc.subtract(3, 3)); |
||||||
|
console.log("Multiply: " + calc.multiply(3, 3)); |
||||||
|
console.log("Divide: " + calc.divide(3, 3)); |
@ -0,0 +1,11 @@ |
|||||||
|
//access custom global variable
|
||||||
|
console.log("Custom global: " + customstring); |
||||||
|
|
||||||
|
//call a custom global function with arguments
|
||||||
|
console.log("Custom function: " + rusty_hello("Boa! Boa!")); |
||||||
|
|
||||||
|
//access a custom global object and call a member function of that object
|
||||||
|
let a = 5; |
||||||
|
let b = 5; |
||||||
|
let result = rusty_obj.add(a, b); |
||||||
|
console.log("Custom object: Result from rusty_obj.add() : " + result); |
@ -0,0 +1 @@ |
|||||||
|
console.log("Hello World from JS file!"); |
@ -1,10 +1,10 @@ |
|||||||
// NOTE: this example requires the `console` feature to run correctly.
|
// NOTE: this example requires the `console` feature to run correctly.
|
||||||
|
|
||||||
use boa_engine::{ |
use boa_engine::{ |
||||||
class::{Class, ClassBuilder}, |
class::{Class, ClassBuilder}, |
||||||
property::Attribute, |
property::Attribute, |
||||||
Context, JsResult, JsValue, |
Context, JsResult, JsValue, |
||||||
}; |
}; |
||||||
|
|
||||||
use boa_gc::{Finalize, Trace}; |
use boa_gc::{Finalize, Trace}; |
||||||
|
|
||||||
// We create a new struct that is going to represent a person.
|
// We create a new struct that is going to represent a person.
|
@ -1,9 +1,11 @@ |
|||||||
|
// This example shows how to manipulate a Javascript array using Rust code.
|
||||||
|
|
||||||
use boa_engine::{ |
use boa_engine::{ |
||||||
object::{FunctionBuilder, JsArray}, |
object::{FunctionBuilder, JsArray}, |
||||||
Context, JsValue, |
Context, JsResult, JsValue, |
||||||
}; |
}; |
||||||
|
|
||||||
fn main() -> Result<(), JsValue> { |
fn main() -> JsResult<()> { |
||||||
// We create a new `Context` to create a new Javascript executor.
|
// We create a new `Context` to create a new Javascript executor.
|
||||||
let context = &mut Context::default(); |
let context = &mut Context::default(); |
||||||
|
|
@ -0,0 +1,28 @@ |
|||||||
|
// This example shows how to load, parse and execute JS code from a source file
|
||||||
|
// (./scripts/helloworld.js)
|
||||||
|
|
||||||
|
use std::fs::read_to_string; |
||||||
|
|
||||||
|
use boa_engine::Context; |
||||||
|
|
||||||
|
fn main() { |
||||||
|
let js_file_path = "./scripts/helloworld.js"; |
||||||
|
|
||||||
|
match read_to_string(js_file_path) { |
||||||
|
Ok(src) => { |
||||||
|
// Instantiate the execution context
|
||||||
|
let mut context = Context::default(); |
||||||
|
// Parse the source code
|
||||||
|
match context.eval(src) { |
||||||
|
Ok(res) => { |
||||||
|
println!("{}", res.to_string(&mut context).unwrap()); |
||||||
|
} |
||||||
|
Err(e) => { |
||||||
|
// Pretty print the error
|
||||||
|
eprintln!("Uncaught {}", e.display()); |
||||||
|
} |
||||||
|
}; |
||||||
|
} |
||||||
|
Err(msg) => eprintln!("Error: {}", msg), |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,21 @@ |
|||||||
|
// This example loads, parses and executes a JS code string
|
||||||
|
|
||||||
|
use boa_engine::Context; |
||||||
|
|
||||||
|
fn main() { |
||||||
|
let js_code = "console.log('Hello World from a JS code string!')"; |
||||||
|
|
||||||
|
// Instantiate the execution context
|
||||||
|
let mut context = Context::default(); |
||||||
|
|
||||||
|
// Parse the source code
|
||||||
|
match context.eval(js_code) { |
||||||
|
Ok(res) => { |
||||||
|
println!("{}", res.to_string(&mut context).unwrap()); |
||||||
|
} |
||||||
|
Err(e) => { |
||||||
|
// Pretty print the error
|
||||||
|
eprintln!("Uncaught {}", e.display()); |
||||||
|
} |
||||||
|
}; |
||||||
|
} |
@ -0,0 +1,59 @@ |
|||||||
|
// This example implements a custom module handler which mimics
|
||||||
|
// the require/module.exports pattern
|
||||||
|
|
||||||
|
use boa_engine::{prelude::JsObject, property::Attribute, Context, JsResult, JsValue}; |
||||||
|
use std::fs::read_to_string; |
||||||
|
|
||||||
|
fn main() { |
||||||
|
let js_file_path = "./scripts/calctest.js"; |
||||||
|
let buffer = read_to_string(js_file_path); |
||||||
|
|
||||||
|
if buffer.is_err() { |
||||||
|
println!("Error: {}", buffer.unwrap_err()); |
||||||
|
return; |
||||||
|
} |
||||||
|
|
||||||
|
// Creating the execution context
|
||||||
|
let mut ctx = Context::default(); |
||||||
|
|
||||||
|
// Adding custom implementation that mimics 'require'
|
||||||
|
ctx.register_global_function("require", 0, require); |
||||||
|
|
||||||
|
// Adding custom object that mimics 'module.exports'
|
||||||
|
let moduleobj = JsObject::default(); |
||||||
|
moduleobj |
||||||
|
.set("exports", JsValue::from(" "), false, &mut ctx) |
||||||
|
.unwrap(); |
||||||
|
ctx.register_global_property("module", JsValue::from(moduleobj), Attribute::default()); |
||||||
|
|
||||||
|
// Instantiating the engine with the execution context
|
||||||
|
// Loading, parsing and executing the JS code from the source file
|
||||||
|
ctx.eval(&buffer.unwrap()).unwrap(); |
||||||
|
} |
||||||
|
|
||||||
|
// Custom implementation that mimics the 'require' module loader
|
||||||
|
fn require(_: &JsValue, args: &[JsValue], ctx: &mut Context) -> JsResult<JsValue> { |
||||||
|
let arg = args.get(0).unwrap(); |
||||||
|
|
||||||
|
// BUG: Dev branch seems to be passing string arguments along with quotes
|
||||||
|
let libfile = arg |
||||||
|
.to_string(ctx) |
||||||
|
.expect("Failed to convert to string") |
||||||
|
.to_string(); |
||||||
|
|
||||||
|
// Read the module source file
|
||||||
|
println!("Loading: {}", libfile); |
||||||
|
let buffer = read_to_string(libfile); |
||||||
|
if let Err(..) = buffer { |
||||||
|
println!("Error: {}", buffer.unwrap_err()); |
||||||
|
Ok(JsValue::Rational(-1.0)) |
||||||
|
} else { |
||||||
|
// Load and parse the module source
|
||||||
|
ctx.eval(&buffer.unwrap()).unwrap(); |
||||||
|
|
||||||
|
// Access module.exports and return as ResultValue
|
||||||
|
let global_obj = ctx.global_object().to_owned(); |
||||||
|
let module = global_obj.get("module", ctx).unwrap(); |
||||||
|
module.as_object().unwrap().get("exports", ctx) |
||||||
|
} |
||||||
|
} |
Loading…
Reference in new issue