Merge branch 'master' into livetest

Conflicts:
	urb/urbit.pill
	urb/zod/base/arvo/dill.hoon
	urb/zod/base/arvo/gall.hoon
This commit is contained in:
C. Guy Yarvin 2015-05-18 12:43:11 -07:00
commit 90dbe458f3
13 changed files with 519 additions and 298 deletions

View File

@ -39,7 +39,7 @@ RM=rm -f
CC=gcc CC=gcc
CXX=g++ CXX=g++
CXXFLAGS=$(CFLAGS) CXXFLAGS=$(CFLAGS)
CLD=g++ -g -L/usr/local/lib -L/opt/local/lib CLD=g++ -O3 -L/usr/local/lib -L/opt/local/lib
ifeq ($(OS),osx) ifeq ($(OS),osx)
COSFLAGS=-fno-diagnostics-fixit-info COSFLAGS=-fno-diagnostics-fixit-info

View File

@ -1,8 +1,6 @@
Urbit Urbit
===== =====
[![Build Status](https://travis-ci.org/urbit/urbit.png?branch=master)](https://travis-ci.org/urbit/urbit)
> Tlön is surely a labyrinth, but it is > Tlön is surely a labyrinth, but it is
> a labyrinth devised by men, a labyrinth > a labyrinth devised by men, a labyrinth
> destined to be deciphered by men. > destined to be deciphered by men.
@ -12,7 +10,8 @@ Urbit is a new programming and execution environment designed from scratch. Any
resemblance to existing languages or operating systems is coincidental, resemblance to existing languages or operating systems is coincidental,
cosmetic, or inevitable. cosmetic, or inevitable.
All of the source code is entirely in the public domain. All of the source code is distributed under the MIT license, but is for all
intents and purposes in the public domain.
Install Install
------------------- -------------------
@ -92,37 +91,54 @@ Run `bin/vere -c mypier` in the urbit directory, where `mypier` is a directory t
A _pier_ is an Urbit virtual machine that hosts one or more Urbit identities, A _pier_ is an Urbit virtual machine that hosts one or more Urbit identities,
or _ships_. When you run `bin/vere -c`, it automatically creates a 128-bit ship, or `submarine`. Your name (a hash of a randomly-generated public key) will look something like: or _ships_. When you run `bin/vere -c`, it automatically creates a 128-bit ship, or `submarine`. Your name (a hash of a randomly-generated public key) will look something like:
~machec-binnev-dordeb-sogduc--dosmul-sarrum-faplec-nidted ~hinfet-rovler-labheb-laddev--ladner-pillur-divmun-tamfur
First you'll see a string of messages like: First you'll see a string of messages like:
vere: urbit home is /Users/cyarvin/Documents/src/u3/urb vere: urbit home is mypier
loom: mapped 1024MB vere: hostname is cyarvin
time: ~2013.9.1..03.57.11..4935 loom: mapped 2048MB
ames: on localhost, UDP 63908. boot: installed 190 jets
boot: loading /home/cyarvin/urbit/urb/urbit.pill
cv_make: loaded pill /home/cyarvin/urbit/urb/urbit.pill, as 8ddffb8
cv_make: kernel 12e1ffdf, core 23b73cd
cv_jack: activating kernel 12e1ffdf
%post-start
cv_jack: activated
cv_start: time: ~2015.5.9..18.03.32..ba77
Next vere will generate a 2048 RSA key that will be used as your identity:
generating 2048-bit RSA pair... generating 2048-bit RSA pair...
and then it'll pause a little, 'cause this is slow, and then and then it'll pause a little, 'cause this is slow, and then
saving passcode in /Users/cyarvin/.urbit/~magsut-hopful.txt saving passcode in mypier/.urb/code.~malmel-ridnep
(for real security, write it down and delete the file...) (for real security, write it down and delete the file...)
and, then, if the network gods are happy, your submarine will start pulling and, then, if the network gods are happy, your submarine will start pulling
down Arvo files: down Arvo files:
+ /~machec-binnev-dordeb-sogduc--dosmul-sarrum-faplec-nidted/main/1/bin/ticket/hoon [%bos ~zod ~hinfet-rovler-labheb-laddev--ladner-pillur-divmun-tamfur]
+ /~machec-binnev-dordeb-sogduc--dosmul-sarrum-faplec-nidted/main/1/bin/reset/hoon [%behn-init ~hinfet-rovler-labheb-laddev--ladner-pillur-divmun-tamfur]
+ /~machec-binnev-dordeb-sogduc--dosmul-sarrum-faplec-nidted/main/1/bin/ye/hoon ames: czar zod.urbit.org: ip .192.241.195.84
+ /~machec-binnev-dordeb-sogduc--dosmul-sarrum-faplec-nidted/main/1/bin/ls/hoon kick: init: ~hinfet-rovler-labheb-laddev--ladner-pillur-divmun-tamfur
ames: on localhost, UDP 55659.
http: live (insecure) on 8081
http: live ("secure") on 8444
term: live on 10024
; ~zod |Tianming| is your neighbor
; ~zod |Tianming| is your neighbor
<sole>
and the like. You'll see a couple pages of this stuff. Don't worry too much You will probably be stuck here for a while as your local submarine copies all of its files from the master carrier, `~zod`. This is normal.
about the details right now. Finally, you'll get the Arvo shell prompt (which
is also a Hoon REPL):
~machec-binnev-dordeb-sogduc--dosmul-sarrum-faplec-nidted/try=> Once that is finished, you will be dropped into the main application, the `:dojo` shell (which is coincidentally also a Hoon REPL):
~hinfet-rovler-labheb-laddev--ladner-pillur-divmun-tamfur:dojo>
If you would like to safely bring this ship back into port (End the Unix process), If you would like to safely bring this ship back into port (End the Unix process),
just enter Control-D. just enter Control-V to switch to the task manager, then Control-D.
To re-launch your pier after creation run `bin/vere mypier` (exclude the `-c`) To re-launch your pier after creation run `bin/vere mypier` (exclude the `-c`)
@ -151,19 +167,18 @@ Let's say one of your ships is `~waclux-tomwyc` and its ticket is
rendered in Hoon's syllabic base, `@p`.) rendered in Hoon's syllabic base, `@p`.)
A new life awaits you on the off-world colonies! To begin, just A new life awaits you on the off-world colonies! To begin, just
type at the submarine prompt: type at the `:dojo` prompt:
:begin ~waclux-tomwyc :helm?begin
and follow the directions. When the script completes, hit return and enter your ship name and ticket when prompted. When the script completes, hit return
and you'll be the `~waclux-tomwyc` you wanted to be. Now, when other user's see you in chat or look at your and you'll begin re-cloning the files from `~zod` needed to boot the destroyer, after which you will become the `~waclux-tomwyc` you wanted to be.
Urbit social profile (a fasplan), they can learn whatever information you gave the :begin process.
###5. Play with Arvo ###5. Play with Arvo
If all went well, you now have a nice short prompt: If all went well, you now have a nice short prompt:
~waclux-tomwyc/try=> ~waclux-tomwyc:dojo>
If all did not go well (send us another email), or you're just If all did not go well (send us another email), or you're just
too impatient to wait for your destroyer, you have a big long too impatient to wait for your destroyer, you have a big long
@ -175,29 +190,30 @@ exercises will still work.
Let's try a few quick things to stretch your fingers. Type these Let's try a few quick things to stretch your fingers. Type these
command lines and you should see the matching results: command lines and you should see the matching results:
~waclux-tomwyc/try=> "hello, world" ~waclux-tomwyc:dojo> "hello, world"
"hello, world" "hello, world"
~waclux-tomwyc/try=> (add 2 2) ~waclux-tomwyc:dojo> (add 2 2)
4 4
~waclux-tomwyc/try=> :hello %world ~waclux-tomwyc:dojo> +hello %world
"hello, world." 'hello, dlrow'
~waclux-tomwyc/try=> :cat /=main=/bin/hello/hoon ~waclux-tomwyc:dojo> +cat /=home=/cat/hello/gate/hook :: XX make this work
:: ::
:: /=main=/bin/hello/hoon :::: /hook/gate/hello/cat
::
/? 314
:: ::
|= * ::::
|= [planet=@ta ~] !:
^- bowl |= [* [[txt=@tas ~] ~]]
:_ ~ :_ ~ :- %noun
:- %% (crip (weld "hello, " (flop (trip txt))))
!>("hello, {(trip planet)}.")
What did you just do? What did you just do?
One, you used Arvo as a Hoon REPL to print the constant `"hello, One, you used the Hoon REPL to print the constant `"hello,
world"`, which is a fancy way to write the Nock noun world"`, which is a fancy way to write the Nock noun
[104 101 108 108 111 44 32 119 111 114 108 100 0] [104 101 108 108 111 44 32 119 111 114 108 100 0]
@ -205,7 +221,7 @@ world"`, which is a fancy way to write the Nock noun
Two, you called the Hoon `add` function to see that two plus two Two, you called the Hoon `add` function to see that two plus two
is four. Math seems to work the same on the off-world colonies. is four. Math seems to work the same on the off-world colonies.
Three, you ran the Arvo application `:hello` with the argument Three, you ran the `:dojo` application `+hello` with the argument
`%world`, which is just a fancy way to write the atom `%world`, which is just a fancy way to write the atom
`431.316.168.567` (or, for non-Germans, `431,316,168,567`). You `431.316.168.567` (or, for non-Germans, `431,316,168,567`). You
might recognize it better as `0x64.6c72.6f77` - the ASCII might recognize it better as `0x64.6c72.6f77` - the ASCII
@ -214,18 +230,18 @@ characters in LSB first order.
(Is Urbit German? Sadly, no. But all our noun print formats are (Is Urbit German? Sadly, no. But all our noun print formats are
URL-safe, which dot is and comma isn't.) URL-safe, which dot is and comma isn't.)
And you (4) used the Arvo application :cat to print the Hoon file And you (4) used the `:dojo` application `+cat` to print the Hoon file
/=main=/bin/hello/hoon /=home=/cat/hello/gate/hook
which, supposing your current date is which, supposing your current date is
~2013.9.1..04.38.31..f259 ~2015.5.9..18.03.32..ba77
(ie, September 1, 2013 at 4:38:31 GMT/LS25 plus 0xf259/65536 (ie, May 9, 2015 at 18:03:32 GMT/LS25 plus 0xba77/47735 seconds), is
seconds), is equivalent to the global path equivalent to the global path
/~waclux-tomwyc/main/~2013.8.23..04.38.31..f259/bin/hello/hoon /~waclux-tomwyc/home/~2015.5.9..18.03.32..ba77/cat/hello/gate/hook
which anyone in Urbit can, see and even use - but we're getting which anyone in Urbit can, see and even use - but we're getting
ahead of ourselves. ahead of ourselves.
@ -259,20 +275,31 @@ There are also some special control keys specific to Arvo. It's
a good idea to learn these first so that you feel in, um, a good idea to learn these first so that you feel in, um,
control. control.
First, we'll quit out of an infinite loop with `^C`: First off, Arvo has a simple task manager interface, allowing you see the
running commands, along with being able to spawn or kill programs.
~waclux-tomwyc/try=> :infinite Hitting `^V` will bring you to this interface, and running `-prog`
will kill that program while `+prog` will spawn a new one.
If you ever end up with a broken program that is spouting errors
and wish to restart it, do it from this interface. Even our shell
and REPL `:dojo` is just another program in this list!
This is the base view from Arvo as well. If you kill all your running
programs, it will drop you into this interface.
Next, we'll show you how we can quit out of an infinite loop with `^C`:
~waclux-tomwyc:dojo> |-($)
When you hit return at the end of this line, Arvo will appear to When you hit return at the end of this line, Arvo will appear to
hang. Do not be alarmed! This is not a bug - it means that hang. Do not be alarmed! This is not a bug - it means that
we've started running our infinite loop before printing the next we've started running our infinite loop before printing the next
console prompt. Simply hit `^C`, and you'll see console prompt. Simply hit `^C`, and you'll see
! intr recover: dig: intr
~waclux-tomwyc/try=> :infinite intr
[various stack traces]
(There may be some stacktrace stuff before the `! intr`, depending ~waclux-tomwyc:dojo> |-($)
on whether your kernel was compiled with debugging.)
Hit `^U` to delete the line and escape from infinity. Arvo is a Hit `^U` to delete the line and escape from infinity. Arvo is a
deterministic OS; you interrupted it while processing an event deterministic OS; you interrupted it while processing an event
@ -296,40 +323,38 @@ current character - as in Unix.
Try this by running Try this by running
~waclux-tomwyc/try=> :begin ~waclux-tomwyc:dojo> +helm?begin
Do you have a ship and a ticket? yes ~waclux-tomwyc:dojo: your ship: ~
Then hit `^D` and you'll be back to the command prompt (which, Then hit `^D` and you'll kill the current task, the command prompt `:dojo`.
unlike in Unix, is not a task itself, but part of the OS).
We don't always want to kill the prompting task. We often want We don't always want to kill the prompting task. We often want
to switch between tasks, or between tasks and the command line. to switch between tasks, or between tasks and the command line.
Sort of like switching between windows, except in a command line. Sort of like switching between windows, except in a command line.
We do this with `^X`. Try We do this with `^X`.
~waclux-tomwyc/try=> :begin Let's try an example: First, make sure you
have two apps running, like `:dojo` and `:talk`. Then, try:
Do you have a ship and a ticket? yes ~waclux-tomwyc:dojo> :helm?begin
But hit `^X` instead of `^D`. You'll get a prompt again. Use ~waclux-tomwyc:dojo: your ship: ~
But hit `^X` instead of `^D`. You'll get switched to the next app in line, in this case `:talk`. Use
it: it:
~waclux-tomwyc/try=> :begin ~waclux-tomwyc:dojo> :helm?begin
~waclux-tomwyc/try=> :hello %world ~waclux-tomwyc:talk() hello, world!
"hello, world."
~waclux-tomwyc/try=>
Hit `^X` again: Hit `^X` again:
~waclux-tomwyc/try=> :begin ~waclux-tomwyc:dojo> :helm?begin
~waclux-tomwyc/try=> :hello %world ~waclux-tomwyc:dojo: your ship: ~
"hello, world."
Do you have a ship and a ticket? yes
And finally, hit `^C` to kill the task. And finally, hit `^D` to kill the task.
Lastly, Arvo is a single-level store. Since it's not the '70s Lastly, Arvo is a single-level store. Since it's not the '70s
anymore and disk is cheap, everything you do is saved for ever. anymore and disk is cheap, everything you do is saved for ever.
@ -337,29 +362,40 @@ anymore and disk is cheap, everything you do is saved for ever.
log - so you, or the government if they haz your filez, can log - so you, or the government if they haz your filez, can
repeat every computation you've ever performed.) repeat every computation you've ever performed.)
If the current prompt is just the shell prompt, `^D` on an empty If the current prompt is the task manager, `^D` on an empty
line will log out - as in Unix: line will log out - as in Unix:
~waclux-tomwyc/try=> ~waclux-tomwyc:dojo, talk#
oxford:~/urbit; pwd cyarvin:~/urbit; pwd
/Users/cyarvin/urbit /home/cyarvin/urbit
oxford:~/urbit; echo "hello, world" cyarvin:~/urbit; echo "hello, world"
hello, world hello, world
oxford:~/urbit; cyarvin:~/urbit;
Then you can restart and be right back where you were - just Then you can restart and be right back where you were - just
run `bin/vere` without `-c`: run `bin/vere` without `-c`:
oxford:~/urbit; bin/vere mypier cyarvin:~/urbit; bin/vere mypier
vere: urbit home is /Users/cyarvin/urb vere: urbit home is mypier
loom: loaded 9MB vere: hostname is cyarvin
time: ~2013.9.1..17.23.05..0cc1 loom: mapped 2048MB
ames: on localhost, UDP 60342. protected loom
http: live on 8080 live: loaded: MB/172.933.120
rest: checkpoint to event 383 boot: installed 190 jets
rest: old 0v1c.gkr1o, new 0v10.m4gdu cv_start: time: ~2015.5.9..19.03.45..a758
raft: single-instance mode
raft: -> lead
sist: booting
rest: checkpoint to event 23.630
rest: old 0vt.3iqg5, new 0v1j.moa0t
loaded passcode from mypier/.urb/code.~lacsep-bonnyr
---------------- playback complete---------------- ---------------- playback complete----------------
waclux-tomwyc/try=> ames: on localhost, UDP 46404.
http: live (insecure) on 8080
http: live ("secure") on 8443
term: live on 10023
~waclux-tomwyc:dojo, talk#
Use your arrow keys and you'll see your history is still there. Use your arrow keys and you'll see your history is still there.
Arvo is indestructible and can be shut down however you like Arvo is indestructible and can be shut down however you like
@ -370,34 +406,18 @@ But don't try to operate the same ship on two Unix hosts at the
same time. This will confuse everyone, including yourself. same time. This will confuse everyone, including yourself.
####System administration ####System administration
Sometimes we make changes to Hoon or Arvo (we never make changes Sometimes we make changes to Hoon or Arvo (we never make changes
to Nock) and you need to update your ship. to Nock) and you need to update your ship.
There are two steps to updating. You need to get the new files, Luckily, Arvo has some special sauce that allows the same carrier
and you need to install them. To get them: you initially pulled your files from to push kernel update over-the-air.
You may notice this happening automatically from time to time through mysterious messages
such as:
~waclux-tomwyc/try=> :update ['merge succeeded' {}]
: /~waclux-tomwyc/arvo/2/hoon/hoon
: /~waclux-tomwyc/arvo/2/dill/hoon
: /~waclux-tomwyc/arvo/2/batz/hoon
To install them (the simplest, slowest, most general way): These updates will be applied without having to restart Arvo or any of its
`%vanes`. All of your state, including running tasks, will be unchanged.
~waclux-tomwyc/try=> :reset
%reset-start
%reset-parsed
%reset-compiled
%hoon-load
[%tang /~waclux-tomwyc/arvo/~2013.11.26..20.29.15..090f/zuse ~tirnux-latwex]
[%vane %a /~waclux-tomwyc/arvo/~2013.11.26..20.29.15..090f/ames ~tolryn-watret]
[%vane %b /~waclux-tomwyc/arvo/~2013.11.26..20.29.15..090f/batz ~donfex-ladsem]
[%vane %c /~waclux-tomwyc/arvo/~2013.11.26..20.29.15..090f/clay ~picsug-mitref]
[%vane %d /~waclux-tomwyc/arvo/~2013.11.26..20.29.15..090f/dill ~dilpex-laptug]
[%vane %e /~waclux-tomwyc/arvo/~2013.11.26..20.29.15..090f/eyre ~forbur-disben]
All of your state, including running tasks, will be unchanged.
Sometimes the interpreter, called `vere` gets updated. In your urbit directory, back in Unixland, run: Sometimes the interpreter, called `vere` gets updated. In your urbit directory, back in Unixland, run:
@ -407,20 +427,22 @@ every so often to get the latest Urbit source code. You'll need to run:
make clean; make make clean; make
before executing `bin/vere pier` again. before executing `bin/vere mypier` again.
###6. Chat ###6. Talk
Okay, fine. You're a long way from being an Arvo ninja. But - Okay, fine. You're a long way from being an Arvo ninja. But -
you're ready for the two most important uses of Urbit right now. you're ready for the two most important uses of Urbit right now.
One, coding. Two, chatting. One, coding. Two, chatting.
To start chatting, simply type To start chatting, simply press `^X` to switch to the `:talk` app
(If you accidently killed it, no worries: start a new one by typing
`+talk` from the `^V` menu)
~waclux-tomwyc/try=> :chat ~waclux-tomwyc:talk()
and type `?` for the list of commands once `:chat` is running. and type `;join /urbit-meta` to join our main chat room.
Most of us are hanging out on `:chat` regularly. We can answer any questions you might have and help you get oriented in this new environment. Most of us are hanging out on `:talk` regularly. We can answer any questions you might have and help you get oriented in this new environment.

10
i/n/a.h
View File

@ -8,6 +8,12 @@
*/ */
# undef U3_MEMORY_DEBUG # undef U3_MEMORY_DEBUG
/* U3_CELLOC_TOGGLE: enable toggling of the custum cell allocator
* via -g. This slightly slows down the cell allocator even when
* it's on. Note that toggling -g breaks the image. If
* U3_MEMORY_DEBUG is on, this should generally be on as well.
*/
# undef U3_CELLOC_TOGGLE
/** Constants. /** Constants.
**/ **/
@ -46,7 +52,7 @@
/** Structures. /** Structures.
**/ **/
/* u3_atom, u3_cell: logical atom and cell structures. /* u3a_atom, u3a_cell: logical atom and cell structures.
*/ */
typedef struct { typedef struct {
c3_w mug_w; c3_w mug_w;
@ -376,7 +382,7 @@
/* u3a_sweep(): sweep a fully marked road. /* u3a_sweep(): sweep a fully marked road.
*/ */
void c3_w
u3a_sweep(void); u3a_sweep(void);
/* u3a_sane(): check allocator sanity. /* u3a_sane(): check allocator sanity.

View File

@ -118,7 +118,7 @@
/* u3h_mark(): mark hashtable for gc. /* u3h_mark(): mark hashtable for gc.
*/ */
void c3_w
u3h_mark(u3p(u3h_root) har_p); u3h_mark(u3p(u3h_root) har_p);
/* u3h_walk(): traverse hashtable with key, value fn; RETAINS. /* u3h_walk(): traverse hashtable with key, value fn; RETAINS.

View File

@ -81,6 +81,11 @@
u3_noun u3_noun
u3m_soft_esc(u3_noun sam); u3m_soft_esc(u3_noun sam);
/* u3m_mark(): mark all nouns in the road.
*/
c3_w
u3m_mark(void);
/* u3m_grab(): garbage-collect the world, plus extra roots. /* u3m_grab(): garbage-collect the world, plus extra roots.
*/ */
void void

View File

@ -27,6 +27,8 @@
u3_noun sen; // instance string u3_noun sen; // instance string
u3_noun own; // owner list u3_noun own; // owner list
u3_noun sac; // space profiling
u3_noun roe; // temporary unsaved events u3_noun roe; // temporary unsaved events
u3_noun key; // log key, or 0 u3_noun key; // log key, or 0
@ -169,5 +171,5 @@
/* u3v_mark(): mark arvo kernel. /* u3v_mark(): mark arvo kernel.
*/ */
void c3_w
u3v_mark(void); u3v_mark(void);

78
n/a.c
View File

@ -561,9 +561,12 @@ u3a_malloc(size_t len_i)
c3_w* c3_w*
u3a_celloc(void) u3a_celloc(void)
{ {
#ifdef U3_MEMORY_DEBUG #ifdef U3_CELLOC_TOGGLE
return u3a_walloc(c3_wiseof(u3a_cell)); if ( u3C.wag_w & u3o_debug_ram ) {
#else return u3a_walloc(c3_wiseof(u3a_cell));
}
#endif
u3p(u3a_fbox) cel_p; u3p(u3a_fbox) cel_p;
if ( (u3R == &(u3H->rod_u)) || !(cel_p = u3R->all.cel_p) ) { if ( (u3R == &(u3H->rod_u)) || !(cel_p = u3R->all.cel_p) ) {
@ -577,7 +580,6 @@ u3a_celloc(void)
return u3a_boxto(box_u); return u3a_boxto(box_u);
} }
#endif
} }
/* u3a_cfree(): free a cell. /* u3a_cfree(): free a cell.
@ -585,9 +587,12 @@ u3a_celloc(void)
void void
u3a_cfree(c3_w* cel_w) u3a_cfree(c3_w* cel_w)
{ {
#ifdef U3_MEMORY_DEBUG #ifdef U3_CELLOC_TOGGLE
return u3a_wfree(cel_w); if ( u3C.wag_w & u3o_debug_ram ) {
#else return u3a_wfree(cel_w);
}
#endif
if ( u3R == &(u3H->rod_u) ) { if ( u3R == &(u3H->rod_u) ) {
return u3a_wfree(cel_w); return u3a_wfree(cel_w);
} }
@ -598,7 +603,6 @@ u3a_cfree(c3_w* cel_w)
u3to(u3a_fbox, fre_p)->nex_p = u3R->all.cel_p; u3to(u3a_fbox, fre_p)->nex_p = u3R->all.cel_p;
u3R->all.cel_p = fre_p; u3R->all.cel_p = fre_p;
} }
#endif
} }
/* u3a_realloc(): aligned realloc in bytes. /* u3a_realloc(): aligned realloc in bytes.
@ -1310,9 +1314,13 @@ u3a_mark_ptr(void* ptr_v)
c3_w siz_w; c3_w siz_w;
#ifdef U3_MEMORY_DEBUG #ifdef U3_MEMORY_DEBUG
if ( box_u->eus_w == 0 ) { if ( 0 == box_u->eus_w ) {
siz_w = box_u->siz_w; siz_w = box_u->siz_w;
} }
else if ( 0xffffffff == box_u->eus_w ) { // see _raft_prof()
siz_w = 0xffffffff;
box_u->eus_w = 0;
}
else { else {
siz_w = 0; siz_w = 0;
} }
@ -1327,7 +1335,11 @@ u3a_mark_ptr(void* ptr_v)
else { else {
c3_assert(use_ws != 0); c3_assert(use_ws != 0);
if ( use_ws < 0 ) { if ( 0x80000000 == (c3_w)use_ws ) { // see _raft_prof()
use_ws = -1;
siz_w = 0xffffffff;
}
else if ( use_ws < 0 ) {
use_ws -= 1; use_ws -= 1;
siz_w = 0; siz_w = 0;
} }
@ -1370,7 +1382,7 @@ u3a_mark_noun(u3_noun som)
c3_w* dog_w = u3a_to_ptr(som); c3_w* dog_w = u3a_to_ptr(som);
c3_w new_w = u3a_mark_ptr(dog_w); c3_w new_w = u3a_mark_ptr(dog_w);
if ( 0 == new_w ) { if ( 0 == new_w || 0xffffffff == new_w ) { // see u3a_mark_ptr()
return siz_w; return siz_w;
} }
else { else {
@ -1415,7 +1427,7 @@ u3a_print_memory(c3_c* cap_c, c3_w wor_w)
/* u3a_sweep(): sweep a fully marked road. /* u3a_sweep(): sweep a fully marked road.
*/ */
void c3_w
u3a_sweep(void) u3a_sweep(void)
{ {
c3_w neg_w, pos_w, leq_w, weq_w; c3_w neg_w, pos_w, leq_w, weq_w;
@ -1460,6 +1472,17 @@ u3a_sweep(void)
u3a_box* box_u = (void *)box_w; u3a_box* box_u = (void *)box_w;
#ifdef U3_MEMORY_DEBUG #ifdef U3_MEMORY_DEBUG
/* I suspect these printfs fail hilariously in the case
* of non-direct atoms. We shouldn't unconditionally run
* u3a_to_pom(). In general, the condition
* box_u->siz_w > u3a_mimimum is sufficient, but not necessary,
* for the box to represent an atom. The atoms between
* 2^31 and 2^32 are the exceptions.
*
* Update: so, apparently u3.md is incorrect, and a pug is just
* an indirect atom. This code should be altered to handle
* that.
*/
if ( box_u->use_w != box_u->eus_w ) { if ( box_u->use_w != box_u->eus_w ) {
if ( box_u->eus_w != 0 ) { if ( box_u->eus_w != 0 ) {
if ( box_u->use_w == 0 ) { if ( box_u->use_w == 0 ) {
@ -1471,7 +1494,8 @@ u3a_sweep(void)
(u3_noun)u3a_to_pom(u3a_outa(u3a_boxto(box_w))), (u3_noun)u3a_to_pom(u3a_outa(u3a_boxto(box_w))),
((u3a_noun *)(u3a_boxto(box_w)))->mug_w, ((u3a_noun *)(u3a_boxto(box_w)))->mug_w,
box_u->use_w, box_u->eus_w); box_u->use_w, box_u->eus_w);
u3m_p("weak", u3a_to_pom(u3a_outa(u3a_boxto(box_w)))); u3a_print_memory("weak (minimum)", box_u->siz_w);
// u3m_p("weak", u3a_to_pom(u3a_outa(u3a_boxto(box_w))));
} }
weq_w += box_u->siz_w; weq_w += box_u->siz_w;
} }
@ -1483,7 +1507,8 @@ u3a_sweep(void)
? ((u3a_noun *)(u3a_boxto(box_w)))->mug_w ? ((u3a_noun *)(u3a_boxto(box_w)))->mug_w
: u3r_mug(u3a_to_pom(u3a_outa(u3a_boxto(box_w)))), : u3r_mug(u3a_to_pom(u3a_outa(u3a_boxto(box_w)))),
box_u->use_w); box_u->use_w);
u3m_p("leak", u3a_to_pom(u3a_outa(u3a_boxto(box_w)))); u3a_print_memory("leak (minimum)", box_u->siz_w);
// u3m_p("leak", u3a_to_pom(u3a_outa(u3a_boxto(box_w))));
leq_w += box_u->siz_w; leq_w += box_u->siz_w;
} }
if ( box_u->cod_w ) { if ( box_u->cod_w ) {
@ -1501,7 +1526,26 @@ u3a_sweep(void)
c3_ws use_ws = (c3_ws)box_u->use_w; c3_ws use_ws = (c3_ws)box_u->use_w;
if ( use_ws > 0 ) { if ( use_ws > 0 ) {
printf("leak %p\r\n", box_u); printf("leak %p %x\r\n",
box_u,
((u3a_noun *)(u3a_boxto(box_w)))->mug_w
? ((u3a_noun *)(u3a_boxto(box_w)))->mug_w
: u3r_mug(u3a_to_pom(u3a_outa(u3a_boxto(box_w)))));
u3a_print_memory("leak (minimum)", box_u->siz_w);
#if 1
/* For those times when you've really just got to crack open
* the box and see what's inside
*/
{
int i;
for ( i = 0; i < box_u->siz_w; i++ ) {
printf("%08x ", (unsigned int)(((c3_w*)box_u)[i]));
}
printf("\r\n");
}
#endif
leq_w += box_u->siz_w; leq_w += box_u->siz_w;
box_u->use_w = 0; box_u->use_w = 0;
@ -1534,6 +1578,8 @@ u3a_sweep(void)
c3_assert((pos_w + leq_w + weq_w) == neg_w); c3_assert((pos_w + leq_w + weq_w) == neg_w);
if ( 0 != leq_w || (0 != weq_w) ) { c3_assert(0); } if ( 0 != leq_w || (0 != weq_w) ) { c3_assert(0); }
return neg_w;
} }
/* u3a_slab(): create a length-bounded proto-atom. /* u3a_slab(): create a length-bounded proto-atom.

37
n/h.c
View File

@ -631,22 +631,26 @@ u3h_walk(u3p(u3h_root) har_p, void (*fun_f)(u3_noun))
/* _ch_mark_buck(): mark bucket for gc. /* _ch_mark_buck(): mark bucket for gc.
*/ */
static void c3_w
_ch_mark_buck(u3h_buck* hab_u) _ch_mark_buck(u3h_buck* hab_u)
{ {
c3_w i_w; c3_w tot_w = 0;
c3_w i_w;
for ( i_w = 0; i_w < hab_u->len_w; i_w++ ) { for ( i_w = 0; i_w < hab_u->len_w; i_w++ ) {
u3a_mark_noun(hab_u->kev[i_w]); tot_w += u3a_mark_noun(hab_u->kev[i_w]);
} }
u3a_mark_ptr(hab_u); tot_w += u3a_mark_ptr(hab_u);
return tot_w;
} }
/* _ch_mark_node(): mark node for gc. /* _ch_mark_node(): mark node for gc.
*/ */
static void c3_w
_ch_mark_node(u3h_node* han_u, c3_w lef_w) _ch_mark_node(u3h_node* han_u, c3_w lef_w)
{ {
c3_w tot_w = 0;
c3_w len_w = _ch_popcount(han_u->map_w); c3_w len_w = _ch_popcount(han_u->map_w);
c3_w i_w; c3_w i_w;
@ -658,26 +662,30 @@ _ch_mark_node(u3h_node* han_u, c3_w lef_w)
if ( _(u3h_slot_is_noun(sot_w)) ) { if ( _(u3h_slot_is_noun(sot_w)) ) {
u3_noun kev = u3h_slot_to_noun(sot_w); u3_noun kev = u3h_slot_to_noun(sot_w);
u3a_mark_noun(kev); tot_w += u3a_mark_noun(kev);
} }
else { else {
void* hav_v = u3h_slot_to_node(sot_w); void* hav_v = u3h_slot_to_node(sot_w);
if ( 0 == lef_w ) { if ( 0 == lef_w ) {
_ch_mark_buck(hav_v); tot_w += _ch_mark_buck(hav_v);
} else { } else {
_ch_mark_node(hav_v, lef_w); tot_w += _ch_mark_node(hav_v, lef_w);
} }
} }
} }
u3a_mark_ptr(han_u);
tot_w += u3a_mark_ptr(han_u);
return tot_w;
} }
/* u3h_mark(): mark hashtable for gc. /* u3h_mark(): mark hashtable for gc.
*/ */
void c3_w
u3h_mark(u3p(u3h_root) har_p) u3h_mark(u3p(u3h_root) har_p)
{ {
c3_w tot_w = 0;
u3h_root* har_u = u3to(u3h_root, har_p); u3h_root* har_u = u3to(u3h_root, har_p);
c3_w i_w; c3_w i_w;
@ -687,13 +695,16 @@ u3h_mark(u3p(u3h_root) har_p)
if ( _(u3h_slot_is_noun(sot_w)) ) { if ( _(u3h_slot_is_noun(sot_w)) ) {
u3_noun kev = u3h_slot_to_noun(sot_w); u3_noun kev = u3h_slot_to_noun(sot_w);
u3a_mark_noun(kev); tot_w += u3a_mark_noun(kev);
} }
else if ( _(u3h_slot_is_node(sot_w)) ) { else if ( _(u3h_slot_is_node(sot_w)) ) {
u3h_node* han_u = u3h_slot_to_node(sot_w); u3h_node* han_u = u3h_slot_to_node(sot_w);
_ch_mark_node(han_u, 25); tot_w += _ch_mark_node(han_u, 25);
} }
} }
u3a_mark_ptr(har_u);
tot_w += u3a_mark_ptr(har_u);
return tot_w;
} }

25
n/m.c
View File

@ -30,11 +30,6 @@
void void
u3m_dump(void); u3m_dump(void);
/* u3m_mark(): mark all nouns in the road.
*/
void
u3m_mark(void);
/* u3m_fall(): return to parent road. /* u3m_fall(): return to parent road.
*/ */
void void
@ -462,17 +457,19 @@ _pave_parts(void)
/* u3m_mark(): mark all nouns in the road. /* u3m_mark(): mark all nouns in the road.
*/ */
void c3_w
u3m_mark(void) u3m_mark(void)
{ {
u3h_mark(u3R->jed.har_p); c3_w tot_w = 0;
u3a_mark_noun(u3R->jed.das); tot_w += u3h_mark(u3R->jed.har_p);
u3a_mark_noun(u3R->ski.flu); tot_w += u3a_mark_noun(u3R->jed.das);
u3a_mark_noun(u3R->bug.tax); tot_w += u3a_mark_noun(u3R->ski.flu);
u3a_mark_noun(u3R->bug.mer); tot_w += u3a_mark_noun(u3R->bug.tax);
u3a_mark_noun(u3R->pro.don); tot_w += u3a_mark_noun(u3R->bug.mer);
u3a_mark_noun(u3R->pro.day); tot_w += u3a_mark_noun(u3R->pro.don);
u3h_mark(u3R->cax.har_p); tot_w += u3a_mark_noun(u3R->pro.day);
tot_w += u3h_mark(u3R->cax.har_p);
return tot_w;
} }
/* _cm_pave(): instantiate or activate image. /* _cm_pave(): instantiate or activate image.

5
n/n.c
View File

@ -86,7 +86,10 @@ _n_hint(u3_noun zep,
} }
pro = _n_nock_on(u3k(bus), u3k(nex)); pro = _n_nock_on(u3k(bus), u3k(nex));
u3z_save_2(c3__nock, bus, nex, pro); if ( u3R != &(u3H->rod_u) ) {
u3z_save_2(c3__nock, bus, nex, pro);
}
u3z(bus); u3z(nex); u3z(bus); u3z(nex);
return pro; return pro;

37
n/v.c
View File

@ -79,6 +79,7 @@ u3v_start(u3_noun now)
{ {
u3v_time(now); u3v_time(now);
u3v_numb(); u3v_numb();
u3A->sac = u3_nul;
{ {
c3_c* wen_c = u3r_string(u3A->wen); c3_c* wen_c = u3r_string(u3A->wen);
@ -490,37 +491,45 @@ u3v_louse(c3_m how_m)
/* _cv_mark_ova(): mark ova queue. /* _cv_mark_ova(): mark ova queue.
*/ */
static void c3_w
_cv_mark_ova(u3p(u3v_cart) egg_p) _cv_mark_ova(u3p(u3v_cart) egg_p)
{ {
c3_w tot_w = 0;
while ( egg_p ) { while ( egg_p ) {
u3v_cart* egg_u = u3to(u3v_cart, egg_p); u3v_cart* egg_u = u3to(u3v_cart, egg_p);
u3a_mark_mptr(egg_u); tot_w += u3a_mark_mptr(egg_u);
u3a_mark_noun(egg_u->vir); tot_w += u3a_mark_noun(egg_u->vir);
egg_p = egg_u->nex_p; egg_p = egg_u->nex_p;
} }
return tot_w;
} }
/* u3v_mark(): mark arvo kernel. /* u3v_mark(): mark arvo kernel.
*/ */
void c3_w
u3v_mark(void) u3v_mark(void)
{ {
c3_w tot_w = 0;
u3v_arvo* arv_u = &(u3H->arv_u); u3v_arvo* arv_u = &(u3H->arv_u);
u3a_mark_noun(arv_u->yot); tot_w += u3a_mark_noun(arv_u->yot);
u3a_mark_noun(arv_u->now); tot_w += u3a_mark_noun(arv_u->now);
u3a_mark_noun(arv_u->wen); tot_w += u3a_mark_noun(arv_u->wen);
u3a_mark_noun(arv_u->sen); tot_w += u3a_mark_noun(arv_u->sen);
u3a_mark_noun(arv_u->own); tot_w += u3a_mark_noun(arv_u->own);
u3a_mark_noun(arv_u->roe); tot_w += u3a_mark_noun(arv_u->roe);
u3a_mark_noun(arv_u->key); tot_w += u3a_mark_noun(arv_u->key);
u3a_mark_noun(arv_u->ken); tot_w += u3a_mark_noun(arv_u->ken);
u3a_mark_noun(arv_u->roc); tot_w += u3a_mark_noun(arv_u->roc);
_cv_mark_ova(arv_u->ova.egg_p); tot_w += _cv_mark_ova(arv_u->ova.egg_p);
return tot_w;
} }

240
v/raft.c
View File

@ -1691,6 +1691,244 @@ _raft_kick_all(u3_noun vir)
} }
} }
/* _raft_spac(): print n spaces.
*/
void _raft_spac(c3_w n)
{
for (; n > 0; n--)
(fprintf(stderr," "));
}
/* _raft_print_memory: print memory amount. cf u3a_print_memory().
*/
void
_raft_print_memory(c3_w wor_w)
{
c3_w byt_w = (wor_w * 4);
c3_w gib_w = (byt_w / 1000000000);
c3_w mib_w = (byt_w % 1000000000) / 1000000;
c3_w kib_w = (byt_w % 1000000) / 1000;
c3_w bib_w = (byt_w % 1000);
if ( gib_w ) {
(fprintf(stderr, "GB/%d.%03d.%03d.%03d\r\n",
gib_w, mib_w, kib_w, bib_w));
}
else if ( mib_w ) {
(fprintf(stderr, "MB/%d.%03d.%03d\r\n", mib_w, kib_w, bib_w));
}
else if ( kib_w ) {
(fprintf(stderr, "KB/%d.%03d\r\n", kib_w, bib_w));
}
else {
(fprintf(stderr, "B/%d\r\n", bib_w));
}
}
#if 0
/* _raft_prof_noun(): get memory usage, in words, of noun. RETAIN.
*/
c3_w
_raft_prof_noun(u3p(u3h_root) hax, u3_noun non, c3_t dud)
{
return 0;
/*
u3_weak got = u3h_git(hax, dud ? non & 0x7fffffff : non);
if (u3_none != got) {
return 1;
}
else {
c3_w res;
if (!(non & 0x80000000)) {
res = 1;
}
if (_(u3ud(non))) {
res = 3 + 3 + u3r_met(5, non);
}
else {
res = 3 + 2
+ _raft_prof_noun(hax, u3h(non), dud)
+ _raft_prof_noun(hax, u3t(non), dud);
}
u3h_put(hax, dud ? non & 0x7fffffff : non, res);
return res;
}
*/
}
#endif
/* _raft_prof(): print memory profile. RETAIN.
*/
c3_w
_raft_prof(u3p(u3h_root) hax, c3_w den, u3_noun mas)
{
c3_w tot_w = 0;
u3_noun h_mas, t_mas;
if ( c3n == u3r_cell(mas, &h_mas, &t_mas) ) {
_raft_spac(den);
(fprintf(stderr, "mistyped mass\r\n"));
return tot_w;
}
else if ( _(u3du(h_mas)) ) {
_raft_spac(den);
(fprintf(stderr, "mistyped mass head\r\n"));
u3m_p("h_mas", h_mas);
return tot_w;
}
else {
_raft_spac(den);
c3_c* lab_c = u3m_pretty(h_mas);
(fprintf(stderr, "%s: ", lab_c));
free(lab_c);
u3_noun it_mas, tt_mas;
if ( c3n == u3r_cell(t_mas, &it_mas, &tt_mas) ) {
(fprintf(stderr, "mistyped mass tail\r\n"));
return tot_w;
}
else if ( c3y == it_mas ) {
tot_w += u3a_mark_noun(tt_mas);
_raft_print_memory(tot_w);
#if 1
/* The basic issue here is that tt_mas is included in
* u3A->sac, so they can't both be roots in the normal
* sense. When we mark u3A->sac later on, we want tt_mas
* to appear unmarked, but its children should be already
* marked.
*/
if ( _(u3a_is_dog(tt_mas)) ) {
u3a_box* box_u = u3a_botox(u3a_to_ptr(tt_mas));
#ifdef U3_MEMORY_DEBUG
if ( 1 == box_u->eus_w ) {
box_u->eus_w = 0xffffffff;
}
else {
box_u->eus_w -= 1;
}
#else
if ( -1 == (c3_w)box_u->use_w ) {
box_u->use_w = 0x80000000;
}
else {
box_u->use_w += 1;
}
#endif
}
#endif
return tot_w;
}
else if ( c3n == it_mas ) {
(fprintf(stderr, "\r\n"));
while ( _(u3du(tt_mas)) ) {
tot_w += _raft_prof(hax, den+2, u3h(tt_mas));
tt_mas = u3t(tt_mas);
}
_raft_spac(den);
(fprintf(stderr, "--"));
_raft_print_memory(tot_w);
return tot_w;
}
else {
_raft_spac(den);
(fprintf(stderr, "mistyped (strange) mass tail\r\n"));
return tot_w;
}
}
}
/* _raft_grab(): garbage collect, checking for profiling. RETAIN.
*/
static void
_raft_grab(u3_noun ova)
{
if ( u3_nul != u3A->sac ) {
c3_w usr_w = 0, ova_w = 0, sac_w = 0, utv_w = 0, utm_w = 0, wep_w = 0,
har_w = 0, das_w = 0, flu_w = 0, tax_w = 0, mer_w = 0, don_w = 0,
day_w = 0, car_w = 0;
c3_assert( u3R == &(u3H->rod_u) );
fprintf(stderr, "\r\n");
usr_w = _raft_prof(u3_nul, 0, u3A->sac);
fprintf(stderr, "total userspace: ");
_raft_print_memory(usr_w);
ova_w = u3a_mark_noun(ova);
fprintf(stderr, "effects list: ");
_raft_print_memory(ova_w);
sac_w = u3a_mark_noun(u3A->sac);
fprintf(stderr, "space profile: ");
_raft_print_memory(sac_w);
utv_w = u3v_mark();
fprintf(stderr, "arvo stuff: ");
_raft_print_memory(utv_w);
har_w = u3h_mark(u3R->jed.har_p);
fprintf(stderr, " warm jet state: ");
_raft_print_memory(har_w);
das_w = u3a_mark_noun(u3R->jed.das);
fprintf(stderr, " cold jet state: ");
_raft_print_memory(das_w);
flu_w = u3a_mark_noun(u3R->ski.flu);
fprintf(stderr, " namespace: ");
_raft_print_memory(flu_w);
tax_w = u3a_mark_noun(u3R->bug.tax);
fprintf(stderr, " trace stack list: ");
_raft_print_memory(tax_w);
mer_w = u3a_mark_noun(u3R->bug.mer);
fprintf(stderr, " trace stack buffer: ");
_raft_print_memory(mer_w);
don_w = u3a_mark_noun(u3R->pro.don);
fprintf(stderr, " profile battery list: ");
_raft_print_memory(don_w);
day_w = u3a_mark_noun(u3R->pro.day);
fprintf(stderr, " profile doss: ");
_raft_print_memory(day_w);
car_w = u3h_mark(u3R->cax.har_p);
fprintf(stderr, " memoization: ");
_raft_print_memory(car_w);
utm_w = har_w + das_w + flu_w + tax_w + mer_w + don_w + day_w + car_w;
fprintf(stderr, "total road stuff: ");
_raft_print_memory(utm_w);
fprintf(stderr, "total marked: ");
_raft_print_memory(usr_w + ova_w + sac_w + utv_w + utm_w);
wep_w = u3a_sweep();
fprintf(stderr, "sweep: ");
_raft_print_memory(wep_w);
u3h_free(u3R->cax.har_p);
u3R->cax.har_p = u3h_new();
u3z(u3A->sac);
u3A->sac = u3_nul;
}
}
int FOO; int FOO;
/* u3_raft_work(): work. /* u3_raft_work(): work.
@ -1803,6 +2041,8 @@ u3_raft_work(void)
_raft_kick_all(vir); _raft_kick_all(vir);
egg_u->did = c3y; egg_u->did = c3y;
egg_u->vir = 0; egg_u->vir = 0;
_raft_grab(ova);
} }
} }
} }

124
v/reck.c
View File

@ -66,120 +66,6 @@ _reck_lily(u3_noun fot, u3_noun txt, c3_l* tid_l)
} }
} }
/* _reck_spac(): print n spaces.
*/
void _reck_spac(c3_w n)
{
for (; n > 0; n--)
uL(fprintf(uH," "));
}
/* _reck_print_memory: print memory amount. cf u3a_print_memory().
*/
void
_reck_print_memory(c3_w wor_w)
{
c3_w byt_w = (wor_w * 4);
c3_w gib_w = (byt_w / 1000000000);
c3_w mib_w = (byt_w % 1000000000) / 1000000;
c3_w kib_w = (byt_w % 1000000) / 1000;
c3_w bib_w = (byt_w % 1000);
if ( gib_w ) {
uL(fprintf(uH, "GB/%d.%03d.%03d.%03d\r\n",
gib_w, mib_w, kib_w, bib_w));
}
else if ( mib_w ) {
uL(fprintf(uH, "MB/%d.%03d.%03d\r\n", mib_w, kib_w, bib_w));
}
else if ( kib_w ) {
uL(fprintf(uH, "KB/%d.%03d\r\n", kib_w, bib_w));
}
else {
uL(fprintf(uH, "B/%d\r\n", bib_w));
}
}
/* _reck_meme_noun(): get memory usage, in words, of noun. RETAIN.
*/
c3_w
_reck_meme_noun(u3p(u3h_root) hax, u3_noun non, c3_t dud)
{
u3_weak got = u3h_git(hax, dud ? non & 0x7fffffff : non);
if (u3_none != got) {
return 0; // I think? maybe 1
}
else {
c3_w res;
if (!(non & 0x80000000)) {
res = 1;
}
if (_(u3ud(non))) {
res = 2 + u3r_met(5, non);
}
else {
res = 1
+ _reck_meme_noun(hax, u3h(non), dud)
+ _reck_meme_noun(hax, u3t(non), dud);
}
u3h_put(hax, dud ? non & 0x7fffffff : non, res);
return res;
}
}
/* _reck_meme_prof(): print memory profile. RETAIN.
*/
void
_reck_meme_prof(u3p(u3h_root) hax, c3_w den, u3_noun mas)
{
u3_noun h_mas, t_mas;
if (c3n == u3r_cell(mas, &h_mas, &t_mas)) {
_reck_spac(den);
uL(fprintf(uH, "mistyped mass\r\n"));
return;
}
if (c3y == h_mas) {
_reck_spac(den);
_reck_print_memory(_reck_meme_noun(hax, t_mas, false));
_reck_spac(den);
_reck_print_memory(_reck_meme_noun(hax, t_mas, true));
}
else if (c3n == h_mas) {
u3_noun it_mas, tt_mas, pit_mas, qit_mas;
while (u3_nul != t_mas)
{
_reck_spac(den);
if (c3n == u3r_cell(t_mas, &it_mas, &tt_mas)) {
uL(fprintf(uH, "mistyped mass list\r\n"));
return;
}
else if (c3n == u3r_cell(it_mas, &pit_mas, &qit_mas)) {
uL(fprintf(uH, "mistyped mass list element\r\n"));
return;
}
else {
c3_c* pit_c = u3m_pretty(pit_mas);
uL(fprintf(uH, "%s\r\n", pit_c));
free(pit_c);
_reck_meme_prof(hax, den+2, qit_mas);
t_mas = tt_mas;
}
}
}
else {
_reck_spac(den);
uL(fprintf(uH, "mistyped mass head\r\n"));
return;
}
}
/* _reck_kick_term(): apply terminal outputs. /* _reck_kick_term(): apply terminal outputs.
*/ */
static u3_noun static u3_noun
@ -227,13 +113,7 @@ _reck_kick_term(u3_noun pox, c3_l tid_l, u3_noun fav)
case c3__mass: p_fav = u3t(fav); case c3__mass: p_fav = u3t(fav);
{ {
uL(fprintf(uH, "memory profile:\r\n")); u3A->sac = u3k(p_fav);
u3p(u3h_root) hax = u3h_new();
_reck_meme_prof(hax, 0, p_fav);
u3h_free(hax);
u3z(pox); u3z(fav); return c3y; u3z(pox); u3z(fav); return c3y;
} break; } break;
@ -359,7 +239,7 @@ _reck_kick_spec(u3_noun pox, u3_noun fav)
u3z(pox); u3z(fav); return c3n; u3z(pox); u3z(fav); return c3n;
} }
else switch ( it_pox ) { else switch ( it_pox ) {
default: return c3n; default: u3z(pox); u3z(fav); return c3n;
case c3__http: { case c3__http: {
u3_noun pud = tt_pox; u3_noun pud = tt_pox;