Skip to content

Commit 8546e8d

Browse files
committed
Preparing again for the migration of modules
1 parent f683778 commit 8546e8d

20 files changed

+2026
-1751
lines changed

src/js_bigint.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ pub(crate) fn bigint_constructor(args: &[Expr], env: &JSObjectDataPtr) -> Result
99
if args.len() != 1 {
1010
return Err(raise_type_error!("BigInt requires exactly one argument"));
1111
}
12-
let arg_val = evaluate_expr(env, &args[0])?;
12+
let arg_val = evaluate_expr(mc, env, &args[0])?;
1313
match arg_val {
1414
Value::BigInt(b) => Ok(Value::BigInt(b)),
1515
Value::Number(n) => {
@@ -49,7 +49,7 @@ pub(crate) fn bigint_constructor(args: &[Expr], env: &JSObjectDataPtr) -> Result
4949
}
5050

5151
/// Handle boxed BigInt object methods (toString, valueOf)
52-
pub fn handle_bigint_object_method(object: &JSObjectDataPtr, method: &str, args: &[Expr], env: &JSObjectDataPtr) -> Result<Value, JSError> {
52+
pub fn handle_bigint_object_method<'gc>(mc: &MutationContext<'gc>, object: &JSObjectDataPtr, method: &str, args: &[Expr], env: &JSObjectDataPtr) -> Result<Value, JSError> {
5353
if let Some(value_val) = obj_get_key_value(object, &"__value__".into())? {
5454
if let Value::BigInt(h) = &*value_val.borrow() {
5555
match method {
@@ -58,7 +58,7 @@ pub fn handle_bigint_object_method(object: &JSObjectDataPtr, method: &str, args:
5858
return Ok(Value::String(utf8_to_utf16(&h.to_string())));
5959
} else {
6060
// radix support: expect a number argument
61-
let arg0 = crate::core::evaluate_expr(env, &args[0])?;
61+
let arg0 = crate::core::evaluate_expr(mc, env, &args[0])?;
6262
if let Value::Number(rad) = arg0 {
6363
let r = rad as i32;
6464
if !(2..=36).contains(&r) {
@@ -90,7 +90,7 @@ pub fn handle_bigint_object_method(object: &JSObjectDataPtr, method: &str, args:
9090
}
9191

9292
/// Handle static methods on the BigInt constructor (asIntN, asUintN)
93-
pub fn handle_bigint_static_method(method: &str, args: &[Expr], env: &JSObjectDataPtr) -> Result<Value, JSError> {
93+
pub fn handle_bigint_static_method<'gc>(mc: &MutationContext<'gc>, method: &str, args: &[Expr], env: &JSObjectDataPtr) -> Result<Value, JSError> {
9494
// Evaluate arguments
9595
if method != "asIntN" && method != "asUintN" {
9696
return Err(raise_eval_error!(format!("BigInt has no static method '{}'", method)));
@@ -100,7 +100,7 @@ pub fn handle_bigint_static_method(method: &str, args: &[Expr], env: &JSObjectDa
100100
}
101101

102102
// bits must be a non-negative integer (ToIndex)
103-
let bits_val = crate::core::evaluate_expr(env, &args[0])?;
103+
let bits_val = crate::core::evaluate_expr(mc, env, &args[0])?;
104104
let bits = match bits_val {
105105
Value::Number(n) => {
106106
if n.is_nan() || n < 0.0 || n.fract() != 0.0 {
@@ -116,7 +116,7 @@ pub fn handle_bigint_static_method(method: &str, args: &[Expr], env: &JSObjectDa
116116
};
117117

118118
// bigint argument: accept BigInt, Number (integer), String, Boolean, or Object (ToPrimitive)
119-
let bigint_val = crate::core::evaluate_expr(env, &args[1])?;
119+
let bigint_val = crate::core::evaluate_expr(mc, env, &args[1])?;
120120
let bi = match bigint_val {
121121
Value::BigInt(b) => b,
122122
Value::Number(n) => {

src/js_class.rs

Lines changed: 124 additions & 122 deletions
Large diffs are not rendered by default.

src/js_function.rs

Lines changed: 241 additions & 270 deletions
Large diffs are not rendered by default.

src/js_generator.rs

Lines changed: 39 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -22,26 +22,26 @@ pub fn handle_generator_function_call(
2222
env: &JSObjectDataPtr,
2323
) -> Result<Value, JSError> {
2424
// Create a new generator object
25-
let generator = Rc::new(RefCell::new(crate::core::JSGenerator {
25+
let generator = gc_arena::Gc::new(mc, gc_arena::lock::RefLock::new(crate::core::JSGenerator {
2626
params: params.to_vec(),
2727
body: body.to_vec(),
2828
env: env.clone(),
2929
state: crate::core::GeneratorState::NotStarted,
3030
}));
3131

3232
// Create a wrapper object for the generator
33-
let gen_obj = Rc::new(RefCell::new(crate::core::JSObjectData::new()));
33+
let gen_obj = gc_arena::Gc::new(mc, gc_arena::lock::RefLock::new(crate::core::JSObjectData::new()));
3434
// Store the actual generator data
35-
gen_obj.borrow_mut().insert(
35+
gen_obj.borrow_mut(mc).insert(
3636
crate::core::PropertyKey::String("__generator__".to_string()),
37-
Rc::new(RefCell::new(Value::Generator(generator))),
37+
gc_arena::Gc::new(mc, gc_arena::lock::RefLock::new(Value::Generator(generator))),
3838
);
3939

4040
Ok(Value::Object(gen_obj))
4141
}
4242

4343
/// Handle generator instance method calls (like `gen.next()`, `gen.return()`, etc.)
44-
pub fn handle_generator_instance_method(
44+
pub fn handle_generator_instance_method<'gc>(mc: &MutationContext<'gc>,
4545
generator: &Rc<RefCell<crate::core::JSGenerator>>,
4646
method: &str,
4747
args: &[Expr],
@@ -53,7 +53,7 @@ pub fn handle_generator_instance_method(
5353
let send_value = if args.is_empty() {
5454
Value::Undefined
5555
} else {
56-
evaluate_expr(env, &args[0])?
56+
evaluate_expr(mc, env, &args[0])?
5757
};
5858

5959
generator_next(generator, send_value)
@@ -63,7 +63,7 @@ pub fn handle_generator_instance_method(
6363
let return_value = if args.is_empty() {
6464
Value::Undefined
6565
} else {
66-
evaluate_expr(env, &args[0])?
66+
evaluate_expr(mc, env, &args[0])?
6767
};
6868

6969
generator_return(generator, return_value)
@@ -73,7 +73,7 @@ pub fn handle_generator_instance_method(
7373
let throw_value = if args.is_empty() {
7474
Value::Undefined
7575
} else {
76-
evaluate_expr(env, &args[0])?
76+
evaluate_expr(mc, env, &args[0])?
7777
};
7878

7979
generator_throw(generator, throw_value)
@@ -90,15 +90,15 @@ fn replace_first_yield_in_expr(expr: &Expr, send_value: &Value, replaced: &mut b
9090
Expr::Yield(_) => {
9191
if !*replaced {
9292
*replaced = true;
93-
Expr::Value(send_value.clone())
93+
Expr::Var("__gen_throw_val".to_string(), None, None)
9494
} else {
9595
expr.clone()
9696
}
9797
}
9898
Expr::YieldStar(_) => {
9999
if !*replaced {
100100
*replaced = true;
101-
Expr::Value(send_value.clone())
101+
Expr::Var("__gen_throw_val".to_string(), None, None)
102102
} else {
103103
expr.clone()
104104
}
@@ -304,7 +304,7 @@ fn replace_first_yield_statement_with_throw(stmt: &mut Statement, throw_value: &
304304
match &mut stmt.kind {
305305
StatementKind::Expr(e) => {
306306
if expr_contains_yield(e) {
307-
stmt.kind = StatementKind::Throw(Expr::Value(throw_value.clone()));
307+
stmt.kind = StatementKind::Throw(Expr::Var("__gen_throw_val".to_string(), None, None));
308308
return true;
309309
}
310310
false
@@ -314,7 +314,7 @@ fn replace_first_yield_statement_with_throw(stmt: &mut Statement, throw_value: &
314314
if let Some(expr) = expr_opt
315315
&& expr_contains_yield(expr)
316316
{
317-
stmt.kind = StatementKind::Throw(Expr::Value(throw_value.clone()));
317+
stmt.kind = StatementKind::Throw(Expr::Var("__gen_throw_val".to_string(), None, None));
318318
return true;
319319
}
320320
}
@@ -323,7 +323,7 @@ fn replace_first_yield_statement_with_throw(stmt: &mut Statement, throw_value: &
323323
StatementKind::Const(decls) => {
324324
for (_, expr) in decls {
325325
if expr_contains_yield(expr) {
326-
stmt.kind = StatementKind::Throw(Expr::Value(throw_value.clone()));
326+
stmt.kind = StatementKind::Throw(Expr::Var("__gen_throw_val".to_string(), None, None));
327327
return true;
328328
}
329329
}
@@ -447,7 +447,7 @@ fn find_first_yield_in_statements(stmts: &[Statement]) -> Option<(usize, Option<
447447

448448
/// Execute generator.next()
449449
fn generator_next(generator: &Rc<RefCell<crate::core::JSGenerator>>, _send_value: Value) -> Result<Value, JSError> {
450-
let mut gen_obj = generator.borrow_mut();
450+
let mut gen_obj = generator.borrow_mut(mc);
451451

452452
match &mut gen_obj.state {
453453
crate::core::GeneratorState::NotStarted => {
@@ -465,17 +465,18 @@ fn generator_next(generator: &Rc<RefCell<crate::core::JSGenerator>>, _send_value
465465
// function-like frame whose prototype is the captured env.
466466
if let Some(inner_expr_box) = yield_inner {
467467
let func_env = prepare_function_call_env(Some(&gen_obj.env), None, None, &[], None, None)?;
468-
match crate::core::evaluate_expr(&func_env, &inner_expr_box) {
469-
Ok(val) => return Ok(create_iterator_result(val, false)),
470-
Err(_) => return Ok(create_iterator_result(Value::Undefined, false)),
468+
crate::core::obj_set_key_value(mc, &func_env, &"__gen_throw_val".into(), throw_value.clone())?;
469+
match crate::core::evaluate_expr(mc, &func_env, &inner_expr_box) {
470+
Ok(val) => return Ok(create_iterator_result(mc, val, false)),
471+
Err(_) => return Ok(create_iterator_result(mc, Value::Undefined, false)),
471472
}
472473
}
473474

474475
// No inner expression -> yield undefined
475-
Ok(create_iterator_result(Value::Undefined, false))
476+
Ok(create_iterator_result(mc, Value::Undefined, false))
476477
} else {
477478
// Fallback to previous placeholder behavior
478-
Ok(create_iterator_result(Value::Number(42.0), false))
479+
Ok(create_iterator_result(mc, Value::Number(42.0), false))
479480
}
480481
}
481482
crate::core::GeneratorState::Suspended { pc, stack: _ } => {
@@ -486,7 +487,7 @@ fn generator_next(generator: &Rc<RefCell<crate::core::JSGenerator>>, _send_value
486487
let pc_val = *pc;
487488
if pc_val >= gen_obj.body.len() {
488489
gen_obj.state = crate::core::GeneratorState::Completed;
489-
return Ok(create_iterator_result(Value::Undefined, true));
490+
return Ok(create_iterator_result(mc, Value::Undefined, true));
490491
}
491492
// Clone the tail and replace first yield in the first statement
492493
let mut tail: Vec<Statement> = gen_obj.body[pc_val..].to_vec();
@@ -496,29 +497,30 @@ fn generator_next(generator: &Rc<RefCell<crate::core::JSGenerator>>, _send_value
496497
}
497498

498499
let func_env = prepare_function_call_env(Some(&gen_obj.env), None, None, &[], None, None)?;
500+
crate::core::obj_set_key_value(mc, &func_env, &"__gen_throw_val".into(), throw_value.clone())?;
499501
// Execute the (possibly modified) tail
500-
let result = crate::core::evaluate_statements(&func_env, &tail);
502+
let result = crate::core::evaluate_statements(mc, &func_env, &tail);
501503
gen_obj.state = crate::core::GeneratorState::Completed;
502504
match result {
503-
Ok(val) => Ok(create_iterator_result(val, true)),
504-
Err(_) => Ok(create_iterator_result(Value::Undefined, true)),
505+
Ok(val) => Ok(create_iterator_result(mc, val, true)),
506+
Err(_) => Ok(create_iterator_result(mc, Value::Undefined, true)),
505507
}
506508
}
507509
crate::core::GeneratorState::Running { .. } => Err(raise_eval_error!("Generator is already running")),
508-
crate::core::GeneratorState::Completed => Ok(create_iterator_result(Value::Undefined, true)),
510+
crate::core::GeneratorState::Completed => Ok(create_iterator_result(mc, Value::Undefined, true)),
509511
}
510512
}
511513

512514
/// Execute generator.return()
513515
fn generator_return(generator: &Rc<RefCell<crate::core::JSGenerator>>, return_value: Value) -> Result<Value, JSError> {
514-
let mut gen_obj = generator.borrow_mut();
516+
let mut gen_obj = generator.borrow_mut(mc);
515517
gen_obj.state = crate::core::GeneratorState::Completed;
516-
Ok(create_iterator_result(return_value, true))
518+
Ok(create_iterator_result(mc, return_value, true))
517519
}
518520

519521
/// Execute generator.throw()
520522
fn generator_throw(generator: &Rc<RefCell<crate::core::JSGenerator>>, throw_value: Value) -> Result<Value, JSError> {
521-
let mut gen_obj = generator.borrow_mut();
523+
let mut gen_obj = generator.borrow_mut(mc);
522524
match &mut gen_obj.state {
523525
crate::core::GeneratorState::NotStarted => {
524526
// Throwing into a not-started generator throws synchronously
@@ -543,17 +545,18 @@ fn generator_throw(generator: &Rc<RefCell<crate::core::JSGenerator>>, throw_valu
543545
}
544546
if !replaced {
545547
// fallback: replace the top-level statement
546-
tail[0] = StatementKind::Throw(Expr::Value(throw_value.clone())).into();
548+
tail[0] = StatementKind::Throw(Expr::Var("__gen_throw_val".to_string(), None, None)).into();
547549
}
548550

549551
let func_env = prepare_function_call_env(Some(&gen_obj.env), None, None, &[], None, None)?;
552+
crate::core::obj_set_key_value(mc, &func_env, &"__gen_throw_val".into(), throw_value.clone())?;
550553

551554
// Execute the modified tail. If the throw is uncaught, evaluate_statements
552555
// will return Err and we should propagate that to the caller.
553-
let result = crate::core::evaluate_statements(&func_env, &tail);
556+
let result = crate::core::evaluate_statements(mc, &func_env, &tail);
554557
gen_obj.state = crate::core::GeneratorState::Completed;
555558
match result {
556-
Ok(val) => Ok(create_iterator_result(val, true)),
559+
Ok(val) => Ok(create_iterator_result(mc, val, true)),
557560
Err(e) => Err(e),
558561
}
559562
}
@@ -563,18 +566,18 @@ fn generator_throw(generator: &Rc<RefCell<crate::core::JSGenerator>>, throw_valu
563566
}
564567

565568
/// Create an iterator result object {value: value, done: done}
566-
fn create_iterator_result(value: Value, done: bool) -> Value {
567-
let obj = Rc::new(RefCell::new(crate::core::JSObjectData::default()));
569+
fn create_iterator_result<'gc>(mc: &MutationContext<'gc>, value: Value<'gc>, done: bool) -> Value<'gc> {
570+
let obj = gc_arena::Gc::new(mc, gc_arena::lock::RefLock::new(crate::core::JSObjectData::default()));
568571

569572
// Set value property
570-
obj.borrow_mut()
573+
obj.borrow_mut(mc)
571574
.properties
572-
.insert(PropertyKey::String("value".to_string()), Rc::new(RefCell::new(value)));
575+
.insert(PropertyKey::String("value".to_string()), gc_arena::Gc::new(mc, gc_arena::lock::RefLock::new(value)));
573576

574577
// Set done property
575-
obj.borrow_mut()
578+
obj.borrow_mut(mc)
576579
.properties
577-
.insert(PropertyKey::String("done".to_string()), Rc::new(RefCell::new(Value::Boolean(done))));
580+
.insert(PropertyKey::String("done".to_string()), gc_arena::Gc::new(mc, gc_arena::lock::RefLock::new(Value::Boolean(done))));
578581

579582
Value::Object(obj)
580583
}

src/js_json.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -108,13 +108,13 @@ fn js_value_to_json_value<'gc>(mc: &MutationContext<'gc>, js_value: Value<'gc>)
108108
}
109109
Value::Object(obj) => {
110110
if is_array(mc, &obj) {
111-
let len = get_array_length(mc, &obj).unwrap_or(obj.borrow(&mc).properties.len());
111+
let len = get_array_length(mc, &obj).unwrap_or(obj.borrow().properties.len());
112112
log::debug!("js_value_to_json_value: array with properties.len() = {}", len);
113113
let mut arr = Vec::new();
114114
for i in 0..len {
115115
let val_opt = get_own_property(&obj, &i.to_string().into());
116116
if let Some(val_rc) = val_opt {
117-
let val_clone = val_rc.borrow(&mc).clone();
117+
let val_clone = val_rc.borrow().clone();
118118
if let Some(json_val) = js_value_to_json_value(mc, val_clone) {
119119
arr.push(json_val);
120120
} else {
@@ -129,11 +129,11 @@ fn js_value_to_json_value<'gc>(mc: &MutationContext<'gc>, js_value: Value<'gc>)
129129
Some(serde_json::Value::Array(arr))
130130
} else {
131131
let mut map = serde_json::Map::new();
132-
for (key, value) in obj.borrow(&mc).properties.iter() {
132+
for (key, value) in obj.borrow().properties.iter() {
133133
if let PropertyKey::String(s) = key
134134
&& s != "length"
135135
{
136-
if let Some(json_val) = js_value_to_json_value(mc, value.borrow(&mc).clone()) {
136+
if let Some(json_val) = js_value_to_json_value(mc, value.borrow().clone()) {
137137
map.insert(s.clone(), json_val);
138138
} else {
139139
// If None (undefined, function, etc), skip property

0 commit comments

Comments
 (0)