out << ind << ns_prefix << _class->name << "* _this;\n";
out << ind << "sq_getinstanceup(v, 1, (SQUserPointer*) &_this, 0);\n";
}
+
+ // custom function?
+ if(function->custom) {
+ if(function->type != Function::FUNCTION)
+ throw std::runtime_error(
+ "custom not allow constructor+destructor yet");
+ if(function->return_type.atomic_type != &BasicType::INT)
+ throw std::runtime_error("custom function has to return int");
+ if(function->parameters.size() != 1)
+ throw std::runtime_error(
+ "custom function must have 1 HSQUIRRELVM parameter");
+
+ out << ind << "return ";
+ if(_class != 0)
+ out << "_this->";
+ else
+ out << ns_prefix;
+ out << function->name << "(v);\n";
+ out << "}\n";
+ out << "\n";
+ return;
+ }
// declare and retrieve arguments
int i = 0;
<< ind << ind << "sq_setreleasehook(v, -1, "
<< _class->name << "_release_hook);\n"
<< ind << "}\n"
- << "}\n";
+ << "}\n"
+ << "\n";
}
void
private { return T_PRIVATE; }
namespace { return T_NAMESPACE; }
__suspend { return T_SUSPEND; }
+__custom { return T_CUSTOM; }
[a-zA-Z_][a-zA-Z_0-9]* {
Namespace* ns = search_namespace;
if(ns == 0)
std_namespace->types.push_back(new StringType());
unit->namespaces.push_back(std_namespace);
unit->types.push_back(new HSQUIRRELVMType());
-
+
yyparse();
Namespace* ns = unit;
std::ofstream dout(output_doc.c_str());
if(!dout.good()) {
std::cerr << "Couldn't open file '"
- << dout << "' for writing.\n";
+ << output_doc << "' for writing.\n";
return 1;
}
DocuCreator creator(dout);
creator.create_docu(ns);
}
} catch(std::exception& e) {
- std::cerr << e.what() << "\n";
+ std::cerr << "Exception: " << e.what() << "\n";
return 1;
}
%token T_STRUCT
%token T_STATIC
%token T_SUSPEND
+%token T_CUSTOM
%token T_CONST
%token T_UNSIGNED
%token T_SIGNED
function_attributes:
/* empty */
| T_CONST function_attributes
+ | T_CUSTOM function_attributes
+ {
+ current_function->custom = true;
+ }
| T_SUSPEND function_attributes
{
current_function->suspend = true;
Function() {
type = FUNCTION;
suspend = false;
+ custom = false;
}
enum FuncType {
DESTRUCTOR
};
FuncType type;
+ /// function should suspend squirrel VM after execution
bool suspend;
+ /// a custom wrapper (just pass along HSQUIRRELVM)
+ bool custom;
std::string docu_comment;
std::string name;
Type return_type;