includes = ["vector"] definitions = ''' struct PrimitivePtrs { int a; int *b; void *c; // No dynamic size, we can't know what it points to! }; struct VectorPtr { std::vector *vec; }; ''' [cases] [cases.int] skip = "top-level pointers are skipped over" # https://github.com/facebookexperimental/object-introspection/issues/19 param_types = ["int*"] setup = "return new int(1);" features = ["chase-raw-pointers"] expect_json = '''[{ "typeName": "int *", "staticSize": 8, "dynamicSize": 4, "NOT": {"pointer": 0}, "members": [ { "typeName": "int", "staticSize": 4, "dynamicSize": 0 } ] }]''' [cases.int_no_follow] skip = "top-level pointers are skipped over" # https://github.com/facebookexperimental/object-introspection/issues/19 param_types = ["int*"] setup = "return new int(1);" expect_json = '''[{ "typeName": "int *", "staticSize": 8, "dynamicSize": 0, "NOT": {"pointer": 0}, "NOT": "members" }]''' [cases.int_null] skip = "top-level pointers are skipped over" # https://github.com/facebookexperimental/object-introspection/issues/19 param_types = ["int*"] setup = "return nullptr;" expect_json = '''[{ "typeName": "int *", "staticSize": 8, "dynamicSize": 0, "pointer": 0, "NOT": "members" }]''' [cases.void] skip = "top-level pointers are skipped over" # https://github.com/facebookexperimental/object-introspection/issues/19 param_types = ["void*"] setup = "return new int(1);" features = ["chase-raw-pointers"] expect_json = '''[{ "typeName": "void *", "staticSize": 8, "dynamicSize": 0, "NOT": {"pointer": 0}, "NOT": "members" }]''' [cases.void_no_follow] skip = "top-level pointers are skipped over" # https://github.com/facebookexperimental/object-introspection/issues/19 param_types = ["void*"] setup = "return new int(1);" expect_json = '''[{ "typeName": "void *", "staticSize": 8, "dynamicSize": 0, "NOT": {"pointer": 0}, "NOT": "members" }]''' [cases.void_null] skip = "top-level pointers are skipped over" # https://github.com/facebookexperimental/object-introspection/issues/19 param_types = ["void*"] setup = "return nullptr;" expect_json = '''[{ "typeName": "void *", "staticSize": 8, "dynamicSize": 0, "pointer": 0, "NOT": "members" }]''' [cases.vector] skip = "top-level pointers are skipped over" # https://github.com/facebookexperimental/object-introspection/issues/19 param_types = ["std::vector*"] setup = "return new std::vector{1,2,3};" features = ["chase-raw-pointers"] expect_json = '''[{ "typeName": "std::vector *", "staticSize": 8, "dynamicSize": 36, "NOT": {"pointer": 0}, "members": [ { "typeName": "std::vector", "staticSize": 24, "dynamicSize": 12 } ] }]''' [cases.vector_no_follow] skip = "top-level pointers are skipped over" # https://github.com/facebookexperimental/object-introspection/issues/19 param_types = ["std::vector*"] setup = "return new std::vector{1,2,3};" expect_json = '''[{ "typeName": "std::vector *", "staticSize": 8, "dynamicSize": 0, "NOT": {"pointer": 0}, "NOT": "members" }]''' [cases.vector_null] skip = "BAD DATA SEGMENT!!! top-level pointers are skipped over" # https://github.com/facebookexperimental/object-introspection/issues/19 param_types = ["std::vector*"] setup = "return nullptr;" expect_json = '''[{ "typeName": "std::vector *", "staticSize": 8, "dynamicSize": 0, "pointer": 0, "NOT": "members" }]''' [cases.struct_primitive_ptrs] param_types = ["const PrimitivePtrs&"] setup = "return PrimitivePtrs{0, new int(0), new int(0)};" features = ["chase-raw-pointers"] expect_json = '''[{ "staticSize":24, "dynamicSize":4, "exclusiveSize":4, "members":[ {"name":"a", "staticSize":4, "exclusiveSize":4, "dynamicSize":0}, {"name":"b", "staticSize":8, "exclusiveSize":8, "dynamicSize":4}, {"name":"c", "staticSize":8, "exclusiveSize":8, "dynamicSize":0} ]}]''' expect_json_v2 = '''[{ "staticSize":24, "exclusiveSize":4, "size":28, "members":[ {"name":"a", "typeNames":["int32_t"], "staticSize":4, "exclusiveSize":4, "size":4}, {"name":"b", "typeNames":["int32_t*"], "staticSize":8, "exclusiveSize":8, "size":12, "capacity":1, "length":1}, {"name":"c", "typeNames":["void*"], "staticSize":8, "exclusiveSize":8, "size":8, "capacity":1, "length":1} ] }]''' [cases.struct_primitive_ptrs_no_follow] param_types = ["const PrimitivePtrs&"] setup = "return PrimitivePtrs{0, new int(0), new int(0)};" expect_json = '''[{ "staticSize":24, "dynamicSize":0, "exclusiveSize":4, "size":24, "members":[ {"name":"a", "staticSize":4, "dynamicSize":0, "exclusiveSize":4, "size":4}, {"name":"b", "staticSize":8, "dynamicSize":0, "exclusiveSize":8, "size":8}, {"name":"c", "staticSize":8, "dynamicSize":0, "exclusiveSize":8, "size":8} ]}]''' [cases.struct_primitive_ptrs_null] param_types = ["const PrimitivePtrs&"] setup = "return PrimitivePtrs{0, nullptr, nullptr};" features = ["chase-raw-pointers"] expect_json = '''[{ "staticSize":24, "dynamicSize":0, "exclusiveSize":4, "size":24, "members":[ {"name":"a", "staticSize":4, "dynamicSize":0, "exclusiveSize":4, "size":4}, {"name":"b", "staticSize":8, "dynamicSize":0, "exclusiveSize":8, "size":8}, {"name":"c", "staticSize":8, "dynamicSize":0, "exclusiveSize":8, "size":8} ]}]''' expect_json_v2 = '''[{ "staticSize":24, "exclusiveSize":4, "size":24, "members":[ {"name":"a", "typeNames":["int32_t"], "staticSize":4, "exclusiveSize":4, "size":4}, {"name":"b", "typeNames":["int32_t*"], "staticSize":8, "exclusiveSize":8, "size":8, "capacity":1, "length":0}, {"name":"c", "typeNames":["void*"], "staticSize":8, "exclusiveSize":8, "size":8, "capacity":1, "length":0} ] }]''' [cases.struct_vector_ptr] param_types = ["const VectorPtr&"] setup = "return VectorPtr{new std::vector{1,2,3}};" features = ["chase-raw-pointers"] expect_json = '''[{ "staticSize":8, "dynamicSize":36, "members":[ {"name":"vec", "staticSize":8, "dynamicSize":36} ]}]''' expect_json_v2 = '''[{ "staticSize":8, "exclusiveSize":0, "size":44, "members": [ { "typeNames":["std::vector>*"], "staticSize":8, "exclusiveSize":8, "size":44, "length":1, "capacity":1, "members":[{ "staticSize":24, "exclusiveSize":24, "size":36 }] } ] }]''' [cases.struct_vector_ptr_no_follow] param_types = ["const VectorPtr&"] setup = "return VectorPtr{new std::vector{1,2,3}};" expect_json = '''[{ "staticSize":8, "dynamicSize":0, "exclusiveSize":0, "size":8, "members":[ {"name":"vec", "staticSize":8, "dynamicSize":0, "exclusiveSize":8, "size":8} ]}]''' [cases.struct_vector_ptr_null] param_types = ["const VectorPtr&"] setup = "return VectorPtr{nullptr};" features = ["chase-raw-pointers"] expect_json = '''[{ "staticSize":8, "dynamicSize":0, "exclusiveSize":0, "size":8, "members":[ {"name":"vec", "staticSize":8, "dynamicSize":0, "exclusiveSize":8, "size":8} ]}]''' expect_json_v2 = '''[{ "staticSize":8, "exclusiveSize":0, "size":8, "members": [ { "typeNames":["std::vector>*"], "staticSize":8, "exclusiveSize":8, "size":8, "length":0, "capacity":1, "members":[] } ] }]''' [cases.vector_of_pointers] param_types = ["const std::vector&"] setup = "return {{new int(1), nullptr, new int(3)}};" features = ["chase-raw-pointers"] expect_json = '''[{ "staticSize":24, "dynamicSize":32, "length":3, "capacity":3, "elementStaticSize":8, "members":[ {"staticSize":8, "dynamicSize":4, "NOT": {"pointer":0}}, {"staticSize":8, "dynamicSize":0, "pointer":0}, {"staticSize":8, "dynamicSize":4, "NOT": {"pointer":0}} ]}]''' expect_json_v2 = '''[{ "staticSize":24, "exclusiveSize":24, "size":56, "length":3, "capacity":3, "members":[ {"staticSize":8, "exclusiveSize":8, "size":12, "NOT": {"pointer":0}}, {"staticSize":8, "exclusiveSize":8, "size":8, "pointer":0}, {"staticSize":8, "exclusiveSize":8, "size":12, "NOT": {"pointer":0}} ] }]''' [cases.vector_of_pointers_no_follow] skip = "pointer field is missing from results" # https://github.com/facebookexperimental/object-introspection/issues/21 param_types = ["const std::vector&"] setup = "return {{new int(1), nullptr, new int(3)}};" expect_json = '''[{ "staticSize":24, "dynamicSize":24, "length":3, "capacity":3, "elementStaticSize":8, "members":[ {"staticSize":8, "dynamicSize":0, "NOT": {"pointer":0}}, {"staticSize":8, "dynamicSize":0, "pointer":0}, {"staticSize":8, "dynamicSize":0, "NOT": {"pointer":0}} ]}]''' [cases.feature_flag_disabled] param_types = ["const PrimitivePtrs&"] setup = "return PrimitivePtrs{0, new int(0), new int(0)};" cli_options = ["-fchase-raw-pointers", "-Fchase-raw-pointers"] expect_json = '''[{ "staticSize":24, "dynamicSize":0, "exclusiveSize":4, "size":24, "members":[ {"name":"a", "staticSize":4, "dynamicSize":0, "exclusiveSize":4, "size":4}, {"name":"b", "staticSize":8, "dynamicSize":0, "exclusiveSize":8, "size":8}, {"name":"c", "staticSize":8, "dynamicSize":0, "exclusiveSize":8, "size":8} ]}]''' [cases.feature_config] param_types = ["const std::vector&"] setup = "return {{new int(1), nullptr, new int(3)}};" config_prefix = 'features = ["chase-raw-pointers"]' expect_json = '''[{ "staticSize":24, "dynamicSize":32, "length":3, "capacity":3, "elementStaticSize":8, "members":[ {"staticSize":8, "dynamicSize":4, "NOT": {"pointer":0}}, {"staticSize":8, "dynamicSize":0, "pointer":0}, {"staticSize":8, "dynamicSize":4, "NOT": {"pointer":0}} ]}]''' expect_json_v2 = '''[{ "staticSize":24, "exclusiveSize":24, "size":56, "length":3, "capacity":3, "members":[ {"staticSize":8, "exclusiveSize":8, "size":12, "NOT": {"pointer":0}}, {"staticSize":8, "exclusiveSize":8, "size":8, "pointer":0}, {"staticSize":8, "exclusiveSize":8, "size":12, "NOT": {"pointer":0}} ] }]'''