@@ -1861,3 +1861,205 @@ void MCScriptEmitPositionForBytecodeInModule(MCScriptModuleBuilderRef self, MCNa
18611861}
18621862
18631863// //////////////////////////////////////////////////////////////////////////////
1864+
1865+ static MCScriptForeignPrimitiveType
1866+ MCScriptMapTypeToForeignPrimitiveTypeInModule (MCScriptModuleBuilderRef self, uindex_t p_type_index, bool p_is_return_type = false )
1867+ {
1868+ MCScriptType *t_type = self->module .types [p_type_index];
1869+ if (t_type->kind == kMCScriptTypeKindDefined )
1870+ {
1871+ auto t_def_type = static_cast <MCScriptDefinedType *>(t_type);
1872+
1873+ MCNameRef t_name = nullptr ;
1874+
1875+ MCScriptDefinition *t_def = self->module .definitions [t_def_type->index ];
1876+ if (t_def->kind == kMCScriptDefinitionKindType )
1877+ {
1878+ uindex_t t_other_type_index = static_cast <MCScriptTypeDefinition *>(t_def)->type ;
1879+ MCScriptType *t_other_type = self->module .types [t_other_type_index];
1880+ if (t_other_type->kind != kMCScriptTypeKindForeign )
1881+ {
1882+ return MCScriptMapTypeToForeignPrimitiveTypeInModule (self, t_other_type_index);
1883+ }
1884+
1885+ t_name = self->module .definition_names [t_def_type->index ];
1886+ }
1887+ else if (t_def->kind == kMCScriptDefinitionKindExternal )
1888+ {
1889+ const MCScriptImportedDefinition& t_imp_def = self->module .imported_definitions [static_cast <MCScriptExternalDefinition *>(t_def)->index ];
1890+ t_name = t_imp_def.name ;
1891+ }
1892+ else
1893+ {
1894+ MCLog (" can't handle type of kind %d" , t_def->kind );
1895+ return kMCScriptForeignPrimitiveTypeUnknown ;
1896+ }
1897+
1898+ if (p_is_return_type &&
1899+ MCStringIsEqualToCString (MCNameGetString (t_name),
1900+ " undefined" ,
1901+ kMCStringOptionCompareCaseless ))
1902+ {
1903+ return kMCScriptForeignPrimitiveTypeVoid ;
1904+ }
1905+
1906+ /* This list must be kept up to date with all types which we bind to
1907+ * to in foreign handlers in the modules embedded in the engine. */
1908+ static struct { const char *name; MCScriptForeignPrimitiveType type; } s_ext_mappings[] =
1909+ {
1910+ /* Foundation Types */
1911+ { " undefined" , kMCScriptForeignPrimitiveTypePointer },
1912+ { " any" , kMCScriptForeignPrimitiveTypePointer },
1913+
1914+ { " Boolean" , kMCScriptForeignPrimitiveTypePointer },
1915+ { " Number" , kMCScriptForeignPrimitiveTypePointer },
1916+ { " String" , kMCScriptForeignPrimitiveTypePointer },
1917+ { " Data" , kMCScriptForeignPrimitiveTypePointer },
1918+ { " Array" , kMCScriptForeignPrimitiveTypePointer },
1919+ { " List" , kMCScriptForeignPrimitiveTypePointer },
1920+
1921+ /* Foreign C Types */
1922+ { " SInt8" , kMCScriptForeignPrimitiveTypeSInt8 },
1923+ { " UInt8" , kMCScriptForeignPrimitiveTypeUInt8 },
1924+ { " SInt16" , kMCScriptForeignPrimitiveTypeSInt16 },
1925+ { " UInt16" , kMCScriptForeignPrimitiveTypeUInt16 },
1926+ { " SInt32" , kMCScriptForeignPrimitiveTypeSInt32 },
1927+ { " UInt32" , kMCScriptForeignPrimitiveTypeUInt32 },
1928+ { " SInt64" , kMCScriptForeignPrimitiveTypeSInt64 },
1929+ { " UInt64" , kMCScriptForeignPrimitiveTypeUInt64 },
1930+
1931+ { " CSIntSize" , kMCScriptForeignPrimitiveTypeSIntSize },
1932+ { " CUIntSize" , kMCScriptForeignPrimitiveTypeUIntSize },
1933+ { " CSIntPtr" , kMCScriptForeignPrimitiveTypeSIntPtr },
1934+ { " CUIntPtr" , kMCScriptForeignPrimitiveTypeUIntPtr },
1935+
1936+ { " CBool" , kMCScriptForeignPrimitiveTypeCBool },
1937+ { " CChar" , kMCScriptForeignPrimitiveTypeCChar },
1938+ { " CSChar" , kMCScriptForeignPrimitiveTypeCSChar },
1939+ { " CUChar" , kMCScriptForeignPrimitiveTypeCUChar },
1940+ { " CSShort" , kMCScriptForeignPrimitiveTypeCSShort },
1941+ { " CUShort" , kMCScriptForeignPrimitiveTypeCUShort },
1942+ { " CSInt" , kMCScriptForeignPrimitiveTypeCSInt },
1943+ { " CUInt" , kMCScriptForeignPrimitiveTypeCUInt },
1944+ { " CSLong" , kMCScriptForeignPrimitiveTypeCSLong },
1945+ { " CULong" , kMCScriptForeignPrimitiveTypeCULong },
1946+ { " CULongLong" , kMCScriptForeignPrimitiveTypeCSLongLong },
1947+ { " CULongLong" , kMCScriptForeignPrimitiveTypeCULongLong },
1948+ { " CDouble" , kMCScriptForeignPrimitiveTypeCDouble },
1949+ { " CFloat" , kMCScriptForeignPrimitiveTypeCFloat },
1950+ { " LCSInt" , kMCScriptForeignPrimitiveTypeSInt },
1951+ { " LCUInt" , kMCScriptForeignPrimitiveTypeUInt },
1952+
1953+ { " Float32" , kMCScriptForeignPrimitiveTypeFloat32 },
1954+ { " Float64" , kMCScriptForeignPrimitiveTypeFloat64 },
1955+
1956+ { " Pointer" , kMCScriptForeignPrimitiveTypePointer },
1957+
1958+ { " ZStringUTF8" , kMCScriptForeignPrimitiveTypePointer },
1959+
1960+ /* Java FFI Types */
1961+ { " JObject" , kMCScriptForeignPrimitiveTypePointer },
1962+
1963+ /* Extra Foundation Types */
1964+ { " Stream" , kMCScriptForeignPrimitiveTypePointer },
1965+
1966+ /* Canvas Types */
1967+ { " Rectangle" , kMCScriptForeignPrimitiveTypePointer },
1968+ { " Point" , kMCScriptForeignPrimitiveTypePointer },
1969+ { " Image" , kMCScriptForeignPrimitiveTypePointer },
1970+ { " Color" , kMCScriptForeignPrimitiveTypePointer },
1971+ { " Paint" , kMCScriptForeignPrimitiveTypePointer },
1972+ { " SolidPaint" , kMCScriptForeignPrimitiveTypePointer },
1973+ { " Pattern" , kMCScriptForeignPrimitiveTypePointer },
1974+ { " Gradient" , kMCScriptForeignPrimitiveTypePointer },
1975+ { " GradientStop" , kMCScriptForeignPrimitiveTypePointer },
1976+ { " Path" , kMCScriptForeignPrimitiveTypePointer },
1977+ { " Effect" , kMCScriptForeignPrimitiveTypePointer },
1978+ { " Font" , kMCScriptForeignPrimitiveTypePointer },
1979+ { " Canvas" , kMCScriptForeignPrimitiveTypePointer },
1980+ { " Transform" , kMCScriptForeignPrimitiveTypePointer },
1981+
1982+ /* Engine Types */
1983+ { " Widget" , kMCScriptForeignPrimitiveTypePointer },
1984+ { " ScriptObject" , kMCScriptForeignPrimitiveTypePointer },
1985+ };
1986+
1987+ for (const auto t_mapping : s_ext_mappings)
1988+ {
1989+ if (MCStringIsEqualToCString (MCNameGetString (t_name), t_mapping.name , kMCStringOptionCompareCaseless ))
1990+ {
1991+ return t_mapping.type ;
1992+ }
1993+ }
1994+
1995+ return kMCScriptForeignPrimitiveTypeUnknown ;
1996+ }
1997+ else if (t_type->kind == kMCScriptTypeKindForeign )
1998+ {
1999+ return kMCScriptForeignPrimitiveTypeUnknown ;
2000+ }
2001+ else if (t_type->kind == kMCScriptTypeKindOptional )
2002+ {
2003+ return kMCScriptForeignPrimitiveTypePointer ;
2004+ }
2005+ else if (t_type->kind == kMCScriptTypeKindForeignHandler ||
2006+ t_type->kind == kMCScriptTypeKindHandler )
2007+ {
2008+ return kMCScriptForeignPrimitiveTypePointer ;
2009+ }
2010+
2011+ return kMCScriptForeignPrimitiveTypeUnknown ;
2012+ }
2013+
2014+ MCScriptForeignPrimitiveType
2015+ MCScriptQueryForeignHandlerReturnTypeInModule (MCScriptModuleBuilderRef self, uindex_t p_type_index)
2016+ {
2017+ if (self->module .types [p_type_index]->kind != kMCScriptTypeKindForeignHandler )
2018+ {
2019+ return kMCScriptForeignPrimitiveTypeUnknown ;
2020+ }
2021+
2022+ auto t_handler_type = static_cast <MCScriptHandlerType *>(self -> module . types[p_type_index]);
2023+
2024+ return MCScriptMapTypeToForeignPrimitiveTypeInModule (self, t_handler_type->return_type , true );
2025+ }
2026+
2027+ uindex_t
2028+ MCScriptQueryForeignHandlerParameterCountInModule (MCScriptModuleBuilderRef self, uindex_t p_type_index)
2029+ {
2030+ if (self->module .types [p_type_index]->kind != kMCScriptTypeKindForeignHandler )
2031+ {
2032+ return 0 ;
2033+ }
2034+
2035+ auto t_handler_type = static_cast <MCScriptHandlerType *>(self -> module . types[p_type_index]);
2036+
2037+ return t_handler_type->parameter_count ;
2038+
2039+ }
2040+
2041+ MCScriptForeignPrimitiveType
2042+ MCScriptQueryForeignHandlerParameterTypeInModule (MCScriptModuleBuilderRef self, uindex_t p_type_index, uindex_t p_arg_index)
2043+ {
2044+ if (self->module .types [p_type_index]->kind != kMCScriptTypeKindForeignHandler )
2045+ {
2046+ return kMCScriptForeignPrimitiveTypeUnknown ;
2047+ }
2048+
2049+ auto t_handler_type = static_cast <MCScriptHandlerType *>(self -> module . types[p_type_index]);
2050+ if (p_arg_index >= t_handler_type->parameter_count )
2051+ {
2052+ return kMCScriptForeignPrimitiveTypeUnknown ;
2053+ }
2054+
2055+ /* Non-in modes map to a primitive pointer type from the point of view of
2056+ FFI. */
2057+ if (t_handler_type->parameters [p_arg_index].mode != kMCScriptHandlerTypeParameterModeIn )
2058+ {
2059+ return kMCScriptForeignPrimitiveTypePointer ;
2060+ }
2061+
2062+ return MCScriptMapTypeToForeignPrimitiveTypeInModule (self, t_handler_type->parameters [p_arg_index].type );
2063+ }
2064+
2065+ // //////////////////////////////////////////////////////////////////////////////
0 commit comments