Clean up code to generate magic property methods

This commit is contained in:
Olly Betts 2021-04-19 15:12:42 +12:00
commit 84559bc441

View file

@ -877,16 +877,9 @@ public:
return false; return false;
} }
/* Magic methods __set, __get, __isset is declared here in the extension. void generate_magic_property_methods(String *baseClassExtend) {
The flag variable is used to decide whether all variables are read or not. if (magic_set == NULL) return;
*/
void magic_method_setter(Node *n, bool flag, String *baseClassExtend) {
if (magic_set == NULL) {
magic_set = NewStringEmpty();
magic_get = NewStringEmpty();
}
if (flag) {
if (Cmp(baseClassExtend, "Exception") == 0 || !is_class_wrapped(baseClassExtend)) { if (Cmp(baseClassExtend, "Exception") == 0 || !is_class_wrapped(baseClassExtend)) {
baseClassExtend = NULL; baseClassExtend = NULL;
} }
@ -1022,19 +1015,6 @@ public:
Delete(magic_get); Delete(magic_get);
magic_set = NULL; magic_set = NULL;
magic_get = NULL; magic_get = NULL;
return;
}
String *v_name = GetChar(n, "name");
Printf(magic_set, "\nelse if (strcmp(ZSTR_VAL(arg2),\"%s\") == 0) {\n",v_name);
Printf(magic_set, "ZVAL_STRING(&tempZval, \"%s_set\");\n",v_name);
Printf(magic_set, "call_user_function(EG(function_table),ZEND_THIS,&tempZval,return_value,1,&args[1]);\n}\n");
Printf(magic_get, "\nelse if (strcmp(ZSTR_VAL(arg2),\"%s\") == 0) {\n",v_name);
Printf(magic_get, "ZVAL_STRING(&tempZval, \"%s_get\");\n",v_name);
Printf(magic_get, "call_user_function(EG(function_table),ZEND_THIS,&tempZval,return_value,0,NULL);\n}\n");
} }
String *getAccessMode(String *access) { String *getAccessMode(String *access) {
@ -1459,18 +1439,6 @@ public:
dispatchFunction(n, constructor); dispatchFunction(n, constructor);
} }
// Handle getters and setters.
if (wrapperType == membervar) {
const char *p = Char(iname);
if (strlen(p) > 4) {
p += strlen(p) - 4;
if (strcmp(p, "_get") == 0) {
magic_method_setter(n, false, NULL);
}
}
return SWIG_OK;
}
return SWIG_OK; return SWIG_OK;
} }
@ -1697,7 +1665,7 @@ public:
Language::classHandler(n); Language::classHandler(n);
print_creation_free_wrapper(n); print_creation_free_wrapper(n);
magic_method_setter(n, true, baseClassExtend); generate_magic_property_methods(baseClassExtend);
Printf(all_cs_entry, " ZEND_FE_END\n};\n\n"); Printf(all_cs_entry, " ZEND_FE_END\n};\n\n");
class_name = NULL; class_name = NULL;
@ -1721,6 +1689,21 @@ public:
* ------------------------------------------------------------ */ * ------------------------------------------------------------ */
virtual int membervariableHandler(Node *n) { virtual int membervariableHandler(Node *n) {
if (magic_set == NULL) {
magic_set = NewStringEmpty();
magic_get = NewStringEmpty();
}
String *v_name = GetChar(n, "name");
Printf(magic_set, "\nelse if (strcmp(ZSTR_VAL(arg2),\"%s\") == 0) {\n", v_name);
Printf(magic_set, "ZVAL_STRING(&tempZval, \"%s_set\");\n", v_name);
Printf(magic_set, "call_user_function(EG(function_table),ZEND_THIS,&tempZval,return_value,1,&args[1]);\n}\n");
Printf(magic_get, "\nelse if (strcmp(ZSTR_VAL(arg2),\"%s\") == 0) {\n", v_name);
Printf(magic_get, "ZVAL_STRING(&tempZval, \"%s_get\");\n", v_name);
Printf(magic_get, "call_user_function(EG(function_table),ZEND_THIS,&tempZval,return_value,0,NULL);\n}\n");
wrapperType = membervar; wrapperType = membervar;
Language::membervariableHandler(n); Language::membervariableHandler(n);
wrapperType = standard; wrapperType = standard;