Use call_native_fn.

This commit is contained in:
Stephen Chung 2022-05-19 14:36:58 +08:00
parent 47d0d014e3
commit dd8c18369b

View File

@ -335,12 +335,11 @@ impl Engine {
let (mut new_val, op_info) = new_val.expect("`Some`"); let (mut new_val, op_info) = new_val.expect("`Some`");
if op_info.is_op_assignment() { if op_info.is_op_assignment() {
let hash = crate::ast::FnCallHashes::from_native(*hash_get);
let args = &mut [target.as_mut()]; let args = &mut [target.as_mut()];
let (mut orig_val, ..) = self let (mut orig_val, ..) = self
.exec_fn_call( .call_native_fn(
None, global, caches, lib, getter, hash, args, is_ref_mut, global, caches, lib, getter, *hash_get, args, is_ref_mut,
true, *pos, level, false, *pos, level,
) )
.or_else(|err| match *err { .or_else(|err| match *err {
// Try an indexer if property does not exist // Try an indexer if property does not exist
@ -371,10 +370,9 @@ impl Engine {
new_val = orig_val; new_val = orig_val;
} }
let hash = crate::ast::FnCallHashes::from_native(*hash_set);
let args = &mut [target.as_mut(), &mut new_val]; let args = &mut [target.as_mut(), &mut new_val];
self.exec_fn_call( self.call_native_fn(
None, global, caches, lib, setter, hash, args, is_ref_mut, true, *pos, global, caches, lib, setter, *hash_set, args, is_ref_mut, false, *pos,
level, level,
) )
.or_else(|err| match *err { .or_else(|err| match *err {
@ -399,10 +397,9 @@ impl Engine {
self.run_debugger(scope, global, lib, this_ptr, rhs, level)?; self.run_debugger(scope, global, lib, this_ptr, rhs, level)?;
let ((getter, hash_get), _, name) = x.as_ref(); let ((getter, hash_get), _, name) = x.as_ref();
let hash = crate::ast::FnCallHashes::from_native(*hash_get);
let args = &mut [target.as_mut()]; let args = &mut [target.as_mut()];
self.exec_fn_call( self.call_native_fn(
None, global, caches, lib, getter, hash, args, is_ref_mut, true, *pos, global, caches, lib, getter, *hash_get, args, is_ref_mut, false, *pos,
level, level,
) )
.map_or_else( .map_or_else(
@ -488,16 +485,14 @@ impl Engine {
let ((getter, hash_get), (setter, hash_set), name) = p.as_ref(); let ((getter, hash_get), (setter, hash_set), name) = p.as_ref();
let rhs_chain = rhs.into(); let rhs_chain = rhs.into();
let hash_get = crate::ast::FnCallHashes::from_native(*hash_get);
let hash_set = crate::ast::FnCallHashes::from_native(*hash_set);
let mut arg_values = [target.as_mut(), &mut Dynamic::UNIT.clone()]; let mut arg_values = [target.as_mut(), &mut Dynamic::UNIT.clone()];
let args = &mut arg_values[..1]; let args = &mut arg_values[..1];
// Assume getters are always pure // Assume getters are always pure
let (mut val, ..) = self let (mut val, ..) = self
.exec_fn_call( .call_native_fn(
None, global, caches, lib, getter, hash_get, args, global, caches, lib, getter, *hash_get, args, is_ref_mut,
is_ref_mut, true, pos, level, false, pos, level,
) )
.or_else(|err| match *err { .or_else(|err| match *err {
// Try an indexer if property does not exist // Try an indexer if property does not exist
@ -531,9 +526,9 @@ impl Engine {
// Re-use args because the first &mut parameter will not be consumed // Re-use args because the first &mut parameter will not be consumed
let mut arg_values = [target.as_mut(), val.as_mut()]; let mut arg_values = [target.as_mut(), val.as_mut()];
let args = &mut arg_values; let args = &mut arg_values;
self.exec_fn_call( self.call_native_fn(
None, global, caches, lib, setter, hash_set, args, global, caches, lib, setter, *hash_set, args, is_ref_mut,
is_ref_mut, true, pos, level, false, pos, level,
) )
.or_else( .or_else(
|err| match *err { |err| match *err {
@ -813,12 +808,13 @@ impl Engine {
level: usize, level: usize,
) -> RhaiResultOf<Dynamic> { ) -> RhaiResultOf<Dynamic> {
let args = &mut [target, idx]; let args = &mut [target, idx];
let hash_get = crate::ast::FnCallHashes::from_native(global.hash_idx_get()); let hash = global.hash_idx_get();
let fn_name = crate::engine::FN_IDX_GET; let fn_name = crate::engine::FN_IDX_GET;
let pos = Position::NONE; let pos = Position::NONE;
let level = level + 1;
self.exec_fn_call( self.call_native_fn(
None, global, caches, lib, fn_name, hash_get, args, true, true, pos, level, global, caches, lib, fn_name, hash, args, true, false, pos, level,
) )
.map(|(r, ..)| r) .map(|(r, ..)| r)
} }
@ -837,13 +833,14 @@ impl Engine {
is_ref_mut: bool, is_ref_mut: bool,
level: usize, level: usize,
) -> RhaiResultOf<(Dynamic, bool)> { ) -> RhaiResultOf<(Dynamic, bool)> {
let hash_set = crate::ast::FnCallHashes::from_native(global.hash_idx_set()); let hash = global.hash_idx_set();
let args = &mut [target, idx, new_val]; let args = &mut [target, idx, new_val];
let fn_name = crate::engine::FN_IDX_SET; let fn_name = crate::engine::FN_IDX_SET;
let pos = Position::NONE; let pos = Position::NONE;
let level = level + 1;
self.exec_fn_call( self.call_native_fn(
None, global, caches, lib, fn_name, hash_set, args, is_ref_mut, true, pos, level, global, caches, lib, fn_name, hash, args, is_ref_mut, false, pos, level,
) )
} }