(
&mut self,
object: Box<Expr<'gc>>,
method: Token<'gc>,
arguments: Vec<Expr<'gc>>,
keyword_args: HashMap<String, Expr<'gc>>,
error_handler: Option<Erro
| 1242 | } |
| 1243 | |
| 1244 | fn generate_invoke( |
| 1245 | &mut self, |
| 1246 | object: Box<Expr<'gc>>, |
| 1247 | method: Token<'gc>, |
| 1248 | arguments: Vec<Expr<'gc>>, |
| 1249 | keyword_args: HashMap<String, Expr<'gc>>, |
| 1250 | error_handler: Option<ErrorHandler<'gc>>, |
| 1251 | ) -> Result<(), VmError> { |
| 1252 | let arg_count = arguments.len() as u8; |
| 1253 | let kw_count = keyword_args.len() as u8; |
| 1254 | |
| 1255 | self.generate_expr(object)?; |
| 1256 | for arg in arguments { |
| 1257 | self.generate_expr(arg)?; |
| 1258 | } |
| 1259 | self.generate_keyword_args(keyword_args)?; |
| 1260 | |
| 1261 | let method_const = self.identifier_constant(method.lexeme); |
| 1262 | |
| 1263 | self.emit(OpCode::Invoke { |
| 1264 | method_constant: method_const as u8, |
| 1265 | positional_count: arg_count, |
| 1266 | keyword_count: kw_count, |
| 1267 | }); |
| 1268 | |
| 1269 | if let Some(handler) = error_handler { |
| 1270 | self.generate_error_handler(handler)?; |
| 1271 | } |
| 1272 | Ok(()) |
| 1273 | } |
| 1274 | |
| 1275 | fn generate_error_handler(&mut self, handler: ErrorHandler<'gc>) -> Result<(), VmError> { |
| 1276 | let error_jump = self.emit_jump(OpCode::JumpIfError(0)); |
no test coverage detected