|
|
1.1 root 1: /*
2: * coret(coexpr,value) - suspend current co-expression and activate
3: * activator with value, without changing activator's activator.
4: *
5: * Outline:
6: * create procedure frame
7: * save sp and boundary in current co-expression stack header
8: * change current stack to coexpr
9: * get sp and boundary from new co-expression stack header
10: * return value in new stack
11: */
12: Global(_boundary) /* Icon/C boundary */
13: Global(_current) /* current co-expression */
14: Global(_file) /* current file name */
15: Global(_line) /* current line number */
16: Global(_deref) /* dereference */
17:
18: Global(_coret)
19: #ifdef VAX
20: _coret:
21: Mask STDSV
22: calls $0,_setbound
23: subl2 $8,sp # Make room on stack for line and file
24: movl _line,-4(fp) # and put them in the frame
25: movl _file,-8(fp)
26: movl _current+4,r2 # r2 <- pointer to current stack header
27: movl sp,16(r2) # save the stack pointer,
28: movl ap,20(r2) # address pointer,
29: movl _boundary,24(r2) # and boundary for the current co-expression
30: # in its stack header
31: movl ap,r4 # save ap for later use (to get the
32: # result that we were passed
33: movl 8(r2),r3 # r3 points to activator
34: movl r3,_current+4 # make new stack header current
35: movl 16(r3),sp # get new sp,
36: movl 20(r3),ap # ap,
37: movl 24(r3),fp # fp,
38: movl fp,_boundary # and boundary
39: movq 8(r4),16(ap) # copy arg0 of caller to our arg0, apparently
40: # because we have two fake arguments (?)
41: moval 16(ap),r4 # point r4 at our new result
42:
43: movl (r4),r1 # get type field of new result
44: bitl $F_NQUAL,r1 # if return value points into the old
45: jeql f1 # co-expression, then it needs
46: bitl $F_VAR,r1 # dereferencing
47: jeql f1
48: bitl $F_TVAR,r1
49: jneq f2
50: movl 4(r4),r1 # get pointer field of result into r1
51: jbr f3
52: f2:
53: bicl2 $~TYPEMASK,r1 # isolate type bits by turning off others
54: cmpl $T_TVSUBS,r1 # if we have a substring t.v., we have
55: jneq f1 # to dereference it.
56: movl 4(r4),r1 # point r1 at the string of the
57: movl 16(r1),r1 # trapped variable
58: f3:
59: cmpl r1,16(r2) # if pointer is between old sp and sbase,
60: jlss f1 # it needs dereferencing
61: cmpl r1,12(r2)
62: jgtr f1
63: pushl r4
64: calls $1,_deref # so, dereference it
65: f1:
66: movl -4(fp),_line # restore line number
67: movl -8(fp),_file # and file name
68: calls $0,_clrbound
69: ret # return. This return will use the dummy
70: # frame built above and we should land in
71: #endif VAX
72: #ifdef PORT
73: DummyFcn(_coret)
74: #endif PORT
75: #ifdef PDP11
76: / coret(coexpr,value) - suspend current co-expression and activate
77: / activator with value, without changing activator's activator.
78:
79: / NOTE: this code is highly dependent on stack frame layout.
80:
81: / Outline:
82: / create procedure frame
83: / save sp and boundary in current co-expression stack header
84: / change current stack to coexpr
85: / get sp and boundary from new co-expression stack header
86: / return value in new stack
87:
88: / Register usage:
89: / r2: pointer to current co-expression stack header
90: / r3: pointer to new co-expression stack header
91: / r4: pointer to arguments to activate
92: / r5: procedure frame pointer
93: Global(csv) / save registers
94: Global(cret) / return as from C
95:
96: _coret:
97: jsr r5,csv / create procedure frame
98: mov _line,(sp) / save current line number
99: mov _file,-(sp) / and file name
100: mov _current+2,r2 / r2 <- pointer to current stack header
101: mov sp,8.(r2) / save sp
102: mov _boundary,12.(r2) / save boundary
103: mov r5,r4 / r4 <- pointer to top of stack
104: mov 4(r2),r3 / r3 <- pointer to activator
105: mov r3,_current+2 / make new stack header current
106: mov 8.(r3),sp / get new sp
107: mov 12.(r3),r5 / get new r5 and
108: mov r5,_boundary / new boundary
109: mov 6(r4),10.(r5) / copy value from old stack
110: mov 8.(r4),12.(r5)
111: mov r5,r4 / r4 <- address of result on new stack
112: add $10.,r4
113: mov (r4), r1 / get type field of return value into r1
114: bit $F_NQUAL,r1 / if return value points into the old
115: beq 1f / co-expression, then it needs
116: bit $F_VAR,r1 / dereferencing
117: beq 1f
118: bit $F_TVAR,r1
119: bne 2f
120: mov 2(r4),r1 / get pointer field into r1
121: br 3f
122: 2:
123: bic $!TYPEMASK,r1 / check type code for substring t.v.
124: cmp $T_TVSUBS,r1 / if not, it doesn't need
125: bne 1f / dereferencing
126: mov 2(r4),r1 / get pointer field from b_tvsubs
127: mov 8.(r1),r1 / block into r1
128: 3:
129: cmp r1,8.(r2) / if pointer is between old
130: blo 1f / sp and sbase it needs
131: cmp r1,6.(r2) / dereferencing
132: bhi 1f
133: mov r4,-(sp) / dereference result
134: jsr pc,_deref
135: tst (sp)+
136: 1:
137: mov -8.(r5),_line / restore line number
138: mov -10.(r5),_file / and file name
139: jmp cret / return in new stack
140: #endif PDP11
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.