Merge branch 'master' into gsoc2017-php7-classes-via-c-api

This commit is contained in:
Olly Betts 2021-03-31 04:53:40 +13:00
commit 904f5a65d8
10 changed files with 100 additions and 47 deletions

View file

@ -21,10 +21,5 @@ extern void sub(int *INPUT, int *INPUT, int *OUTPUT);
/* Next we'll use typemaps and the %apply directive */ /* Next we'll use typemaps and the %apply directive */
//%apply int *OUTPUT { int *r }; %apply int *OUTPUT { int *r };
//extern int divide(int n, int d, int *r); extern int divide(int n, int d, int *r);

View file

@ -14,7 +14,7 @@
print " b = $b\n"; print " b = $b\n";
print " c = $c\n"; print " c = $c\n";
# Call the add() function wuth some pointers # Call the add() function with some pointers
add($a,$b,$c); add($a,$b,$c);
print " $a + $b = $c\n"; print " $a + $b = $c\n";
@ -28,6 +28,8 @@
print " 37 - 42 = $r\n"; print " 37 - 42 = $r\n";
# Now try the version with multiple return values # Now try the version with multiple return values
# print "Testing multiple return values\n"; print "Testing multiple return values\n";
# ($q,$r) = divide(42,37); $a = divide(42,37);
# print " 42/37 = $q remainder $r\n"; $q = $a[0];
$r = $a[1];
print " 42/37 = $q remainder $r\n";

View file

@ -56,7 +56,7 @@ auto lambda4 = [](int x, int y) { return x+y; };
auto lambda5 = []() { return thing; }; auto lambda5 = []() { return thing; };
#endif #endif
void fn() { void fn1() {
int stuff = 0; int stuff = 0;
auto lambdaxxxx = [=,&stuff]() { return thing; }; auto lambdaxxxx = [=,&stuff]() { return thing; };
} }

View file

@ -25,7 +25,7 @@ public class rname_runme {
bar.foo_u((long)10); bar.foo_u((long)10);
RenamedBase base = new RenamedBase(); RenamedBase base = new RenamedBase();
base.fn(base, base, base); base.fn1(base, base, base);
if (!base.newname(10.0).equals("Base")) if (!base.newname(10.0).equals("Base"))
throw new RuntimeException("base.newname"); throw new RuntimeException("base.newname");

View file

@ -1,4 +1,3 @@
<?php <?php
require "tests.php"; require "tests.php";

View file

@ -22,7 +22,7 @@
%rename (newname) Space::Base::oldname(double d) const; %rename (newname) Space::Base::oldname(double d) const;
/* Rename derived class method only */ /* Rename derived class method only */
%rename (Xfunc) Space::Derived::fn(Base baseValue, Base* basePtr, Base& baseRef); %rename (Xfunc) Space::Derived::fn1(Base baseValue, Base* basePtr, Base& baseRef);
%inline %{ %inline %{
class Bar { class Bar {
@ -43,14 +43,14 @@ class Base {
public: public:
Base(){}; Base(){};
virtual ~Base(){}; virtual ~Base(){};
void fn(Base baseValue, Base* basePtr, Base& baseRef){} void fn1(Base baseValue, Base* basePtr, Base& baseRef){}
virtual const char * oldname(double d) const { return "Base"; } virtual const char * oldname(double d) const { return "Base"; }
}; };
class Derived : public Base { class Derived : public Base {
public: public:
Derived(){} Derived(){}
~Derived(){} ~Derived(){}
void fn(Base baseValue, Base* basePtr, Base& baseRef){} void fn1(Base baseValue, Base* basePtr, Base& baseRef){}
virtual const char * oldname(double d) const { return "Derived"; } virtual const char * oldname(double d) const { return "Derived"; }
}; };
} }

View file

@ -30,7 +30,6 @@ PHP Options (available with -php7)\n\
*/ */
#define SWIG_PTR "_cPtr" #define SWIG_PTR "_cPtr"
static int constructors = 0;
static String *NOTCLASS = NewString("Not a class"); static String *NOTCLASS = NewString("Not a class");
static Node *classnode = 0; static Node *classnode = 0;
static String *module = 0; static String *module = 0;
@ -46,7 +45,6 @@ static File *f_h = 0;
static File *f_phpcode = 0; static File *f_phpcode = 0;
static File *f_directors = 0; static File *f_directors = 0;
static File *f_directors_h = 0; static File *f_directors_h = 0;
static String *phpfilename = 0;
static String *s_header; static String *s_header;
static String *s_wrappers; static String *s_wrappers;
@ -360,7 +358,6 @@ public:
/* PHP module file */ /* PHP module file */
filen = NewStringEmpty(); filen = NewStringEmpty();
Printv(filen, SWIG_output_directory(), module, ".php", NIL); Printv(filen, SWIG_output_directory(), module, ".php", NIL);
phpfilename = NewString(filen);
f_phpcode = NewFile(filen, "w", SWIG_output_files()); f_phpcode = NewFile(filen, "w", SWIG_output_files());
if (!f_phpcode) { if (!f_phpcode) {
@ -2357,7 +2354,6 @@ public:
* ------------------------------------------------------------ */ * ------------------------------------------------------------ */
virtual int classHandler(Node *n) { virtual int classHandler(Node *n) {
constructors = 0;
current_class = n; current_class = n;
String *symname = Getattr(n, "sym:name"); String *symname = Getattr(n, "sym:name");
String *baseClassExtend = NULL; String *baseClassExtend = NULL;
@ -2535,7 +2531,6 @@ public:
* ------------------------------------------------------------ */ * ------------------------------------------------------------ */
virtual int constructorHandler(Node *n) { virtual int constructorHandler(Node *n) {
constructors++;
if (Swig_directorclass(n)) { if (Swig_directorclass(n)) {
String *name = GetChar(Swig_methodclass(n), "name"); String *name = GetChar(Swig_methodclass(n), "name");
String *ctype = GetChar(Swig_methodclass(n), "classtype"); String *ctype = GetChar(Swig_methodclass(n), "classtype");

View file

@ -3,6 +3,7 @@
import sys import sys
import os import os
import subprocess import subprocess
from utils import *
def failed(): def failed():
print("mkdist.py failed to complete") print("mkdist.py failed to complete")
@ -22,6 +23,15 @@ dirname = "swig-" + version
force_tag = args.force_tag force_tag = args.force_tag
skip_checks = args.skip_checks skip_checks = args.skip_checks
# Tools directory path $ENV/swig/Tools
toolsdir = os.path.dirname(os.path.abspath(__file__))
# Root directory path (swig) $ENV/swig
rootdir = os.path.abspath(os.path.join(toolsdir, os.pardir))
# current directory
current_dir = os.getcwd()
# version directory path $ENV/swig/<x.x.x>
dirpath = os.path.join(current_dir, dirname)
if sys.version_info[0:2] < (2, 7): if sys.version_info[0:2] < (2, 7):
print("Error: Python 2.7 or higher is required") print("Error: Python 2.7 or higher is required")
sys.exit(3) sys.exit(3)
@ -33,21 +43,26 @@ if dirname.lower() != dirname:
# If directory and tarball exist, remove it # If directory and tarball exist, remove it
print("Removing " + dirname) print("Removing " + dirname)
os.system("rm -rf " + dirname) if check_dir_exists(dirpath):
run_command("rm", "-rf", dirpath)
print("Removing " + dirname + ".tar if exists") print("Removing " + dirname + ".tar if exists")
os.system("rm -f " + dirname + ".tar.gz") filename = dirpath + ".tar"
if check_file_exists(filename):
run_command("rm", "-rf", filename)
print("Removing " + dirname + ".tar.gz if exists") print("Removing " + dirname + ".tar.gz if exists")
os.system("rm -f " + dirname + ".tar") filename += ".gz"
if check_file_exists(filename):
run_command("rm", "-rf", filename)
# Grab the code from git # Grab the code from git
print("Checking there are no local changes in git repo") print("Checking there are no local changes in git repo")
os.system("git remote update origin") == 0 or failed() run_command("git", "remote", "update", "origin") == 0 or failed()
command = ["git", "status", "--porcelain", "-uno"] command = ["git", "status", "--porcelain", "-uno"]
out = subprocess.check_output(command) out = subprocess.check_output(command)
if out.strip() != "": if out.strip():
print("Local git repository has modifications") print("Local git repository has modifications")
print(" ".join(command)) print(" ".join(command))
print(out) print(out)
@ -57,7 +72,7 @@ if not skip_checks:
print("Checking git repository is in sync with remote repository") print("Checking git repository is in sync with remote repository")
command = ["git", "log", "--oneline", branch + "..origin/" + branch] command = ["git", "log", "--oneline", branch + "..origin/" + branch]
out = subprocess.check_output(command) out = subprocess.check_output(command)
if out.strip() != "": if out.strip():
print("Remote repository has additional modifications to local repository") print("Remote repository has additional modifications to local repository")
print(" ".join(command)) print(" ".join(command))
print(out) print(out)
@ -65,7 +80,7 @@ if not skip_checks:
command = ["git", "log", "--oneline", "origin/" + branch + ".." + branch] command = ["git", "log", "--oneline", "origin/" + branch + ".." + branch]
out = subprocess.check_output(command) out = subprocess.check_output(command)
if out.strip() != "": if out.strip():
print("Local repository has modifications not pushed to the remote repository") print("Local repository has modifications not pushed to the remote repository")
print("These should be pushed and checked that they pass Continuous Integration testing before continuing") print("These should be pushed and checked that they pass Continuous Integration testing before continuing")
print(" ".join(command)) print(" ".join(command))
@ -73,31 +88,49 @@ if not skip_checks:
sys.exit(3) sys.exit(3)
print("Tagging release") print("Tagging release")
tag = "'v" + version + "'" tag = "v" + version
force = "-f " if force_tag else "" force = "-f " if force_tag else ""
os.system("git tag -a -m 'Release version " + version + "' " + force + tag) == 0 or failed() command = ["git", "tag", "-a", "-m", "'Release version " + version + "'"]
force and command.extend(force, tag)
not force and command.append(tag)
run_command(*command) == 0 or failed()
outdir = os.path.basename(os.getcwd()) + "/" + dirname + "/" outdir = dirname + "/"
print("Grabbing tagged release git repository using 'git archive' into " + outdir) print("Grabbing tagged release git repository using 'git archive' into " + outdir)
os.system("(cd .. && git archive --prefix=" + outdir + " " + tag + " . | tar -xf -)") == 0 or failed()
# using pipe operator without shell=True; split commands into individual ones.
# git archive command
command = ["git", "archive", "--prefix=" + outdir, tag, "."]
archive_ps = subprocess.Popen(command, cwd=rootdir, stdout=subprocess.PIPE)
# tar -xf -
tar_ps = subprocess.Popen(("tar", "-xf", "-"), stdin=archive_ps.stdout, stdout=subprocess.PIPE)
archive_ps.stdout.close() # Allow archive_ps to receive a SIGPIPE if tar_ps exits.
output = tar_ps.communicate()
# Go build the system # Go build the system
print("Building system") print("Building system")
os.system("cd " + dirname + " && ./autogen.sh") == 0 or failed() run_command("mkdir", "-p", dirpath)
os.system("cd " + dirname + "/Source/CParse && bison -y -d parser.y && mv y.tab.c parser.c && mv y.tab.h parser.h") == 0 or failed() run_command("./autogen.sh", cwd=dirpath) == 0 or failed()
os.system("cd " + dirname + " && make -f Makefile.in libfiles srcdir=./") == 0 or failed()
cmdpath = os.path.join(dirpath, "Source", "CParse")
run_command("bison", "-y", "-d", "parser.y", cwd=cmdpath) == 0 or failed()
run_command("mv", "y.tab.c", "parser.c", cwd=cmdpath) == 0 or failed()
run_command("mv", "y.tab.h", "parser.h", cwd=cmdpath) == 0 or failed()
run_command("make", "-f", "Makefile.in", "libfiles", "srcdir=./", cwd=dirpath) == 0 or failed()
# Remove autoconf files # Remove autoconf files
os.system("find " + dirname + " -name autom4te.cache -exec rm -rf {} \\;") run_command("find", dirname, "-name", "autom4te.cache", "-exec", "rm", "-rf", "{}", ";", cwd=rootdir)
# Build documentation # Build documentation
print("Building html documentation") print("Building html documentation")
os.system("cd " + dirname + "/Doc/Manual && make all clean-baks") == 0 or failed() docpath = os.path.join(dirpath, "Doc", "Manual")
run_command("make", "all", "clean-baks", cwd=docpath) == 0 or failed()
# Build the tar-ball # Build the tar-ball
os.system("tar -cf " + dirname + ".tar " + dirname) == 0 or failed() run_command("tar", "-cf", dirname + ".tar", dirname, stdout=open(dirname + ".tar", "w")) == 0 or failed()
os.system("gzip " + dirname + ".tar") == 0 or failed() run_command("gzip", dirname + ".tar", stdout=open(dirname + ".tar.gz", "w")) == 0 or failed()
print("Finished building " + dirname + ".tar.gz") print("Finished building " + dirname + ".tar.gz")

View file

@ -2,6 +2,7 @@
import sys import sys
import os import os
from utils import *
def failed(message): def failed(message):
if message == "": if message == "":
@ -27,15 +28,17 @@ skip_checks = args.skip_checks
username = args.username username = args.username
print("Looking for rsync") print("Looking for rsync")
os.system("which rsync") and failed("rsync not installed/found. Please install.") run_command("which", "rsync") and failed("rsync not installed/found. Please install.")
print("Making source tarball") print("Making source tarball")
force = "--force-tag" if force_tag else "" force = "--force-tag" if force_tag else ""
skip = "--skip-checks" if skip_checks else "" skip = "--skip-checks" if skip_checks else ""
os.system("python ./mkdist.py {} {} --branch {} {}".format(force, skip, branch, version)) and failed("") toolsdir = os.path.dirname(os.path.abspath(__file__))
cmd = "python {}/mkdist.py {} {} --branch {} {}".format(toolsdir, force, skip, branch, version).split()
run_command(*cmd) and failed("")
print("Build Windows package") print("Build Windows package")
os.system("./mkwindows.sh " + version) and failed("") run_command("{}/mkwindows.sh".format(toolsdir), version) and failed("")
if username: if username:
print("Uploading to SourceForge") print("Uploading to SourceForge")
@ -45,11 +48,11 @@ if username:
# If a file with 'readme' in the name exists in the same folder as the zip/tarball, it gets automatically displayed as the release notes by SF # If a file with 'readme' in the name exists in the same folder as the zip/tarball, it gets automatically displayed as the release notes by SF
full_readme_file = "readme-" + version + ".txt" full_readme_file = "readme-" + version + ".txt"
os.system("rm -f " + full_readme_file) run_command("rm", "-f", full_readme_file)
os.system("cat swig-" + version + "/README " + "swig-" + version + "/CHANGES.current " + "swig-" + version + "/RELEASENOTES " + "> " + full_readme_file) run_command("cat", "swig-" + version + "/README", "swig-" + version + "/CHANGES.current", "swig-" + version + "/RELEASENOTES", ">", full_readme_file)
os.system("rsync --archive --verbose -P --times -e ssh " + "swig-" + version + ".tar.gz " + full_readme_file + " " + swig_dir_sf) and failed("") run_command("rsync", "--archive", "--verbose", "-P", "--times", "-e", "ssh", "swig-" + version + ".tar.gz", full_readme_file, swig_dir_sf) and failed("")
os.system("rsync --archive --verbose -P --times -e ssh " + "swigwin-" + version + ".zip " + full_readme_file + " " + swigwin_dir_sf) and failed("") run_command("rsync", "--archive", "--verbose", "-P", "--times", "-e", "ssh", "swigwin-" + version + ".zip", full_readme_file, swigwin_dir_sf) and failed("")
print("Finished") print("Finished")

26
Tools/utils.py Normal file
View file

@ -0,0 +1,26 @@
import os, subprocess
def check_file_exists(path):
"""
Checks if a file exists or not.
"""
return os.path.isfile(path)
def check_dir_exists(path):
"""
Checks if a folder exists or not.
"""
return os.path.isdir(path)
def run_command(*args, **kwargs):
"""
Runs an os command using subprocess module.
"""
redirect_out = list(map(str.strip, " ".join(args).split(" > ")))
if len(redirect_out) > 1:
args, filepath = redirect_out[0].split(), redirect_out[-1]
kwargs.update(stdout=open(filepath, "w"))
return subprocess.call(args, **kwargs)