# HG changeset patch
# User Michael FIG <[EMAIL PROTECTED]>
# Date 1205294739 21600
# Node ID be2e135a45e9246acd6f80c176722cc953c5296c
# Parent  f09caecc1e52c145b8a7e25e5aad841c0e367458
Get libjolt working again.

diff -r f09caecc1e52 -r be2e135a45e9 function/examples/libjolt/Makefile
--- a/function/examples/libjolt/Makefile        Wed Feb 27 00:03:54 2008 -0600
+++ b/function/examples/libjolt/Makefile        Tue Mar 11 22:05:39 2008 -0600
@@ -1,4 +1,4 @@ IDC             = idc -k # -O
-IDC            = idc -k # -O
+IDC            = ../idc -k # -O
 OBJECTS                = ../../objects
 MPINT          = ../../objects/mpint
 JOLT           = ../../jolt-burg
@@ -9,8 +9,10 @@ OBJEXT_O        = .o
 OBJEXT_O        = .o
 OBJEXT_SO       = .so
 
+CFLAGS   = $(shell $(IDC) -C CFLAGS)
 LDFLAGS  = $(shell $(IDC) -C LDFLAGS)
 LDLIBS   = $(shell $(IDC) -C LDLIBS)
+CPPFLAGS = $(shell $(IDC) -C CPPFLAGS)
 
 JOLT_OBJ_FILES = $(filter-out $(JOLT)/readline.o, $(wildcard $(JOLT)/*.o))
 JOLT_BOOT_FILES = boot.k quasiquote.k syntax.k number.k object.k
@@ -50,7 +52,7 @@ test : jest$(OBJEXT) .FORCE
 #
 boot.h : $(JOLT_BOOT_FILES)
        cat $(JOLT_BOOT_FILES) | \
-               awk 'BEGIN {RS = "\(define herald.*contents\]\)\)\)\)"} {print 
$$0}' | \
+               awk 'BEGIN {RS = "\\(define herald.*contents\\]\\)\\)\\)\\)"} 
{print $$0}' | \
                grep -Ev '^(;|$$)' | \
                sed -e 's/";/"/g' -e 's/;.*$$//' -e 's/\\/\\\\/g' -e 
's/"/\\"/g' | \
                awk '{print "\"", $$0, "\""}' | \
@@ -61,8 +63,8 @@ libjolt.o : boot.h
 libjolt.o : boot.h
 
 libjolt.a : libjolt.o
-       ld -r libjolt.o $(OBJECTS)/*.o $(MPINT)/*.o $(JOLT_OBJ_FILES) 
$(OBJ)/gc.a \
-               $(OBJ)/libid.o -o [EMAIL PROTECTED]
+       ld -r libjolt.o $(OBJECTS)/*.o $(MPINT)/*.o $(JOLT_OBJ_FILES) \
+               $(OBJ)/libid.o $(OBJ)/gc.a -o [EMAIL PROTECTED]
        ar rsc [EMAIL PROTECTED] [EMAIL PROTECTED]
        rm [EMAIL PROTECTED]
        mv [EMAIL PROTECTED] $@
@@ -73,11 +75,10 @@ install: libjolt.a
        cp jolt.h /usr/include
 
 test-libjolt : libjolt.a .FORCE
-       gcc -o $@ [EMAIL PROTECTED] $(LDFLAGS) libjolt.a $(LDLIBS)
-       ./$@
+       gcc $(CFLAGS) $(CPPFLAGS) -o $@ [EMAIL PROTECTED] $(LDFLAGS) libjolt.a 
$(LDLIBS)
 
 jest : jest.c libjolt.a jolt.h
-       gcc -o $@ [EMAIL PROTECTED]  $(LDFLAGS) libjolt.a $(LDLIBS)
+       gcc $(CFLAGS) $(CPPFLAGS) -o $@ [EMAIL PROTECTED]  $(LDFLAGS) libjolt.a 
$(LDLIBS)
 
 tidy : .FORCE
        -rm -f *.o *.d *~ .gdb* *.stackdump *.o.c boot.h
diff -r f09caecc1e52 -r be2e135a45e9 function/examples/libjolt/jolt.h
--- a/function/examples/libjolt/jolt.h  Wed Feb 27 00:03:54 2008 -0600
+++ b/function/examples/libjolt/jolt.h  Tue Mar 11 22:05:39 2008 -0600
@@ -48,69 +48,63 @@
 
 typedef struct t__object *oop;
 
-typedef oop (*_imp_t)(oop _thunk, oop receiver, ...);
+struct __send;
+typedef oop (*_imp_t)(oop v_send, oop v_stateful_self, oop v_self, ...);
 
-struct __closure
-{
-  _imp_t method;
-  oop   data;
-};
+#include <id/id.h>
 
-static oop               (*_local_intern  )(const char *string)= 0;
-static oop               (*_local_import  )(const char *name)= 0;
-static struct __closure  *(*_local_bind    )(oop selector, oop receiver)= 0;
-static oop                 _local_object= 0;
+static struct __libid *_libid= 0;
+static oop _send_vtable= 0;
 
-#define _send(MSG, RCV, ARG...) ({                                     \
-  register oop _r= (RCV);                                              \
-  struct __closure *_c= (struct __closure *)_local_bind((MSG), _r);    \
-  (_c->method)((oop)_c, _r, _r, ##ARG);                                        
\
+#define _sendv(MSG, N, RCV, ARG...) ({                         \
+  struct { oop _vtable; struct __send send; } _s =             \
+       { _send_vtable, { (MSG), (N), (RCV) } };                \
+  ((_imp_t)(_libid->bindv(&_s.send)))                          \
+    ((oop)&_s.send, _s.send.state, _s.send.receiver, ##ARG);   \
 })
 
-#define _super(TYP, MSG, RCV, ARG...) ({                               \
-  register oop _r= (RCV);                                              \
-  struct __closure *_c= (struct __closure *)_local_bind((MSG), (TYP)); \
-  (_c->method)((oop)_c, _r, _r, ##ARG);                                        
\
+#define _superv(TYP, MSG, N, RCV, ARG...) ({           \
+  struct { oop _vtable; struct __send send; } _s =     \
+       { _send_vtable, { (MSG), (N), (TYP) } };        \
+  _imp_t _imp= _libid->bindv(&_s.send);                        \
+  _s.send.receiver= (RCV);                             \
+  _imp((oop)&_s.send, _s.send.state, _s.send.receiver, ##ARG);\
 })
 
-static oop s__5fimport_= 0;
-static oop s_initialise= 0;
-static oop s_size_5f_value_5f_= 0;
+/* Drag in the object files stored in libjolt.a */
+extern oop __id__init__libjolt(void);
+static void *__libjolt_ref __attribute__((unused))= __id__init__libjolt;
 
-static oop v_String= 0;
-static oop v_Jolt= 0;
+oop __id__init__(struct __libid *__libid)
+{
+  if (!_libid) {
+    if (!(_libid= __libid)) { fprintf(stderr, "init _libid %p\n", __libid);  
abort(); }
 
-extern oop __id__init__libjolt(void);
-static void *__libjolt_ref= __id__init__libjolt;
+    _send_vtable= ((oop *)_libid->import("_send"))[-1];
+    _sendv(_libid->intern("_import:"),
+          3,
+          _libid->_object, 
+          "libjolt", 
+          "__id__init__libjolt");
+  }
 
-oop __id__init__(void)
-{
-  if (_local_object) return;
-  { 
-    dlhandle_t global= dlopen(0, RTLD_LAZY);
-    _local_object= *(oop *)dlsym(global, "_libid_object");
-    _local_intern= dlsym(global, "_libid_intern");
-    _local_import= dlsym(global, "_libid_import");
-    _local_bind= dlsym(global, "_libid_bind");
-    dlclose(global);
-  }
-  s__5fimport_         = _local_intern("_import:");
-  s_initialise         = _local_intern("initialise");
-  s_size_5f_value_5f_  = _local_intern("size_:value_:");
-  _send(s__5fimport_, _local_object, "libjolt", "__id__init__libjolt");
-  v_String= _local_import("String");
-  v_Jolt= _local_import("Jolt");
-  return _send(s_initialise, v_Jolt);
+  return _sendv(_libid->intern("initialise"), 
+               1, _libid->import("Jolt"));
 }
 
 oop libjolt_init(int *argcp, char ***argvp, char ***envpp)
 {
+  struct __libid* libid;
+  oop entry= 0;
+
   dlhandle_t global= dlopen(0, RTLD_LAZY);
-  void *_local_init= dlsym(global, "_libid_init");
-  oop entry= 0;
+  struct __libid *(*_local_init)(int *, char ***, char ***)=
+    dlsym(global, "_libid_init");
   if (!_local_init) { fprintf(stderr, "id runtime not found\n");  abort(); }
-  ((void (*)(int *, char ***, char ***))_local_init)(argcp, argvp, envpp);
-  entry= __id__init__();
+  
+  libid = _local_init(argcp, argvp, envpp);
+  entry= __id__init__(libid);
   dlclose(global);
+
   return entry;
 }
diff -r f09caecc1e52 -r be2e135a45e9 function/objects/sigalrm.h
--- a/function/objects/sigalrm.h        Wed Feb 27 00:03:54 2008 -0600
+++ b/function/objects/sigalrm.h        Tue Mar 11 22:05:39 2008 -0600
@@ -1,3 +1,5 @@ static oop sigalrmReceiver= 0;
+#include <signal.h>
+
 static oop sigalrmReceiver= 0;
 static oop sigalrmSelector= 0;
 
diff -r f09caecc1e52 -r be2e135a45e9 object/idc/idc.in
--- a/object/idc/idc.in Wed Feb 27 00:03:54 2008 -0600
+++ b/object/idc/idc.in Tue Mar 11 22:05:39 2008 -0600
@@ -131,6 +131,8 @@ while [ $# -gt 0 ]; do
     shift;
 done
 
+CPPFLAGS="-I$prefix/include"
+
 case "$config" in
     "arch")            echo "@SYSARCH@";       exit;;
     "os")              echo "@SYSOS@";         exit;;
@@ -144,6 +146,7 @@ case "$config" in
     "CCFLAGS")         echo "@CCFLAGS@";       exit;;
     "CCFLAGS_O")       echo "@CCFLAGS_O@";     exit;;
     "CCFLAGS_SO")      echo "@CCFLAGS_SO@";    exit;;
+    "CPPFLAGS")                echo "$CPPFLAGS";       exit;;
     "LDFLAGS")         echo "@LDFLAGS@";       exit;;
     "LDFLAGS_O")       echo "@LDFLAGS_O@";     exit;;
     "LDFLAGS_SO")      echo "@LDFLAGS_SO@";    exit;;
@@ -240,9 +243,9 @@ if [ ! -z "$infile" ]; then
 if [ ! -z "$infile" ]; then
   $verbose
   $run ${prefix}idc1 -I$prefix $idopts $idflags $infile -o $ccfile &&
-  $run $cc -I$prefix/include $ccflags $ccopts $ccfile -o $outfile $ldflags 
$ldobjs $idlibs $ldlibs &&
+  $run $cc $CPPFLAGS $ccflags $ccopts $ccfile -o $outfile $ldflags $ldobjs 
$idlibs $ldlibs &&
   $run $cckill $ccfile
 else
   $verbose
-  $run $cc -I$prefix/include $ccflags $ccopts -o $outfile $ldflags $ldobjs 
$idlibs $ldlibs
-fi
+  $run $cc $CPPFLAGS $ccflags $ccopts -o $outfile $ldflags $ldobjs $idlibs 
$ldlibs
+fi

_______________________________________________
fonc mailing list
fonc@vpri.org
http://vpri.org/mailman/listinfo/fonc

Reply via email to