Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
X
x-RPySOM
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
mu
x-RPySOM
Commits
f5b18e4d
Commit
f5b18e4d
authored
May 22, 2014
by
Stefan Marr
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Use polymorphism on AbstractObject for quick bytecodes
Signed-off-by:
Stefan Marr
<
git@stefan-marr.de
>
parent
402ca7e4
Changes
5
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
74 additions
and
33 deletions
+74
-33
interpreter.py
src/som/interpreter/interpreter.py
+5
-33
abstract_object.py
src/som/vmobjects/abstract_object.py
+15
-0
biginteger.py
src/som/vmobjects/biginteger.py
+18
-0
double.py
src/som/vmobjects/double.py
+18
-0
integer.py
src/som/vmobjects/integer.py
+18
-0
No files found.
src/som/interpreter/interpreter.py
View file @
f5b18e4d
...
...
@@ -145,45 +145,15 @@ class Interpreter(object):
def
_do_add
(
self
,
bytecode_index
,
frame
,
method
):
rcvr
=
frame
.
get_stack_element
(
1
)
right
=
frame
.
get_stack_element
(
0
)
if
(
isinstance
(
rcvr
,
Integer
)
or
isinstance
(
rcvr
,
BigInteger
)
or
isinstance
(
rcvr
,
Double
)):
frame
.
pop
()
frame
.
pop
()
frame
.
push
(
rcvr
.
prim_add
(
right
,
self
.
_universe
))
else
:
self
.
_send
(
method
,
frame
,
self
.
_add_symbol
,
rcvr
.
get_class
(
self
.
_universe
),
bytecode_index
)
rcvr
.
quick_add
(
method
,
frame
,
self
,
bytecode_index
)
def
_do_multiply
(
self
,
bytecode_index
,
frame
,
method
):
rcvr
=
frame
.
get_stack_element
(
1
)
right
=
frame
.
get_stack_element
(
0
)
if
(
isinstance
(
rcvr
,
Integer
)
or
isinstance
(
rcvr
,
BigInteger
)
or
isinstance
(
rcvr
,
Double
)):
frame
.
pop
()
frame
.
pop
()
frame
.
push
(
rcvr
.
prim_multiply
(
right
,
self
.
_universe
))
else
:
self
.
_send
(
method
,
frame
,
self
.
_multiply_symbol
,
rcvr
.
get_class
(
self
.
_universe
),
bytecode_index
)
rcvr
.
quick_multiply
(
method
,
frame
,
self
,
bytecode_index
)
def
_do_subtract
(
self
,
bytecode_index
,
frame
,
method
):
rcvr
=
frame
.
get_stack_element
(
1
)
right
=
frame
.
get_stack_element
(
0
)
if
(
isinstance
(
rcvr
,
Integer
)
or
isinstance
(
rcvr
,
BigInteger
)
or
isinstance
(
rcvr
,
Double
)):
frame
.
pop
()
frame
.
pop
()
frame
.
push
(
rcvr
.
prim_subtract
(
right
,
self
.
_universe
))
else
:
self
.
_send
(
method
,
frame
,
self
.
_subtract_symbol
,
rcvr
.
get_class
(
self
.
_universe
),
bytecode_index
)
rcvr
.
quick_subtract
(
method
,
frame
,
self
,
bytecode_index
)
def
_do_send
(
self
,
bytecode_index
,
frame
,
method
):
# Handle the send bytecode
...
...
@@ -272,6 +242,8 @@ class Interpreter(object):
return
frame
.
get_outer_context
()
.
get_argument
(
0
,
0
)
def
_send
(
self
,
m
,
frame
,
selector
,
receiver_class
,
bytecode_index
):
# selector.inc_send_count()
# First try the inline cache
cached_class
=
m
.
get_inline_cache_class
(
bytecode_index
)
if
cached_class
==
receiver_class
:
...
...
src/som/vmobjects/abstract_object.py
View file @
f5b18e4d
...
...
@@ -50,6 +50,21 @@ class AbstractObject(object):
def
get_class
(
self
,
universe
):
raise
NotImplementedError
(
"Subclasses need to implement get_class(universe)."
)
def
quick_add
(
self
,
from_method
,
frame
,
interpreter
,
bytecode_index
):
interpreter
.
_send
(
from_method
,
frame
,
interpreter
.
_add_symbol
,
self
.
get_class
(
interpreter
.
get_universe
()),
bytecode_index
)
def
quick_multiply
(
self
,
from_method
,
frame
,
interpreter
,
bytecode_index
):
interpreter
.
_send
(
from_method
,
frame
,
interpreter
.
_multiply_symbol
,
self
.
get_class
(
interpreter
.
get_universe
()),
bytecode_index
)
def
quick_subtract
(
self
,
from_method
,
frame
,
interpreter
,
bytecode_index
):
interpreter
.
_send
(
from_method
,
frame
,
interpreter
.
_subtract_symbol
,
self
.
get_class
(
interpreter
.
get_universe
()),
bytecode_index
)
@
staticmethod
def
is_invokable
():
return
False
...
...
src/som/vmobjects/biginteger.py
View file @
f5b18e4d
...
...
@@ -18,6 +18,24 @@ class BigInteger(AbstractObject):
def
get_class
(
self
,
universe
):
return
universe
.
integerClass
def
quick_add
(
self
,
from_method
,
frame
,
interpreter
,
bytecode_index
):
right
=
frame
.
get_stack_element
(
0
)
frame
.
pop
()
frame
.
pop
()
frame
.
push
(
self
.
prim_add
(
right
,
interpreter
.
get_universe
()))
def
quick_multiply
(
self
,
from_method
,
frame
,
interpreter
,
bytecode_index
):
right
=
frame
.
get_stack_element
(
0
)
frame
.
pop
()
frame
.
pop
()
frame
.
push
(
self
.
prim_multiply
(
right
,
interpreter
.
get_universe
()))
def
quick_subtract
(
self
,
from_method
,
frame
,
interpreter
,
bytecode_index
):
right
=
frame
.
get_stack_element
(
0
)
frame
.
pop
()
frame
.
pop
()
frame
.
push
(
self
.
prim_subtract
(
right
,
interpreter
.
get_universe
()))
def
_to_double
(
self
,
universe
):
return
universe
.
new_double
(
self
.
_embedded_biginteger
.
tofloat
())
...
...
src/som/vmobjects/double.py
View file @
f5b18e4d
...
...
@@ -19,6 +19,24 @@ class Double(AbstractObject):
def
get_class
(
self
,
universe
):
return
universe
.
doubleClass
def
quick_add
(
self
,
from_method
,
frame
,
interpreter
,
bytecode_index
):
right
=
frame
.
get_stack_element
(
0
)
frame
.
pop
()
frame
.
pop
()
frame
.
push
(
self
.
prim_add
(
right
,
interpreter
.
get_universe
()))
def
quick_multiply
(
self
,
from_method
,
frame
,
interpreter
,
bytecode_index
):
right
=
frame
.
get_stack_element
(
0
)
frame
.
pop
()
frame
.
pop
()
frame
.
push
(
self
.
prim_multiply
(
right
,
interpreter
.
get_universe
()))
def
quick_subtract
(
self
,
from_method
,
frame
,
interpreter
,
bytecode_index
):
right
=
frame
.
get_stack_element
(
0
)
frame
.
pop
()
frame
.
pop
()
frame
.
push
(
self
.
prim_subtract
(
right
,
interpreter
.
get_universe
()))
@
staticmethod
def
_get_float
(
obj
):
from
.integer
import
Integer
...
...
src/som/vmobjects/integer.py
View file @
f5b18e4d
...
...
@@ -23,6 +23,24 @@ class Integer(AbstractObject):
def
get_class
(
self
,
universe
):
return
universe
.
integerClass
def
quick_add
(
self
,
from_method
,
frame
,
interpreter
,
bytecode_index
):
right
=
frame
.
get_stack_element
(
0
)
frame
.
pop
()
frame
.
pop
()
frame
.
push
(
self
.
prim_add
(
right
,
interpreter
.
get_universe
()))
def
quick_multiply
(
self
,
from_method
,
frame
,
interpreter
,
bytecode_index
):
right
=
frame
.
get_stack_element
(
0
)
frame
.
pop
()
frame
.
pop
()
frame
.
push
(
self
.
prim_multiply
(
right
,
interpreter
.
get_universe
()))
def
quick_subtract
(
self
,
from_method
,
frame
,
interpreter
,
bytecode_index
):
right
=
frame
.
get_stack_element
(
0
)
frame
.
pop
()
frame
.
pop
()
frame
.
push
(
self
.
prim_subtract
(
right
,
interpreter
.
get_universe
()))
def
_to_double
(
self
,
universe
):
return
universe
.
new_double
(
float
(
self
.
_embedded_integer
))
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment