shape_jit/ffi/call_method/
object.rs1use crate::nan_boxing::*;
9use std::collections::HashMap;
10
11#[inline(always)]
13pub fn call_object_method(receiver_bits: u64, method_name: &str, args: &[u64]) -> u64 {
14 unsafe {
15 if !is_heap_kind(receiver_bits, HK_JIT_OBJECT) {
16 return TAG_NULL;
17 }
18 let obj = jit_unbox::<HashMap<String, u64>>(receiver_bits);
19
20 match method_name {
21 "hasOwnProperty" | "has" => {
22 if args.is_empty() {
23 return TAG_BOOL_FALSE;
24 }
25 if is_heap_kind(args[0], HK_STRING) {
26 let key = jit_unbox::<String>(args[0]);
27 if obj.contains_key(key.as_str()) {
28 return TAG_BOOL_TRUE;
29 }
30 }
31 TAG_BOOL_FALSE
32 }
33 "length" | "len" => box_number(obj.len() as f64),
34 "mean" | "sum" | "min" | "max" | "std" => {
36 if let Some(&type_bits) = obj.get("__type") {
38 if is_heap_kind(type_bits, HK_STRING) {
39 let type_str = jit_unbox::<String>(type_bits);
40 if type_str == "RollingWindow" {
41 let series_bits = obj.get("series").copied().unwrap_or(TAG_NULL);
43 let window_bits = obj.get("window").copied().unwrap_or(TAG_NULL);
44
45 if is_heap_kind(series_bits, HK_COLUMN_REF) && is_number(window_bits) {
46 let _ = (series_bits, window_bits, method_name);
48 return TAG_NULL;
49 }
50 }
51 }
52 }
53 TAG_NULL
54 }
55 "filter_by" => TAG_NULL,
57 "group_by_month" => TAG_NULL,
58 _ => TAG_NULL,
59 }
60 }
61}