Changeset 64

Show
Ignore:
Timestamp:
06/04/06 03:39:51 (2 years ago)
Author:
Gregor
Message:

bcd.gen/scripts/libglade2.sh: New libglade2 binding.

bcd.gen/bcd/gen/bcdgen.d: More keywords, constructor-reflection fixes.

bcd.gen/bcd/bind.d: C_data_owned (don't delete data that's not ours to delete!)

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/bcd.gen/bcd/bind.d

    r60 r64  
    3030    } 
    3131    void *__C_data = null; 
     32    bool __C_data_owned = false; 
    3233} 
    3334 
     
    3637        super("BCDReflectionException: " ~ msg); 
    3738    } 
     39} 
     40 
     41struct CXXDelegate { 
     42    void *o; 
     43    void *f; 
    3844} 
    3945 
  • trunk/bcd.gen/bcd/gen/bcdgen.d

    r59 r64  
    326326        name == "align" || 
    327327        name == "body" || 
     328        name == "debug" || 
    328329        name == "final" || 
    329330        name == "function" || 
     
    333334        name == "out" || 
    334335        name == "override" || 
     336        name == "package" || 
    335337        name == "scope" || 
    336338        name == "version") { 
     
    671673    dtail ~= "super(ignore);\n"; 
    672674    dtail ~= "__C_data = x;\n"; 
     675    dtail ~= "__C_data_owned = false;\n"; 
    673676    dtail ~= "}\n"; 
    674677     
     
    680683     
    681684    dtail ~= "~this() {\n"; 
    682     dtail ~= "if (__C_data) _BCD_delete_" ~ mangled ~ "(__C_data);\n"; 
     685    dtail ~= "if (__C_data && __C_data_owned) _BCD_delete_" ~ mangled ~ "(__C_data);\n"; 
    683686    dtail ~= "__C_data = null;\n"; 
    684687    dtail ~= "}\n"; 
     
    692695        dtail ~= "super(cast(ifloat) 0);\n"; 
    693696        dtail ~= "__C_data = _BCD_new_" ~ mangled ~ "();\n"; 
     697        dtail ~= "__C_data_owned = true;\n"; 
    694698        dtail ~= "}\n"; 
    695699        cout ~= demangled ~ " *_BCD_new_" ~ mangled ~ "() {\n"; 
     
    715719 
    716720    dtail ~= "~this() {\n"; 
    717     dtail ~= "if (__C_data) _BCD_delete_" ~ mangled ~ "__" ~ curReflection ~ "(__C_data);\n"; 
     721    dtail ~= "if (__C_data && __C_data_owned) _BCD_delete_" ~ mangled ~ "__" ~ curReflection ~ "(__C_data);\n"; 
    718722    dtail ~= "__C_data = null;\n"; 
    719723    dtail ~= "}\n"; 
     
    748752        dtail ~= "super(cast(ifloat) 0);\n"; 
    749753        dtail ~= "__C_data = _BCD_new_" ~ mangled ~ "__" ~ curReflection ~ "();\n"; 
     754        dtail ~= "__C_data_owned = true;\n"; 
    750755        dtail ~= "}\n"; 
    751756        cout ~= curReflection ~ " *_BCD_new_" ~ mangled ~ "__" ~ curReflection ~ "() {\n"; 
     
    860865         
    861866            cout ~= type.CType ~ " _BCD_get_" ~ mangled ~ "(" ~ curClass ~ " *This) {\n"; 
    862             cout ~= "return (" ~ type.CType ~ ") "; 
     867            cout ~= "return "; 
    863868            if (type.isClass) cout ~= "&"; 
    864869            cout ~= "This->" ~ name ~ ";\n"; 
     
    891896         
    892897            cout ~= type.CType ~ " _BCD_get_" ~ mangled ~ "() {\n"; 
    893             cout ~= "return (" ~ type.CType  ~ ") "; 
     898            cout ~= "return "; 
    894899            if (type.isClass) cout ~= "&"; 
    895900            cout ~= demangled ~ ";\n"; 
     
    10401045        cout ~= type.CType ~ " _BCD_" ~ mangled ~ "(" ~ Cargs ~ ") {\n"; 
    10411046        if (type.DType != "void") { 
    1042             cout ~= "return (" ~ type.CType ~ ") "; 
     1047            cout ~= "return "; 
    10431048        } 
    10441049        cout ~= "(" ~ demangled ~ "(" ~ Ccall ~ "));\n"; 
     
    13051310     
    13061311    if (!reflection) 
    1307         parse_Function_body(node, dname, mangled, "This->" ~ name, type, 
     1312        parse_Function_body(node, dname, mangled, "This->operator" ~ name, type, 
    13081313                            Dargs, Deargs, Cargs, Dcall, Ccall); 
    13091314    else 
    1310         parse_Function_reflection(node, dname, name, mangled, type, 
     1315        parse_Function_reflection(node, dname, "operator" ~ name, mangled, type, 
    13111316                                  Dargs, Deargs, Cargs, Dcall, Ccall); 
    13121317} 
     
    13551360    char[] Dargs; 
    13561361    char[] Deargs; 
    1357     if (!reflection) Deargs = "void *"; 
    13581362    char[] Cargs; 
    1359     if (!reflection) { 
    1360         if (outputC) { 
    1361             Cargs = "struct " ~ curClass ~ " *This"; 
    1362         } else { 
    1363             Cargs = curClass ~ " *This"; 
    1364         } 
    1365     } 
    13661363    char[] Dcall; 
    1367     if (!reflection) Dcall = "__C_data"; 
    13681364    char[] Ccall; 
    13691365     
     
    13731369    } 
    13741370     
    1375     parse_Arguments(node, Dargs, Deargs, Cargs, Dcall, Ccall, reflection); 
     1371    parse_Arguments(node, Dargs, Deargs, Cargs, Dcall, Ccall, false); 
    13761372     
    13771373    if (reflection) { 
     
    13871383    dtail ~= "super(cast(ifloat) 0);\n"; 
    13881384    dtail ~= "__C_data = _BCD_new_" ~ mangled ~ "(" ~ Dcall ~ ");\n"; 
     1385    dtail ~= "__C_data_owned = true;\n"; 
    13891386    if (reflection) { 
    13901387        dtail ~= curReflectionInit ~ "(__C_data, cast(void *) this);\n"; 
     
    16111608                            break; 
    16121609                         
     1610                        case "wchar_t": 
     1611                            parsedCache[type] = new ParsedType("wchar_t", "wchar"); 
     1612                            break; 
    16131613                         
    16141614                        case "bool": 
     
    18041804                    parsedCache[type] = rpt; 
    18051805                 
    1806                 } else if (nname == "FunctionType") { 
     1806                } else if (nname == "FunctionType" || nname == "MethodType") { 
    18071807                    // make a typedef and an alias 
    18081808                    static bool[char[]] handledFunctions; 
     1809 
     1810                    char[] base = ""; 
     1811                    if (nname == "MethodType") { 
     1812                        base = parseType(toStringFree(xmlGetProp(curNode, "basetype"))).CType; 
     1813                        base[base.length - 2 .. base.length] = "::"; 
     1814                    } 
    18091815                 
    18101816                    if (!(type in handledFunctions)) { 
     
    18161822                        bool first = true; 
    18171823                        couta = "typedef " ~ pt.CType ~ 
    1818                         " (*_BCD_func_" ~ type ~ ")("; 
     1824                        " (*" ~ base ~ "_BCD_func_" ~ type ~ ")("; 
    18191825                        dheada = "alias " ~ pt.DType ~ " function("; 
    18201826                     
     
    18561862                    } 
    18571863                 
    1858                     ParsedType pt = new ParsedType("_BCD_func_" ~ type, "_BCD_func_" ~ type); 
    1859                     pt.isFunction = true; 
     1864                    ParsedType pt; 
     1865                    if (nname != "MethodType") { 
     1866                        pt = new ParsedType("_BCD_func_" ~ type, "_BCD_func_" ~ type); 
     1867                        pt.isFunction = true; 
     1868                    } else { 
     1869                        writefln("WARNING: method types/delegates are not yet supported"); 
     1870                        pt = new ParsedType("_BCD_func_" ~ type, "bcd.bind.CXXDelegate"); 
     1871                        pt.isFunction = true; 
     1872                    } 
    18601873                 
    18611874                    parsedCache[type] = pt; 
    1862               
     1875 
    18631876                } else if (nname == "Enumeration") { 
    18641877                    if (parseThis(curNode, true)) parse_Enumeration(curNode);