@@ -2038,6 +2038,16 @@ fn evaluate_var(env: &JSObjectDataPtr, name: &str) -> Result<Value, JSError> {
20382038 let v = Value :: Function ( "Promise" . to_string ( ) ) ;
20392039 log:: trace!( "evaluate_var - {} -> {:?}" , name, v) ;
20402040 Ok ( v)
2041+ } else if name == "Proxy" {
2042+ // Return the Proxy constructor (we store it in the global environment)
2043+ if let Some ( val_rc) = obj_get_value ( env, & "Proxy" . into ( ) ) ? {
2044+ let resolved = val_rc. borrow ( ) . clone ( ) ;
2045+ log:: trace!( "evaluate_var - {} -> {:?}" , name, resolved) ;
2046+ return Ok ( resolved) ;
2047+ }
2048+ let v = Value :: Function ( "Proxy" . to_string ( ) ) ;
2049+ log:: trace!( "evaluate_var - {} -> {:?}" , name, v) ;
2050+ Ok ( v)
20412051 } else if name == "new" {
20422052 let v = Value :: Function ( "new" . to_string ( ) ) ;
20432053 log:: trace!( "evaluate_var - {} -> {:?}" , name, v) ;
@@ -2835,6 +2845,7 @@ fn evaluate_typeof(env: &JSObjectDataPtr, expr: &Expr) -> Result<Value, JSError>
28352845 Value :: WeakMap ( _) => "object" ,
28362846 Value :: WeakSet ( _) => "object" ,
28372847 Value :: Generator ( _) => "object" ,
2848+ Value :: Proxy ( _) => "object" ,
28382849 } ;
28392850 Ok ( Value :: String ( utf8_to_utf16 ( type_str) ) )
28402851}
@@ -2850,7 +2861,7 @@ fn evaluate_delete(env: &JSObjectDataPtr, expr: &Expr) -> Result<Value, JSError>
28502861 let obj_val = evaluate_expr ( env, obj) ?;
28512862 match obj_val {
28522863 Value :: Object ( obj_map) => {
2853- let deleted = obj_delete ( & obj_map, & prop. into ( ) ) ;
2864+ let deleted = obj_delete ( & obj_map, & prop. into ( ) ) ? ;
28542865 Ok ( Value :: Boolean ( deleted) )
28552866 }
28562867 _ => Ok ( Value :: Boolean ( false ) ) ,
@@ -2863,17 +2874,17 @@ fn evaluate_delete(env: &JSObjectDataPtr, expr: &Expr) -> Result<Value, JSError>
28632874 match ( obj_val, idx_val) {
28642875 ( Value :: Object ( obj_map) , Value :: String ( s) ) => {
28652876 let key = PropertyKey :: String ( String :: from_utf16_lossy ( & s) ) ;
2866- let deleted = obj_delete ( & obj_map, & key) ;
2877+ let deleted = obj_delete ( & obj_map, & key) ? ;
28672878 Ok ( Value :: Boolean ( deleted) )
28682879 }
28692880 ( Value :: Object ( obj_map) , Value :: Number ( n) ) => {
28702881 let key = PropertyKey :: String ( n. to_string ( ) ) ;
2871- let deleted = obj_delete ( & obj_map, & key) ;
2882+ let deleted = obj_delete ( & obj_map, & key) ? ;
28722883 Ok ( Value :: Boolean ( deleted) )
28732884 }
28742885 ( Value :: Object ( obj_map) , Value :: Symbol ( sym) ) => {
28752886 let key = PropertyKey :: Symbol ( Rc :: new ( RefCell :: new ( Value :: Symbol ( sym) ) ) ) ;
2876- let deleted = obj_delete ( & obj_map, & key) ;
2887+ let deleted = obj_delete ( & obj_map, & key) ? ;
28772888 Ok ( Value :: Boolean ( deleted) )
28782889 }
28792890 _ => Ok ( Value :: Boolean ( false ) ) ,
@@ -3726,6 +3737,12 @@ fn evaluate_property(env: &JSObjectDataPtr, obj: &Expr, prop: &str) -> Result<Va
37263737 Ok ( Value :: Undefined )
37273738 }
37283739 }
3740+ // Special cases for wrapped Generator objects
3741+ Value :: Object ( obj_map)
3742+ if obj_map. borrow ( ) . contains_key ( & "__generator__" . into ( ) ) && ( prop == "next" || prop == "return" || prop == "throw" ) =>
3743+ {
3744+ Ok ( Value :: Function ( format ! ( "Generator.prototype.{}" , prop) ) )
3745+ }
37293746 Value :: Object ( obj_map) => {
37303747 // Special-case the `__proto__` accessor so property reads return the
37313748 // object's current prototype object when present.
@@ -3762,6 +3779,8 @@ fn evaluate_property(env: &JSObjectDataPtr, obj: &Expr, prop: &str) -> Result<Va
37623779 "Property not found for Symbol constructor property: {prop}"
37633780 ) ) )
37643781 } ) ;
3782+ } else if func_name == "Proxy" && prop == "revocable" {
3783+ return Ok ( Value :: Function ( "Proxy.revocable" . to_string ( ) ) ) ;
37653784 }
37663785
37673786 Err ( raise_eval_error ! ( format!( "Property not found for prop={prop}" ) ) )
@@ -3891,6 +3910,14 @@ fn evaluate_call(env: &JSObjectDataPtr, func_expr: &Expr, args: &[Expr]) -> Resu
38913910 return handle_symbol_static_method ( method_name, args, env) ;
38923911 }
38933912
3913+ // Special case for Proxy static methods
3914+ if let Expr :: Var ( var_name) = & * * obj_expr
3915+ && var_name == "Proxy"
3916+ && method_name == "revocable"
3917+ {
3918+ return crate :: js_proxy:: handle_proxy_revocable ( args, env) ;
3919+ }
3920+
38943921 let obj_val = evaluate_expr ( env, obj_expr) ?;
38953922 log:: trace!( "evaluate_call - object evaluated" ) ;
38963923 match ( obj_val, method_name. as_str ( ) ) {
@@ -3926,6 +3953,15 @@ fn evaluate_call(env: &JSObjectDataPtr, func_expr: &Expr, args: &[Expr]) -> Resu
39263953 ( Value :: WeakMap ( weakmap) , method) => crate :: js_weakmap:: handle_weakmap_instance_method ( & weakmap, method, args, env) ,
39273954 ( Value :: WeakSet ( weakset) , method) => crate :: js_weakset:: handle_weakset_instance_method ( & weakset, method, args, env) ,
39283955 ( Value :: Generator ( generator) , method) => crate :: js_generator:: handle_generator_instance_method ( & generator, method, args, env) ,
3956+ ( Value :: Object ( obj_map) , method) if obj_map. borrow ( ) . contains_key ( & "__generator__" . into ( ) ) => {
3957+ if let Some ( gen_val) = obj_map. borrow ( ) . get ( & "__generator__" . into ( ) )
3958+ && let Value :: Generator ( generator) = & * gen_val. borrow ( )
3959+ {
3960+ crate :: js_generator:: handle_generator_instance_method ( generator, method, args, env)
3961+ } else {
3962+ Err ( raise_eval_error ! ( "Invalid Generator object" ) )
3963+ }
3964+ }
39293965 ( Value :: Object ( obj_map) , method) => {
39303966 // Object prototype methods are supplied on `Object.prototype`.
39313967 // Lookups will find user-defined (own) methods before inherited
@@ -4150,6 +4186,11 @@ fn evaluate_call(env: &JSObjectDataPtr, func_expr: &Expr, args: &[Expr]) -> Resu
41504186 // Regular function call
41514187 let func_val = evaluate_expr ( env, func_expr) ?;
41524188 match func_val {
4189+ Value :: Proxy ( proxy) => {
4190+ // Special case: calling a proxy directly (assumed to be revoke function)
4191+ proxy. borrow_mut ( ) . revoked = true ;
4192+ Ok ( Value :: Undefined )
4193+ }
41534194 Value :: Function ( func_name) => crate :: js_function:: handle_global_function ( & func_name, args, env) ,
41544195 Value :: GeneratorFunction ( params, body, captured_env) => {
41554196 // Generator function call - return a generator object
0 commit comments