Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions modules/Kernel/VM/SmallInteger.st
Original file line number Diff line number Diff line change
Expand Up @@ -8,16 +8,19 @@ Extension { #name : #SmallInteger }
{ #category : '*Primitives' }
SmallInteger >> - aNumber [
<primitive: SMIMinus>
^(aNumber - self) negated
]

{ #category : '*Primitives' }
SmallInteger >> != aNumber [
<primitive: SMINotEqual>
^aNumber != self
]

{ #category : '*Primitives' }
SmallInteger >> * aNumber [
<primitive: SMITimes>
^aNumber * self
]

{ #category : '*Primitives' }
Expand All @@ -33,21 +36,25 @@ SmallInteger >> \\ aNumber [
{ #category : '*Primitives' }
SmallInteger >> + aNumber [
<primitive: SMIPlus>
^aNumber + self
]

{ #category : '*Primitives' }
SmallInteger >> = aNumber [
<primitive: SMIEqual>
^aNumber = self
]

{ #category : '*Primitives' }
SmallInteger >> > aNumber [
<primitive: SMIGreaterThan>
^aNumber < self
]

{ #category : '*Primitives' }
SmallInteger >> >= aNumber [
<primitive: SMIGreaterEqualThan>
^aNumber <= self
]

{ #category : '*Primitives' }
Expand Down
1 change: 1 addition & 0 deletions runtime/cpp/Bootstrapper.h
Original file line number Diff line number Diff line change
Expand Up @@ -172,6 +172,7 @@ class Bootstrapper {
return binding->valueWithin_(_runtime->_evaluator->context());
}
ASSERT(false);
std::terminate();
}
};

Expand Down
38 changes: 32 additions & 6 deletions runtime/cpp/Evaluator/Evaluator.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -460,6 +460,14 @@ Object* Evaluator::boolObject(bool aBoolean){
return (Object*)this->_runtime->booleanFor_(aBoolean);
}

Object* Evaluator::failPrimitive()
{
// failing a primitive implies skipping the return just after the primop bytecode
// after that return comes the normal Smalltalk failure code of the method
this->_context->incRegPC();
return this->_regR;
}


Object* Evaluator::primitiveAt() {
auto receiver = this->_context->self();
Expand Down Expand Up @@ -778,15 +786,24 @@ Object* Evaluator::primitiveSMIBitXor() {
}

Object* Evaluator::primitiveSMIEqual() {
return boolObject(this->_context->self()->asSmallInteger()->asNative() == (this->_context->firstArgument()->asSmallInteger()->asNative()));
auto arg = this->_context->firstArgument();
return arg->isSmallInteger() ?
boolObject(this->_context->self()->asSmallInteger()->asNative() == (arg->asSmallInteger()->asNative())) :
this->failPrimitive();
}

Object* Evaluator::primitiveSMIGreaterEqualThan() {
return boolObject(this->_context->self()->asSmallInteger()->asNative() >= (this->_context->firstArgument()->asSmallInteger()->asNative()));
auto arg = this->_context->firstArgument();
return arg->isSmallInteger() ?
boolObject(this->_context->self()->asSmallInteger()->asNative() >= (arg->asSmallInteger()->asNative())) :
this->failPrimitive();
}

Object* Evaluator::primitiveSMIGreaterThan() {
return boolObject(this->_context->self()->asSmallInteger()->asNative() > (this->_context->firstArgument()->asSmallInteger()->asNative()));
auto arg = this->_context->firstArgument();
return arg->isSmallInteger() ?
boolObject(this->_context->self()->asSmallInteger()->asNative() > (arg->asSmallInteger()->asNative())) :
this->failPrimitive();
}

Object* Evaluator::primitiveSMIHighBit() {
Expand All @@ -809,11 +826,17 @@ Object* Evaluator::primitiveSMIMinus() {
}

Object* Evaluator::primitiveSMINotEqual() {
return boolObject(this->_context->self()->asSmallInteger()->asNative() != (this->_context->firstArgument()->asSmallInteger()->asNative()));
auto arg = this->_context->firstArgument();
return arg->isSmallInteger() ?
boolObject(this->_context->self()->asSmallInteger()->asNative() != (arg->asSmallInteger()->asNative())) :
this->failPrimitive();
}

Object* Evaluator::primitiveSMIPlus() {
return newIntObject((this->_context->self()->asSmallInteger()->asNative() + this->_context->firstArgument()->asSmallInteger()->asNative()));
auto arg = this->_context->firstArgument();
return arg->isSmallInteger() ?
newIntObject((this->_context->self()->asSmallInteger()->asNative() + this->_context->firstArgument()->asSmallInteger()->asNative())) :
this->failPrimitive();
}

Object* Evaluator::primitiveSMISize() {
Expand All @@ -825,7 +848,10 @@ Object* Evaluator::primitiveSMISize() {
}

Object* Evaluator::primitiveSMITimes() {
return newIntObject((this->_context->self()->asSmallInteger()->asNative() * this->_context->firstArgument()->asSmallInteger()->asNative()));
auto arg = this->_context->firstArgument();
return arg->isSmallInteger() ?
newIntObject((this->_context->self()->asSmallInteger()->asNative() * arg->asSmallInteger()->asNative())) :
this->failPrimitive();
}

Object* Evaluator::primitiveSetBehavior() {
Expand Down
2 changes: 2 additions & 0 deletions runtime/cpp/Evaluator/Evaluator.h
Original file line number Diff line number Diff line change
Expand Up @@ -180,6 +180,8 @@ class Evaluator : public SExpressionVisitor {
Object* newIntObject(auto anInteger);
Object* boolObject(bool aBoolean);

Object* failPrimitive();

Object* primitiveAt();
Object* primitiveAtPut();
Object* primitiveBehavior();
Expand Down
1 change: 0 additions & 1 deletion runtime/cpp/Evaluator/SExpressionLinearizer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -547,7 +547,6 @@ void SExpressionLinearizer::visitMethod(SMethod *anSMethod, HeapObject *method)
PrimitivePointer primitive = this->_primitives[name];
this->primitive_(primitive);
this->returnOp();
return;
}
this->_stackTop = _runtime->methodTempCount_(anSMethod->compiledCode());
auto statements = anSMethod->statements();
Expand Down
1 change: 0 additions & 1 deletion runtime/cpp/Evaluator/TreecodeDecoder.h
Original file line number Diff line number Diff line change
Expand Up @@ -192,7 +192,6 @@ class TreecodeDecoder {
this->_stream >> dummy;
auto pragma = new SPragma(this->nextSymbolOrNil());
node->pragma_(pragma);
return node;
}
node->compiledCode_(this->_method);
node->statements_(this->nextExpressionArray());
Expand Down
73 changes: 47 additions & 26 deletions runtime/pharo/Powerlang-Core/EggEvaluator.class.st
Original file line number Diff line number Diff line change
Expand Up @@ -115,6 +115,12 @@ EggEvaluator >> evaluatePrimitiveHash: receiver [
^ runtime newInteger: hash
]

{ #category : 'primitives' }
EggEvaluator >> failPrimitive [
context incRegPC.
^self regR
]

{ #category : 'initialization' }
EggEvaluator >> false [
^ falseObj
Expand Down Expand Up @@ -619,24 +625,30 @@ EggEvaluator >> primitiveSMIBitXor [

{ #category : 'primitives' }
EggEvaluator >> primitiveSMIEqual [
^ [ runtime
booleanFor: (
context self value =
context firstArgument value) ]
^ [
| arg |
arg := context firstArgument.
arg isImmediate
ifTrue: [ runtime booleanFor: context self value = arg value ]
ifFalse: [ self failPrimitive ] ]
]

{ #category : 'primitives' }
EggEvaluator >> primitiveSMIGreaterEqualThan [
^ [ runtime
booleanFor:
context self value
>= (runtime integerFrom: context firstArgument) ]
^ [ | arg |
arg := context firstArgument.
arg isImmediate
ifTrue: [ runtime booleanFor: context self value >= (runtime integerFrom: arg) ]
ifFalse: [ self failPrimitive ] ]
]

{ #category : 'primitives' }
EggEvaluator >> primitiveSMIGreaterThan [
^ [ runtime
booleanFor: context self value > (runtime integerFrom: context firstArgument) ]
^ [ | arg |
arg := context firstArgument.
arg isImmediate
ifTrue: [ runtime booleanFor: context self value > (runtime integerFrom: arg) ]
ifFalse: [ self failPrimitive ] ]
]

{ #category : 'primitives' }
Expand All @@ -662,26 +674,29 @@ EggEvaluator >> primitiveSMIIntQuot [

{ #category : 'primitives' }
EggEvaluator >> primitiveSMIMinus [
^ [ runtime
newInteger:
context self value
- (runtime integerFrom: context firstArgument) ]
^ [ | arg |
arg := context firstArgument.
arg isImmediate
ifTrue: [ runtime newInteger: context self value - (runtime integerFrom: arg) ]
ifFalse: [ self failPrimitive ] ]
]

{ #category : 'primitives' }
EggEvaluator >> primitiveSMINotEqual [
^ [ runtime
booleanFor:
context self value
!= (runtime integerFrom: context firstArgument) ]
^ [ | arg |
arg := context firstArgument.
arg isImmediate
ifTrue: [ runtime booleanFor: context self value != (runtime integerFrom: arg) ]
ifFalse: [ self failPrimitive ] ]
]

{ #category : 'primitives' }
EggEvaluator >> primitiveSMIPlus [
^ [ runtime
newInteger:
context self value
+ (runtime integerFrom: context firstArgument) ]
^ [ | arg |
arg := context firstArgument.
arg isImmediate
ifTrue: [ runtime newInteger: context self value + (runtime integerFrom: arg) ]
ifFalse: [ self failPrimitive ] ]
]

{ #category : 'primitives' }
Expand All @@ -691,10 +706,11 @@ EggEvaluator >> primitiveSMISize [

{ #category : 'primitives' }
EggEvaluator >> primitiveSMITimes [
^ [ runtime
newInteger:
context self value
* (runtime integerFrom: context firstArgument) ]
^ [ | arg |
arg := context firstArgument.
arg isImmediate
ifTrue: [ runtime newInteger: context self value * (runtime integerFrom: arg) ]
ifFalse: [ self failPrimitive ] ]
]

{ #category : 'primitives' }
Expand Down Expand Up @@ -742,6 +758,11 @@ EggEvaluator >> primitiveUnderSize [
^ [ runtime newInteger: context self size ]
]

{ #category : 'initializing' }
EggEvaluator >> regR [
^self subclassResponsibility
]

{ #category : 'initializing' }
EggEvaluator >> runtime [
^runtime
Expand Down
6 changes: 6 additions & 0 deletions runtime/pharo/Powerlang-Core/EggIterativeInterpreter.class.st
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,12 @@ EggIterativeInterpreter >> prepareForBlock: sblock [
^self subclassResponsibility
]

{ #category : 'accessing' }
EggIterativeInterpreter >> regR [

^regR
]

{ #category : 'accessing' }
EggIterativeInterpreter >> regR: anObject [
regR := anObject
Expand Down
4 changes: 2 additions & 2 deletions runtime/pharo/Powerlang-Core/SExpressionLinearizer.class.st
Original file line number Diff line number Diff line change
Expand Up @@ -622,13 +622,13 @@ SExpressionLinearizer >> visitMessage: anSMessage [

{ #category : 'initialization' }
SExpressionLinearizer >> visitMethod: anSMethod [
| primitive statements symbol descriptor handler |
| primitive statements symbol handler |
self reset.
primitive := anSMethod pragma.
primitive
ifNotNil: [ symbol := runtime localSymbolFrom: anSMethod primitive.
handler := primitives at: symbol.
^ self
self
primitive: handler;
return ].
stackTop := runtime methodTempCount: anSMethod compiledCode.
Expand Down