Branch: Tag:

1999-07-24

1999-07-24 23:34:55 by Marcus Comstedt <marcus@mc.pp.se>

Added support for string returns and polymorphic single arguments.

Rev: src/post_modules/GL/gen.pike:1.10

95:      array(string) gen_func(string name, string ty)   { -  string res="", got="", prot, vdec, vret, fu=name; +  string res="", got="", prot, vdec, vret, vcast, fu=name;    array novec, args=({}), argt=({}); -  int r234, argt_cut=-1, img_obj=0; +  int r234, argt_cut=-1, img_obj=0, polya=-1;    string rtypes;       switch(ty[0]) {
111:    vdec="INT32";    vret="push_int";    break; +  case 'S': +  prot=":string"; +  vdec="const GLubyte *"; +  vret="push_text"; +  vcast="(char *)"; +  break;    default:    error("%s: Unknown return type '%c'.", name, ty[0]);    }
145:    got += " arg"+a+"=sp["+(a-1)+"-args].u.float_number;\n";    a++;    break; +  case 'Z': +  argt += ({"float|int"}); +  args += ({ "sp["+(a-1)+"-args]" }); +  polya = (a++)-1; +  break;    case '+':    int mi, mx;    switch(sizeof(ty[i+1..])) {
270:    switch(r234)    {    case 0: +  if(polya<0)    res += (vret?" res=":" ")+fu+"("+(args*",")+");\n"; -  +  else +  res += " switch("+args[polya]+".type) {\n"+ +  Array.map(argt[polya]/"|", lambda(string t) +  { +  array(string) a = copy_value(args); +  a[polya] += ".u"; +  switch(t) { +  case "int": +  a[polya]+=".integer"; break; +  case "float": +  a[polya]+=".float_number"; break; +  } +  return " case T_"+upper_case(t)+": "+ +  (vret?"res=":"")+fu+t[0..0]+"("+ +  (a*",")+"); break;\n"; +  })*""+" }\n";    break;    case 1:    if(sizeof(rtypes)==1)
368:    res += " release_img(&img);\n";    }    res += " pop_n_elems(args);\n"; -  res += (vret? " "+vret+"(res);\n":/*" push_int(0);\n"*/""); +  res += (vret? " "+vret+"("+(vcast||"")+"res);\n":/*" push_int(0);\n"*/"");    res += "}\n\n";    return ({res,prot});   }